diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 18fdbe920b..cea7282fb8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,6 +1,6 @@ name: PR Checks -on: +on: push: branches: [ develop, "release/**" ] pull_request: @@ -13,13 +13,11 @@ jobs: runs-on: ubuntu-latest steps: - - name: Check out the code - uses: actions/checkout@v3 - - - name: Run SwiftLint on all files - uses: norio-nomura/action-swiftlint@3.2.1 + - uses: actions/checkout@v3 + - name: SwiftLint + uses: docker://norionomura/swiftlint:0.53.0 with: - args: --strict --force-exclude + args: swiftlint --reporter github-actions-logging --strict shellcheck: diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig index e513c6b471..86866ee7eb 100644 --- a/Configuration/Version.xcconfig +++ b/Configuration/Version.xcconfig @@ -1 +1 @@ -MARKETING_VERSION = 7.91.1 +MARKETING_VERSION = 7.92.0 diff --git a/Core/AppPrivacyConfigurationDataProvider.swift b/Core/AppPrivacyConfigurationDataProvider.swift index 9243d613f2..56755c581d 100644 --- a/Core/AppPrivacyConfigurationDataProvider.swift +++ b/Core/AppPrivacyConfigurationDataProvider.swift @@ -23,8 +23,8 @@ import BrowserServicesKit final public class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider { public struct Constants { - public static let embeddedDataETag = "\"30f2a2ffc762a0b87627dc218ba71b7e\"" - public static let embeddedDataSHA = "985db4a0b3bb35e7b116ace9bcffbfed40275a10ec39bbbb52d84de76a6769c9" + public static let embeddedDataETag = "\"54efb258435567856e087913f93d43df\"" + public static let embeddedDataSHA = "d0f9c70c5baba23a0966b277f8b4c949ecf01612558a50d2bda720fe1919b43f" } public var embeddedDataEtag: String { diff --git a/Core/AppTrackerDataSetProvider.swift b/Core/AppTrackerDataSetProvider.swift index eb85b243d0..edcbbad058 100644 --- a/Core/AppTrackerDataSetProvider.swift +++ b/Core/AppTrackerDataSetProvider.swift @@ -23,8 +23,8 @@ import BrowserServicesKit final public class AppTrackerDataSetProvider: EmbeddedDataProvider { public struct Constants { - public static let embeddedDataETag = "\"c9a18e593a4f5f8d32a18db294497226\"" - public static let embeddedDataSHA = "6264eb92240fee69aeebb14aa333bdc8d76b2818fb7f44f0acb1fb0373d50af4" + public static let embeddedDataETag = "\"a1bb76901a395eb251cd6f30f54037f1\"" + public static let embeddedDataSHA = "53cad742076d1382fba8db0e508307668eb0609738d526cb16cbc623b50410fc" } public var embeddedDataEtag: String { diff --git a/Core/UIViewControllerExtension.swift b/Core/UIViewControllerExtension.swift index da622a8980..f37bca411b 100644 --- a/Core/UIViewControllerExtension.swift +++ b/Core/UIViewControllerExtension.swift @@ -27,7 +27,7 @@ extension UIViewController { } var isPad: Bool { - return traitCollection.horizontalSizeClass == .regular + return UIDevice.current.userInterfaceIdiom == .pad } @objc func buildActivities() -> [UIActivity] { diff --git a/Core/UserAgentManager.swift b/Core/UserAgentManager.swift index 811293ca45..577922f317 100644 --- a/Core/UserAgentManager.swift +++ b/Core/UserAgentManager.swift @@ -85,8 +85,16 @@ public class DefaultUserAgentManager: UserAgentManager { } struct UserAgent { + + private enum DefaultPolicy: String { + + case ddg + case ddgFixed + case closest + + } - private struct Constants { + private enum Constants { // swiftlint:disable line_length static let fallbackWekKitVersion = "605.1.15" static let fallbackSafariComponent = "Safari/\(fallbackWekKitVersion)" @@ -96,6 +104,16 @@ struct UserAgent { static let uaOmitSitesConfigKey = "omitApplicationSites" static let uaOmitDomainConfigKey = "domain" + + static let defaultPolicyConfigKey = "defaultPolicy" + static let ddgDefaultSitesConfigKey = "ddgDefaultSites" + static let ddgFixedSitesConfigKey = "ddgFixedSites" + + static let closestUserAgentConfigKey = "closestUserAgent" + static let ddgFixedUserAgentConfigKey = "ddgFixedUserAgent" + + static let uaVersionsKey = "versions" + static let uaStateKey = "state" // swiftlint:enable line_length } @@ -110,12 +128,15 @@ struct UserAgent { private let versionComponent: String private let safariComponent: String private let applicationComponent = "DuckDuckGo/\(AppVersion.shared.majorVersionNumber)" + private let statistics: StatisticsStore + private let isTesting: Bool = ProcessInfo().arguments.contains("testing") - init(defaultAgent: String = Constants.fallbackDefaultAgent) { + init(defaultAgent: String = Constants.fallbackDefaultAgent, statistics: StatisticsStore = StatisticsUserDefaults()) { versionComponent = UserAgent.createVersionComponent(fromAgent: defaultAgent) baseAgent = UserAgent.createBaseAgent(fromAgent: defaultAgent, versionComponent: versionComponent) baseDesktopAgent = UserAgent.createBaseDesktopAgent(fromAgent: defaultAgent, versionComponent: versionComponent) safariComponent = UserAgent.createSafariComponent(fromAgent: baseAgent) + self.statistics = statistics } private func omitApplicationSites(forConfig config: PrivacyConfiguration) -> [String] { @@ -124,24 +145,160 @@ struct UserAgent { return omitApplicationObjs.map { $0[Constants.uaOmitDomainConfigKey] ?? "" } } - - public func agent(forUrl url: URL?, isDesktop: Bool, + + private func defaultPolicy(forConfig config: PrivacyConfiguration) -> DefaultPolicy { + let uaSettings = config.settings(for: .customUserAgent) + guard let policy = uaSettings[Constants.defaultPolicyConfigKey] as? String else { return .ddg } + + return DefaultPolicy(rawValue: policy) ?? .ddg + } + + private func ddgDefaultSites(forConfig config: PrivacyConfiguration) -> [String] { + let uaSettings = config.settings(for: .customUserAgent) + let defaultSitesObjs = uaSettings[Constants.ddgDefaultSitesConfigKey] as? [[String: String]] ?? [] + + return defaultSitesObjs.map { $0[Constants.uaOmitDomainConfigKey] ?? "" } + } + + private func ddgFixedSites(forConfig config: PrivacyConfiguration) -> [String] { + let uaSettings = config.settings(for: .customUserAgent) + let fixedSitesObjs = uaSettings[Constants.ddgFixedSitesConfigKey] as? [[String: String]] ?? [] + + return fixedSitesObjs.map { $0[Constants.uaOmitDomainConfigKey] ?? "" } + } + + private func closestUserAgentVersions(forConfig config: PrivacyConfiguration) -> [String] { + let uaSettings = config.settings(for: .customUserAgent) + let closestUserAgent = uaSettings[Constants.closestUserAgentConfigKey] as? [String: Any] ?? [:] + let versions = closestUserAgent[Constants.uaVersionsKey] as? [String] ?? [] + return versions + } + + private func ddgFixedUserAgentVersions(forConfig config: PrivacyConfiguration) -> [String] { + let uaSettings = config.settings(for: .customUserAgent) + let fixedUserAgent = uaSettings[Constants.ddgFixedUserAgentConfigKey] as? [String: Any] ?? [:] + let versions = fixedUserAgent[Constants.uaVersionsKey] as? [String] ?? [] + return versions + } + + public func agent(forUrl url: URL?, + isDesktop: Bool, privacyConfig: PrivacyConfiguration = ContentBlocking.shared.privacyConfigurationManager.privacyConfig) -> String { + + guard privacyConfig.isEnabled(featureKey: .customUserAgent) else { return oldLogic(forUrl: url, + isDesktop: isDesktop, + privacyConfig: privacyConfig) } + + if ddgDefaultSites(forConfig: privacyConfig).contains(where: { domain in + url?.isPart(ofDomain: domain) ?? false + }) { return oldLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) } + + if ddgFixedSites(forConfig: privacyConfig).contains(where: { domain in + url?.isPart(ofDomain: domain) ?? false + }) { return ddgFixedLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) } + + if closestUserAgentVersions(forConfig: privacyConfig).contains(statistics.atbWeek ?? "") { + if canUseClosestLogic { + return closestLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } else { + return oldLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } + } + + if ddgFixedUserAgentVersions(forConfig: privacyConfig).contains(statistics.atbWeek ?? "") { + return ddgFixedLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } + + switch defaultPolicy(forConfig: privacyConfig) { + case .ddg: return oldLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + case .ddgFixed: return ddgFixedLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + case .closest: + if canUseClosestLogic { + return closestLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } else { + return oldLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } + } + } + + private func oldLogic(forUrl url: URL?, + isDesktop: Bool, + privacyConfig: PrivacyConfiguration) -> String { let omittedSites = omitApplicationSites(forConfig: privacyConfig) let customUAEnabled = privacyConfig.isEnabled(featureKey: .customUserAgent) let omitApplicationComponent = !customUAEnabled || omittedSites.contains { domain in url?.isPart(ofDomain: domain) ?? false } - + let resolvedApplicationComponent = !omitApplicationComponent ? applicationComponent : nil + if isDesktop { return concatWithSpaces(baseDesktopAgent, resolvedApplicationComponent, safariComponent) } else { return concatWithSpaces(baseAgent, resolvedApplicationComponent, safariComponent) } } - + + private func ddgFixedLogic(forUrl url: URL?, + isDesktop: Bool, + privacyConfig: PrivacyConfiguration) -> String { + let omittedSites = omitApplicationSites(forConfig: privacyConfig) + let omitApplicationComponent = omittedSites.contains { domain in + url?.isPart(ofDomain: domain) ?? false + } + let resolvedApplicationComponent = !omitApplicationComponent ? applicationComponent : nil + + if canUseClosestLogic { + var defaultSafari = closestLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + // If the UA should have DuckDuckGo append it prior to Safari + if let resolvedApplicationComponent { + if let index = defaultSafari.range(of: "Safari")?.lowerBound { + defaultSafari.insert(contentsOf: resolvedApplicationComponent + " ", at: index) + } + } + return defaultSafari + } else { + return oldLogic(forUrl: url, isDesktop: isDesktop, privacyConfig: privacyConfig) + } + } + + private func closestLogic(forUrl url: URL?, + isDesktop: Bool, + privacyConfig: PrivacyConfiguration) -> String { + if isDesktop { + return "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15" + } + return "Mozilla/5.0 (" + deviceProfile + ") AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1" + } + + private var canUseClosestLogic: Bool { + guard let webKitVersion else { return false } + return webKitVersion.versionCompare("605.1.15") != .orderedAscending + } + + private var webKitVersion: String? { + let components = baseAgent.components(separatedBy: "AppleWebKit/") + + if components.count > 1 { + let versionComponents = components[1].components(separatedBy: " ") + return versionComponents.first + } + + return nil + } + + var deviceProfile: String { + let regex = try? NSRegularExpression(pattern: "\\((.*?)\\)") + if let match = regex?.firstMatch(in: baseAgent, range: NSRange(baseAgent.startIndex..., in: baseAgent)) { + let range = Range(match.range(at: 1), in: baseAgent) + if let range = range { + return String(baseAgent[range]) + } + } + return "iPhone; CPU iPhone OS 16_6 like Mac OS X" + } + private func concatWithSpaces(_ elements: String?...) -> String { return elements .compactMap { $0 } @@ -205,3 +362,26 @@ struct UserAgent { } } + +private extension StatisticsStore { + + var atbWeek: String? { + guard let atb else { return nil } + let trimmed = String(atb.dropFirst()) + + if let hyphenIndex = trimmed.firstIndex(of: "-") { + return String(trimmed.prefix(upTo: hyphenIndex)) + } else { + return trimmed + } + } + +} + +private extension String { + + func versionCompare(_ otherVersion: String) -> ComparisonResult { + compare(otherVersion, options: .numeric) + } + +} diff --git a/Core/ios-config.json b/Core/ios-config.json index 5d3b95fa24..b9847b8298 100644 --- a/Core/ios-config.json +++ b/Core/ios-config.json @@ -1,6 +1,6 @@ { "readme": "https://github.com/duckduckgo/privacy-configuration", - "version": 1695742642039, + "version": 1695828991975, "features": { "adClickAttribution": { "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection", @@ -313,6 +313,66 @@ { "domain": "roll20.net", "reason": "Performance issue for too many fields." + }, + { + "domain": "amazon.ca", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.cn", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.co.jp", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.com", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.com.au", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.com.mx", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.co.uk", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.de", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.es", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.eu", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.fr", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.in", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.it", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.nl", + "reason": "Performance issue, infinite loop." + }, + { + "domain": "amazon.sa", + "reason": "Performance issue, infinite loop." } ], "state": "enabled", @@ -338,7 +398,7 @@ "minSupportedVersion": "7.75.0" } }, - "hash": "0050520033bd94b10474e9d2f649f8f9" + "hash": "c427670d1be007f3bd4af4c0e83addfb" }, "clickToLoad": { "exceptions": [ @@ -7362,6 +7422,10 @@ { "domain": "paramountplus.com", "reason": "https://github.com/duckduckgo/privacy-configuration/issues/1085" + }, + { + "domain": "theverge.com", + "reason": "https://github.com/duckduckgo/privacy-configuration/issues/1326" } ], "settings": { @@ -7394,7 +7458,7 @@ ] }, "state": "enabled", - "hash": "d999feeb71ba8e37839b7ed5e267d365" + "hash": "aab19f2fd45ded0765912ee266c309df" }, "userAgentRotation": { "settings": { diff --git a/Core/trackerData.json b/Core/trackerData.json index f15dd18e3a..3de737a946 100644 --- a/Core/trackerData.json +++ b/Core/trackerData.json @@ -1,6 +1,6 @@ { "_builtWith": { - "tracker-radar": "57775dc368381de2672ec8875583340037a13847ef33ffd176974a8f2d7e7ac9-4013b4e91930c643394cb31c6c745356f133b04f", + "tracker-radar": "6eb8582c70d4e62ccb4b23113fc8bfdeb9b945b8ba986a60e71ab693af87e755-4013b4e91930c643394cb31c6c745356f133b04f", "tracker-surrogates": "d61691a2fdf9f4dc062a8d248fd1e78c20b5b892" }, "readme": "https://github.com/duckduckgo/tracker-blocklists", @@ -482,7 +482,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -493,7 +493,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -539,7 +539,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2417,7 +2417,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2428,7 +2428,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2472,7 +2472,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2483,7 +2483,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2593,8 +2593,10 @@ "amazon.dev": { "domain": "amazon.dev", "owner": { - "name": "amazon.dev", - "displayName": "amazon.dev" + "name": "Amazon Technologies, Inc.", + "displayName": "Amazon.com", + "privacyPolicy": "https://www.amazon.com/gp/help/customer/display.html?nodeId=468496", + "url": "http://www.amazon.com/" }, "prevalence": 0.0842, "fingerprinting": 0, @@ -2608,7 +2610,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2747,7 +2749,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -2758,7 +2760,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3077,7 +3079,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3204,7 +3206,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3328,7 +3330,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3712,7 +3714,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3723,7 +3725,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3734,7 +3736,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3745,7 +3747,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3811,7 +3813,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3863,7 +3865,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -3874,7 +3876,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -4011,7 +4013,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -4362,7 +4364,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -4397,7 +4399,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -4848,7 +4850,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -4859,7 +4861,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5061,7 +5063,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5103,7 +5105,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5126,7 +5128,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5161,7 +5163,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5190,7 +5192,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5478,7 +5480,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5595,7 +5597,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5606,7 +5608,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5617,7 +5619,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5628,7 +5630,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5665,7 +5667,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -5720,7 +5722,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -6256,7 +6258,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -6415,7 +6417,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -6731,7 +6733,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -6742,7 +6744,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -6866,7 +6868,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7062,7 +7064,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7098,7 +7100,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7109,7 +7111,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7120,7 +7122,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7703,7 +7705,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7714,7 +7716,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7725,7 +7727,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7801,7 +7803,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7924,7 +7926,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -7935,7 +7937,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8013,7 +8015,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8024,7 +8026,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8139,7 +8141,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8282,7 +8284,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8293,7 +8295,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8819,7 +8821,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8830,7 +8832,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -8871,7 +8873,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -9287,7 +9289,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -9897,7 +9899,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -9908,7 +9910,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -9919,7 +9921,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -9959,7 +9961,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10001,7 +10003,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10075,7 +10077,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10143,7 +10145,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10154,7 +10156,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10202,7 +10204,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10328,7 +10330,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10488,7 +10490,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10499,7 +10501,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10510,7 +10512,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10537,7 +10539,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10587,7 +10589,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -10634,7 +10636,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -11113,7 +11115,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -11153,7 +11155,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -11846,7 +11848,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -11933,7 +11935,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -11944,7 +11946,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12176,7 +12178,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12216,7 +12218,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12227,7 +12229,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12238,7 +12240,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12249,7 +12251,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12575,7 +12577,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12586,7 +12588,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -12597,7 +12599,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -14520,7 +14522,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -15205,7 +15207,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -15280,7 +15282,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -15331,7 +15333,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16153,7 +16155,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16164,7 +16166,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16192,7 +16194,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16411,7 +16413,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16719,7 +16721,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16730,7 +16732,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16915,7 +16917,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -16964,7 +16966,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -17238,7 +17240,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -17249,7 +17251,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -17812,7 +17814,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -18124,7 +18126,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -18263,7 +18265,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -18613,7 +18615,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -18843,7 +18845,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20032,7 +20034,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20253,7 +20255,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20264,7 +20266,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20275,7 +20277,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20383,7 +20385,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20860,7 +20862,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20889,7 +20891,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20900,7 +20902,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20911,7 +20913,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -20975,7 +20977,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21055,7 +21057,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21103,7 +21105,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21114,7 +21116,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21159,7 +21161,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21170,7 +21172,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21205,7 +21207,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21216,7 +21218,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21349,7 +21351,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21440,7 +21442,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21911,7 +21913,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21922,7 +21924,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -21933,7 +21935,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22003,7 +22005,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22014,7 +22016,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22167,7 +22169,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22178,7 +22180,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22220,7 +22222,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22231,7 +22233,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22242,7 +22244,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22512,7 +22514,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22523,7 +22525,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22584,7 +22586,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22642,7 +22644,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22653,7 +22655,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22753,7 +22755,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22776,7 +22778,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -22787,7 +22789,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23128,7 +23130,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23232,7 +23234,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23629,7 +23631,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23704,7 +23706,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23715,7 +23717,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23759,7 +23761,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23770,7 +23772,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23781,7 +23783,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23792,7 +23794,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23872,7 +23874,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23905,7 +23907,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -23956,7 +23958,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24092,7 +24094,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24221,7 +24223,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24232,7 +24234,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24479,7 +24481,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24490,7 +24492,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24501,7 +24503,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24782,7 +24784,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24817,7 +24819,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24858,7 +24860,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24974,7 +24976,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -24985,7 +24987,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25014,7 +25016,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25110,7 +25112,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25167,7 +25169,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25178,7 +25180,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25299,7 +25301,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25456,7 +25458,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25482,7 +25484,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25493,7 +25495,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25556,7 +25558,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25567,7 +25569,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25578,7 +25580,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25809,7 +25811,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25836,7 +25838,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25847,7 +25849,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25858,7 +25860,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25888,7 +25890,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25899,7 +25901,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25927,7 +25929,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -25938,7 +25940,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26026,7 +26028,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26074,7 +26076,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26085,7 +26087,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26096,7 +26098,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26107,7 +26109,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26118,7 +26120,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26129,7 +26131,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26201,7 +26203,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26212,7 +26214,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26266,7 +26268,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26468,7 +26470,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26776,7 +26778,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26787,7 +26789,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -26798,7 +26800,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -27049,7 +27051,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -27060,7 +27062,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -27425,7 +27427,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28282,7 +28284,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28412,7 +28414,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28423,7 +28425,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28556,7 +28558,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28639,7 +28641,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -28650,7 +28652,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -29010,7 +29012,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -29306,7 +29308,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -29317,7 +29319,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -29443,7 +29445,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -29454,7 +29456,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -31188,7 +31190,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -31418,6 +31420,55 @@ "categories": [], "default": "ignore" }, + "opencmp.net": { + "domain": "opencmp.net", + "owner": { + "name": "opencmp.net", + "displayName": "opencmp.net" + }, + "prevalence": 0.0116, + "fingerprinting": 2, + "cookies": 0, + "categories": [], + "default": "ignore", + "rules": [ + { + "rule": "opencmp\\.net\\/tcf-v2\\/platforms\\/legacy\\/cmp-latest\\.js", + "fingerprinting": 2, + "cookies": 0 + } + ] + }, + "axept.io": { + "domain": "axept.io", + "owner": { + "name": "axept.io", + "displayName": "axept.io" + }, + "prevalence": 0.0192, + "fingerprinting": 1, + "cookies": 0.0191, + "categories": [], + "default": "ignore", + "rules": [ + { + "rule": "axept\\.io\\/sdk\\.js", + "fingerprinting": 1, + "cookies": 0.0167 + }, + { + "rule": "axept\\.io\\/sdk-slim\\.js", + "fingerprinting": 1, + "cookies": 0.00241 + }, + { + "rule": "axept\\.io\\/v1\\/analytics\\/evts", + "fingerprinting": 0, + "cookies": 0, + "comment": "pixel" + } + ] + }, "veoxa.com": { "domain": "veoxa.com", "owner": { @@ -31443,7 +31494,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -31536,6 +31587,25 @@ } ] }, + "medietall.no": { + "domain": "medietall.no", + "owner": { + "name": "medietall.no", + "displayName": "medietall.no" + }, + "prevalence": 0.0152, + "fingerprinting": 1, + "cookies": 0.015, + "categories": [], + "default": "ignore", + "rules": [ + { + "rule": "medietall\\.no\\/analytics\\.v2\\.js", + "fingerprinting": 1, + "cookies": 0.015 + } + ] + }, "ad-delivery.net": { "domain": "ad-delivery.net", "owner": { @@ -32584,7 +32654,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32595,7 +32665,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32606,7 +32676,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32617,7 +32687,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32628,7 +32698,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32639,7 +32709,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32650,7 +32720,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32661,7 +32731,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32672,7 +32742,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32683,7 +32753,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32694,7 +32764,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32705,7 +32775,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32716,7 +32786,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32727,7 +32797,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32738,7 +32808,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32749,7 +32819,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32760,7 +32830,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32771,7 +32841,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32782,7 +32852,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32793,7 +32863,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32804,7 +32874,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32815,7 +32885,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32826,7 +32896,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32837,7 +32907,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32848,7 +32918,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32859,7 +32929,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32870,7 +32940,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32881,7 +32951,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32892,7 +32962,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32903,7 +32973,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32914,7 +32984,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32925,7 +32995,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32936,7 +33006,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32947,7 +33017,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32958,7 +33028,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32969,7 +33039,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32980,7 +33050,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -32991,7 +33061,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33002,7 +33072,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33013,7 +33083,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33024,7 +33094,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33035,7 +33105,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33046,7 +33116,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33057,7 +33127,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33068,7 +33138,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33079,7 +33149,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33090,7 +33160,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33101,7 +33171,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33112,7 +33182,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33123,7 +33193,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33134,7 +33204,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33145,7 +33215,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33156,7 +33226,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33167,7 +33237,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33178,7 +33248,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33189,7 +33259,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33200,7 +33270,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33211,7 +33281,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33222,7 +33292,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33233,7 +33303,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33244,7 +33314,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33255,7 +33325,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33266,7 +33336,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33277,7 +33347,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33288,7 +33358,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33299,7 +33369,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33310,7 +33380,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33321,7 +33391,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33332,7 +33402,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33343,7 +33413,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33354,7 +33424,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33365,7 +33435,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33376,7 +33446,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33387,7 +33457,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33398,7 +33468,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33409,7 +33479,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33420,7 +33490,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33431,7 +33501,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33442,7 +33512,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33453,7 +33523,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33464,7 +33534,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33475,7 +33545,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33486,7 +33556,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33497,7 +33567,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33508,7 +33578,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33519,7 +33589,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33530,7 +33600,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33541,7 +33611,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33552,7 +33622,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33563,7 +33633,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33574,7 +33644,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33585,7 +33655,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33596,7 +33666,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33607,7 +33677,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33618,7 +33688,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33629,7 +33699,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33640,7 +33710,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33651,7 +33721,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33662,7 +33732,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33673,7 +33743,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33684,7 +33754,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33695,7 +33765,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33706,7 +33776,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33717,7 +33787,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33728,7 +33798,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33739,7 +33809,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33750,7 +33820,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33761,7 +33831,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33772,7 +33842,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33783,7 +33853,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33794,7 +33864,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33805,7 +33875,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33816,7 +33886,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33827,7 +33897,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33838,7 +33908,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33849,7 +33919,18 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, + "fingerprinting": 1, + "cookies": 0.01, + "default": "block" + }, + "excitingtub.com": { + "domain": "excitingtub.com", + "owner": { + "name": "Leven Labs, Inc. DBA Admiral", + "displayName": "Admiral" + }, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33860,7 +33941,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33871,7 +33952,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33882,7 +33963,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33893,7 +33974,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33904,7 +33985,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33915,7 +33996,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33926,7 +34007,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33937,7 +34018,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33948,7 +34029,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33959,7 +34040,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33970,7 +34051,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33981,7 +34062,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -33992,7 +34073,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34003,7 +34084,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34014,7 +34095,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34025,7 +34106,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34036,7 +34117,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34047,7 +34128,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34058,7 +34139,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34069,7 +34150,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34080,7 +34161,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34091,7 +34172,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34102,7 +34183,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34113,7 +34194,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34124,7 +34205,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34135,7 +34216,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34146,7 +34227,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34157,7 +34238,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34168,7 +34249,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34179,7 +34260,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34190,7 +34271,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34201,7 +34282,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34212,7 +34293,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34223,7 +34304,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34234,7 +34315,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34245,7 +34326,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34256,7 +34337,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34267,7 +34348,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34278,7 +34359,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34289,7 +34370,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34300,7 +34381,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34311,7 +34392,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34322,7 +34403,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34333,7 +34414,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34344,7 +34425,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34355,7 +34436,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34366,7 +34447,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34377,7 +34458,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34388,7 +34469,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34399,7 +34480,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34410,7 +34491,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34421,7 +34502,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34432,7 +34513,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34443,7 +34524,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34454,7 +34535,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34465,7 +34546,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34476,7 +34557,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34487,7 +34568,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34498,7 +34579,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34509,7 +34590,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34520,7 +34601,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34531,7 +34612,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34542,7 +34623,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34553,7 +34634,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34564,7 +34645,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34575,7 +34656,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34586,7 +34667,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34597,7 +34678,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34608,7 +34689,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34619,7 +34700,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34630,7 +34711,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34641,7 +34722,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34652,7 +34733,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34663,7 +34744,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34674,7 +34755,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34685,7 +34766,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34696,7 +34777,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34707,7 +34788,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34718,7 +34799,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34729,7 +34810,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34740,7 +34821,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34751,7 +34832,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34762,7 +34843,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34773,7 +34854,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34784,7 +34865,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34795,7 +34876,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34806,7 +34887,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34817,7 +34898,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34828,7 +34909,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34839,7 +34920,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34850,7 +34931,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34861,7 +34942,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34872,7 +34953,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34883,7 +34964,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34894,7 +34975,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34905,7 +34986,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34916,7 +34997,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34927,7 +35008,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34938,7 +35019,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34949,7 +35030,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34960,7 +35041,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34971,7 +35052,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34982,7 +35063,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -34993,7 +35074,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35004,7 +35085,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35015,7 +35096,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35026,7 +35107,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35037,7 +35118,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35048,7 +35129,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35059,7 +35140,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35070,7 +35151,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35081,7 +35162,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35092,7 +35173,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35103,7 +35184,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35114,7 +35195,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35125,7 +35206,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35136,7 +35217,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35147,7 +35228,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35158,7 +35239,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35169,7 +35250,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35180,7 +35261,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35191,7 +35272,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35202,7 +35283,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35213,7 +35294,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35224,7 +35305,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35235,7 +35316,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35246,7 +35327,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35257,7 +35338,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35268,7 +35349,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35279,7 +35360,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35290,7 +35371,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35301,7 +35382,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35312,7 +35393,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35323,7 +35404,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35334,7 +35415,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35345,7 +35426,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35356,7 +35437,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35367,7 +35448,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35378,7 +35459,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35389,7 +35470,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35400,7 +35481,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35411,7 +35492,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35422,7 +35503,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35433,7 +35514,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35444,7 +35525,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35455,7 +35536,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35466,7 +35547,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35477,7 +35558,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35488,7 +35569,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35499,7 +35580,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35510,7 +35591,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35521,7 +35602,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35532,7 +35613,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35543,7 +35624,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35554,7 +35635,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35565,7 +35646,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35576,7 +35657,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35587,7 +35668,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35598,7 +35679,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35609,7 +35690,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35620,7 +35701,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35631,7 +35712,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35642,7 +35723,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35653,7 +35734,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35664,7 +35745,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35675,7 +35756,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35686,7 +35767,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35697,7 +35778,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35708,7 +35789,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35719,7 +35800,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35730,7 +35811,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35741,7 +35822,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35752,7 +35833,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35763,7 +35844,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35774,7 +35855,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35785,7 +35866,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35796,7 +35877,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35807,7 +35888,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35818,7 +35899,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35829,7 +35910,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35840,7 +35921,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35851,7 +35932,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35862,7 +35943,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35873,7 +35954,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35884,7 +35965,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35895,7 +35976,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35906,7 +35987,18 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, + "fingerprinting": 1, + "cookies": 0.01, + "default": "block" + }, + "slinksuggestion.com": { + "domain": "slinksuggestion.com", + "owner": { + "name": "Leven Labs, Inc. DBA Admiral", + "displayName": "Admiral" + }, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35917,7 +36009,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35928,7 +36020,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35939,7 +36031,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35950,7 +36042,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35961,7 +36053,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35972,7 +36064,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35983,7 +36075,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -35994,7 +36086,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36005,7 +36097,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36016,7 +36108,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36027,7 +36119,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36038,7 +36130,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36049,7 +36141,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36060,7 +36152,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36071,7 +36163,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36082,7 +36174,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36093,7 +36185,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36104,7 +36196,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36115,7 +36207,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36126,7 +36218,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36137,7 +36229,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36148,7 +36240,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36159,7 +36251,18 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, + "fingerprinting": 1, + "cookies": 0.01, + "default": "block" + }, + "strangersponge.com": { + "domain": "strangersponge.com", + "owner": { + "name": "Leven Labs, Inc. DBA Admiral", + "displayName": "Admiral" + }, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36170,7 +36273,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36181,7 +36284,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36192,7 +36295,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36203,7 +36306,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36214,7 +36317,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36225,7 +36328,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36236,7 +36339,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36247,7 +36350,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36258,7 +36361,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36269,7 +36372,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36280,7 +36383,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36291,7 +36394,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36302,7 +36405,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36313,7 +36416,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36324,7 +36427,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36335,7 +36438,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36346,7 +36449,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36357,7 +36460,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36368,7 +36471,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36379,7 +36482,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36390,7 +36493,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36401,7 +36504,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36412,7 +36515,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36423,7 +36526,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36434,7 +36537,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36445,7 +36548,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36456,7 +36559,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36467,7 +36570,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36478,7 +36581,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36489,7 +36592,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36500,7 +36603,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36511,7 +36614,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36522,7 +36625,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36533,7 +36636,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36544,7 +36647,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36555,7 +36658,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36566,7 +36669,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36577,7 +36680,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36588,7 +36691,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36599,7 +36702,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36610,7 +36713,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36621,7 +36724,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36632,7 +36735,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36643,7 +36746,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36654,7 +36757,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36665,7 +36768,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36676,7 +36779,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36687,7 +36790,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36698,7 +36801,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36709,7 +36812,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36720,7 +36823,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36731,7 +36834,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36742,7 +36845,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36753,7 +36856,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36764,7 +36867,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36775,7 +36878,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36786,7 +36889,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36797,7 +36900,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36808,7 +36911,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -36819,7 +36922,7 @@ "name": "Leven Labs, Inc. DBA Admiral", "displayName": "Admiral" }, - "prevalence": 0.0137, + "prevalence": 0.0138, "fingerprinting": 1, "cookies": 0.01, "default": "block" @@ -37542,6 +37645,7 @@ "amazon.com.mx", "amazon.com.tr", "amazon.de", + "amazon.dev", "amazon.es", "amazon.fr", "amazon.in", @@ -37618,7 +37722,7 @@ "zappos.com", "zapposcouture.com" ], - "prevalence": 22.3, + "prevalence": 21.8, "displayName": "Amazon.com" }, "Alliance for Audited Media": { @@ -39040,13 +39144,6 @@ "prevalence": 0.0361, "displayName": "Alibaba" }, - "amazon.dev": { - "domains": [ - "amazon.dev" - ], - "prevalence": 0, - "displayName": "amazon.dev" - }, "Amplitude": { "domains": [ "amplitude.com" @@ -40445,6 +40542,7 @@ "radian6.com", "relateiq.com", "salesforce-communities.com", + "salesforce-sites.com", "salesforce.com", "salesforceiq.com", "salesforceliveagent.com", @@ -40461,7 +40559,7 @@ "visualforce.com", "weinvoiceit.com" ], - "prevalence": 8.34, + "prevalence": 7.23, "displayName": "Salesforce.com" }, "Crazy Egg, Inc.": { @@ -42179,17 +42277,27 @@ "tripadvisor.be", "tripadvisor.ca", "tripadvisor.ch", + "tripadvisor.cl", + "tripadvisor.co", + "tripadvisor.co.id", + "tripadvisor.co.il", "tripadvisor.co.nz", "tripadvisor.co.uk", "tripadvisor.co.za", "tripadvisor.com", + "tripadvisor.com.ar", "tripadvisor.com.au", "tripadvisor.com.br", + "tripadvisor.com.gr", "tripadvisor.com.hk", "tripadvisor.com.mx", "tripadvisor.com.my", + "tripadvisor.com.pe", "tripadvisor.com.ph", "tripadvisor.com.sg", + "tripadvisor.com.tr", + "tripadvisor.com.tw", + "tripadvisor.com.ve", "tripadvisor.de", "tripadvisor.dk", "tripadvisor.es", @@ -42204,7 +42312,7 @@ "tripadvisor.ru", "tripadvisor.se" ], - "prevalence": 0.116, + "prevalence": 0.0981, "displayName": "TripAdvisor" }, "Prospect One": { @@ -43469,10 +43577,13 @@ }, "Nextdoor, Inc.": { "domains": [ + "nextdoor.ca", "nextdoor.co.uk", - "nextdoor.com" + "nextdoor.com", + "nextdoor.de", + "nextdoor.nl" ], - "prevalence": 0.274, + "prevalence": 0.322, "displayName": "Nextdoor" }, "Nine Entertainment Co.": { @@ -46597,6 +46708,20 @@ "prevalence": 0.0041, "displayName": "Telstra" }, + "opencmp.net": { + "domains": [ + "opencmp.net" + ], + "prevalence": 0, + "displayName": "opencmp.net" + }, + "axept.io": { + "domains": [ + "axept.io" + ], + "prevalence": 0, + "displayName": "axept.io" + }, "J S WEB PRODUCTION": { "domains": [ "ad2perf.com", @@ -46622,6 +46747,13 @@ "prevalence": 0.0014, "displayName": "Adtraction Marketing" }, + "medietall.no": { + "domains": [ + "medietall.no" + ], + "prevalence": 0, + "displayName": "medietall.no" + }, "easyAd Deutschland GmbH": { "domains": [ "ad-delivery.net", @@ -46994,6 +47126,7 @@ "evanescentedge.com", "eventexistence.com", "exampleshake.com", + "excitingtub.com", "exhibitsneeze.com", "expansioneggnog.com", "exuberantedge.com", @@ -47292,6 +47425,7 @@ "sixscissors.com", "skillfuldrop.com", "skisofa.com", + "slinksuggestion.com", "slopesoap.com", "smashquartz.com", "smashsurprise.com", @@ -47334,6 +47468,7 @@ "stomachscience.com", "straightnest.com", "strangeclocks.com", + "strangersponge.com", "strangesink.com", "stretchsister.com", "stretchsneeze.com", @@ -47423,7 +47558,7 @@ "zipperxray.com", "zlp6s.pw" ], - "prevalence": 0.0137, + "prevalence": 0.0138, "displayName": "Admiral" } }, @@ -48064,6 +48199,7 @@ "amazon.com.mx": "Amazon Technologies, Inc.", "amazon.com.tr": "Amazon Technologies, Inc.", "amazon.de": "Amazon Technologies, Inc.", + "amazon.dev": "Amazon Technologies, Inc.", "amazon.es": "Amazon Technologies, Inc.", "amazon.fr": "Amazon Technologies, Inc.", "amazon.in": "Amazon Technologies, Inc.", @@ -48317,6 +48453,7 @@ "evanescentedge.com": "Leven Labs, Inc. DBA Admiral", "eventexistence.com": "Leven Labs, Inc. DBA Admiral", "exampleshake.com": "Leven Labs, Inc. DBA Admiral", + "excitingtub.com": "Leven Labs, Inc. DBA Admiral", "exhibitsneeze.com": "Leven Labs, Inc. DBA Admiral", "expansioneggnog.com": "Leven Labs, Inc. DBA Admiral", "exuberantedge.com": "Leven Labs, Inc. DBA Admiral", @@ -48615,6 +48752,7 @@ "sixscissors.com": "Leven Labs, Inc. DBA Admiral", "skillfuldrop.com": "Leven Labs, Inc. DBA Admiral", "skisofa.com": "Leven Labs, Inc. DBA Admiral", + "slinksuggestion.com": "Leven Labs, Inc. DBA Admiral", "slopesoap.com": "Leven Labs, Inc. DBA Admiral", "smashquartz.com": "Leven Labs, Inc. DBA Admiral", "smashsurprise.com": "Leven Labs, Inc. DBA Admiral", @@ -48657,6 +48795,7 @@ "stomachscience.com": "Leven Labs, Inc. DBA Admiral", "straightnest.com": "Leven Labs, Inc. DBA Admiral", "strangeclocks.com": "Leven Labs, Inc. DBA Admiral", + "strangersponge.com": "Leven Labs, Inc. DBA Admiral", "strangesink.com": "Leven Labs, Inc. DBA Admiral", "stretchsister.com": "Leven Labs, Inc. DBA Admiral", "stretchsneeze.com": "Leven Labs, Inc. DBA Admiral", @@ -49718,7 +49857,6 @@ "wpn.com": "Alibaba Group", "ykimg.com": "Alibaba Group", "youku.com": "Alibaba Group", - "amazon.dev": "amazon.dev", "amplitude.com": "Amplitude", "amung.us": "whos.amung.us Inc", "waust.at": "whos.amung.us Inc", @@ -50338,6 +50476,7 @@ "radian6.com": "Salesforce.com, Inc.", "relateiq.com": "Salesforce.com, Inc.", "salesforce-communities.com": "Salesforce.com, Inc.", + "salesforce-sites.com": "Salesforce.com, Inc.", "salesforce.com": "Salesforce.com, Inc.", "salesforceiq.com": "Salesforce.com, Inc.", "salesforceliveagent.com": "Salesforce.com, Inc.", @@ -51076,17 +51215,27 @@ "tripadvisor.be": "TripAdvisor LLC", "tripadvisor.ca": "TripAdvisor LLC", "tripadvisor.ch": "TripAdvisor LLC", + "tripadvisor.cl": "TripAdvisor LLC", + "tripadvisor.co": "TripAdvisor LLC", + "tripadvisor.co.id": "TripAdvisor LLC", + "tripadvisor.co.il": "TripAdvisor LLC", "tripadvisor.co.nz": "TripAdvisor LLC", "tripadvisor.co.uk": "TripAdvisor LLC", "tripadvisor.co.za": "TripAdvisor LLC", "tripadvisor.com": "TripAdvisor LLC", + "tripadvisor.com.ar": "TripAdvisor LLC", "tripadvisor.com.au": "TripAdvisor LLC", "tripadvisor.com.br": "TripAdvisor LLC", + "tripadvisor.com.gr": "TripAdvisor LLC", "tripadvisor.com.hk": "TripAdvisor LLC", "tripadvisor.com.mx": "TripAdvisor LLC", "tripadvisor.com.my": "TripAdvisor LLC", + "tripadvisor.com.pe": "TripAdvisor LLC", "tripadvisor.com.ph": "TripAdvisor LLC", "tripadvisor.com.sg": "TripAdvisor LLC", + "tripadvisor.com.tr": "TripAdvisor LLC", + "tripadvisor.com.tw": "TripAdvisor LLC", + "tripadvisor.com.ve": "TripAdvisor LLC", "tripadvisor.de": "TripAdvisor LLC", "tripadvisor.dk": "TripAdvisor LLC", "tripadvisor.es": "TripAdvisor LLC", @@ -51712,8 +51861,11 @@ "newscorpaustralia.com": "News Limited", "newsroom.bi": "newsroom.bi", "nextday.media": "P B.V.", + "nextdoor.ca": "Nextdoor, Inc.", "nextdoor.co.uk": "Nextdoor, Inc.", "nextdoor.com": "Nextdoor, Inc.", + "nextdoor.de": "Nextdoor, Inc.", + "nextdoor.nl": "Nextdoor, Inc.", "9cdn.net": "Nine Entertainment Co.", "9nation.com.au": "Nine Entertainment Co.", "9news.com.au": "Nine Entertainment Co.", @@ -53006,6 +53158,8 @@ "shop.pe": "Add Shoppers", "telstra.com": "Telstra Corporation Limited", "telstra.com.au": "Telstra Corporation Limited", + "opencmp.net": "opencmp.net", + "axept.io": "axept.io", "ad2perf.com": "J S WEB PRODUCTION", "moxielinks.com": "J S WEB PRODUCTION", "veoxa.com": "J S WEB PRODUCTION", @@ -53013,6 +53167,7 @@ "sooqr.nl": "Sooqr", "adtr.io": "Adtraction Marketing AB", "adtraction.com": "Adtraction Marketing AB", + "medietall.no": "medietall.no", "ad-delivery.net": "easyAd Deutschland GmbH", "easyad.com": "easyAd Deutschland GmbH", "easyad.info": "easyAd Deutschland GmbH", diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 73d664090c..65d30c5fef 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -319,7 +319,6 @@ 83E2D2B4253CC16B005605F5 /* httpsMobileV2BloomSpec.json in Resources */ = {isa = PBXBuildFile; fileRef = 83E2D2B1253CC16B005605F5 /* httpsMobileV2BloomSpec.json */; }; 83EDCC411F86B89C005CDFCD /* StatisticsLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83EDCC3F1F86B895005CDFCD /* StatisticsLoaderTests.swift */; }; 84E341961E2F7EFB00BDBA6F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E341951E2F7EFB00BDBA6F /* AppDelegate.swift */; }; - 84E3419B1E2F7EFB00BDBA6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84E341991E2F7EFB00BDBA6F /* Main.storyboard */; }; 84E341A01E2F7EFB00BDBA6F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84E3419E1E2F7EFB00BDBA6F /* LaunchScreen.storyboard */; }; 85010502292FB1000033978F /* FireproofFaviconUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85010501292FB1000033978F /* FireproofFaviconUpdater.swift */; }; 85010504292FFB080033978F /* FireproofFaviconUpdaterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85010503292FFB080033978F /* FireproofFaviconUpdaterTests.swift */; }; @@ -466,6 +465,7 @@ 85D598872927F84C00FA3B1B /* Crashes in Frameworks */ = {isa = PBXBuildFile; productRef = 85D598862927F84C00FA3B1B /* Crashes */; }; 85DB12EB2A1FE2A4000A4A72 /* LockScreenWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DB12EA2A1FE2A4000A4A72 /* LockScreenWidgets.swift */; }; 85DB12ED2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DB12EC2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift */; }; + 85DDE0402AC6FF65006ABCA2 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DDE03F2AC6FF65006ABCA2 /* MainView.swift */; }; 85DF714624F7FE6100C89288 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F143C2E41E4A4CD400CFDE3A /* Core.framework */; }; 85DFEDED24C7CCA500973FE7 /* AppWidthObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFEDEC24C7CCA500973FE7 /* AppWidthObserver.swift */; }; 85DFEDEF24C7EA3B00973FE7 /* SmallOmniBarState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFEDEE24C7EA3B00973FE7 /* SmallOmniBarState.swift */; }; @@ -694,6 +694,7 @@ C17B595A2A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17B59572A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift */; }; C17B595B2A03AAD30055F2D1 /* PasswordGenerationPromptView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17B59582A03AAD30055F2D1 /* PasswordGenerationPromptView.swift */; }; C18ED43C2AB8364400BF3805 /* FileTextPreviewDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18ED43B2AB8364400BF3805 /* FileTextPreviewDebugViewController.swift */; }; + C18ED43A2AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18ED4392AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift */; }; C1963863283794A000298D4D /* BookmarksCachingSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1963862283794A000298D4D /* BookmarksCachingSearch.swift */; }; C1B0F63E2AB08904001EAF05 /* PhasedRolloutFeatureFlagTester.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B0F63D2AB08904001EAF05 /* PhasedRolloutFeatureFlagTester.swift */; }; C1B0F6422AB08BE9001EAF05 /* MockPrivacyConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B0F6412AB08BE9001EAF05 /* MockPrivacyConfiguration.swift */; }; @@ -764,6 +765,7 @@ EE7A92872AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE7A92862AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift */; }; EE8594992A44791C008A6D06 /* NetworkProtectionTunnelController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE8594982A44791C008A6D06 /* NetworkProtectionTunnelController.swift */; }; EE8E568A2A56BCE400F11DCA /* NetworkProtection in Frameworks */ = {isa = PBXBuildFile; productRef = EE8E56892A56BCE400F11DCA /* NetworkProtection */; }; + EEDFE2DA2AC6ED4F00F0E19C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EEDFE2DC2AC6ED4F00F0E19C /* Localizable.strings */; }; EEEB80A32A421CE600386378 /* NetworkProtectionPacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEEB80A22A421CE600386378 /* NetworkProtectionPacketTunnelProvider.swift */; }; EEF0F8CC2ABC832300630031 /* NetworkProtectionDebugFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEF0F8CB2ABC832200630031 /* NetworkProtectionDebugFeatures.swift */; }; EEFAB4672A73C230008A38E4 /* NetworkProtectionTestUtils in Frameworks */ = {isa = PBXBuildFile; productRef = EEFAB4662A73C230008A38E4 /* NetworkProtectionTestUtils */; }; @@ -1231,7 +1233,6 @@ 317045BF2858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceEmailTruncatorTests.swift; sourceTree = ""; }; 31794BFF2821DFB600F18633 /* DuckUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = DuckUI; sourceTree = ""; }; 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsHeaderView.swift; sourceTree = ""; }; - 31951E94282310FF00CAF535 /* WebsiteAccountExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebsiteAccountExtension.swift; sourceTree = ""; }; 319A370F28299A850079FBCE /* PasswordHider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordHider.swift; sourceTree = ""; }; 319A37142829A55F0079FBCE /* AutofillListItemTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillListItemTableViewCell.swift; sourceTree = ""; }; 319A37162829C8AD0079FBCE /* UITableViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewExtension.swift; sourceTree = ""; }; @@ -1327,7 +1328,6 @@ 83EDCC3F1F86B895005CDFCD /* StatisticsLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatisticsLoaderTests.swift; sourceTree = ""; }; 84E341921E2F7EFB00BDBA6F /* DuckDuckGo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DuckDuckGo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 84E341951E2F7EFB00BDBA6F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 84E3419A1E2F7EFB00BDBA6F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 84E3419F1E2F7EFB00BDBA6F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 84E341A11E2F7EFB00BDBA6F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 84E341A61E2F7EFB00BDBA6F /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1471,6 +1471,7 @@ 85D33FCF25C97B6E002B91A6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 85DB12EA2A1FE2A4000A4A72 /* LockScreenWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockScreenWidgets.swift; sourceTree = ""; }; 85DB12EC2A1FED0C000A4A72 /* AppDelegate+AppDeepLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+AppDeepLinks.swift"; sourceTree = ""; }; + 85DDE03F2AC6FF65006ABCA2 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; 85DFEDEC24C7CCA500973FE7 /* AppWidthObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppWidthObserver.swift; sourceTree = ""; }; 85DFEDEE24C7EA3B00973FE7 /* SmallOmniBarState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmallOmniBarState.swift; sourceTree = ""; }; 85DFEDF024C7EEA400973FE7 /* LargeOmniBarState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeOmniBarState.swift; sourceTree = ""; }; @@ -1521,7 +1522,6 @@ 981685442521EEEF00FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Bookmarks.strings; sourceTree = ""; }; 981685452521EEF000FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Feedback.strings; sourceTree = ""; }; 981685462521EEF000FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Home.strings; sourceTree = ""; }; - 981685472521EEF000FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Main.strings; sourceTree = ""; }; 981685482521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/OmniBar.strings; sourceTree = ""; }; 981685492521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Authentication.strings; sourceTree = ""; }; 9816854A2521EEF100FA91A1 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1626,7 +1626,6 @@ 9866DB8C251CA8F300612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DB8D251CA8F300612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Feedback.strings; sourceTree = ""; }; 9866DB8E251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Home.strings; sourceTree = ""; }; - 9866DB8F251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Main.strings; sourceTree = ""; }; 9866DB90251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/OmniBar.strings; sourceTree = ""; }; 9866DB91251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Authentication.strings; sourceTree = ""; }; 9866DB92251CA8F400612E3A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1645,7 +1644,6 @@ 9866DBA3251CA91700612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DBA4251CA91700612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Feedback.strings; sourceTree = ""; }; 9866DBA5251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Home.strings; sourceTree = ""; }; - 9866DBA6251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Main.strings; sourceTree = ""; }; 9866DBA7251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/OmniBar.strings; sourceTree = ""; }; 9866DBA8251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Authentication.strings; sourceTree = ""; }; 9866DBA9251CA91800612E3A /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1664,7 +1662,6 @@ 9866DBBA251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DBBB251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Feedback.strings; sourceTree = ""; }; 9866DBBC251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Home.strings; sourceTree = ""; }; - 9866DBBD251CA92A00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Main.strings; sourceTree = ""; }; 9866DBBE251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/OmniBar.strings; sourceTree = ""; }; 9866DBBF251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Authentication.strings; sourceTree = ""; }; 9866DBC0251CA92B00612E3A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1683,7 +1680,6 @@ 9866DBD1251CA93800612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DBD2251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Feedback.strings; sourceTree = ""; }; 9866DBD3251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Home.strings; sourceTree = ""; }; - 9866DBD4251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Main.strings; sourceTree = ""; }; 9866DBD5251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/OmniBar.strings; sourceTree = ""; }; 9866DBD6251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Authentication.strings; sourceTree = ""; }; 9866DBD7251CA93900612E3A /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1702,7 +1698,6 @@ 9866DBE8251CA94E00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DBE9251CA94E00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Feedback.strings; sourceTree = ""; }; 9866DBEA251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Home.strings; sourceTree = ""; }; - 9866DBEB251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Main.strings; sourceTree = ""; }; 9866DBEC251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/OmniBar.strings; sourceTree = ""; }; 9866DBED251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Authentication.strings; sourceTree = ""; }; 9866DBEE251CA94F00612E3A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1721,7 +1716,6 @@ 9866DBFF251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC00251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Feedback.strings; sourceTree = ""; }; 9866DC01251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Home.strings; sourceTree = ""; }; - 9866DC02251CA96200612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Main.strings; sourceTree = ""; }; 9866DC03251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC04251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Authentication.strings; sourceTree = ""; }; 9866DC05251CA96300612E3A /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1740,7 +1734,6 @@ 9866DC16251CA99A00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC17251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Feedback.strings; sourceTree = ""; }; 9866DC18251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Home.strings; sourceTree = ""; }; - 9866DC19251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; }; 9866DC1A251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC1B251CA99B00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Authentication.strings; sourceTree = ""; }; 9866DC1C251CA99C00612E3A /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1759,7 +1752,6 @@ 9866DC2D251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC2E251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Feedback.strings; sourceTree = ""; }; 9866DC2F251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Home.strings; sourceTree = ""; }; - 9866DC30251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Main.strings; sourceTree = ""; }; 9866DC31251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC32251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Authentication.strings; sourceTree = ""; }; 9866DC33251CA9B000612E3A /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1778,7 +1770,6 @@ 9866DC44251CA9BF00612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC45251CA9BF00612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Feedback.strings; sourceTree = ""; }; 9866DC46251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Home.strings; sourceTree = ""; }; - 9866DC47251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Main.strings; sourceTree = ""; }; 9866DC48251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC49251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Authentication.strings; sourceTree = ""; }; 9866DC4A251CA9C000612E3A /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1797,7 +1788,6 @@ 9866DC5B251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC5C251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Feedback.strings; sourceTree = ""; }; 9866DC5D251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Home.strings; sourceTree = ""; }; - 9866DC5E251CA9CE00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; }; 9866DC5F251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC60251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Authentication.strings; sourceTree = ""; }; 9866DC61251CA9CF00612E3A /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1816,7 +1806,6 @@ 9866DC72251CA9E200612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC73251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Feedback.strings; sourceTree = ""; }; 9866DC74251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Home.strings; sourceTree = ""; }; - 9866DC75251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Main.strings; sourceTree = ""; }; 9866DC76251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC77251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Authentication.strings; sourceTree = ""; }; 9866DC78251CA9E300612E3A /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1835,7 +1824,6 @@ 9866DC89251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DC8A251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Feedback.strings; sourceTree = ""; }; 9866DC8B251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Home.strings; sourceTree = ""; }; - 9866DC8C251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Main.strings; sourceTree = ""; }; 9866DC8D251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/OmniBar.strings; sourceTree = ""; }; 9866DC8E251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Authentication.strings; sourceTree = ""; }; 9866DC8F251CA9F500612E3A /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1854,7 +1842,6 @@ 9866DCA0251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DCA1251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Feedback.strings; sourceTree = ""; }; 9866DCA2251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Home.strings; sourceTree = ""; }; - 9866DCA3251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; }; 9866DCA4251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/OmniBar.strings; sourceTree = ""; }; 9866DCA5251CAA0500612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Authentication.strings; sourceTree = ""; }; 9866DCA6251CAA0600612E3A /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1873,7 +1860,6 @@ 9866DCB7251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DCB8251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Feedback.strings; sourceTree = ""; }; 9866DCB9251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Home.strings; sourceTree = ""; }; - 9866DCBA251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Main.strings; sourceTree = ""; }; 9866DCBB251CAA2600612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/OmniBar.strings; sourceTree = ""; }; 9866DCBC251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Authentication.strings; sourceTree = ""; }; 9866DCBD251CAA2700612E3A /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1892,7 +1878,6 @@ 9866DCCE251CAA3300612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DCCF251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Feedback.strings; sourceTree = ""; }; 9866DCD0251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Home.strings; sourceTree = ""; }; - 9866DCD1251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Main.strings; sourceTree = ""; }; 9866DCD2251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/OmniBar.strings; sourceTree = ""; }; 9866DCD3251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Authentication.strings; sourceTree = ""; }; 9866DCD4251CAA3400612E3A /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1911,7 +1896,6 @@ 9866DCE5251CAA4800612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Bookmarks.strings; sourceTree = ""; }; 9866DCE6251CAA4800612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Feedback.strings; sourceTree = ""; }; 9866DCE7251CAA4800612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Home.strings; sourceTree = ""; }; - 9866DCE8251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Main.strings; sourceTree = ""; }; 9866DCE9251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/OmniBar.strings; sourceTree = ""; }; 9866DCEA251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Authentication.strings; sourceTree = ""; }; 9866DCEB251CAA4900612E3A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/PrivacyDashboard.strings; sourceTree = ""; }; @@ -1961,13 +1945,6 @@ 9866DD66251CB10600612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Home.strings; sourceTree = ""; }; 9866DD68251CB10700612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Home.strings; sourceTree = ""; }; 9866DD6A251CB10800612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Home.strings; sourceTree = ""; }; - 9866DD74251CB11A00612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Main.strings; sourceTree = ""; }; - 9866DD76251CB11B00612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; - 9866DD7A251CB11E00612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Main.strings; sourceTree = ""; }; - 9866DD7C251CB11F00612E3A /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; }; - 9866DD7E251CB12000612E3A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; }; - 9866DD80251CB12100612E3A /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Main.strings; sourceTree = ""; }; - 9866DD82251CB12200612E3A /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Main.strings; sourceTree = ""; }; 9866DD84251CB12700612E3A /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Authentication.strings; sourceTree = ""; }; 9866DD86251CB12800612E3A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Authentication.strings; sourceTree = ""; }; 9866DD8A251CB12B00612E3A /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Authentication.strings; sourceTree = ""; }; @@ -2291,6 +2268,7 @@ C17B59572A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordGenerationPromptViewController.swift; sourceTree = ""; }; C17B59582A03AAD30055F2D1 /* PasswordGenerationPromptView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordGenerationPromptView.swift; sourceTree = ""; }; C18ED43B2AB8364400BF3805 /* FileTextPreviewDebugViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileTextPreviewDebugViewController.swift; sourceTree = ""; }; + C18ED4392AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillSettingsEnableFooterView.swift; sourceTree = ""; }; C1963862283794A000298D4D /* BookmarksCachingSearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarksCachingSearch.swift; sourceTree = ""; }; C1B0F63D2AB08904001EAF05 /* PhasedRolloutFeatureFlagTester.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhasedRolloutFeatureFlagTester.swift; sourceTree = ""; }; C1B0F63F2AB08A53001EAF05 /* PhasedRolloutFeatureFlagTesterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhasedRolloutFeatureFlagTesterTests.swift; sourceTree = ""; }; @@ -2357,6 +2335,31 @@ EE7A92862AC6DE4700832A36 /* NetworkProtectionNotificationIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionNotificationIdentifier.swift; sourceTree = ""; }; EE8594982A44791C008A6D06 /* NetworkProtectionTunnelController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionTunnelController.swift; sourceTree = ""; }; EEB8FDB92A990AEE00EBEDCF /* Configuration-Alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Configuration-Alpha.xcconfig"; path = "Configuration/Configuration-Alpha.xcconfig"; sourceTree = ""; }; + EEDFE2DB2AC6ED4F00F0E19C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2DD2AC6ED5B00F0E19C /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2DE2AC6ED5F00F0E19C /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2DF2AC6ED6300F0E19C /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E02AC6ED7300F0E19C /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E12AC6ED7500F0E19C /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E22AC6ED7700F0E19C /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E32AC6ED7900F0E19C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E42AC6ED9200F0E19C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E52AC6ED9200F0E19C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E62AC6ED9400F0E19C /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E72AC6ED9500F0E19C /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E82AC6ED9700F0E19C /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2E92AC6ED9A00F0E19C /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2EA2AC6ED9D00F0E19C /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2EB2AC6ED9D00F0E19C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2EC2AC6ED9E00F0E19C /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2ED2AC6ED9E00F0E19C /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2EE2AC6ED9F00F0E19C /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2EF2AC6EDA100F0E19C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2F02AC6EDA200F0E19C /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2F12AC6EDA300F0E19C /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2F22AC6EDA400F0E19C /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2F32AC6EDA500F0E19C /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + EEDFE2F42AC6EDA700F0E19C /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; EEEB80A22A421CE600386378 /* NetworkProtectionPacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionPacketTunnelProvider.swift; sourceTree = ""; }; EEF0F8CB2ABC832200630031 /* NetworkProtectionDebugFeatures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkProtectionDebugFeatures.swift; sourceTree = ""; }; EEFC6A5F2AC0F2F80065027D /* UserText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserText.swift; sourceTree = ""; }; @@ -2622,6 +2625,7 @@ 02025668298818B200E694E7 /* Info.plist */, 02025669298818B200E694E7 /* PacketTunnelProvider.entitlements */, EEFC6A5F2AC0F2F80065027D /* UserText.swift */, + EEDFE2DC2AC6ED4F00F0E19C /* Localizable.strings */, ); path = PacketTunnelProvider; sourceTree = ""; @@ -3246,6 +3250,7 @@ 311BD1AC2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift */, 311BD1AE2836BB4200AEF6C1 /* AutofillItemsLockedView.swift */, 2DC3FBD62FBAF21E87610FA8 /* AutofillNoAuthAvailableView.swift */, + C18ED4392AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift */, ); name = Table; sourceTree = ""; @@ -5001,7 +5006,7 @@ 988F3DD2237DE8D900AEE34C /* ForgetDataAlert.swift */, 8C4838B4221C8F7F008A6739 /* GestureToolbarButton.swift */, 8577A1C4255D2C0D00D43FCD /* HitTestingToolbar.swift */, - 84E341991E2F7EFB00BDBA6F /* Main.storyboard */, + 85DDE03F2AC6FF65006ABCA2 /* MainView.swift */, F17669D61E43401C003D3222 /* MainViewController.swift */, 981CA7E92617797500E119D5 /* MainViewController+AddFavoriteFlow.swift */, 1E4F4A59297193DE00625985 /* MainViewController+CookiesManaged.swift */, @@ -5157,7 +5162,6 @@ C13B32D12A0E750700A59236 /* AutofillSettingStatus.swift */, 319A370F28299A850079FBCE /* PasswordHider.swift */, 31C70B5428045E3500FB6AD1 /* SecureVaultErrorReporter.swift */, - 31951E94282310FF00CAF535 /* WebsiteAccountExtension.swift */, F407605328131910006B1E0B /* AutofillLoginUI */, 310C4B4A281B69BC00BA79A9 /* Management */, C17B59552A03AAC40055F2D1 /* PasswordGeneration */, @@ -5622,6 +5626,7 @@ buildActionMask = 2147483647; files = ( 0262085C2A37915D006CB755 /* ios_blocklist_075.json in Resources */, + EEDFE2DA2AC6ED4F00F0E19C /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5707,7 +5712,6 @@ 85A313972028E78A00327D00 /* release_notes.txt in Resources */, 9865DFFD22A84CF300D27829 /* FavoriteHomeCell.xib in Resources */, 1EE411FE2858B9300003FE64 /* dark-shield.json in Resources */, - 84E3419B1E2F7EFB00BDBA6F /* Main.storyboard in Resources */, 1E16260B296845120004127F /* cookie-banner-illustration-animated.json in Resources */, AA4D6AD323DE4D27007E8790 /* AppIconPurple29x29@2x.png in Resources */, AA4D6AA123DE4CC4007E8790 /* AppIconBlue60x60@3x.png in Resources */, @@ -6254,6 +6258,7 @@ 1EDE39D22705D4A200C99C72 /* FileSizeDebugViewController.swift in Sources */, 85047C772A0D5D3D00D2FF3F /* SyncSettingsViewController+SyncDelegate.swift in Sources */, 4B6484EA27FD1E350050A7A1 /* MacBrowserWaitlistView.swift in Sources */, + 85DDE0402AC6FF65006ABCA2 /* MainView.swift in Sources */, 980891A72237D5D800313A70 /* FeedbackPresenter.swift in Sources */, 989B337522D7EF2100437824 /* EmptyCollectionReusableView.swift in Sources */, 8524CC94246C5C8900E59D45 /* DaxDialogViewController.swift in Sources */, @@ -6400,6 +6405,7 @@ 1E4FAA6627D8DFC800ADC5B3 /* CompleteDownloadRowViewModel.swift in Sources */, 83004E862193E5ED00DA013C /* TabViewControllerBrowsingMenuExtension.swift in Sources */, EE72CA852A862D000043B5B3 /* NetworkProtectionDebugViewController.swift in Sources */, + C18ED43A2AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift in Sources */, CB84C7BD29A3EF530088A5B8 /* AppConfigurationURLProvider.swift in Sources */, AA3D854723D9E88E00788410 /* AppIconSettingsCell.swift in Sources */, 316931D927BD22A80095F5ED /* DownloadActionMessageViewHelper.swift in Sources */, @@ -6874,38 +6880,6 @@ name = MainInterface.storyboard; sourceTree = ""; }; - 84E341991E2F7EFB00BDBA6F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 84E3419A1E2F7EFB00BDBA6F /* Base */, - 9866DB8F251CA8F400612E3A /* bg */, - 9866DBA6251CA91800612E3A /* hr */, - 9866DBBD251CA92A00612E3A /* cs */, - 9866DBD4251CA93900612E3A /* da */, - 9866DBEB251CA94F00612E3A /* nl */, - 9866DC02251CA96200612E3A /* et */, - 9866DC19251CA99B00612E3A /* de */, - 9866DC30251CA9B000612E3A /* el */, - 9866DC47251CA9C000612E3A /* hu */, - 9866DC5E251CA9CE00612E3A /* it */, - 9866DC75251CA9E300612E3A /* lv */, - 9866DC8C251CA9F500612E3A /* lt */, - 9866DCA3251CAA0500612E3A /* pl */, - 9866DCBA251CAA2600612E3A /* ro */, - 9866DCD1251CAA3400612E3A /* sk */, - 9866DCE8251CAA4900612E3A /* sl */, - 9866DD74251CB11A00612E3A /* fi */, - 9866DD76251CB11B00612E3A /* fr */, - 9866DD7A251CB11E00612E3A /* pt */, - 9866DD7C251CB11F00612E3A /* ru */, - 9866DD7E251CB12000612E3A /* es */, - 9866DD80251CB12100612E3A /* sv */, - 9866DD82251CB12200612E3A /* tr */, - 981685472521EEF000FA91A1 /* nb */, - ); - name = Main.storyboard; - sourceTree = ""; - }; 84E3419E1E2F7EFB00BDBA6F /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -7482,6 +7456,38 @@ name = OmniBar.xib; sourceTree = ""; }; + EEDFE2DC2AC6ED4F00F0E19C /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + EEDFE2DB2AC6ED4F00F0E19C /* en */, + EEDFE2DD2AC6ED5B00F0E19C /* bg */, + EEDFE2DE2AC6ED5F00F0E19C /* da */, + EEDFE2DF2AC6ED6300F0E19C /* cs */, + EEDFE2E02AC6ED7300F0E19C /* nl */, + EEDFE2E12AC6ED7500F0E19C /* et */, + EEDFE2E22AC6ED7700F0E19C /* hr */, + EEDFE2E32AC6ED7900F0E19C /* fi */, + EEDFE2E42AC6ED9200F0E19C /* fr */, + EEDFE2E52AC6ED9200F0E19C /* de */, + EEDFE2E62AC6ED9400F0E19C /* el */, + EEDFE2E72AC6ED9500F0E19C /* hu */, + EEDFE2E82AC6ED9700F0E19C /* it */, + EEDFE2E92AC6ED9A00F0E19C /* lv */, + EEDFE2EA2AC6ED9D00F0E19C /* lt */, + EEDFE2EB2AC6ED9D00F0E19C /* nb */, + EEDFE2EC2AC6ED9E00F0E19C /* pl */, + EEDFE2ED2AC6ED9E00F0E19C /* pt */, + EEDFE2EE2AC6ED9F00F0E19C /* ro */, + EEDFE2EF2AC6EDA100F0E19C /* ru */, + EEDFE2F02AC6EDA200F0E19C /* sk */, + EEDFE2F12AC6EDA300F0E19C /* sl */, + EEDFE2F22AC6EDA400F0E19C /* es */, + EEDFE2F32AC6EDA500F0E19C /* sv */, + EEDFE2F42AC6EDA700F0E19C /* tr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; F176699D1E40BC86003D3222 /* Settings.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift index c17f13e4fd..854b0440c6 100644 --- a/DuckDuckGo/AppDelegate.swift +++ b/DuckDuckGo/AppDelegate.swift @@ -209,19 +209,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { syncService.initializeIfNeeded() self.syncService = syncService - let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main) - - guard let main = storyboard.instantiateInitialViewController(creator: { coder in - MainViewController(coder: coder, - bookmarksDatabase: self.bookmarksDatabase, - bookmarksDatabaseCleaner: self.syncDataProviders.bookmarksAdapter.databaseCleaner, - appTrackingProtectionDatabase: self.appTrackingProtectionDatabase, - syncService: self.syncService, - syncDataProviders: self.syncDataProviders) - }) else { - fatalError("Could not load MainViewController") - } - + let main = MainViewController(bookmarksDatabase: bookmarksDatabase, + bookmarksDatabaseCleaner: syncDataProviders.bookmarksAdapter.databaseCleaner, + appTrackingProtectionDatabase: appTrackingProtectionDatabase, + syncService: syncService, + syncDataProviders: syncDataProviders) + main.loadViewIfNeeded() + window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = main window?.makeKeyAndVisible() diff --git a/DuckDuckGo/AutofillItemsEmptyView.swift b/DuckDuckGo/AutofillItemsEmptyView.swift index 1c71d14388..6ef8c058cb 100644 --- a/DuckDuckGo/AutofillItemsEmptyView.swift +++ b/DuckDuckGo/AutofillItemsEmptyView.swift @@ -23,10 +23,10 @@ import DuckUI class AutofillItemsEmptyView: UIView { private enum Constants { - static let defaultPadding: CGFloat = 15 - static let portraitPaddingImageTitle: CGFloat = 8 - static let portraitPaddingTitleSubtitle: CGFloat = 27 - static let portraitPaddingTitle: CGFloat = 24 + static let imageHeight: CGFloat = 170.0 + static let imageWidth: CGFloat = 220.0 + static let maxWidth: CGFloat = 250.0 + static let topPadding: CGFloat = -64 } override init(frame: CGRect) { @@ -53,24 +53,11 @@ class AutofillItemsEmptyView: UIView { return label }() - - private lazy var subtitle: UILabel = { - let label = UILabel(frame: CGRect.zero) - label.numberOfLines = 0 - label.lineBreakMode = .byWordWrapping - label.textAlignment = .center - label.font = .preferredFont(forTextStyle: .footnote) - label.textColor = .gray70 - label.text = UserText.autofillEmptyViewSubtitle - return label - }() - private lazy var imageView: UIImageView = { - let image = UIImage(named: "AutofillKey") - let imageView = UIImageView(image: image) + let imageView = UIImageView(image: .autofillKey) imageView.contentMode = .scaleAspectFit - imageView.frame = CGRect(x: 0, y: 0, width: 220, height: 170) + imageView.frame = CGRect(x: 0, y: 0, width: Constants.imageWidth, height: Constants.imageHeight) return imageView }() @@ -81,51 +68,36 @@ class AutofillItemsEmptyView: UIView { return stackView }() - private lazy var outerStackContentView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [stackContentView, subtitle]) - stackView.axis = .vertical - return stackView - }() - private lazy var centerYConstraint: NSLayoutConstraint = { NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, - toItem: outerStackContentView, + toItem: stackContentView, attribute: .centerY, multiplier: 1.1, constant: 0) }() - private lazy var widthConstraintIPhonePortrait: NSLayoutConstraint = { - outerStackContentView.widthAnchor.constraint(equalToConstant: 250) - }() - private lazy var topConstraintIPhonePortrait: NSLayoutConstraint = { NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, - toItem: outerStackContentView, + toItem: stackContentView, attribute: .top, multiplier: 1, - constant: -66) + constant: Constants.topPadding) }() private func installSubviews() { addSubview(stackContentView) - addSubview(subtitle) - addSubview(outerStackContentView) } private func installConstraints() { stackContentView.translatesAutoresizingMaskIntoConstraints = false - subtitle.translatesAutoresizingMaskIntoConstraints = false - outerStackContentView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ - outerStackContentView.centerXAnchor.constraint(equalTo: centerXAnchor), - outerStackContentView.leadingAnchor.constraint(greaterThanOrEqualTo: leadingAnchor, constant: 16), - outerStackContentView.trailingAnchor.constraint(greaterThanOrEqualTo: trailingAnchor, constant: -16) + stackContentView.widthAnchor.constraint(equalToConstant: Constants.maxWidth), + stackContentView.centerXAnchor.constraint(equalTo: centerXAnchor), ]) refreshConstraints() @@ -134,20 +106,12 @@ class AutofillItemsEmptyView: UIView { func refreshConstraints() { let isIPhonePortrait = traitCollection.verticalSizeClass == .regular && traitCollection.horizontalSizeClass == .compact - if isIPhonePortrait { - centerYConstraint.isActive = !isIPhonePortrait - topConstraintIPhonePortrait.isActive = isIPhonePortrait - widthConstraintIPhonePortrait.isActive = isIPhonePortrait - stackContentView.spacing = Constants.portraitPaddingImageTitle - outerStackContentView.spacing = Constants.portraitPaddingTitleSubtitle + Constants.portraitPaddingTitle - } else { - topConstraintIPhonePortrait.isActive = isIPhonePortrait - widthConstraintIPhonePortrait.isActive = isIPhonePortrait - centerYConstraint.isActive = !isIPhonePortrait - stackContentView.spacing = Constants.defaultPadding - outerStackContentView.spacing = Constants.defaultPadding - } - invalidateIntrinsicContentSize() + centerYConstraint.isActive = !isIPhonePortrait + topConstraintIPhonePortrait.isActive = isIPhonePortrait + } + + func adjustHeight(to newHeight: CGFloat) { + frame.size.height = newHeight } } @@ -155,6 +119,9 @@ extension AutofillItemsEmptyView: Themable { func decorate(with theme: Theme) { title.textColor = theme.autofillDefaultTitleTextColor - subtitle.textColor = theme.autofillDefaultSubtitleTextColor } } + +private extension UIImage { + static let autofillKey = UIImage(named: "AutofillKey") +} diff --git a/DuckDuckGo/AutofillLoginSettingsListViewController.swift b/DuckDuckGo/AutofillLoginSettingsListViewController.swift index b6597967fe..6e502b8619 100644 --- a/DuckDuckGo/AutofillLoginSettingsListViewController.swift +++ b/DuckDuckGo/AutofillLoginSettingsListViewController.swift @@ -40,8 +40,9 @@ final class AutofillLoginSettingsListViewController: UIViewController { weak var delegate: AutofillLoginSettingsListViewControllerDelegate? weak var detailsViewController: AutofillLoginDetailsViewController? private let viewModel: AutofillLoginListViewModel - private let emptyView = AutofillItemsEmptyView() + private lazy var emptyView = AutofillItemsEmptyView() private let lockedView = AutofillItemsLockedView() + private let enableAutofillFooterView = AutofillSettingsEnableFooterView() private let emptySearchView = AutofillEmptySearchView() private let noAuthAvailableView = AutofillNoAuthAvailableView() private let tld: TLD = AppDependencyProvider.shared.storageCache.tld @@ -73,6 +74,7 @@ final class AutofillLoginSettingsListViewController: UIViewController { tableView.delegate = self tableView.dataSource = self tableView.estimatedRowHeight = 60 + tableView.estimatedSectionFooterHeight = 40 tableView.registerCell(ofType: AutofillListItemTableViewCell.self) tableView.registerCell(ofType: EnableAutofillSettingsTableViewCell.self) // Have to set tableHeaderView height otherwise tableView content will jump when adding / removing searchController due to tableView insetGrouped style @@ -154,12 +156,21 @@ final class AutofillLoginSettingsListViewController: UIViewController { } } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + guard viewModel.viewState == .empty else { return } + adjustEmptyViewFooterSize() + } + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) coordinator.animate(alongsideTransition: { _ in self.updateConstraintConstants() - self.emptyView.refreshConstraints() + if self.viewModel.viewState == .empty { + self.emptyView.refreshConstraints() + } if self.view.subviews.contains(self.noAuthAvailableView) { self.noAuthAvailableView.refreshConstraints() } @@ -291,38 +302,38 @@ final class AutofillLoginSettingsListViewController: UIViewController { switch viewModel.viewState { case .showItems: - emptyView.isHidden = true + tableView.tableFooterView = nil tableView.isHidden = false lockedView.isHidden = true noAuthAvailableView.isHidden = true emptySearchView.isHidden = true case .noAuthAvailable: - emptyView.isHidden = true + tableView.tableFooterView = nil tableView.isHidden = true lockedView.isHidden = true noAuthAvailableView.isHidden = false emptySearchView.isHidden = true case .authLocked: - emptyView.isHidden = true + tableView.tableFooterView = nil tableView.isHidden = true lockedView.isHidden = false noAuthAvailableView.isHidden = true emptySearchView.isHidden = true case .empty: - emptyView.isHidden = false + tableView.tableFooterView = emptyView tableView.isHidden = false setEditing(false, animated: false) lockedView.isHidden = true noAuthAvailableView.isHidden = true emptySearchView.isHidden = true case .searching: - emptyView.isHidden = true + tableView.tableFooterView = nil tableView.isHidden = false lockedView.isHidden = true noAuthAvailableView.isHidden = true emptySearchView.isHidden = true case .searchingNoResults: - emptyView.isHidden = true + tableView.tableFooterView = nil tableView.isHidden = false lockedView.isHidden = true noAuthAvailableView.isHidden = true @@ -431,6 +442,15 @@ final class AutofillLoginSettingsListViewController: UIViewController { } } + // Adjust the footer size based on remaining space + private func adjustEmptyViewFooterSize() { + // Temporarily remove the footer + tableView.tableFooterView = nil + let remainingHeight = tableView.frame.height - tableView.contentSize.height - view.safeAreaInsets.bottom - view.safeAreaInsets.top + emptyView.adjustHeight(to: max(remainingHeight, 0)) + tableView.tableFooterView = emptyView + } + // MARK: Cell Methods private func credentialCell(for tableView: UITableView, item: AutofillLoginListItemViewModel, indexPath: IndexPath) -> AutofillListItemTableViewCell { @@ -478,7 +498,9 @@ extension AutofillLoginSettingsListViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { switch viewModel.viewState { case .empty: - return emptyView + return viewModel.sections[section] == .enableAutofill ? enableAutofillFooterView : nil + case .showItems: + return viewModel.sections[section] == .enableAutofill ? enableAutofillFooterView : nil default: return nil } @@ -487,9 +509,15 @@ extension AutofillLoginSettingsListViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { switch viewModel.viewState { case .empty: - return max(tableView.bounds.height - tableView.contentSize.height, 250) + if viewModel.sections[section] == .enableAutofill { + return enableAutofillFooterView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height + } + return 0 case .showItems: - return 10 + if viewModel.sections[section] == .enableAutofill { + return enableAutofillFooterView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height + } + return 10.0 default: return 0 } diff --git a/DuckDuckGo/AutofillSettingsEnableFooterView.swift b/DuckDuckGo/AutofillSettingsEnableFooterView.swift new file mode 100644 index 0000000000..488a53ac4b --- /dev/null +++ b/DuckDuckGo/AutofillSettingsEnableFooterView.swift @@ -0,0 +1,65 @@ +// +// AutofillSettingsEnableFooterView.swift +// DuckDuckGo +// +// Copyright © 2023 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +class AutofillSettingsEnableFooterView: UIView { + + private enum Constants { + static let topPadding: CGFloat = 8 + static let defaultPadding: CGFloat = 16 + } + + override init(frame: CGRect) { + super.init(frame: frame) + installSubviews() + installConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private lazy var title: UILabel = { + let label = UILabel(frame: CGRect.zero) + label.font = .preferredFont(forTextStyle: .footnote) + label.numberOfLines = 0 + label.textAlignment = .left + label.lineBreakMode = .byWordWrapping + label.textColor = UIColor(designSystemColor: .textSecondary) + label.text = UserText.autofillEmptyViewSubtitle + + return label + }() + + private func installSubviews() { + addSubview(title) + } + + private func installConstraints() { + title.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + title.topAnchor.constraint(equalTo: self.topAnchor, constant: Constants.topPadding), + title.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -Constants.defaultPadding), + title.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: Constants.defaultPadding), + title.trailingAnchor.constraint(lessThanOrEqualTo: self.trailingAnchor, constant: -Constants.defaultPadding) + ]) + } +} diff --git a/DuckDuckGo/AutofillViews.swift b/DuckDuckGo/AutofillViews.swift index f11649b090..8dab1a504d 100644 --- a/DuckDuckGo/AutofillViews.swift +++ b/DuckDuckGo/AutofillViews.swift @@ -77,7 +77,7 @@ struct AutofillViews { Text(title) .daxTitle3() .foregroundColor(Color(designSystemColor: .textPrimary)) - .frame(maxWidth: .infinity) + .frame(maxWidth: Const.Size.maxWidth) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) } @@ -92,6 +92,7 @@ struct AutofillViews { .foregroundColor(Color(designSystemColor: .textSecondary)) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: Const.Size.maxWidth) } } @@ -106,7 +107,7 @@ struct AutofillViews { Text(title) .daxButton() .padding() - .frame(minWidth: 0, maxWidth: .infinity) + .frame(minWidth: 0, maxWidth: Const.Size.maxWidth) .foregroundColor(.white) .background(Color(designSystemColor: .accent)) .cornerRadius(Const.Size.buttonCornerRadius) @@ -126,7 +127,7 @@ struct AutofillViews { Text(title) .daxButton() .padding() - .frame(minWidth: 0, maxWidth: .infinity) + .frame(minWidth: 0, maxWidth: Const.Size.maxWidth) .foregroundColor(Color(designSystemColor: .accent)) .cornerRadius(Const.Size.buttonCornerRadius) .fixedSize(horizontal: false, vertical: true) @@ -234,6 +235,7 @@ private enum Const { static let buttonCornerRadius: CGFloat = 8.0 static let buttonBorderWidth: CGFloat = 1.0 static let smallDevice: CGFloat = 320.0 + static let maxWidth: CGFloat = 480.0 } } diff --git a/DuckDuckGo/BrowserChromeManager.swift b/DuckDuckGo/BrowserChromeManager.swift index d14af209d9..183f4b87d0 100644 --- a/DuckDuckGo/BrowserChromeManager.swift +++ b/DuckDuckGo/BrowserChromeManager.swift @@ -32,7 +32,7 @@ protocol BrowserChromeDelegate: AnyObject { var barsMaxHeight: CGFloat { get } var omniBar: OmniBar! { get } - var tabsBar: UIView! { get } + var tabBarContainer: UIView { get } } class BrowserChromeManager: NSObject, UIScrollViewDelegate { diff --git a/DuckDuckGo/EmailAddressPromptView.swift b/DuckDuckGo/EmailAddressPromptView.swift index 97f5cbbccf..a5e2ebaf30 100644 --- a/DuckDuckGo/EmailAddressPromptView.swift +++ b/DuckDuckGo/EmailAddressPromptView.swift @@ -130,9 +130,9 @@ private struct EmailAddressRow: View { } } - .background(Color(designSystemColor: .container)) .cornerRadius(Const.Size.cornerRadius) + .frame(maxWidth: Const.Size.maxWidth) } } @@ -154,6 +154,7 @@ private enum Const { static let rowVerticalSpacing: CGFloat = 3.0 static let rowVerticalPadding: CGFloat = 11.0 static let cornerRadius: CGFloat = 8.0 + static let maxWidth: CGFloat = 480.0 } } diff --git a/DuckDuckGo/HomeViewController.swift b/DuckDuckGo/HomeViewController.swift index f1d31543bb..f938dca3c1 100644 --- a/DuckDuckGo/HomeViewController.swift +++ b/DuckDuckGo/HomeViewController.swift @@ -51,7 +51,7 @@ class HomeViewController: UIViewController { delegate?.home(self, searchTransitionUpdated: percent) chromeDelegate?.omniBar.alpha = percent - chromeDelegate?.tabsBar.alpha = percent + chromeDelegate?.tabBarContainer.alpha = percent } } diff --git a/DuckDuckGo/MainView.swift b/DuckDuckGo/MainView.swift new file mode 100644 index 0000000000..c22ef7a3f8 --- /dev/null +++ b/DuckDuckGo/MainView.swift @@ -0,0 +1,335 @@ +// +// MainView.swift +// DuckDuckGo +// +// Copyright © 2023 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +class MainViewFactory { + + private let coordinator: MainViewCoordinator + + var superview: UIView { + coordinator.superview + } + + private init(_ superview: UIView) { + coordinator = MainViewCoordinator(superview: superview) + } + + static func createViewHierarchy(_ superview: UIView) -> MainViewCoordinator { + let factory = MainViewFactory(superview) + + factory.createViews() + factory.disableAutoresizingOnViewAndImmediateSubviews(superview) + factory.constrainViews() + + return factory.coordinator + } + + private func disableAutoresizingOnViewAndImmediateSubviews(_ view: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + view.subviews.forEach { + $0.translatesAutoresizingMaskIntoConstraints = false + } + } + +} + +/// Create functions. The lightweight subclases of UIView make it easier to debug to the UI. +extension MainViewFactory { + + private func createViews() { + createLogoBackground() + createContentContainer() + createSuggestionTrayContainer() + createNotificationBarContainer() + createStatusBackground() + createTabBarContainer() + createNavigationBarContainer() + createProgressView() + createToolbar() + } + + private func createProgressView() { + coordinator.progress = ProgressView() + superview.addSubview(coordinator.progress) + } + + class NavigationBarContainer: UIView { } + private func createNavigationBarContainer() { + coordinator.navigationBarContainer = NavigationBarContainer() + superview.addSubview(coordinator.navigationBarContainer) + } + + class NotificationBarContainer: UIView { } + private func createNotificationBarContainer() { + coordinator.notificationBarContainer = NotificationBarContainer() + superview.addSubview(coordinator.notificationBarContainer) + } + + class ContentContainer: UIView { } + private func createContentContainer() { + coordinator.contentContainer = ContentContainer() + superview.addSubview(coordinator.contentContainer) + } + + class StatusBackgroundView: UIView { } + private func createStatusBackground() { + coordinator.statusBackground = StatusBackgroundView() + superview.addSubview(coordinator.statusBackground) + } + + class TabBarContainer: UIView { } + private func createTabBarContainer() { + coordinator.tabBarContainer = TabBarContainer() + superview.addSubview(coordinator.tabBarContainer) + } + + class SuggestionTrayContainer: UIView { } + private func createSuggestionTrayContainer() { + coordinator.suggestionTrayContainer = SuggestionTrayContainer() + coordinator.suggestionTrayContainer.isHidden = true + coordinator.suggestionTrayContainer.backgroundColor = .clear + superview.addSubview(coordinator.suggestionTrayContainer) + } + + private func createToolbar() { + + coordinator.toolbar = HitTestingToolbar() + coordinator.toolbarBackButton = UIBarButtonItem(title: UserText.keyCommandBrowserBack, image: UIImage(named: "BrowsePrevious")) + coordinator.toolbarForwardButton = UIBarButtonItem(title: UserText.keyCommandBrowserForward, image: UIImage(named: "BrowseNext")) + coordinator.toolbarFireButton = UIBarButtonItem(title: UserText.actionForgetAll, image: UIImage(named: "Fire")) + coordinator.toolbarTabSwitcherButton = UIBarButtonItem(title: UserText.tabSwitcherAccessibilityLabel, image: UIImage(named: "Add-24")) + coordinator.lastToolbarButton = UIBarButtonItem(title: UserText.actionOpenBookmarks, image: UIImage(named: "Book-24")) + superview.addSubview(coordinator.toolbar) + + coordinator.toolbar.setItems([ + coordinator.toolbarBackButton!, + .flexibleSpace(), + coordinator.toolbarForwardButton!, + .flexibleSpace(), + coordinator.toolbarFireButton!, + .flexibleSpace(), + coordinator.toolbarTabSwitcherButton!, + .flexibleSpace(), + coordinator.lastToolbarButton!, + ], animated: true) + } + + class LogoBackgroundView: UIView { } + private func createLogoBackground() { + coordinator.logoContainer = LogoBackgroundView() + coordinator.logo = UIImageView(image: UIImage(named: "Logo")) + coordinator.logoText = UIImageView(image: UIImage(named: "TextDuckDuckGo")) + + coordinator.logoContainer.backgroundColor = .clear + coordinator.logoContainer.addSubview(coordinator.logo) + coordinator.logoContainer.addSubview(coordinator.logoText) + superview.addSubview(coordinator.logoContainer) + + disableAutoresizingOnViewAndImmediateSubviews(coordinator.logoContainer) + } + +} + +/// Add constraint functions +extension MainViewFactory { + + private func constrainViews() { + constrainLogoBackground() + constrainContentContainer() + constrainSuggestionTrayContainer() + constrainNotificationBarContainer() + constrainStatusBackground() + constrainTabBarContainer() + constrainNavigationBarContainer() + constrainProgress() + constrainToolbar() + } + + private func constrainProgress() { + let progress = coordinator.progress! + let navigationBarContainer = coordinator.navigationBarContainer! + NSLayoutConstraint.activate([ + progress.constrainView(navigationBarContainer, by: .trailing), + progress.constrainView(navigationBarContainer, by: .leading), + progress.constrainAttribute(.height, to: 3), + progress.constrainView(navigationBarContainer, by: .top, to: .bottom), + ]) + } + + private func constrainNavigationBarContainer() { + let navigationBarContainer = coordinator.navigationBarContainer! + + coordinator.constraints.navigationBarContainerTop = navigationBarContainer.constrainView(superview.safeAreaLayoutGuide, by: .top) + + NSLayoutConstraint.activate([ + navigationBarContainer.constrainView(superview, by: .centerX), + navigationBarContainer.constrainView(superview, by: .width), + coordinator.constraints.navigationBarContainerTop, + navigationBarContainer.constrainAttribute(.height, to: 52), + ]) + } + + private func constrainTabBarContainer() { + let tabBarContainer = coordinator.tabBarContainer! + + coordinator.constraints.tabBarContainerTop = tabBarContainer.constrainView(superview.safeAreaLayoutGuide, by: .top) + + NSLayoutConstraint.activate([ + tabBarContainer.constrainView(superview, by: .leading), + tabBarContainer.constrainView(superview, by: .trailing), + tabBarContainer.constrainAttribute(.height, to: 40), + coordinator.constraints.tabBarContainerTop, + ]) + } + + private func constrainStatusBackground() { + let statusBackground = coordinator.statusBackground! + let navigationBarContainer = coordinator.navigationBarContainer! + NSLayoutConstraint.activate([ + statusBackground.constrainView(superview, by: .width), + statusBackground.constrainView(superview, by: .centerX), + statusBackground.constrainView(superview, by: .top), + statusBackground.constrainView(navigationBarContainer, by: .bottom), + ]) + } + + private func constrainNotificationBarContainer() { + let notificationBarContainer = coordinator.notificationBarContainer! + let contentContainer = coordinator.contentContainer! + let navigationBarContainer = coordinator.navigationBarContainer! + + coordinator.constraints.notificationContainerTop = notificationBarContainer.constrainView(navigationBarContainer, by: .top, to: .bottom) + coordinator.constraints.notificationContainerHeight = notificationBarContainer.constrainAttribute(.height, to: 0) + + NSLayoutConstraint.activate([ + notificationBarContainer.constrainView(superview, by: .width), + notificationBarContainer.constrainView(superview, by: .centerX), + coordinator.constraints.notificationContainerHeight, + notificationBarContainer.constrainView(contentContainer, by: .bottom, to: .top), + coordinator.constraints.notificationContainerTop, + ]) + } + + private func constrainContentContainer() { + let contentContainer = coordinator.contentContainer! + let toolbar = coordinator.toolbar! + let notificationBarContainer = coordinator.notificationBarContainer! + + coordinator.constraints.contentContainerTop = contentContainer.constrainView(notificationBarContainer, by: .top, to: .bottom) + + NSLayoutConstraint.activate([ + contentContainer.constrainView(superview, by: .leading), + contentContainer.constrainView(superview, by: .trailing), + contentContainer.constrainView(toolbar, by: .bottom, to: .top), + coordinator.constraints.contentContainerTop, + ]) + } + + private func constrainToolbar() { + let toolbar = coordinator.toolbar! + coordinator.constraints.toolbarBottom = toolbar.constrainView(superview.safeAreaLayoutGuide, by: .bottom) + NSLayoutConstraint.activate([ + toolbar.constrainView(superview, by: .width), + toolbar.constrainView(superview, by: .centerX), + toolbar.constrainAttribute(.height, to: 49), + coordinator.constraints.toolbarBottom, + ]) + } + + private func constrainSuggestionTrayContainer() { + let suggestionTrayContainer = coordinator.suggestionTrayContainer! + let contentContainer = coordinator.contentContainer! + NSLayoutConstraint.activate([ + suggestionTrayContainer.constrainView(contentContainer, by: .width), + suggestionTrayContainer.constrainView(contentContainer, by: .height), + suggestionTrayContainer.constrainView(contentContainer, by: .centerX), + suggestionTrayContainer.constrainView(contentContainer, by: .centerY), + ]) + } + + private func constrainLogoBackground() { + let logoContainer = coordinator.logoContainer! + let logo = coordinator.logo! + let text = coordinator.logoText! + NSLayoutConstraint.activate([ + logoContainer.constrainView(superview, by: .width), + logoContainer.constrainView(superview, by: .height), + logoContainer.constrainView(superview, by: .centerX), + logoContainer.constrainView(superview, by: .centerY), + logo.constrainView(logoContainer, by: .centerX), + logo.constrainView(logoContainer, by: .centerY, constant: -72), + logo.constrainAttribute(.width, to: 96), + logo.constrainAttribute(.height, to: 96), + text.constrainView(logo, by: .top, to: .bottom, constant: 12), + text.constrainView(logo, by: .centerX), + ]) + } + +} + +class MainViewCoordinator { + + let superview: UIView + + var logoContainer: UIView! + var logo: UIImageView! + var logoText: UIImageView! + var toolbar: UIToolbar! + var suggestionTrayContainer: UIView! + var contentContainer: UIView! + var notificationBarContainer: UIView! + var statusBackground: UIView! + var tabBarContainer: UIView! + var navigationBarContainer: UIView! + var progress: ProgressView! + var toolbarBackButton: UIBarButtonItem! + var toolbarForwardButton: UIBarButtonItem! + var toolbarFireButton: UIBarButtonItem! + var toolbarTabSwitcherButton: UIBarButtonItem! + var lastToolbarButton: UIBarButtonItem! + + let constraints = Constraints() + + fileprivate init(superview: UIView) { + self.superview = superview + } + + func decorateWithTheme(_ theme: Theme) { + superview.backgroundColor = theme.mainViewBackgroundColor + logoText.tintColor = theme.ddgTextTintColor + } + + func hideSuggestionTray() { + suggestionTrayContainer.isHidden = true + suggestionTrayContainer.backgroundColor = .clear + } + + class Constraints { + + var navigationBarContainerTop: NSLayoutConstraint! + var toolbarBottom: NSLayoutConstraint! + var contentContainerTop: NSLayoutConstraint! + var tabBarContainerTop: NSLayoutConstraint! + var notificationContainerTop: NSLayoutConstraint! + var notificationContainerHeight: NSLayoutConstraint! + + } + +} diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index f1fc1936da..ceda17d760 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -31,8 +31,8 @@ import Persistence import PrivacyDashboard import Networking -// swiftlint:disable type_body_length // swiftlint:disable file_length +// swiftlint:disable type_body_length class MainViewController: UIViewController { // swiftlint:enable type_body_length @@ -45,34 +45,6 @@ class MainViewController: UIViewController { return isIPad ? [.left, .right] : [] } - - @IBOutlet weak var progressView: ProgressView! - - @IBOutlet weak var suggestionTrayContainer: UIView! - @IBOutlet weak var customNavigationBar: UIView! - @IBOutlet weak var containerView: UIView! - @IBOutlet weak var fireButton: UIBarButtonItem! - @IBOutlet weak var lastToolbarButton: UIBarButtonItem! - @IBOutlet weak var backButton: UIBarButtonItem! - @IBOutlet weak var forwardButton: UIBarButtonItem! - @IBOutlet weak var tabsButton: UIBarButtonItem! - @IBOutlet weak var toolbar: UIToolbar! - @IBOutlet weak var navBarTop: NSLayoutConstraint! - @IBOutlet weak var toolbarBottom: NSLayoutConstraint! - @IBOutlet weak var containerViewTop: NSLayoutConstraint! - - @IBOutlet weak var tabsBar: UIView! - @IBOutlet weak var tabsBarTop: NSLayoutConstraint! - - @IBOutlet weak var notificationContainer: UIView! - @IBOutlet weak var notificationContainerTop: NSLayoutConstraint! - @IBOutlet weak var notificationContainerHeight: NSLayoutConstraint! - - @IBOutlet weak var statusBarBackground: UIView! - - @IBOutlet weak var logoContainer: UIView! - @IBOutlet weak var logo: UIImageView! - @IBOutlet weak var logoText: UIImageView! weak var findInPageView: FindInPageView! weak var findInPageHeightLayoutConstraint: NSLayoutConstraint! @@ -85,12 +57,12 @@ class MainViewController: UIViewController { var allowContentUnderflow = false { didSet { - containerViewTop.constant = allowContentUnderflow ? contentUnderflow : 0 + viewCoordinator.constraints.contentContainerTop.constant = allowContentUnderflow ? contentUnderflow : 0 } } var contentUnderflow: CGFloat { - return 3 + (allowContentUnderflow ? -customNavigationBar.frame.size.height : 0) + return 3 + (allowContentUnderflow ? -viewCoordinator.navigationBarContainer.frame.size.height : 0) } lazy var emailManager: EmailManager = { @@ -147,12 +119,18 @@ class MainViewController: UIViewController { // Skip SERP flow (focusing on autocomplete logic) and prepare for new navigation when selecting search bar private var skipSERPFlow = true - required init?(coder: NSCoder, - bookmarksDatabase: CoreDataDatabase, - bookmarksDatabaseCleaner: BookmarkDatabaseCleaner, - appTrackingProtectionDatabase: CoreDataDatabase, - syncService: DDGSyncing, - syncDataProviders: SyncDataProviders + required init?(coder: NSCoder) { + fatalError("Use init?(code:") + } + + var viewCoordinator: MainViewCoordinator! + + init( + bookmarksDatabase: CoreDataDatabase, + bookmarksDatabaseCleaner: BookmarkDatabaseCleaner, + appTrackingProtectionDatabase: CoreDataDatabase, + syncService: DDGSyncing, + syncDataProviders: SyncDataProviders ) { self.appTrackingProtectionDatabase = appTrackingProtectionDatabase self.bookmarksDatabase = bookmarksDatabase @@ -161,12 +139,10 @@ class MainViewController: UIViewController { self.syncDataProviders = syncDataProviders self.favoritesViewModel = FavoritesListViewModel(bookmarksDatabase: bookmarksDatabase) self.bookmarksCachingSearch = BookmarksCachingSearch(bookmarksStore: CoreDataBookmarksSearchStore(bookmarksStore: bookmarksDatabase)) - super.init(coder: coder) - bindSyncService() - } - required init?(coder: NSCoder) { - fatalError("Use init?(code:") + super.init(nibName: nil, bundle: nil) + + bindSyncService() } fileprivate var tabCountInfo: TabCountInfo? @@ -197,6 +173,12 @@ class MainViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + viewCoordinator = MainViewFactory.createViewHierarchy(self.view) + + viewCoordinator.toolbarBackButton.action = #selector(onBackPressed) + viewCoordinator.toolbarForwardButton.action = #selector(onForwardPressed) + viewCoordinator.toolbarFireButton.action = #selector(onFirePressed) + loadSuggestionTray() loadTabsBarIfNeeded() loadFindInPage() @@ -237,6 +219,9 @@ class MainViewController: UIViewController { startOnboardingFlowIfNotSeenBefore() tabsBarController?.refresh(tabsModel: tabManager.model) + _ = AppWidthObserver.shared.willResize(toWidth: view.frame.width) + applyWidth() + if DaxDialogs.shared.shouldShowFireButtonPulse { showFireButtonPulse() } @@ -259,8 +244,8 @@ class MainViewController: UIViewController { return } - controller.view.frame = suggestionTrayContainer.bounds - suggestionTrayContainer.addSubview(controller.view) + controller.view.frame = viewCoordinator.suggestionTrayContainer.bounds + viewCoordinator.suggestionTrayContainer.addSubview(controller.view) controller.dismissHandler = dismissSuggestionTray controller.autocompleteDelegate = self @@ -273,9 +258,9 @@ class MainViewController: UIViewController { let storyboard = UIStoryboard(name: "TabSwitcher", bundle: nil) let controller: TabsBarViewController = storyboard.instantiateViewController(identifier: "TabsBar") - controller.view.frame = tabsBar.bounds + controller.view.frame = viewCoordinator.tabBarContainer.bounds controller.delegate = self - tabsBar.addSubview(controller.view) + viewCoordinator.tabBarContainer.addSubview(controller.view) tabsBarController = controller } @@ -358,15 +343,15 @@ class MainViewController: UIViewController { private func initTabButton() { tabSwitcherButton.delegate = self - tabsButton.customView = tabSwitcherButton - tabsButton.isAccessibilityElement = true - tabsButton.accessibilityTraits = .button + viewCoordinator.toolbarTabSwitcherButton.customView = tabSwitcherButton + viewCoordinator.toolbarTabSwitcherButton.isAccessibilityElement = true + viewCoordinator.toolbarTabSwitcherButton.accessibilityTraits = .button } private func initMenuButton() { - lastToolbarButton.customView = menuButton - lastToolbarButton.isAccessibilityElement = true - lastToolbarButton.accessibilityTraits = .button + viewCoordinator.lastToolbarButton.customView = menuButton + viewCoordinator.lastToolbarButton.isAccessibilityElement = true + viewCoordinator.lastToolbarButton.accessibilityTraits = .button menuButton.delegate = self } @@ -409,21 +394,6 @@ class MainViewController: UIViewController { Pixel.fire(pixel: .tabBarBookmarksLongPressed) currentTab?.saveAsBookmark(favorite: true, viewModel: menuBookmarksViewModel) } - - @IBSegueAction func onCreateSuggestionTray(_ coder: NSCoder, sender: Any?, segueIdentifier: String?) -> SuggestionTrayViewController { - guard let controller = SuggestionTrayViewController(coder: coder, - favoritesViewModel: favoritesViewModel, - bookmarksSearch: bookmarksCachingSearch) else { - fatalError("Failed to create controller") - } - - controller.dismissHandler = dismissSuggestionTray - controller.autocompleteDelegate = self - controller.favoritesOverlayDelegate = self - suggestionTrayController = controller - - return controller - } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) @@ -512,12 +482,12 @@ class MainViewController: UIViewController { omniBar = OmniBar.loadFromXib() omniBar.omniDelegate = self omniBar.menuButtonContent.delegate = self - omniBar.frame = customNavigationBar.bounds - customNavigationBar.addSubview(omniBar) + omniBar.frame = viewCoordinator.navigationBarContainer.bounds + viewCoordinator.navigationBarContainer.addSubview(omniBar) } fileprivate func attachHomeScreen() { - logoContainer.isHidden = false + viewCoordinator.logoContainer.isHidden = false findInPageView.isHidden = true chromeManager.detach() @@ -558,7 +528,7 @@ class MainViewController: UIViewController { let alert = ForgetDataAlert.buildAlert(forgetTabsAndDataHandler: { [weak self] in self?.forgetAllWithAnimation {} }) - self.present(controller: alert, fromView: self.toolbar) + self.present(controller: alert, fromView: self.viewCoordinator.toolbar) } } @@ -607,7 +577,7 @@ class MainViewController: UIViewController { func loadUrlInNewTab(_ url: URL, reuseExisting: Bool = false, inheritedAttribution: AdClickAttributionLogic.State?) { allowContentUnderflow = false - customNavigationBar.alpha = 1 + viewCoordinator.navigationBarContainer.alpha = 1 loadViewIfNeeded() if reuseExisting, let existing = tabManager.first(withUrl: url) { selectTab(existing) @@ -662,7 +632,7 @@ class MainViewController: UIViewController { } private func prepareTabForRequest(request: () -> Void) { - customNavigationBar.alpha = 1 + viewCoordinator.navigationBarContainer.alpha = 1 allowContentUnderflow = false request() guard let tab = currentTab else { fatalError("no tab") } @@ -677,7 +647,7 @@ class MainViewController: UIViewController { } func select(tabAt index: Int) { - customNavigationBar.alpha = 1 + viewCoordinator.navigationBarContainer.alpha = 1 allowContentUnderflow = false let tab = tabManager.select(tabAt: index) select(tab: tab) @@ -702,16 +672,16 @@ class MainViewController: UIViewController { currentTab?.progressWorker.progressBar = nil currentTab?.chromeDelegate = nil addToView(controller: tab) - tab.progressWorker.progressBar = progressView + tab.progressWorker.progressBar = viewCoordinator.progress chromeManager.attach(to: tab.webView.scrollView) tab.chromeDelegate = self } private func addToView(controller: UIViewController) { addChild(controller) - containerView.subviews.forEach { $0.removeFromSuperview() } - containerView.addSubview(controller.view) - controller.view.frame = containerView.bounds + viewCoordinator.contentContainer.subviews.forEach { $0.removeFromSuperview() } + viewCoordinator.contentContainer.addSubview(controller.view) + controller.view.frame = viewCoordinator.contentContainer.bounds controller.didMove(toParent: self) } @@ -734,7 +704,7 @@ class MainViewController: UIViewController { } private func refreshTabIcon() { - tabsButton.accessibilityHint = UserText.numberOfTabs(tabManager.count) + viewCoordinator.toolbarTabSwitcherButton.accessibilityHint = UserText.numberOfTabs(tabManager.count) tabSwitcherButton.tabCount = tabManager.count tabSwitcherButton.hasUnread = tabManager.hasUnread } @@ -765,11 +735,11 @@ class MainViewController: UIViewController { } fileprivate func refreshBackForwardButtons() { - backButton.isEnabled = currentTab?.canGoBack ?? false - forwardButton.isEnabled = currentTab?.canGoForward ?? false + viewCoordinator.toolbarBackButton.isEnabled = currentTab?.canGoBack ?? false + viewCoordinator.toolbarForwardButton.isEnabled = currentTab?.canGoForward ?? false - omniBar.backButton.isEnabled = backButton.isEnabled - omniBar.forwardButton.isEnabled = forwardButton.isEnabled + omniBar.backButton.isEnabled = viewCoordinator.toolbarBackButton.isEnabled + omniBar.forwardButton.isEnabled = viewCoordinator.toolbarForwardButton.isEnabled } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -798,7 +768,7 @@ class MainViewController: UIViewController { DispatchQueue.main.async { // Do this async otherwise the toolbar buttons skew to the right - if self.navBarTop.constant >= 0 { + if self.viewCoordinator.constraints.navigationBarContainerTop.constant >= 0 { self.showBars() } // If tabs have been udpated, do this async to make sure size calcs are current @@ -815,7 +785,7 @@ class MainViewController: UIViewController { let expectedState: MenuButton.State if homeController != nil { expectedState = .bookmarksImage - lastToolbarButton.accessibilityLabel = UserText.bookmarksButtonHint + viewCoordinator.lastToolbarButton.accessibilityLabel = UserText.bookmarksButtonHint omniBar.menuButton.accessibilityLabel = UserText.bookmarksButtonHint } else { @@ -824,7 +794,7 @@ class MainViewController: UIViewController { } else { expectedState = .menuImage } - lastToolbarButton.accessibilityLabel = UserText.menuButtonHint + viewCoordinator.lastToolbarButton.accessibilityLabel = UserText.menuButtonHint omniBar.menuButton.accessibilityLabel = UserText.menuButtonHint } @@ -841,14 +811,14 @@ class MainViewController: UIViewController { } private func applyLargeWidth() { - tabsBar.isHidden = false - toolbar.isHidden = true + viewCoordinator.tabBarContainer.isHidden = false + viewCoordinator.toolbar.isHidden = true omniBar.enterPadState() } private func applySmallWidth() { - tabsBar.isHidden = true - toolbar.isHidden = false + viewCoordinator.tabBarContainer.isHidden = true + viewCoordinator.toolbar.isHidden = false omniBar.enterPhoneState() } @@ -872,13 +842,13 @@ class MainViewController: UIViewController { omniBar.hideSeparator() } } - suggestionTrayContainer.isHidden = false + viewCoordinator.suggestionTrayContainer.isHidden = false currentTab?.webView.accessibilityElementsHidden = true } func hideSuggestionTray() { omniBar.showSeparator() - suggestionTrayContainer.isHidden = true + viewCoordinator.suggestionTrayContainer.isHidden = true currentTab?.webView.accessibilityElementsHidden = false suggestionTrayController?.didHide() } @@ -912,7 +882,7 @@ class MainViewController: UIViewController { super.viewDidLayoutSubviews() notificationView?.layoutSubviews() let height = notificationView?.frame.size.height ?? 0 - notificationContainerHeight.constant = height + viewCoordinator.constraints.notificationContainerHeight.constant = height ViewHighlighter.updatePositions() } @@ -922,13 +892,13 @@ class MainViewController: UIViewController { notificationView.setTitle(text: title) notificationView.setMessage(text: message) - notificationContainer.addSubview(notificationView) - notificationContainerTop.constant = -notificationView.frame.size.height + viewCoordinator.notificationBarContainer.addSubview(notificationView) + viewCoordinator.constraints.notificationContainerTop.constant = -notificationView.frame.size.height self.notificationView = notificationView DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.notificationContainerTop.constant = 0 - self.notificationContainerHeight.constant = notificationView.frame.size.height + self.viewCoordinator.constraints.notificationContainerTop.constant = 0 + self.viewCoordinator.constraints.notificationContainerHeight.constant = notificationView.frame.size.height UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } @@ -938,12 +908,12 @@ class MainViewController: UIViewController { func hideNotification() { - notificationContainerTop.constant = -(notificationView?.frame.size.height ?? 0) - notificationContainerHeight.constant = 0 + viewCoordinator.constraints.notificationContainerTop.constant = -(notificationView?.frame.size.height ?? 0) + viewCoordinator.constraints.notificationContainerHeight.constant = 0 UIView.animate(withDuration: 0.5, animations: { self.view.layoutIfNeeded() }, completion: { _ in - self.notificationContainerTop.constant = 0 + self.viewCoordinator.constraints.notificationContainerTop.constant = 0 self.notificationView?.removeFromSuperview() }) @@ -969,13 +939,13 @@ class MainViewController: UIViewController { } func replaceToolbar(item target: UIBarButtonItem, with replacement: UIBarButtonItem) { - guard let items = toolbar.items else { return } + guard let items = viewCoordinator.toolbar.items else { return } let newItems = items.compactMap({ $0 == target ? replacement : $0 }) - toolbar.setItems(newItems, animated: false) + viewCoordinator.toolbar.setItems(newItems, animated: false) } func newTab(reuseExisting: Bool = false, allowingKeyboard: Bool = true) { @@ -997,12 +967,12 @@ class MainViewController: UIViewController { } func animateLogoAppearance() { - logoContainer.alpha = 0 - logoContainer.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) + viewCoordinator.logoContainer.alpha = 0 + viewCoordinator.logoContainer.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { UIView.animate(withDuration: 0.2) { - self.logoContainer.alpha = 1 - self.logoContainer.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) + self.viewCoordinator.logoContainer.alpha = 1 + self.viewCoordinator.logoContainer.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) } } } @@ -1011,7 +981,7 @@ class MainViewController: UIViewController { currentTab?.findInPage?.delegate = self findInPageView.update(with: currentTab?.findInPage, updateTextField: true) // hide toolbar on iPhone - toolbar.accessibilityElementsHidden = !AppWidthObserver.shared.isLargeWidth + viewCoordinator.toolbar.accessibilityElementsHidden = !AppWidthObserver.shared.isLargeWidth } private func showVoiceSearch() { @@ -1094,7 +1064,7 @@ extension MainViewController: FindInPageViewDelegate { func done(findInPageView: FindInPageView) { currentTab?.findInPage = nil - toolbar.accessibilityElementsHidden = false + viewCoordinator.toolbar.accessibilityElementsHidden = false } } @@ -1105,6 +1075,10 @@ extension MainViewController: BrowserChromeDelegate { static let duration = 0.1 } + var tabBarContainer: UIView { + viewCoordinator.tabBarContainer + } + private func hideKeyboard() { dismissOmniBar() _ = findInPageView.resignFirstResponder() @@ -1131,8 +1105,8 @@ extension MainViewController: BrowserChromeDelegate { self.view.layoutIfNeeded() self.omniBar.alpha = percent - self.tabsBar.alpha = percent - self.toolbar.alpha = percent + self.viewCoordinator.tabBarContainer.alpha = percent + self.viewCoordinator.toolbar.alpha = percent } if animated { @@ -1147,8 +1121,8 @@ extension MainViewController: BrowserChromeDelegate { updateNavBarConstant(hidden ? 0 : 1.0) omniBar.alpha = hidden ? 0 : 1 - tabsBar.alpha = hidden ? 0 : 1 - statusBarBackground.alpha = hidden ? 0 : 1 + viewCoordinator.tabBarContainer.alpha = hidden ? 0 : 1 + viewCoordinator.statusBackground.alpha = hidden ? 0 : 1 } var canHideBars: Bool { @@ -1156,11 +1130,11 @@ extension MainViewController: BrowserChromeDelegate { } var isToolbarHidden: Bool { - return toolbar.alpha < 1 + return viewCoordinator.toolbar.alpha < 1 } var toolbarHeight: CGFloat { - return toolbar.frame.size.height + return viewCoordinator.toolbar.frame.size.height } var barsMaxHeight: CGFloat { @@ -1171,20 +1145,20 @@ extension MainViewController: BrowserChromeDelegate { private func updateToolbarConstant(_ ratio: CGFloat) { var bottomHeight = toolbarHeight bottomHeight += view.safeAreaInsets.bottom - let multiplier = toolbar.isHidden ? 1.0 : 1.0 - ratio - toolbarBottom.constant = bottomHeight * multiplier + let multiplier = viewCoordinator.toolbar.isHidden ? 1.0 : 1.0 - ratio + viewCoordinator.constraints.toolbarBottom.constant = bottomHeight * multiplier findInPageHeightLayoutConstraint.constant = findInPageView.container.frame.height + view.safeAreaInsets.bottom } // 1.0 - full size, 0.0 - hidden private func updateNavBarConstant(_ ratio: CGFloat) { - let browserTabsOffset = (tabsBar.isHidden ? 0 : tabsBar.frame.size.height) - let navBarTopOffset = customNavigationBar.frame.size.height + browserTabsOffset - if !tabsBar.isHidden { + let browserTabsOffset = (viewCoordinator.tabBarContainer.isHidden ? 0 : viewCoordinator.tabBarContainer.frame.size.height) + let navBarTopOffset = viewCoordinator.navigationBarContainer.frame.size.height + browserTabsOffset + if !viewCoordinator.tabBarContainer.isHidden { let topBarsConstant = -browserTabsOffset * (1.0 - ratio) - tabsBarTop.constant = topBarsConstant + viewCoordinator.constraints.tabBarContainerTop.constant = topBarsConstant } - navBarTop.constant = browserTabsOffset + -navBarTopOffset * (1.0 - ratio) + viewCoordinator.constraints.navigationBarContainerTop.constant = browserTabsOffset + -navBarTopOffset * (1.0 - ratio) } } @@ -1279,7 +1253,7 @@ extension MainViewController: OmniBarDelegate { } func onEnterPressed() { - guard !suggestionTrayContainer.isHidden else { return } + guard !viewCoordinator.suggestionTrayContainer.isHidden else { return } suggestionTrayController?.willDismiss(with: omniBar.textField.text ?? "") } @@ -1457,16 +1431,16 @@ extension MainViewController: HomeControllerDelegate { } func home(_ home: HomeViewController, didRequestHideLogo hidden: Bool) { - logoContainer.isHidden = hidden + viewCoordinator.logoContainer.isHidden = hidden } func homeDidRequestLogoContainer(_ home: HomeViewController) -> UIView { - return logoContainer + return viewCoordinator.logoContainer } func home(_ home: HomeViewController, searchTransitionUpdated percent: CGFloat) { - statusBarBackground?.alpha = percent - customNavigationBar?.alpha = percent + viewCoordinator.statusBackground.alpha = percent + viewCoordinator.navigationBarContainer.alpha = percent } } @@ -1863,10 +1837,10 @@ extension MainViewController: AutoClearWorker { guard let window = view.window else { return } let fireButtonView: UIView? - if toolbar.isHidden { + if viewCoordinator.toolbar.isHidden { fireButtonView = tabsBarController?.fireButton } else { - fireButtonView = fireButton.value(forKey: "view") as? UIView + fireButtonView = viewCoordinator.toolbarFireButton.value(forKey: "view") as? UIView } guard let view = fireButtonView else { return } @@ -1884,25 +1858,25 @@ extension MainViewController: Themable { setNeedsStatusBarAppearanceUpdate() if AppWidthObserver.shared.isLargeWidth { - statusBarBackground.backgroundColor = theme.tabsBarBackgroundColor + viewCoordinator.statusBackground.backgroundColor = theme.tabsBarBackgroundColor } else { - statusBarBackground.backgroundColor = theme.omniBarBackgroundColor + viewCoordinator.statusBackground.backgroundColor = theme.omniBarBackgroundColor } view.backgroundColor = theme.mainViewBackgroundColor - customNavigationBar?.backgroundColor = theme.barBackgroundColor - customNavigationBar?.tintColor = theme.barTintColor + viewCoordinator.navigationBarContainer.backgroundColor = theme.barBackgroundColor + viewCoordinator.navigationBarContainer.tintColor = theme.barTintColor - omniBar?.decorate(with: theme) - progressView?.decorate(with: theme) + omniBar.decorate(with: theme) + viewCoordinator.progress.decorate(with: theme) - toolbar?.barTintColor = theme.barBackgroundColor - toolbar?.tintColor = theme.barTintColor + viewCoordinator.toolbar.barTintColor = theme.barBackgroundColor + viewCoordinator.toolbar.tintColor = theme.barTintColor tabSwitcherButton.decorate(with: theme) gestureBookmarksButton.decorate(with: theme) - tabsButton.tintColor = theme.barTintColor + viewCoordinator.toolbarTabSwitcherButton.tintColor = theme.barTintColor presentedMenuButton.decorate(with: theme) @@ -1910,7 +1884,7 @@ extension MainViewController: Themable { findInPageView.decorate(with: theme) - logoText.tintColor = theme.ddgTextTintColor + viewCoordinator.logoText.tintColor = theme.ddgTextTintColor } } @@ -1983,11 +1957,11 @@ extension MainViewController { let backMenu = historyMenu(with: currentTab.webView.backForwardList.backList.reversed()) omniBar.backButton.menu = backMenu - backButton.menu = backMenu + viewCoordinator.toolbarBackButton.menu = backMenu let forwardMenu = historyMenu(with: currentTab.webView.backForwardList.forwardList) omniBar.forwardButton.menu = forwardMenu - forwardButton.menu = forwardMenu + viewCoordinator.toolbarForwardButton.menu = forwardMenu } private func historyMenu(with backForwardList: [WKBackForwardListItem]) -> UIMenu { diff --git a/DuckDuckGo/NetworkProtectionStatusView.swift b/DuckDuckGo/NetworkProtectionStatusView.swift index 238fcc860e..c5f637379d 100644 --- a/DuckDuckGo/NetworkProtectionStatusView.swift +++ b/DuckDuckGo/NetworkProtectionStatusView.swift @@ -89,9 +89,6 @@ struct NetworkProtectionStatusView: View { .scaledToFit() .frame(height: 96) .padding(8) - .if(statusModel.shouldShowError) { - $0.rotationEffect(Angle.degrees(statusModel.shouldShowError ? 180 : 0)) - } Text(statusModel.headerTitle) .font(.system(size: 17, weight: .semibold)) .multilineTextAlignment(.center) diff --git a/DuckDuckGo/SaveLoginViewModel.swift b/DuckDuckGo/SaveLoginViewModel.swift index 2421e9918d..074b3b76d4 100644 --- a/DuckDuckGo/SaveLoginViewModel.swift +++ b/DuckDuckGo/SaveLoginViewModel.swift @@ -49,7 +49,7 @@ final class SaveLoginViewModel: ObservableObject { @UserDefaultsWrapper(key: .autofillFirstTimeUser, defaultValue: true) private var autofillFirstTimeUser: Bool - private let numberOfRejectionsToTurnOffAutofill = 3 + private let numberOfRejectionsToTurnOffAutofill = 2 private let maximumPasswordDisplayCount = 40 private let credentialManager: SaveAutofillLoginManagerProtocol private let appSettings: AppSettings diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist index 8c01846663..2e4f5bb46b 100644 --- a/DuckDuckGo/Settings.bundle/Root.plist +++ b/DuckDuckGo/Settings.bundle/Root.plist @@ -6,7 +6,7 @@ DefaultValue - 7.91.1 + 7.92.0 Key version Title diff --git a/DuckDuckGo/UIView+Constraints.swift b/DuckDuckGo/UIView+Constraints.swift index 65c2f0cbf3..4daabe252e 100644 --- a/DuckDuckGo/UIView+Constraints.swift +++ b/DuckDuckGo/UIView+Constraints.swift @@ -21,9 +21,9 @@ import UIKit extension UIView { - func constrainView(_ other: UIView, + func constrainView(_ other: Any, by attribute: NSLayoutConstraint.Attribute, - to otherAttribute: NSLayoutConstraint.Attribute, + to otherAttribute: NSLayoutConstraint.Attribute? = nil, relatedBy relation: NSLayoutConstraint.Relation = .equal, multiplier: Double = 1.0, constant: Double = 0.0) -> NSLayoutConstraint { @@ -32,7 +32,7 @@ extension UIView { attribute: attribute, relatedBy: relation, toItem: other, - attribute: otherAttribute, + attribute: otherAttribute ?? attribute, multiplier: multiplier, constant: constant) diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index 50d90af163..b57f9df4c4 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -404,8 +404,8 @@ public struct UserText { public static let autofillSaveLoginTitle = NSLocalizedString("autofill.save-login.title", value: "Save Login?", comment: "Title displayed on modal asking for the user to save the login") public static let autofillUpdateUsernameTitle = NSLocalizedString("autofill.update-usernamr.title", value: "Update username?", comment: "Title displayed on modal asking for the user to update the username") - public static let autofillSaveLoginMessageNewUser = NSLocalizedString("autofill.save-login.new-user.message", value: "Logins are stored securely on your device, and can be managed from the Logins menu in Settings.", comment: "Message displayed on modal asking for the user to save the login for the first time") - public static let autofillSaveLoginNotNowCTA = NSLocalizedString("autofill.save-login.not-now.CTA", value: "Not Now", comment: "Cancel CTA displayed on modal asking for the user to save the login") + public static let autofillSaveLoginMessageNewUser = NSLocalizedString("autofill.save-login.new-user.message", value: "Logins are stored securely on your device in the Logins menu.", comment: "Message displayed on modal asking for the user to save the login for the first time") + public static let autofillSaveLoginNotNowCTA = NSLocalizedString("autofill.save-login.not-now.CTA", value: "Don’t Save", comment: "Cancel CTA displayed on modal asking for the user to save the login") public static let autofillSavePasswordTitle = NSLocalizedString("autofill.save-password.title", value: "Save Password?", comment: "Title displayed on modal asking for the user to save the password") public static func autofillUpdatePassword(for title: String) -> String { @@ -758,9 +758,9 @@ In addition to the details entered into this form, your app issue report will co public static let autofillNavigationButtonItemTitleClose = NSLocalizedString("autofill.logins.list.close-title", value:"Close", comment: "Title for close navigation button") // Autofill Password Generation Prompt - public static let autofillPasswordGenerationPromptTitle = NSLocalizedString("autofill.password-generation-prompt.title", value:"Use generated password from DuckDuckGo?", comment: "Title for prompt to use suggested strong password for creating a login") - public static let autofillPasswordGenerationPromptSubtitle = NSLocalizedString("autofill.password-generation-prompt.subtitle", value:"Password will be saved in Logins.", comment: "Subtitle for prompt to use suggested strong password for creating a login") - public static let autofillPasswordGenerationPromptUseGeneratedPasswordCTA = NSLocalizedString("autofill.password-generation-prompt.use-generated-password.cta", value:"Use Generated Password", comment: "Button title choosing to use the suggested generated password for creating a login") + public static let autofillPasswordGenerationPromptTitle = NSLocalizedString("autofill.password-generation-prompt.title", value:"Use a strong password from DuckDuckGo?", comment: "Title for prompt to use suggested strong password for creating a login") + public static let autofillPasswordGenerationPromptSubtitle = NSLocalizedString("autofill.password-generation-prompt.subtitle", value:"Passwords are stored securely on your device in the Logins menu.", comment: "Subtitle for prompt to use suggested strong password for creating a login") + public static let autofillPasswordGenerationPromptUseGeneratedPasswordCTA = NSLocalizedString("autofill.password-generation-prompt.use-generated-password.cta", value:"Use Strong Password", comment: "Button title choosing to use the suggested generated password for creating a login") public static let autofillPasswordGenerationPromptUseOwnPasswordCTA = NSLocalizedString("autofill.password-generation-prompt.use-own-password.cta", value:"Create My Own", comment: "Button title choosing to use own password for creating a login") // Autofill Email Management diff --git a/DuckDuckGo/bg.lproj/Localizable.strings b/DuckDuckGo/bg.lproj/Localizable.strings index 42a7c64f57..0745f2aa1a 100644 --- a/DuckDuckGo/bg.lproj/Localizable.strings +++ b/DuckDuckGo/bg.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Когато DuckDuckGo открие изскачащи прозорци за съгласие за използване на бисквитки в сайтовете, които посещавате, можем да опитаме автоматично да настроим предпочитанията Ви за бисквитки, така че бисквитките да са сведени до минимум, а поверителността да е максимална, след което да затворим изскачащите прозорци. Някои сайтове не предоставят възможност за управление на предпочитанията за бисквитки, затова можем само да скрием техните изскачащи прозорци."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Активиране на Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Скриване на паролата"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Няма резултати"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Паролата ще бъде запазена в „Данни за вход“."; +"autofill.password-generation-prompt.subtitle" = "Паролите се съхраняват на сигурно място в менюто Данни за вход на Вашето устройство."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Използване на парола, генерирана от DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Използване на силна парола от DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Използване на генерирана парола"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Използване на силна парола"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Създаване на собствена"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Имейлите, изпратени до %@, отново ще бъдат препращани към пощенската Ви кутия."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Повторно активиране на личен Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Активен"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Имейлите, изпратени до %@, вече няма да бъдат препращани към пощенската Ви кутия."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Деактивиране на личен Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Управлението на този адрес е временно недостъпно"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Деактивиран"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Разбрах"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Все още можете да управлявате този Duck Address от получените на него имейли в личната Ви пощенска кутия."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Потребителското име на личен Duck Address беше премахнато"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Данните за вход са сигурно съхранени само на Вашето устройство и могат да се управляват от менюто Данни за вход в Настройки."; +"autofill.save-login.new-user.message" = "Данните за вход се съхраняват на сигурно място в менюто Данни за вход на Вашето устройство."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Искате ли DuckDuckGo да запази данните за вход?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Не сега"; +"autofill.save-login.not-now.CTA" = "Не записвай"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Запазване на данните за вход"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Показване на паролата"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ за управление на Вашите Duck Address на това устройство."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo ще актуализира запазените данни за вход във Вашето устройство."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Стартирано изтегляне на %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Защита на имейл"; diff --git a/DuckDuckGo/bg.lproj/Main.strings b/DuckDuckGo/bg.lproj/Main.strings deleted file mode 100644 index d227fca0ed..0000000000 --- a/DuckDuckGo/bg.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Сърфиране напред"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Превключване на раздели"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Сърфиране назад"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Отметки"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Затваряне на всички раздели и изчистване на данните"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 от 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Готово"; - diff --git a/DuckDuckGo/cs.lproj/Localizable.strings b/DuckDuckGo/cs.lproj/Localizable.strings index 8e0ed78999..349ab7f5e7 100644 --- a/DuckDuckGo/cs.lproj/Localizable.strings +++ b/DuckDuckGo/cs.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Když DuckDuckGo na navštívené stránce zjistí vyskakovací okno žádající o souhlas se soubory cookie, můžeme zkusit automaticky nastavit tvou předvolbu na co nejméně souborů cookie a maximální ochranu soukromí a potom vyskakovací okno zavřít. Některé weby nenabízejí možnost si nastavit předvolby souborů cookie, takže podobná vyskakovací okna můžeme jen skrýt."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Povol funkci Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Skrýt heslo"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Žádné výsledky"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Heslo se uloží do části Přihlášení."; +"autofill.password-generation-prompt.subtitle" = "Hesla jsou bezpečně uložená v zařízení v nabídce Přihlášení."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Použít heslo vygenerované DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Použít silné heslo od DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Použít vygenerované heslo"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Použít silné heslo"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Vytvořit vlastní"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-maily poslané na adresu %@ se budou zase přeposílat do tvé schránky."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Znovu aktivovat soukromou adresu Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktivní"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-maily poslané na adresu %@ už se nebudou přeposílat do tvé schránky."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktivovat soukromou adresu Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Správa této adresy je dočasně nedostupná"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivováno"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Rozumím"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Tuhle adresu Duck Address můžeš dál spravovat z e-mailů, které ti z ní přijdou do tvé soukromé schránky."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Soukromé uživatelské jméno Duck Address je smazané"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Přihlašovací údaje se bezpečně ukládají do tvého zařízení a dají se spravovat v nabídce Přihlášení v Nastavení."; +"autofill.save-login.new-user.message" = "Přihlašovací údaje jsou bezpečně uložené v zařízení v nabídce Přihlášení."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Má DuckDuckGo uložit přihlašovací údaje?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Teď ne"; +"autofill.save-login.not-now.CTA" = "Neukládat"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Uložit přihlašovací údaje"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Zobrazit heslo"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ pro správu adres Duck Address na tomto zařízení."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo zaktualizuje toto uložené přihlášení ve tvém zařízení."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Stahování souboru %@ bylo zahájeno"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Ochrana e-mailu"; diff --git a/DuckDuckGo/cs.lproj/Main.strings b/DuckDuckGo/cs.lproj/Main.strings deleted file mode 100644 index 4ed4a36e30..0000000000 --- a/DuckDuckGo/cs.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Procházet dopředu"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Přepínač karet"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Procházet zpátky"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Záložky"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Zavřít všechny karty a vymazat data"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 z 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Hotovo"; - diff --git a/DuckDuckGo/da.lproj/Localizable.strings b/DuckDuckGo/da.lproj/Localizable.strings index 41a4cff652..766d5618ee 100644 --- a/DuckDuckGo/da.lproj/Localizable.strings +++ b/DuckDuckGo/da.lproj/Localizable.strings @@ -398,7 +398,7 @@ "autoconsent.info.header" = "Når DuckDuckGo registrerer pop op-vinduer med samtykke til brug af cookies på websteder, du besøger, kan vi automatisk indstille dine cookiepræferencer til at minimere cookies og maksimere privatlivets fred og derefter lukke pop op-vinduer. Nogle websteder giver ikke mulighed for at administrere cookiepræferencer, så vi kan kun skjule pop op-vinduer som disse."; /* Text link to email protection website */ -"autofill.enable.email.protection" = "Enable Email Protection"; +"autofill.enable.email.protection" = "Aktivér Email Protection"; /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Skjul adgangskode"; @@ -566,55 +566,55 @@ "autofill.logins.search.no-results.title" = "Ingen resultater"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Adgangskoden vil blive gemt i logins."; +"autofill.password-generation-prompt.subtitle" = "Adgangskoder gemmes sikkert på din enhed i menuen Logins."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Brug genereret adgangskode fra DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Brug en stærk adgangskode fra DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Brug genereret adgangskode"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Brug en stærk adgangskode"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Opret min egen"; /* Text for the confirmation message displayed when a user tries activate a Private Email Address */ -"autofill.private.email.mesage.activate.confirm.content" = "Emails sent to %@ will again be forwarded to your inbox."; +"autofill.private.email.mesage.activate.confirm.content" = "E-mails sendt til %@ vil igen blive videresendt til din indbakke."; /* Title for the confirmation message displayed when a user tries activate a Private Email Address */ -"autofill.private.email.mesage.activate.confirm.title" = "Reactivate Private Duck Address?"; +"autofill.private.email.mesage.activate.confirm.title" = "Genaktivere privat Duck Address?"; /* Mesasage displayed when a private email address is active */ -"autofill.private.email.mesage.active" = "Active"; +"autofill.private.email.mesage.active" = "Aktiv"; /* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ -"autofill.private.email.mesage.deactivate.confirm.content" = "Emails sent to %@ will no longer be forwarded to your inbox."; +"autofill.private.email.mesage.deactivate.confirm.content" = "E-mails sendt til %@ vil ikke længere blive videresendt til din indbakke."; /* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ -"autofill.private.email.mesage.deactivate.confirm.title" = "Deactivate Private Duck Address?"; +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktiver privat Duck Address?"; /* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ -"autofill.private.email.mesage.error" = "Management of this address is temporarily unavailable"; +"autofill.private.email.mesage.error" = "Administration af denne adresse er midlertidigt utilgængelig."; /* Mesasage displayed when a private email address is inactive */ -"autofill.private.email.mesage.inactive" = "Deactivated"; +"autofill.private.email.mesage.inactive" = "Deaktiveret"; /* Button text for the alert dialog telling the user an updated username is no longer a private email address */ -"autofill.removed.duck.address.button" = "Got it"; +"autofill.removed.duck.address.button" = "Forstået"; /* Content for the alert dialog telling the user an updated username is no longer a private email address */ -"autofill.removed.duck.address.content" = "You can still manage this Duck Address from emails received from it in your personal inbox."; +"autofill.removed.duck.address.content" = "Du kan stadig administrere denne Duck Address fra e-mails modtaget fra den i din personlige indbakke."; /* Title for the alert dialog telling the user an updated username is no longer a private email address */ -"autofill.removed.duck.address.title" = "Private Duck Address username was removed"; +"autofill.removed.duck.address.title" = "Privat Duck Address-brugernavn blev fjernet"; /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Logins gemmes sikkert på din enhed og kan administreres fra menuen Logins i Indstillinger."; +"autofill.save-login.new-user.message" = "Logins gemmes sikkert på din enhed i menuen Logins."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Skal DuckDuckGo gemme dit login?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ikke nu"; +"autofill.save-login.not-now.CTA" = "Gem ikke"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Gem login"; @@ -632,7 +632,7 @@ "autofill.show-password" = "Vis adgangskode"; /* Message displayed to the user when they are logged out of Email protection. */ -"autofill.signin.to.manage" = "%@ to manage your Duck Addresses on this device."; +"autofill.signin.to.manage" = "%@ for at administrere dine Duck-adresser på denne enhed."; /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo opdaterer dette gemte login på din enhed."; diff --git a/DuckDuckGo/da.lproj/Main.strings b/DuckDuckGo/da.lproj/Main.strings deleted file mode 100644 index 83131719e5..0000000000 --- a/DuckDuckGo/da.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Gennemse fremad"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Faneskifter"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Gennemse tilbage"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Bogmærker"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Luk alle faner og ryd data"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 af 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Færdig"; - diff --git a/DuckDuckGo/de.lproj/Localizable.strings b/DuckDuckGo/de.lproj/Localizable.strings index be5e9531ac..fbcbc7b098 100644 --- a/DuckDuckGo/de.lproj/Localizable.strings +++ b/DuckDuckGo/de.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Wenn DuckDuckGo Pop-ups zur Cookie-Zustimmung auf den von dir besuchten Websites erkennt, können wir deine Cookie-Einstellungen automatisch so festlegen, dass Cookies minimiert werden und der Datenschutz maximiert wird, und dann die Pop-ups schließen. Einige Websites bieten keine Option zur Verwaltung von Cookie-Einstellungen, sodass wir Pop-ups wie diese nur ausblenden können."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Email Protection aktivieren"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Passwort ausblenden"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Keine Ergebnisse"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Das Passwort wird in den Anmeldedaten gespeichert."; +"autofill.password-generation-prompt.subtitle" = "Passwörter werden sicher auf deinem Gerät im Anmeldedaten-Menü gespeichert."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Generiertes Passwort von DuckDuckGo verwenden?"; +"autofill.password-generation-prompt.title" = "Ein sicheres Passwort von DuckDuckGo verwenden?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Generiertes Passwort verwenden"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Sicheres Passwort verwenden"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Eigenes erstellen"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-Mails, die an %@ gesendet werden, werden wieder an deinen Posteingang weitergeleitet."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Private Duck Address reaktivieren?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktiv"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-Mails, die an %@ gesendet werden, werden nicht mehr an deinen Posteingang weitergeleitet."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Private Duck Address deaktivieren?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Die Verwaltung dieser Adresse ist vorübergehend nicht möglich"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktiviert"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Verstanden"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Du kannst diese Duck Address weiterhin über die E-Mails in deinem persönlichen Posteingang verwalten."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Benutzername von Private Duck Address wurde entfernt"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Die Anmeldedaten werden auf diesem Gerät sicher gespeichert und können über das Anmeldedaten-Menü in den Einstellungen verwaltet werden."; +"autofill.save-login.new-user.message" = "Anmeldedaten werden sicher auf deinem Gerät im Anmeldedaten-Menü gespeichert."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Möchtest du, dass DuckDuckGo deine Anmeldedaten speichert?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Jetzt nicht"; +"autofill.save-login.not-now.CTA" = "Nicht speichern"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Anmeldedaten speichern"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Passwort anzeigen"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@, um deine Duck Addresses auf diesem Gerät zu verwalten."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo aktualisiert diese gespeicherten Anmeldedaten auf deinem Gerät."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Download von %@ gestartet"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-Mail-Schutz"; diff --git a/DuckDuckGo/de.lproj/Main.strings b/DuckDuckGo/de.lproj/Main.strings deleted file mode 100644 index b2f9f23424..0000000000 --- a/DuckDuckGo/de.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Vorwärts"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Tabwechsel-Bildschirm"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Zurück"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Lesezeichen"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Alle Tabs schließen und Daten löschen"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 von 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Fertig"; - diff --git a/DuckDuckGo/el.lproj/Localizable.strings b/DuckDuckGo/el.lproj/Localizable.strings index 77c94906f1..36e315af41 100644 --- a/DuckDuckGo/el.lproj/Localizable.strings +++ b/DuckDuckGo/el.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Όταν το DuckDuckGo εντοπίζει αναδυόμενα παράθυρα συναίνεσης για cookies σε ιστότοπους που επισκέπτεστε, μπορούμε να προσπαθήσουμε να ρυθμίσουμε αυτόματα τις προτιμήσεις σας για τα cookies ώστε να ελαχιστοποιήσετε τα cookies και να μεγιστοποιήσετε το απόρρητο. Έπειτα μπορείτε να κλείσετε τα αναδυόμενα παράθυρα. Ορισμένοι ιστότοποι δεν παρέχουν επιλογή για διαχείριση των προτιμήσεων cookies, οπότε μπορούμε μόνο να αποκρύψουμε αναδυόμενα παράθυρα όπως αυτά."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Ενεργοποίηση Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Απόκρυψη κωδικού πρόσβασης"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Κανένα αποτέλεσμα"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Ο κωδικός πρόσβασης θα αποθηκευτεί στις Συνδέσεις."; +"autofill.password-generation-prompt.subtitle" = "Οι κωδικοί πρόσβασης αποθηκεύονται με ασφάλεια στη συσκευή σας στο μενού Συνδέσεις."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Χρήση κωδικού πρόσβασης που δημιουργήθηκε από το DuckDuckGo;"; +"autofill.password-generation-prompt.title" = "Χρησιμοποιείτε ισχυρό κωδικό πρόσβασης από το DuckDuckGo;"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Χρήση του κωδικού πρόσβασης που δημιουργήθηκε"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Χρησιμοποιήστε ισχυρό κωδικό πρόσβασης"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Δημιουργία δικού μου"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Τα email που αποστέλλονται στο %@ θα προωθούνται ξανά στα εισερχόμενά σας."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Εκ νέου ενεργοποίηση της ιδιωτικής Duck Address;"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Ενεργό"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Τα email που αποστέλλονται στο %@ δεν θα προωθούνται πλέον στα εισερχόμενά σας."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Απενεργοποίηση της ιδιωτικής Duck Address;"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Η διαχείριση της διεύθυνσης αυτής δεν είναι διαθέσιμη προσωρινά"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Απενεργοποιήθηκε"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Κατάλαβα"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Μπορείτε ακόμα να διαχειρίζεστε αυτήν τη διεύθυνση Duck Address από τα email που λαμβάνετε από αυτήν στα προσωπικά εισερχόμενά σας."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Το ιδιωτικό όνομα χρήστη Duck Address καταργήθηκε"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Οι συνδέσεις αποθηκεύονται με ασφάλεια στη συσκευή σας και η διαχείρισή τους γίνεται από το μενού Συνδέσεις, στις Ρυθμίσεις."; +"autofill.save-login.new-user.message" = "Οι συνδέσεις αποθηκεύονται με ασφάλεια στη συσκευή σας στο μενού Συνδέσεις."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Θέλετε να αποθηκεύσει το DuckDuckGo τη σύνδεσή σας;"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Όχι τώρα"; +"autofill.save-login.not-now.CTA" = "Να μην αποθηκευτεί"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Αποθήκευση σύνδεσης"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Εμφάνιση κωδικού πρόσβασης"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ για διαχείριση των διευθύνσεών σας Duck Address σε αυτήν τη συσκευή."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "Το DuckDuckGo θα ενημερώσει αυτήν την αποθηκευμένη σύνδεση στη συσκευή σας."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Άρχισε η λήψη για το αρχείο %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Προστασία email"; diff --git a/DuckDuckGo/el.lproj/Main.strings b/DuckDuckGo/el.lproj/Main.strings deleted file mode 100644 index f4a511320c..0000000000 --- a/DuckDuckGo/el.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Περιήγηση προς τα μπροστά"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Εναλλαγή καρτελών"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Περιήγηση προς τα πίσω"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Σελιδοδείκτες"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Κλείσιμο όλων των καρτελών και εκκαθάριση δεδομένων"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 από 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Ολοκληρώθηκε"; - diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index 3fa5cc4bf4..ae15b576b9 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -563,13 +563,13 @@ "autofill.logins.search.no-results.title" = "No Results"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Password will be saved in Logins."; +"autofill.password-generation-prompt.subtitle" = "Passwords are stored securely on your device in the Logins menu."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Use generated password from DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Use a strong password from DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Use Generated Password"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Use Strong Password"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Create My Own"; @@ -605,13 +605,13 @@ "autofill.removed.duck.address.title" = "Private Duck Address username was removed"; /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Logins are stored securely on your device, and can be managed from the Logins menu in Settings."; +"autofill.save-login.new-user.message" = "Logins are stored securely on your device in the Logins menu."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Do you want DuckDuckGo to save your Login?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Not Now"; +"autofill.save-login.not-now.CTA" = "Don’t Save"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Save Login"; diff --git a/DuckDuckGo/es.lproj/Localizable.strings b/DuckDuckGo/es.lproj/Localizable.strings index 2784f3ffdf..68c300fbe1 100644 --- a/DuckDuckGo/es.lproj/Localizable.strings +++ b/DuckDuckGo/es.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Cuando DuckDuckGo detecta ventanas emergentes de consentimiento de cookies en los sitios que visitas, podemos configurar automáticamente tus preferencias de cookies para minimizar las cookies y maximizar la privacidad y, a continuación, cerrar las ventanas emergentes. Algunos sitios no ofrecen la opción de administrar las preferencias de cookies, por lo que solo podemos ocultar ventanas emergentes de este tipo."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Activar Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Ocultar contraseña"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Sin resultados"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "La contraseña se guardará en Inicios de sesión."; +"autofill.password-generation-prompt.subtitle" = "Las contraseñas se almacenan de forma segura en tu dispositivo en el menú Inicios de sesión."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "¿Usar contraseña generada por DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "¿Usar una contraseña segura de DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Usar contraseña generada"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Usar contraseña segura"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Crear la mía propia"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Los correos electrónicos enviados a %@ volverán a reenviarse a tu bandeja de entrada."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "¿Reactivar la Duck Address privada?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Activo"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Los correos electrónicos electrónicos enviados a %@ ya no se se reenviarán a tu bandeja de entrada."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "¿Desactivar la Duck Address privada?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "La gestión de esta dirección no está disponible temporalmente"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Desactivado"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Entendido"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Puedes gestionar esta Duck Address desde los correos electrónicos recibidos en tu bandeja de entrada personal."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Se ha eliminado el nombre de usuario de la Duck Address privada"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Los inicios de sesión se almacenan de forma segura en tu dispositivo y se pueden administrar desde el menú de Inicios de Sesión en Ajustes."; +"autofill.save-login.new-user.message" = "Los inicios de sesión se almacenan de forma segura en tu dispositivo en el menú Inicios de sesión."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "¿Quieres que DuckDuckGo guarde tu inicio de sesión?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ahora no"; +"autofill.save-login.not-now.CTA" = "No guardar"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Guardar inicio de sesión"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Mostrar contraseña"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ para gestionar tus Duck Addresses en este dispositivo."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo actualizará este inicio de sesión almacenado en tu dispositivo."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Descarga de %@ iniciada"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Protección del correo electrónico"; diff --git a/DuckDuckGo/es.lproj/Main.strings b/DuckDuckGo/es.lproj/Main.strings deleted file mode 100644 index 0bc0cac4cc..0000000000 --- a/DuckDuckGo/es.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Avanzar"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Cambiar pestañas"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Retroceder"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Marcadores"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Cerrar todas las pestañas y borrar los datos"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 de 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Hecho"; - diff --git a/DuckDuckGo/et.lproj/Localizable.strings b/DuckDuckGo/et.lproj/Localizable.strings index 82588f2889..0299189580 100644 --- a/DuckDuckGo/et.lproj/Localizable.strings +++ b/DuckDuckGo/et.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Kui DuckDuckGo tuvastab külastatavatel veebisaitidel küpsiste nõusoleku hüpikaknad, saame proovida automaatselt seadistada sinu küpsise-eelistused selliselt, et minimeerida küpsised ja maksimeerida privaatsust, ning seejärel hüpikaknad sulgeda. Mõned saidid ei paku võimalust küpsise-eelistuste haldamiseks, seega saame sellised hüpikaknad ainult peita."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Luba Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Peida parool"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Tulemusi pole"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Parool salvestatakse sisselogimisandmetesse."; +"autofill.password-generation-prompt.subtitle" = "Paroole hoitakse turvaliselt sinu seadmes sisselogimisandmete menüüs."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Kas kasutada DuckDuckGo loodud parooli?"; +"autofill.password-generation-prompt.title" = "Kas kasutada DuckDuckGo tugevat parooli?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Kasuta loodud parooli"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Kasuta tugevat parooli"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Loon selle ise"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Aadressile %@ saadetud kirjad edastatakse jälle sinu postkasti."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Kas soovid privaatse Duck Addressi uuesti aktiveerida?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktiivne"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Aadressile %@ saadetud kirju ei edastata enam sinu postkasti."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Kas soovid privaatse Duck Addressi inaktiveerida?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Selle aadressi haldamine pole ajutiselt saadaval"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Inaktiveeritud"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Selge"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Saad seda Duck Addressi endiselt hallata e-kirjadest, mis on sellelt saadetud sinu isiklikku postkasti."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Privaatse Duck Addressi kasutajanimi eemaldati"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Sisselogimisandmed salvestatakse turvaliselt selles seadmes ja neid saab hallata sätete menüüst Sisselogimisandmed."; +"autofill.save-login.new-user.message" = "Logisid hoitakse turvaliselt sinu seadmes logide menüüs."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Kas soovid, et DuckDuckGo salvestaks sinu sisselogimisandmed?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Mitte praegu"; +"autofill.save-login.not-now.CTA" = "Ära salvesta"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Salvesta sisselogimisandmed"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Kuva parool"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@, et hallata selles seadmes oma Duck Addresse."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo värskendab need salvestatud sisselogimisandmed sinu seadmes."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "%@ allalaadimine algas"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-posti kaitse"; diff --git a/DuckDuckGo/et.lproj/Main.strings b/DuckDuckGo/et.lproj/Main.strings deleted file mode 100644 index f6ef3e05b0..0000000000 --- a/DuckDuckGo/et.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Sirvi edasi"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Vahekaardi vaheldaja"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Sirvi tagasi"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Järjehoidjad"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Sulge kõik vahekaardid ja kustuta andmed"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 / 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Valmis"; - diff --git a/DuckDuckGo/fi.lproj/Localizable.strings b/DuckDuckGo/fi.lproj/Localizable.strings index 041b48cda4..f5e0fab46e 100644 --- a/DuckDuckGo/fi.lproj/Localizable.strings +++ b/DuckDuckGo/fi.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Kun DuckDuckGo havaitsee evästeiden hallinnan ponnahdusikkunoita vierailemillasi sivustoilla, voimme yrittää määrittää evästeasetuksesi automaattisesti evästeiden minimoimiseksi ja yksityisyyden maksimoimiseksi ja sulkea sitten ponnahdusikkunat. Joillakin sivustoilla evästeiden hallinta ei ole mahdollista, joten voimme vain piilottaa tällaiset ponnahdusikkunat."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Ota Email Protection käyttöön"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Piilota salasana"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Ei tuloksia"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Salasana tallennetaan Kirjautumiset-osioon."; +"autofill.password-generation-prompt.subtitle" = "Salasanat tallennetaan turvallisesti laitteellesi kirjautumistiedot-valikkoon."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Haluatko käyttää DuckDuckGon luomaa salasanaa?"; +"autofill.password-generation-prompt.title" = "Käytetäänkö DuckDuckGon vahvaa salasanaa?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Käytä luotua salasanaa"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Käytä vahvaa salasanaa"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Luo oma"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Osoitteeseen %@ lähetetyt sähköpostit välitetään taas saapuneet-kansioosi."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Aktivoi yksityinen Duck Address uudelleen?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktiivinen"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Osoitteeseen %@ lähetettyjä sähköposteja ei enää välitetä saapuneet-kansioosi."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktivoi yksityinen Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Tämän osoitteen hallinta ei ole tilapäisesti käytettävissä"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivoitu"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Selvä"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Voit edelleen hallita tätä Duck Address -osoitetta siltä vastaanotetuista sähköposteista henkilökohtaisessa postilaatikossasi."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Yksityinen Duck Address -käyttäjätunnus on poistettu"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Kirjautumistiedot tallennetaan turvallisesti laitteellesi. Niitä voi hallita asetusten kirjautumistiedot-valikosta."; +"autofill.save-login.new-user.message" = "Kirjautumistiedot tallennetaan turvallisesti laitteellesi kirjautumistiedot-valikkoon."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Haluatko, että DuckDuckGo tallentaa kirjautumistietosi?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ei nyt"; +"autofill.save-login.not-now.CTA" = "Älä tallenna"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Tallenna kirjautumistiedot"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Näytä salasana"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ hallitaksesi Duck Address -osoitteita tällä laitteella."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo päivittää tämän laitteellesi tallennetun kirjautumistiedon."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Tiedoston %@ lataus aloitettu"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Sähköpostisuojaus"; diff --git a/DuckDuckGo/fi.lproj/Main.strings b/DuckDuckGo/fi.lproj/Main.strings deleted file mode 100644 index f0b1e8064c..0000000000 --- a/DuckDuckGo/fi.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Selaa eteenpäin"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Välilehtien vaihtotyökalu"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Selaa taaksepäin"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Kirjanmerkit"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Sulje kaikki välilehdet ja tyhjennä tiedot"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1/12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Valmis"; - diff --git a/DuckDuckGo/fr.lproj/Localizable.strings b/DuckDuckGo/fr.lproj/Localizable.strings index 639e8a9351..3eb6c00b8b 100644 --- a/DuckDuckGo/fr.lproj/Localizable.strings +++ b/DuckDuckGo/fr.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Lorsque DuckDuckGo détecte les fenêtres contextuelles de consentement aux cookies sur les sites que vous visitez, vos préférences peuvent, dans la mesure du possible, être configurées automatiquement de façon à ce que les cookies soient réduits au minimum et la confidentialité maximisée, puis les fenêtres contextuelles sont fermées. Certains sites ne proposent pas d'option pour gérer les préférences en matière de cookies. Nous ne pouvons donc masquer que des fenêtres contextuelles comme celles-ci."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Activez Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Masquer le mot de passe"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Aucun résultat"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Le mot de passe sera enregistré dans les identifiants."; +"autofill.password-generation-prompt.subtitle" = "Les mots de passe sont stockés en toute sécurité sur votre appareil dans le menu Identifiants."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Utiliser le mot de passe généré par DuckDuckGo ?"; +"autofill.password-generation-prompt.title" = "Utiliser un mot de passe fort généré par DuckDuckGo ?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Utiliser le mot de passe généré"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Utiliser un mot de passe fort"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Créer le mien"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Les e-mails envoyés à %@ seront à nouveau transférés vers votre boîte de réception."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Réactiver la Duck Address privée ?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Actif"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Les e-mails envoyés à %@ ne seront plus transférés vers votre boîte de réception."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Désactiver la Duck Address privée ?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "La gestion de cette adresse est temporairement indisponible"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Désactivé"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "J'ai compris"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Vous pouvez toujours gérer cette Duck Address à partir des e-mails reçus de sa part dans votre boîte de réception personnelle."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Le nom d'utilisateur de la Duck Address privée a été supprimé"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Les identifiants sont stockés en toute sécurité sur votre appareil et peuvent être gérés à partir du menu Identifiants dans Paramètres."; +"autofill.save-login.new-user.message" = "Les identifiants de connexion sont stockés en toute sécurité sur votre appareil dans le menu Identifiants."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Voulez-vous que DuckDuckGo enregistre votre identifiant ?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Pas maintenant"; +"autofill.save-login.not-now.CTA" = "Ne pas enregistrer"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Enregistrer l'identifiant"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Afficher le mot de passe"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ pour gérer vos Duck Addresses sur cet appareil."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo mettra à jour cet identifiant enregistré sur votre appareil."; @@ -670,6 +706,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Début du téléchargement pour %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Protection des e-mails"; diff --git a/DuckDuckGo/fr.lproj/Main.strings b/DuckDuckGo/fr.lproj/Main.strings deleted file mode 100644 index 8ff3d6c928..0000000000 --- a/DuckDuckGo/fr.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Afficher la page suivante"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Outil de changement d'onglet"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Afficher la page précédente"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Signets"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Fermer tous les onglets et effacer les données"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 sur 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Terminé"; - diff --git a/DuckDuckGo/hr.lproj/Localizable.strings b/DuckDuckGo/hr.lproj/Localizable.strings index 9367ea22b6..65fb6c8599 100644 --- a/DuckDuckGo/hr.lproj/Localizable.strings +++ b/DuckDuckGo/hr.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Kada DuckDuckGo otkrije skočne prozore pristanka na kolačiće na web lokacijama koje posjećuješ, mi možemo pokušati automatski odrediti tvoje postavke kolačića kako bismo minimizirali kolačiće i maksimizirali privatnost, a zatim zatvorili skočne prozore. Neke web lokacije ne nude opciju upravljanja postavkama kolačića, tako da možemo sakriti samo ovakve skočne prozore."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Omogući Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Sakrij lozinku"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Nema rezultata"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Lozinka će biti spremljena u Prijavama."; +"autofill.password-generation-prompt.subtitle" = "Lozinke su sigurno pohranjene na tvom uređaju u izborniku Prijava."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Koristiti generiranu lozinku iz DuckDuckGoa?"; +"autofill.password-generation-prompt.title" = "Koristiti jaku lozinku od DuckDuckGoa?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Koristi generiranu lozinku"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Koristi jaku lozinku"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Izradi vlastitu"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-pošta poslana na %@ ponovno će se prosljeđivati u tvoju pristiglu poštu."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Ponovno aktivirati privatnu adresu Duck address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktivna"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-pošta poslana na %@ više se neće prosljeđivati u tvoju pristiglu poštu."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktivirati privatnu adresu Duck address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Upravljanje ovom adresom privremeno je nedostupno"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivirana"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Shvaćam"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "I dalje možeš upravljati ovom Duck Address adresom putem e-pošte koju si od nje primio u svom osobnom sandučiću."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Korisničko ime privatne Duck Address adrese uklonjeno je"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Prijave se sigurno spremaju na tvom uređaju i njima se može upravljati putem izbornika Prijave u Postavkama."; +"autofill.save-login.new-user.message" = "Prijave su sigurno pohranjene na tvom uređaju u izborniku Prijave."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Želiš li da DuckDuckGo spremi tvoju prijavu?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ne sada"; +"autofill.save-login.not-now.CTA" = "Nemoj spremiti"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Spremi prijavu"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Pokaži lozinku"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ za upravljanje tvojim Duck Address adresama na ovom uređaju."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo će ažurirati ovu spremljenu prijavu na tvom uređaju."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Preuzimanje je počelo za %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Zaštita e-pošte"; diff --git a/DuckDuckGo/hr.lproj/Main.strings b/DuckDuckGo/hr.lproj/Main.strings deleted file mode 100644 index b272121196..0000000000 --- a/DuckDuckGo/hr.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Pretraži unaprijed"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Mjenjač kartica"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Pretraži unazad"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Knjižne oznake"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Zatvori sve kartice i očisti podatke"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 od 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Gotovo"; - diff --git a/DuckDuckGo/hu.lproj/Localizable.strings b/DuckDuckGo/hu.lproj/Localizable.strings index 4123bd1a8d..900f197b78 100644 --- a/DuckDuckGo/hu.lproj/Localizable.strings +++ b/DuckDuckGo/hu.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Amikor a DuckDuckGo a meglátogatott webhelyeken sütik elfogadására szolgáló felugró ablakokat észlel, a sütik minimalizálása és az adatvédelem maximalizálása érdekében automatikusan megpróbálhatjuk megadni a sütikre vonatkozó beállításaidat, és bezárhatjuk a felugró ablakokat. Egyes webhelyek nem adnak lehetőséget a sütikre vonatkozó beállítások kezelésére, így csak az ilyen felugró ablakokat tudjuk elrejteni."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "E-mail-védelem engedélyezése"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Jelszó elrejtése"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Nincs találat"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "A jelszó mentve lesz a Bejelentkezésekben."; +"autofill.password-generation-prompt.subtitle" = "A rendszer biztonságosan tárolja az eszköz Bejelentkezés menüjében elérhető jelszavakat."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "DuckDuckGo által generált jelszó használata?"; +"autofill.password-generation-prompt.title" = "A DuckDuckGo által kínált erős jelszót kívánsz használni?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Generált jelszó használata"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Erős jelszó használata"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Saját létrehozása"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "A megadott %@ címre küldött e-maileket ismét továbbítjuk a postafiókodba."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Újraaktiválod a privát Duck-címet?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktív"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "A megadott %@ címre küldött e-maileket többé nem továbbítjuk a postafiókodba."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktiválod a privát Duck-címet?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "A cím kezelése átmenetileg nem elérhető"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktiválva"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Értem"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Ezt a Duck-címet a személyes postafiókodban továbbra is kezelheted az erről a címről érkező e-mailek segítségével."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Privát Duck-cím felhasználóneve eltávolítva"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "A bejelentkezési adatokat az eszközöd biztonságosan tárolja, ezen adatok pedig a Beállítások > Bejelentkezések menüpontban kezelhetők."; +"autofill.save-login.new-user.message" = "A rendszer biztonságosan tárolja az eszköz Bejelentkezés menüjében elérhető bejelentkezési adatokat."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "A DuckDuckGo mentse a bejelentkezést?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Most nem"; +"autofill.save-login.not-now.CTA" = "Mentés mellőzése"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Bejelentkezés mentése"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Jelszó megjelenítése"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ a Duck-címek kezeléséhez ezen az eszközön."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "A DuckDuckGo frissíti az eszközödön ezt a tárolt bejelentkezést."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "A letöltés elindult: %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck-cím"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-mail védelem"; diff --git a/DuckDuckGo/hu.lproj/Main.strings b/DuckDuckGo/hu.lproj/Main.strings deleted file mode 100644 index 20a12da220..0000000000 --- a/DuckDuckGo/hu.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Böngészés előre"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Lapváltó"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Böngészés vissza"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Könyvjelzők"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Összes lap bezárása és adattörlés"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1/12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Kész"; - diff --git a/DuckDuckGo/it.lproj/Localizable.strings b/DuckDuckGo/it.lproj/Localizable.strings index 27b012fc49..a6dd82d8cc 100644 --- a/DuckDuckGo/it.lproj/Localizable.strings +++ b/DuckDuckGo/it.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Quando DuckDuckGo rileva la presenza di popup per il consenso ai cookie sui siti che visiti, può tentare di impostare automaticamente le tue preferenze in modo da ridurre al minimo i cookie e aumentare la privacy, chiudendo poi i popup. Alcuni siti non forniscono un'opzione di gestione delle preferenze sui cookie, quindi possiamo nascondere solo popup come questi."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Abilita Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Nascondi password"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Nessun risultato"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "La password verrà salvata in Accessi."; +"autofill.password-generation-prompt.subtitle" = "Le password sono archiviate in modo sicuro sul tuo dispositivo nel menu Accessi."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Usare la password generata da DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Usare una password complessa da DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Usa password generata"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Usa una password complessa"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Crea la mia"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Le e-mail inviate a %@ saranno nuovamente inoltrate alla tua casella di posta."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Riattivare Duck Address privato?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Attivo"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Le e-mail inviate a %@ non saranno più inoltrate alla tua casella di posta in arrivo."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Disattivare Duck Address privato?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "La gestione di questo indirizzo non è al momento disponibile"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Disattivato"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Ho capito"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Puoi comunque gestire questo Duck Address dalle e-mail da esso ricevute nella tua casella di posta personale."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Il nome utente Private Duck Address è stato rimosso"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "I dati di accesso sono archiviati in modo sicuro sul tuo dispositivo e possono essere gestiti dal menu Accessi, in Impostazioni."; +"autofill.save-login.new-user.message" = "Gli accessi sono archiviati in modo sicuro sul tuo dispositivo nel menu Accessi."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Vuoi che DuckDuckGo salvi i dati di accesso?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Non adesso"; +"autofill.save-login.not-now.CTA" = "Non salvare"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Salva dati di accesso"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Mostra password"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ per gestire i tuoi Duck Address su questo dispositivo."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo aggiornerà questi dati di accesso memorizzati sul tuo dispositivo."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Download di %@ avviato"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Protezione email"; diff --git a/DuckDuckGo/it.lproj/Main.strings b/DuckDuckGo/it.lproj/Main.strings deleted file mode 100644 index d98e3e79a0..0000000000 --- a/DuckDuckGo/it.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Vai avanti"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Selettore schede"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Torna indietro"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Segnalibri"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Chiudi tutte le schede e cancella i dati"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 di 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Fatto"; - diff --git a/DuckDuckGo/lt.lproj/Localizable.strings b/DuckDuckGo/lt.lproj/Localizable.strings index 8c9a830221..d5a911be54 100644 --- a/DuckDuckGo/lt.lproj/Localizable.strings +++ b/DuckDuckGo/lt.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Kai „DuckDuckGo“ jūsų lankomose svetainėse aptinka sutikimo su slapukais iškylančiuosius langus, galime automatiškai nustatyti jūsų slapukų nuostatas, kad sumažintume slapukų skaičių, sustiprintume privatumą ir uždarytume iškylančiuosius langus. Kai kuriose svetainėse nėra galimybės tvarkyti slapukų nuostatas, todėl galime tik paslėpti tokius iškylančiuosius langus."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Įjungti „Email Protection“"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Paslėpti slaptažodį"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Rezultatų nerasta"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Slaptažodis bus išsaugotas prisijungimų lange."; +"autofill.password-generation-prompt.subtitle" = "Slaptažodžiai saugiai saugomi jūsų įrenginio meniu „Prisijungimai“."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Naudoti sugeneruotą slaptažodį iš „DuckDuckGo“?"; +"autofill.password-generation-prompt.title" = "Naudoti stiprų „DuckDuckGo“ slaptažodį?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Naudoti sugeneruotą slaptažodį"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Naudoti stiprų slaptažodį"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Sukurti savo"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "El. laiškai, išsiųsti į %@, vėl bus persiųsti į jūsų pašto dėžutę."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Iš naujo suaktyvinti privatų „Duck Address“?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktyvus"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "El. laiškai, išsiųsti į %@, nebebus persiunčiami į jūsų pašto dėžutę."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktyvinti privatų „Duck Address“?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Šio adreso valdymas laikinai nepasiekiamas"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktyvinta"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Supratau"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Šį „Duck Address“ vis dar galite valdyti iš jo į savo asmeninę pašto dėžutę gautais el. laiškais."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Privatus „Duck Address“ naudotojo vardas buvo pašalintas"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Prisijungimai saugiai laikomi tik šiame įrenginyje, o juos galima tvarkyti nustatymuose, prisijungimų meniu."; +"autofill.save-login.new-user.message" = "Prisijungimai saugiai saugomi jūsų įrenginio meniu „Prisijungimai“."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Ar norite, kad „DuckDuckGo“ išsaugotų jūsų prisijungimą?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ne dabar"; +"autofill.save-login.not-now.CTA" = "Neišsaugokite"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Išsaugoti prisijungimą"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Rodyti slaptažodį"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@, kad galėtumėte valdyti savo „Duck Address“ šiame įrenginyje."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "„DuckDuckGo“ atnaujins šį jūsų įrenginyje įrašytą prisijungimą."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "%@ atsiusntimas prasidėjo."; +/* No comment provided by engineer. */ +"Duck Address" = "„Duck Address“"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "El. pašto apsauga"; diff --git a/DuckDuckGo/lt.lproj/Main.strings b/DuckDuckGo/lt.lproj/Main.strings deleted file mode 100644 index 802a934cc0..0000000000 --- a/DuckDuckGo/lt.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Naršyti pirmyn"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Skirtukų perjungiklis"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Naršyti atgal"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Žymės"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Uždaryti visus skirtukus ir išvalyti duomenis"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 iš 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Atlikta"; - diff --git a/DuckDuckGo/lv.lproj/Localizable.strings b/DuckDuckGo/lv.lproj/Localizable.strings index 10f25f4808..b5f3dbfa2e 100644 --- a/DuckDuckGo/lv.lproj/Localizable.strings +++ b/DuckDuckGo/lv.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Ja DuckDuckGo tevis apmeklētajās vietnēs atklāj sīkfailu piekrišanas uznirstošos logus, mēs varam automātiski iestatīt tavas sīkfailu preferences, lai samazinātu sīkfailus un stiprinātu privātumu, un pēc tam aizvērt šos uznirstošos logus. Dažās vietnēs nav iespējas pārvaldīt sīkfailu preferences, tāpēc mēs varam tikai paslēpt šādus uznirstošos logus."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Iespējo e-pasta aizsardzību"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Paslēpt paroli"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Nav rezultātu"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Parole tiks saglabāta Pieteikšanās datos."; +"autofill.password-generation-prompt.subtitle" = "Paroles tiek droši saglabātas tavā ierīcē, izvēlnē Pieteikšanās dati."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Vai izmantot DuckDuckGo ģenerētu paroli?"; +"autofill.password-generation-prompt.title" = "Vai izmantot spēcīgu DuckDuckGo paroli?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Izmantot ģenerētu paroli"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Izmantot spēcīgu paroli"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Izveidot savu"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-pasti, kas nosūtīti uz %@, atkal tiks pārsūtīti uz tavu pastkastīti."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Vai atkārtoti aktivizēt privāto Duck adresi?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktīva"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-pasti, kas nosūtīti uz %@, vairs netiks pārsūtīti uz tavu pastkastīti."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktivizēt privāto Duck adresi?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Šīs adreses pārvaldība uz laiku nav pieejama"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivizēta"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Sapratu"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Tu joprojām vari pārvaldīt šo Duck adresi, izmantojot no tās saņemtos e-pasta ziņojumus savā personīgajā pastkastītē."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Privātās Duck adreses lietotājvārds tika noņemts"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Pieteikšanās dati tiek droši saglabāti tavā ierīcē, un tos var pārvaldīt no iestatījumu izvēlnes Pieteikšanās dati."; +"autofill.save-login.new-user.message" = "Pieteikšanās dati tiek droši saglabāti tavā ierīcē, izvēlnē Pieteikšanās dati."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Vai vēlies, lai DuckDuckGo saglabātu tavus pieteikšanās datus?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ne tagad"; +"autofill.save-login.not-now.CTA" = "Nesaglabāt"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Saglabāt pieteikšanās datus"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Rādīt paroli"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@, lai pārvaldītu savas Duck adreses šajā ierīcē."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo atjauninās šos saglabātos pieteikšanās datus tavā ierīcē."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "%@ lejupielāde sākta"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck adrese"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-pasta aizsardzība"; diff --git a/DuckDuckGo/lv.lproj/Main.strings b/DuckDuckGo/lv.lproj/Main.strings deleted file mode 100644 index 90b6fcf657..0000000000 --- a/DuckDuckGo/lv.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Pārlūkot uz priekšu"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Ciļņu pārslēdzējs"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Pārlūkot atpakaļ"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Grāmatzīmes"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Aizvērt visas cilnes un notīrīt datus"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 no 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Gatavs"; - diff --git a/DuckDuckGo/nb.lproj/Localizable.strings b/DuckDuckGo/nb.lproj/Localizable.strings index f37ebdfa10..38521571c3 100644 --- a/DuckDuckGo/nb.lproj/Localizable.strings +++ b/DuckDuckGo/nb.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Når DuckDuckGo oppdager popup-vinduer om samtykke til informasjonskapsler på nettsteder du besøker, kan vi automatisk angi innstillingene for å minimere informasjonskapslene og maksimere personvernet, og deretter lukke popup-vinduene. Noen nettsteder tilbyr ikke noe alternativ for å administrere preferanser for informasjonskapsler, så slike popup-vinduer kan vi bare skjule."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Aktiver e-postbeskyttelse"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Skjul passord"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Ingen resultater"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Passord blir lagret i pålogginger."; +"autofill.password-generation-prompt.subtitle" = "Passord lagres trygt på enheten din i påloggingsmenyen."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Vil du bruke et generert passord fra DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Vil du bruke et sterkt passord fra DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Bruk generert passord"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Bruk sterkt passord"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Opprett eget passord"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-post som sendes til %@, blir videresendt til innboksen din igjen."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Vil du aktivere privat Duck Address på nytt?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktiv"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-post som sendes til %@, blir ikke lenger videresendt til innboksen din."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Vil du deaktivere privat Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Administrasjon av denne adressen er midlertidig utilgjengelig."; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivert"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Den er grei"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Du kan fortsatt administrere denne Duck-adressen fra e-poster du mottar fra den i din personlige innboks."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Brukernavn for privat Duck-adresse ble fjernet"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Pålogginger lagres trygt på enheten din og kan administreres i påloggingsmenyen i innstillinger."; +"autofill.save-login.new-user.message" = "Pålogginger lagres trygt på enheten din i påloggingsmenyen."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Vil du at DuckDuckGo skal lagre påloggingen din?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ikke nå"; +"autofill.save-login.not-now.CTA" = "Ikke lagre"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Lagre påloggingen"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Vis passord"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ for å administrere Duck-adressene dine på denne enheten."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo oppdaterer denne lagrede påloggingen på enheten din."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Nedlasting av %@ har startet"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck-adresse"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-postbeskyttelse"; diff --git a/DuckDuckGo/nb.lproj/Main.strings b/DuckDuckGo/nb.lproj/Main.strings deleted file mode 100644 index 50c970d34d..0000000000 --- a/DuckDuckGo/nb.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Gå frem"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Fanebytter"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Gå tilbake"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Bokmerker"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Lukk alle faner og slett data"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 av 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Ferdig"; - diff --git a/DuckDuckGo/nl.lproj/Localizable.strings b/DuckDuckGo/nl.lproj/Localizable.strings index e47962458a..6c18ca909d 100644 --- a/DuckDuckGo/nl.lproj/Localizable.strings +++ b/DuckDuckGo/nl.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Wanneer DuckDuckGo pop-ups voor cookietoestemming op bezochte websites detecteert, kunnen we proberen automatisch je cookievoorkeuren in te stellen om het aantal cookies tot een minimum te beperken en je privacy te maximaliseren. De pop-ups worden vervolgens gesloten. Sommige sites bieden geen optie om cookievoorkeuren te beheren, zodat we pop-ups zoals deze alleen kunnen verbergen."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "E-mailbeveiliging inschakelen"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Wachtwoord verbergen"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Geen resultaten"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Wachtwoord wordt opgeslagen in aanmeldgegevens."; +"autofill.password-generation-prompt.subtitle" = "Wachtwoorden worden veilig opgeslagen op je apparaat in het menu 'Aanmeldingen'."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Gegenereerd wachtwoord van DuckDuckGo gebruiken?"; +"autofill.password-generation-prompt.title" = "Een sterk wachtwoord van DuckDuckGo gebruiken?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Gegenereerd wachtwoord gebruiken"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Sterk wachtwoord gebruiken"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Zelf wachtwoord aanmaken"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-mails die naar %@ worden gestuurd, worden opnieuw doorgestuurd naar je inbox."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Privé-Duck Address opnieuw activeren?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Actief"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-mails die naar %@ worden gestuurd, worden niet meer doorgestuurd naar je inbox."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Privé-Duck Address deactiveren?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Beheren van dit adres is tijdelijk niet beschikbaar"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Gedeactiveerd"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Ik snap het"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Je kunt dit Duck Address nog steeds beheren via e-mails die je ervan ontvangt in je persoonlijke inbox."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "De persoonlijke gebruikersnaam voor het Duck Address is verwijderd"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Aanmeldgegevens worden veilig opgeslagen op je apparaat en kunnen worden beheerd via het menu Aanmeldgegevens in Instellingen."; +"autofill.save-login.new-user.message" = "Aanmeldgegevens worden veilig opgeslagen op je apparaat in het menu 'Aanmeldingen'."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Wil je dat DuckDuckGo je login opslaat?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Niet nu"; +"autofill.save-login.not-now.CTA" = "Niet opslaan"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Login opslaan"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Wachtwoord weergeven"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ om je Duck-adressen op dit apparaat te beheren."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo werkt deze opgeslagen aanmeldgegevens op je apparaat bij."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Downloaden gestart voor %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-mailbescherming"; diff --git a/DuckDuckGo/nl.lproj/Main.strings b/DuckDuckGo/nl.lproj/Main.strings deleted file mode 100644 index 7136ee440a..0000000000 --- a/DuckDuckGo/nl.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Vooruit browsen"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Wisselen tussen tabbladen"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Terug browsen"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Bladwijzers"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Alle tabbladen sluiten en gegevens wissen"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 van 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Klaar"; - diff --git a/DuckDuckGo/pl.lproj/Localizable.strings b/DuckDuckGo/pl.lproj/Localizable.strings index 12049b5b6c..e1c239da53 100644 --- a/DuckDuckGo/pl.lproj/Localizable.strings +++ b/DuckDuckGo/pl.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Kiedy DuckDuckGo wykrywa wyskakujące okienka z prośbą o zgodę na używanie plików cookie na odwiedzanych przez Ciebie stronach, może spróbować automatycznie ustawić Twoje preferencje dotyczące plików cookie w taki sposób, aby zminimalizować liczbę plików cookie i zmaksymalizować prywatność, a następnie zamknąć wyskakujące okienka. Niektóre witryny nie umożliwiają zarządzania preferencjami dotyczącymi plików cookie, dlatego możemy jedynie ukryć takie wyskakujące okienka."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Włącz ochronę poczty Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Ukryj hasło"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Brak wyników"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Hasło zostanie zapisane w Danych logowania."; +"autofill.password-generation-prompt.subtitle" = "Hasła są bezpiecznie przechowywane na Twoim urządzeniu w menu Loginy."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Użyć hasła wygenerowanego z DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Użyć silnego hasła z DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Użyj wygenerowanego hasła"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Użyj silnego hasła"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Utwórz własne"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Wiadomości e-mail wysłane do %@ będą ponownie przekazywane do Twojej skrzynki odbiorczej."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Ponownie aktywować prywatny adres Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktywny"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Wiadomości e-mail wysłane do %@ nie będą już przekazywane do Twojej skrzynki odbiorczej."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Dezaktywować prywatny adres Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Zarządzanie tym adresem jest chwilowo niedostępne"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Dezaktywowany"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Rozumiem"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Nadal możesz zarządzać adresem Duck Address z wiadomości e-mail otrzymanych z tego adresu w swojej osobistej skrzynce odbiorczej."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Nazwa użytkownika prywatnego adresu Duck Address została usunięta"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Dane logowania są bezpiecznie przechowywane na Twoim urządzeniu i można nimi zarządzać w sekcji Loginy menu Ustawienia."; +"autofill.save-login.new-user.message" = "Loginy są bezpiecznie przechowywane na Twoim urządzeniu w menu Loginy."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Czy chcesz zapisać dane logowania w DuckDuckGo?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Nie teraz"; +"autofill.save-login.not-now.CTA" = "Nie zapisuj"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Zapisz logowanie"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Pokaż hasło"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@, aby zarządzać adresami Duck Address na tym urządzeniu."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo zaktualizuje ten zapisany login na Twoim urządzeniu."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Rozpoczęto pobieranie %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Ochrona poczty e-mail"; diff --git a/DuckDuckGo/pl.lproj/Main.strings b/DuckDuckGo/pl.lproj/Main.strings deleted file mode 100644 index f3a3e28e05..0000000000 --- a/DuckDuckGo/pl.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Przeglądaj dalej"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Przełącznik kart"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Przeglądaj wstecz"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Zakładki"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Zamknij wszystkie karty i wyczyść dane"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 z 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Gotowe"; - diff --git a/DuckDuckGo/pt.lproj/Localizable.strings b/DuckDuckGo/pt.lproj/Localizable.strings index e6ca6c40d2..a246eb5775 100644 --- a/DuckDuckGo/pt.lproj/Localizable.strings +++ b/DuckDuckGo/pt.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Quando o DuckDuckGo deteta pop-ups de consentimento de cookies nos sites que visitas, podemos tentar definir automaticamente as tuas preferências de cookies para minimizar os cookies e maximizar a privacidade e, em seguida, fechar os pop-ups. Alguns sites não te dão a opção de gerir preferências de cookies, por isso só podemos ocultar pop-ups como estes."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Ativa a Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Ocultar palavra-passe"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Sem resultados"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "A palavra-passe será guardada em Início de sessão."; +"autofill.password-generation-prompt.subtitle" = "As palavras-passe são armazenadas de forma segura no teu dispositivo no menu Inícios de sessão."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Utilizar palavra-passe gerada do DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Utilizar uma palavra-passe forte do DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Utilizar palavra-passe gerada"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Utilizar palavra-passe forte"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Criar a minha própria palavra-passe"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Os e-mails enviados para %@ serão encaminhados para a tua caixa de entrada."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Reativar Duck Address privado?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Ativo"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Os e-mails enviados para %@ já não serão encaminhados para a tua caixa de entrada."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Desativar Duck Address privado?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "A gestão deste endereço está temporariamente indisponível"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Desativado"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Entendi"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Ainda podes gerir este Duck Address a partir dos e-mails recebidos deste endereço na tua caixa de entrada pessoal."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "O nome de utilizador privado do Duck Address foi removido"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Os inícios de sessão são armazenados com segurança no teu dispositivo, e podes efetuar a gestão dos mesmos a partir do menu Inícios de sessão nas Definições."; +"autofill.save-login.new-user.message" = "Os dados de início de sessão são armazenados de forma segura no teu dispositivo no menu Inícios de sessão."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Queres que o DuckDuckGo guarde o teu início de sessão?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Agora não"; +"autofill.save-login.not-now.CTA" = "Não guardes"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Guardar início de sessão"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Mostrar palavra-passe"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ para gerires os teus Duck Addresses neste dispositivo."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "O DuckDuckGo vai atualizar este início de sessão armazenado no teu dispositivo."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Transferência iniciada de %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Proteção de e-mail"; diff --git a/DuckDuckGo/pt.lproj/Main.strings b/DuckDuckGo/pt.lproj/Main.strings deleted file mode 100644 index 3bb92a1fbb..0000000000 --- a/DuckDuckGo/pt.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Navegar para a frente"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Alternar de separador"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Navegar para trás"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Marcadores"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Fechar todos os separadores e limpar os dados"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 de 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Feito"; - diff --git a/DuckDuckGo/ro.lproj/Localizable.strings b/DuckDuckGo/ro.lproj/Localizable.strings index 9574b00d67..a9ae2508be 100644 --- a/DuckDuckGo/ro.lproj/Localizable.strings +++ b/DuckDuckGo/ro.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Când DuckDuckGo detectează ferestre pop-up în care ți se solicită consimțământul cu privire la modulele cookie pe site-urile pe care le vizitezi, putem încerca să îți setăm automat preferințele privind modulele cookie pentru a minimiza modulele cookie și a maximiza confidențialitatea și, apoi, pentru a închide ferestrele pop-up. Unele site-uri nu oferă o opțiune de gestionare a preferințelor privind modulele cookie, prin urmare putem doar să ascundem ferestrele pop-up precum acestea."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Activează Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Ascunde parola"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Niciun rezultat"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Parola va fi salvată în Datele de conectare."; +"autofill.password-generation-prompt.subtitle" = "Parolele sunt stocate în siguranță pe dispozitivul dvs. în meniul Autentificări."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Vrei să folosești parola generată de DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Folosiți o parolă puternică de la DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Folosește parola generată"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Utilizați o parolă puternică"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Îmi creez propria parolă"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Mesajele de e-mail trimise la %@ vor fi din nou redirecționate către căsuța ta de inbox."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Reactivezi Duck Address privată?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Activ"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-mailurile trimise la %@ nu vor mai fi redirecționate către căsuța ta de inbox."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Dezactivează Duck Address privată?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Gestionarea acestei adrese este temporar indisponibilă"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Dezactivat"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Am înțeles"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Poți gestiona în continuare această Duck Address din e-mailurile primite de la aceasta în căsuța ta de e-mail personală."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Numele de utilizator pentru Duck Address privată a fost eliminat"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Datele de conectare sunt stocate în siguranță pe dispozitivul tău și pot fi gestionate din Setări, meniul Date de conectare."; +"autofill.save-login.new-user.message" = "Conexiunile sunt stocate în siguranță pe dispozitivul dvs. în meniul Conectări."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Dorești ca DuckDuckGo să îți salveze datele de autentificare?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Nu acum"; +"autofill.save-login.not-now.CTA" = "Nu salva"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Salvează autentificarea"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Arată parola"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ pentru a-ți gestiona adresele Duck Address pe acest dispozitiv."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo va actualiza aceste date de conectare stocate pe dispozitivul tău."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Descărcarea a început pentru %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Protecția comunicațiilor prin e-mail"; diff --git a/DuckDuckGo/ro.lproj/Main.strings b/DuckDuckGo/ro.lproj/Main.strings deleted file mode 100644 index cdc12a056d..0000000000 --- a/DuckDuckGo/ro.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Navigare înainte"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Comutator între file"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Navigare înapoi"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Semne de carte"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Închide toate filele și șterge datele"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 din 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Terminat"; - diff --git a/DuckDuckGo/ru.lproj/Localizable.strings b/DuckDuckGo/ru.lproj/Localizable.strings index 2731e206d8..f1353ea90b 100644 --- a/DuckDuckGo/ru.lproj/Localizable.strings +++ b/DuckDuckGo/ru.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Если DuckDuckGo обнаружит всплывающее окно выбора куки-файлов на каком-либо сайте, мы попытаемся автоматически выбрать минимум куки, максимально защитив ваши данные, а затем закроем окно. Некоторые сайты не позволяют контролировать настройки куки-файлов. В этом случае мы можем их только скрыть."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Включите защиту электронной почты"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Скрыть пароль"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Нет результатов"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Пароль будет сохранен в разделе «Логины»."; +"autofill.password-generation-prompt.subtitle" = "Пароли надежно хранятся на вашем устройстве в меню «Логины»."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Использовать пароль, сгенерированный DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Как насчет надежного пароля от DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Использовать предложенный"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Применить надежный пароль"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Создать собственный"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Электронные письма, отправленные на адрес %@, снова будут пересылаться на ваш почтовый ящик."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Вновь активировать приватный адрес Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Активирован"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Электронные письма, отправленные на адрес %@, не будут пересылаться на ваш почтовый ящик."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Деактивировать приватный адрес Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Управление этим адресом временно недоступно"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Деактивирован"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Понятно"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Вы по-прежнему можете управлять этим адресом Duck Address через поступившие на него письма в своем почтовом ящике."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Приватное имя пользователя Duck Address удалено"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Учетные данные надежно хранятся на вашем устройстве, а проконтролировать их можно в меню «Логины» в «Настройках»."; +"autofill.save-login.new-user.message" = "Учетные данные надежно хранятся на вашем устройстве в меню «Логины»."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Хотите, чтобы DuckDuckGo сохранил логин?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Не сейчас"; +"autofill.save-login.not-now.CTA" = "Не сохранять"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Сохранить логин"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Показать пароль"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ для управления адресами Duck Address с этого устройства."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo обновит логин, сохраненный на вашем устройстве."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Началась загрузка файла %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Защита электронной почты"; diff --git a/DuckDuckGo/ru.lproj/Main.strings b/DuckDuckGo/ru.lproj/Main.strings deleted file mode 100644 index ad87d393bf..0000000000 --- a/DuckDuckGo/ru.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Вперед"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Переключатель вкладок"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Назад"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Закладки"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Закрыть все вкладки и удалить данные"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 из 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Готово"; - diff --git a/DuckDuckGo/sk.lproj/Localizable.strings b/DuckDuckGo/sk.lproj/Localizable.strings index 6a21dd5611..7704624637 100644 --- a/DuckDuckGo/sk.lproj/Localizable.strings +++ b/DuckDuckGo/sk.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "Keď DuckDuckGo zistí na vami navštívených lokalitách kontextové okná týkajúce sa súhlasu so súbormi cookie, môžeme sa pokúsiť automaticky nastaviť vaše možnosti súborov cookie tak, aby sa využívanie súborov cookie minimalizovali a aby sa maximalizovala ochrana súkromia, a potom môžeme kontextové automaticky okná zavrieť. Niektoré lokality neponúkajú možnosť spravovať preferencie súborov cookie, takže takéto kontextové okná môžeme iba skryť."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Povoliť ochranu e-mailu"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Skryť heslo"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Žiadne výsledky"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Heslo sa uloží do prihlasovacích údajov."; +"autofill.password-generation-prompt.subtitle" = "Heslá sú bezpečne uložené na vašom zariadení v ponuke Prihlásenia."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Použiť vygenerované heslo z DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Používate silné heslo od DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Použiť vygenerované heslo"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Používanie silného hesla"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Vytvoriť vlastné"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-maily odoslané na adresu %@ budú opäť preposielané do vašej schránky."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Znova aktivovať súkromnú Duck adresu?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktívne"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-maily odoslané na adresu %@ sa už nebudú preposielať do vašej schránky."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Deaktivovať súkromnú Duck adresu?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Správa tejto adresy je dočasne nedostupná."; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivované"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Rozumiem"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Túto Duck adresu môžete naďalej spravovať z e-mailov, ktoré z nej dostanete do svojej osobnej schránky."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Používateľské meno Private Duck Address bolo odstránené"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Prihlasovacie údaje sú zabezpečene uložené len v tomto zariadení a môžete ich spravovať v ponuke Prihlasovacie údaje v Nastaveniach."; +"autofill.save-login.new-user.message" = "Prihlasovacie údaje sú bezpečne uložené v zariadení v ponuke Prihlásenia."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Chcete, aby DuckDuckGo uložil vaše prihlasovacie údaje?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Teraz nie"; +"autofill.save-login.not-now.CTA" = "Neukladať"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Uložiť prihlasovacie údaje"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Zobraziť heslo"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ na správu vašich Duck adries na tomto zariadení."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo bude aktualizovať tieto uložené prihlasovacie údaje vo vašom zariadení."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "%@ – začalo sa sťahovanie"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Ochrana e-mailu"; diff --git a/DuckDuckGo/sk.lproj/Main.strings b/DuckDuckGo/sk.lproj/Main.strings deleted file mode 100644 index 3e86b1d44b..0000000000 --- a/DuckDuckGo/sk.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Prehliadajte dopredu"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Prepínač kariet"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Prehliadajte dozadu"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Záložky"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Zatvoriť všetky karty a vymazať údaje"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 z 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Hotovo"; - diff --git a/DuckDuckGo/sl.lproj/Localizable.strings b/DuckDuckGo/sl.lproj/Localizable.strings index ffefaa99e3..d0c2f9a7fa 100644 --- a/DuckDuckGo/sl.lproj/Localizable.strings +++ b/DuckDuckGo/sl.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "DuckDuckGo na spletnih mestih, ki jih obiščete, zazna pojavna okna s soglasjem za piškotke, zato lahko samodejno nastavimo vaše nastavitve piškotkov, da zmanjšamo uporabo piškotkov in povečamo zasebnost, nato pa pojavna okna zapremo. Nekatera spletna mesta pa ne omogočajo upravljanja nastavitev piškotkov, zato lahko takšna pojavna okna le skrijemo."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Omogočite zaščito e-pošte Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Skrij geslo"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Ni rezultatov"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Geslo bo shranjeno v razdelku Prijave."; +"autofill.password-generation-prompt.subtitle" = "Gesla so varno shranjena v napravi v meniju Prijave."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Želite uporabiti geslo, ki ga je ustvaril DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Želite uporabiti močno geslo od DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Uporabi ustvarjeno geslo"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Uporabi močno geslo"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Ustvari svoje"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "Elektronska sporočila, poslana na naslov %@, bodo znova posredovana v vaš e-poštni predal."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Želite znova aktivirati zasebni naslov Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktivno"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "Elektronska sporočila, poslana na naslov %@, ne bodo več posredovana v vaš e-poštni predal."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Želite deaktivirati zasebni naslov Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Upravljanje tega naslova trenutno ni na voljo"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Deaktivirano"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Razumem"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Ta naslov Duck Address lahko še vedno upravljate iz e-poštnih sporočili, ki jih prejmete z njega, v svojem osebnem e-poštnem predalu."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Uporabniško ime za zasebni naslov Duck Address je bilo odstranjeno"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Prijave so varno shranjene v tej napravi in jih lahko upravljate v razdelku Prijave v nastavitvah."; +"autofill.save-login.new-user.message" = "Prijave so varno shranjene v vaši napravi v meniju Prijave."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Ali želite, da DuckDuckGo shrani vašo prijavo?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Ne zdaj"; +"autofill.save-login.not-now.CTA" = "Ne shrani"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Shrani prijavo"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Prikaži geslo"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ za upravljanje naslovov Duck Address v tej napravi."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo bo posodobil to shranjeno prijavo v vaši napravi."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Prenos za %@ se je začel"; +/* No comment provided by engineer. */ +"Duck Address" = "Naslov Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "Zaščita e-pošte"; diff --git a/DuckDuckGo/sl.lproj/Main.strings b/DuckDuckGo/sl.lproj/Main.strings deleted file mode 100644 index e8129b28f8..0000000000 --- a/DuckDuckGo/sl.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Brskaj naprej"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Preklopi med zavihki"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Brskaj nazaj"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Zaznamki"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Zapri vse zavihke in izbriši podatke"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 od 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Končano"; - diff --git a/DuckDuckGo/sv.lproj/Localizable.strings b/DuckDuckGo/sv.lproj/Localizable.strings index c4a3a314d6..63175f919e 100644 --- a/DuckDuckGo/sv.lproj/Localizable.strings +++ b/DuckDuckGo/sv.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "När DuckDuckGo upptäcker popup-fönster för godkännande av cookies på webbplatser som du besöker kan vi försöka att automatiskt ställa in dina cookieinställningar på att minimera cookies och maximera din integritet, och därefter stänga popup-fönstren. På vissa webbplatser finns ingen möjlighet att justera cookieinställningarna, så vi kan enbart dölja popup-fönster som dessa."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Aktivera Email Protection"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Dölj lösenord"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Inga resultat"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Lösenordet sparas i Inloggningar."; +"autofill.password-generation-prompt.subtitle" = "Lösenord lagras säkert på din enhet i menyn Inloggningar."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "Använd genererat lösenord från DuckDuckGo?"; +"autofill.password-generation-prompt.title" = "Använd ett starkt lösenord från DuckDuckGo?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Använd genererat lösenord"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Använd starkt lösenord"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Skapa mitt eget"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "E-postmeddelanden som skickas till %@ kommer återigen att vidarebefordras till din inkorg."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Återaktivera privat Duck Address?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktiv"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "E-postmeddelanden som skickas till %@ kommer inte längre att vidarebefordras till din inkorg."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Inaktivera privat Duck Address?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Den här adressen kan inte hanteras för närvarande"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Inaktiverad"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Jag fattar"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Du kan fortfarande hantera denna Duck Address från e-postmeddelanden som tas emot från den till din personliga inkorg."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Användarnamn för privat Duck Address har tagits bort"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Inloggningar lagras säkert på din enhet, och kan hanteras genom menyn Inloggningar i inställningarna."; +"autofill.save-login.new-user.message" = "Inloggningar lagras säkert på din enhet i menyn Inloggningar."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "Vill du att DuckDuckGo ska spara din inloggning?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Inte nu"; +"autofill.save-login.not-now.CTA" = "Spara inte"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Spara inloggning"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Visa lösenord"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "%@ för att hantera Duck Addresses på denna enhet."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo uppdaterar den här lagrade inloggningen på din enhet."; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "Nerladdning påbörjad för %@"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-postskydd"; diff --git a/DuckDuckGo/sv.lproj/Main.strings b/DuckDuckGo/sv.lproj/Main.strings deleted file mode 100644 index 85c434c49f..0000000000 --- a/DuckDuckGo/sv.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "Bläddra framåt"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Flikväxlare"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Bläddra tillbaka"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Bokmärken"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Stäng alla flikar och rensa data"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1 av 12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Klart"; - diff --git a/DuckDuckGo/tr.lproj/Localizable.strings b/DuckDuckGo/tr.lproj/Localizable.strings index ab80ad1c43..6b694dd10b 100644 --- a/DuckDuckGo/tr.lproj/Localizable.strings +++ b/DuckDuckGo/tr.lproj/Localizable.strings @@ -175,6 +175,9 @@ /* No comment provided by engineer. */ "autoconsent.info.header" = "DuckDuckGo ziyaret ettiğiniz sitelerde çerez onayı açılır pencereleri tespit ederse çerez tercihlerinizi çerezleri en aza indirecek ve gizliliği en üst düzeye çıkaracak şekilde otomatik olarak ayarlayabilir ve ardından açılır pencereleri kapatabiliriz. Bazı siteler çerez tercihlerini yönetmek için bir seçenek sunmaz. Bu nedenle yalnızca bu gibi açılır pencereleri gizleyebiliriz."; +/* Text link to email protection website */ +"autofill.enable.email.protection" = "Email Protection'ı Etkinleştir"; + /* Accessibility title for a Hide Password button replacing displayed password with ***** */ "autofill.hide-password" = "Parolayı gizle"; @@ -341,25 +344,55 @@ "autofill.logins.search.no-results.title" = "Sonuç yok"; /* Subtitle for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.subtitle" = "Şifre, Girişlere kaydedilecektir."; +"autofill.password-generation-prompt.subtitle" = "Şifreler cihazınızdaki Oturum Açma menüsünde güvenli bir şekilde saklanır."; /* Title for prompt to use suggested strong password for creating a login */ -"autofill.password-generation-prompt.title" = "DuckDuckGo'dan oluşturulan şifre kullanılsın mı?"; +"autofill.password-generation-prompt.title" = "DuckDuckGo'nun oluşturduğu güçlü bir şifre kullanmak ister misiniz?"; /* Button title choosing to use the suggested generated password for creating a login */ -"autofill.password-generation-prompt.use-generated-password.cta" = "Oluşturulan Şifreyi Kullan"; +"autofill.password-generation-prompt.use-generated-password.cta" = "Güçlü Şifre Kullan"; /* Button title choosing to use own password for creating a login */ "autofill.password-generation-prompt.use-own-password.cta" = "Kendiminkini Oluştur"; +/* Text for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.content" = "%@ adresine gönderilen e-postalar tekrar gelen kutunuza yönlendirilecektir."; + +/* Title for the confirmation message displayed when a user tries activate a Private Email Address */ +"autofill.private.email.mesage.activate.confirm.title" = "Özel Duck Address yeniden etkinleştirilsin mi?"; + +/* Mesasage displayed when a private email address is active */ +"autofill.private.email.mesage.active" = "Aktif"; + +/* Text for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.content" = "%@ adresine gönderilen e-postalar artık gelen kutunuza yönlendirilmeyecektir."; + +/* Title for the confirmation message displayed when a user tries deactivate a Private Email Address */ +"autofill.private.email.mesage.deactivate.confirm.title" = "Özel Duck Address devre dışı bırakılsın mı?"; + +/* Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down */ +"autofill.private.email.mesage.error" = "Bu adresin yönetimi geçici olarak kullanılamıyor"; + +/* Mesasage displayed when a private email address is inactive */ +"autofill.private.email.mesage.inactive" = "Devre dışı bırakıldı"; + +/* Button text for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.button" = "Anladım"; + +/* Content for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.content" = "Bu Duck Address'i kişisel hesabınıza gönderilen e-postalardan yönetmeye devam edebilirsiniz."; + +/* Title for the alert dialog telling the user an updated username is no longer a private email address */ +"autofill.removed.duck.address.title" = "Özel Duck Address kullanıcı adı kaldırıldı"; + /* Message displayed on modal asking for the user to save the login for the first time */ -"autofill.save-login.new-user.message" = "Giriş bilgileri yalnızca bu cihazda güvenli bir şekilde saklanır ve Ayarlar'daki Giriş Bilgileri menüsünden yönetilebilir."; +"autofill.save-login.new-user.message" = "Giriş bilgileri cihazınızdaki Giriş Bilgileri menüsünde güvenli bir şekilde saklanır."; /* Title displayed on modal asking for the user to save the login for the first time */ "autofill.save-login.new-user.title" = "DuckDuckGo'nun Girişinizi kaydetmesini istiyor musunuz?"; /* Cancel CTA displayed on modal asking for the user to save the login */ -"autofill.save-login.not-now.CTA" = "Şimdi Değil"; +"autofill.save-login.not-now.CTA" = "Kaydetme"; /* Confirm CTA displayed on modal asking for the user to save the login */ "autofill.save-login.save.CTA" = "Girişi Kaydet"; @@ -376,6 +409,9 @@ /* Accessibility title for a Show Password button displaying actial password instead of ***** */ "autofill.show-password" = "Parolayı göster"; +/* Message displayed to the user when they are logged out of Email protection. */ +"autofill.signin.to.manage" = "Bu cihazdaki Duck Address'leri yönetmek için %@."; + /* Message displayed on modal asking for the user to update the password */ "autofill.update-password.message" = "DuckDuckGo, cihazınızdaki bu kayıtlı Giriş bilgisini güncelleyecektir."; @@ -389,7 +425,7 @@ "autofill.update-username.save.CTA" = "Kullanıcı Adını Güncelle"; /* Title displayed on modal asking for the user to update the username */ -"autofill.update-usernamr.title" = "Kullanıcı Adı Güncellensin mi?"; +"autofill.update-usernamr.title" = "Kullanıcı adı güncellensin mi?"; /* Add bookmark screen title */ "bookmark.addBookmark.title" = "Yer İmi ekle"; @@ -661,6 +697,9 @@ /* Message confirming that the download process has started. Parameter is downloaded file's filename */ "downloads.message.download-started" = "%@ için indirme başlatıldı"; +/* No comment provided by engineer. */ +"Duck Address" = "Duck Address"; + /* Email protection service offered by DuckDuckGo */ "email-protection" = "E-posta Koruması"; diff --git a/DuckDuckGo/tr.lproj/Main.strings b/DuckDuckGo/tr.lproj/Main.strings deleted file mode 100644 index 9f6e3a39ae..0000000000 --- a/DuckDuckGo/tr.lproj/Main.strings +++ /dev/null @@ -1,21 +0,0 @@ -/* Class = "UIBarButtonItem"; title = "Browse Forward"; ObjectID = "cUp-YP-aMf"; */ -"cUp-YP-aMf.title" = "İleri Git"; - -/* Class = "UIBarButtonItem"; title = "Tab Switcher"; ObjectID = "K7o-WL-SC5"; */ -"K7o-WL-SC5.title" = "Sekme Değiştirici"; - -/* Class = "UIBarButtonItem"; title = "Browse Back"; ObjectID = "Kc6-IR-lKx"; */ -"Kc6-IR-lKx.title" = "Geri Dön"; - -/* Class = "UIBarButtonItem"; title = "Bookmarks"; ObjectID = "M7u-mw-fly"; */ -"M7u-mw-fly.title" = "Yer İmleri"; - -/* Class = "UIBarButtonItem"; title = "Close all tabs and clear data"; ObjectID = "ntb-c7-mjV"; */ -"ntb-c7-mjV.title" = "Tüm sekmeleri kapat ve verileri temizle"; - -/* Class = "UILabel"; text = "1 of 12"; ObjectID = "rSE-zZ-iud"; */ -"rSE-zZ-iud.text" = "1/12"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "X8N-Ee-U1n"; */ -"X8N-Ee-U1n.normalTitle" = "Bitti"; - diff --git a/DuckDuckGoTests/BarsAnimatorTests.swift b/DuckDuckGoTests/BarsAnimatorTests.swift index 198ba820a9..40efd123f9 100644 --- a/DuckDuckGoTests/BarsAnimatorTests.swift +++ b/DuckDuckGoTests/BarsAnimatorTests.swift @@ -181,5 +181,5 @@ private class BrowserChromeDelegateMock: BrowserChromeDelegate { var omniBar: OmniBar! = OmniBar(frame: CGRect(x: 0, y: 0, width: 300, height: 30)) - var tabsBar: UIView! = UIView() + var tabBarContainer: UIView = UIView() } diff --git a/DuckDuckGoTests/UserAgentTests.swift b/DuckDuckGoTests/UserAgentTests.swift index 86da0621c2..2ad32d1438 100644 --- a/DuckDuckGoTests/UserAgentTests.swift +++ b/DuckDuckGoTests/UserAgentTests.swift @@ -22,34 +22,53 @@ import XCTest import BrowserServicesKit @testable import Core -class UserAgentTests: XCTestCase { +// swiftlint:disable file_length type_body_length +final class UserAgentTests: XCTestCase { private struct DefaultAgent { + + // swiftlint:disable line_length static let mobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" static let tablet = "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" + static let oldWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.14 (KHTML, like Gecko) Mobile/15E148" + static let newWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.16 (KHTML, like Gecko) Mobile/15E148" + static let sameWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" + } private struct ExpectedAgent { - // swiftlint:disable line_length - + // Based on DefaultAgent values static let mobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4 Mobile/15E148 DuckDuckGo/7 Safari/605.1.15" static let tablet = "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4 Mobile/15E148 DuckDuckGo/7 Safari/605.1.15" static let desktop = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4 DuckDuckGo/7 Safari/605.1.15" - + static let oldWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.14 (KHTML, like Gecko) Version/12.4 Mobile/15E148 DuckDuckGo/7 Safari/605.1.14" + static let newWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 DuckDuckGo/7 Safari/604.1" + static let sameWebkitVersionMobile = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 DuckDuckGo/7 Safari/604.1" + static let mobileNoApplication = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4 Mobile/15E148 Safari/605.1.15" // Based on fallback constants in UserAgent static let mobileFallback = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.5 Mobile/15E148 DuckDuckGo/7 Safari/605.1.15" static let desktopFallback = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.5 DuckDuckGo/7 Safari/605.1.15" - + + static let mobileFixed = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 DuckDuckGo/7 Safari/604.1" + static let tabletFixed = "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 DuckDuckGo/7 Safari/604.1" + static let desktopFixed = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 DuckDuckGo/7 Safari/605.1.15" + + static let mobileClosest = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1" + static let tabletClosest = "Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1" + static let desktopClosest = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15" // swiftlint:enable line_length + } private struct Constants { static let url = URL(string: "http://example.com/index.html") static let noAppUrl = URL(string: "http://cvs.com/index.html") static let noAppSubdomainUrl = URL(string: "http://subdomain.cvs.com/index.html") + static let ddgFixedUrl = URL(string: "http://test2.com/index.html") + static let ddgDefaultUrl = URL(string: "http://test3.com/index.html") } let testConfig = """ @@ -73,7 +92,7 @@ class UserAgentTests: XCTestCase { """.data(using: .utf8)! private var privacyConfig: PrivacyConfiguration! - + override func setUp() { super.setUp() @@ -164,4 +183,270 @@ class UserAgentTests: XCTestCase { XCTAssertEqual(ExpectedAgent.mobileNoApplication, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: manager.privacyConfig)) } + + /// Experimental config + + func makePrivacyConfig(from rawConfig: Data) -> PrivacyConfiguration { + let mockEmbeddedData = MockEmbeddedDataProvider(data: rawConfig, etag: "test") + let mockProtectionStore = MockDomainsProtectionStore() + + let manager = PrivacyConfigurationManager(fetchedETag: nil, + fetchedData: nil, + embeddedDataProvider: mockEmbeddedData, + localProtection: mockProtectionStore, + internalUserDecider: DefaultInternalUserDecider()) + return manager.privacyConfig + } + + let ddgConfig = """ + { + "features": { + "customUserAgent": { + "defaultPolicy": "ddg", + "state": "enabled", + "settings": { + "omitApplicationSites": [ + { + "domain": "cvs.com", + "reason": "Site reports browser not supported" + } + ], + "ddgFixedSites": [ + { + "domain": "test2.com" + } + ] + }, + "exceptions": [] + } + }, + "unprotectedTemporary": [] + } + """.data(using: .utf8)! + + func testWhenMobileUaAndDesktopFalseAndDomainSupportsFixedUAThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: ddgConfig) + XCTAssertEqual(ExpectedAgent.mobileFixed, testee.agent(forUrl: Constants.ddgFixedUrl, isDesktop: false, privacyConfig: config)) + } + + func testWhenMobileUaAndDesktopTrueAndDomainSupportsFixedUAThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: ddgConfig) + XCTAssertEqual(ExpectedAgent.desktopFixed, testee.agent(forUrl: Constants.ddgFixedUrl, isDesktop: true, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopFalseAndDomainSupportsFixedUAThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: ddgConfig) + XCTAssertEqual(ExpectedAgent.tabletFixed, testee.agent(forUrl: Constants.ddgFixedUrl, isDesktop: false, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopTrueAndDomainSupportsFixedUAThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: ddgConfig) + XCTAssertEqual(ExpectedAgent.desktopFixed, testee.agent(forUrl: Constants.ddgFixedUrl, isDesktop: true, privacyConfig: config)) + } + + let ddgFixedConfig = """ + { + "features": { + "customUserAgent": { + "state": "enabled", + "settings": { + "defaultPolicy": "ddgFixed", + "omitApplicationSites": [ + { + "domain": "cvs.com", + "reason": "Site reports browser not supported" + } + ], + "ddgDefaultSites": [ + { + "domain": "test3.com" + } + ] + }, + "exceptions": [] + } + }, + "unprotectedTemporary": [] + } + """.data(using: .utf8)! + + func testWhenMobileUaAndDesktopFalseAndDefaultPolicyFixedThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.mobileFixed, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenMobileUaAndDesktopTrueAndDefaultPolicyFixedThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.desktopFixed, testee.agent(forUrl: Constants.url, isDesktop: true, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopFalseAndDefaultPolicyFixedThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.tabletFixed, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopTrueAndDefaultPolicyFixedThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.desktopFixed, testee.agent(forUrl: Constants.url, isDesktop: true, privacyConfig: config)) + } + + func testWhenDefaultPolicyFixedAndDomainIsOnDefaultListThenDefaultAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.mobile, testee.agent(forUrl: Constants.ddgDefaultUrl, isDesktop: false, privacyConfig: config)) + } + + let closestConfig = """ + { + "features": { + "customUserAgent": { + "state": "enabled", + "settings": { + "defaultPolicy": "closest", + "omitApplicationSites": [ + { + "domain": "cvs.com", + "reason": "Site reports browser not supported" + } + ], + "ddgFixedSites": [ + { + "domain": "test2.com" + } + ], + "ddgDefaultSites": [ + { + "domain": "test3.com" + } + ] + }, + "exceptions": [] + } + }, + "unprotectedTemporary": [] + } + """.data(using: .utf8)! + + func testWhenMobileUaAndDesktopFalseAndDefaultPolicyClosestThenClosestMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.mobileClosest, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenMobileUaAndDesktopTrueAndDefaultPolicyClosestThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.desktopClosest, testee.agent(forUrl: Constants.url, isDesktop: true, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopFalseAndDefaultPolicyClosestThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.tabletClosest, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenTabletUaAndDesktopTrueAndDefaultPolicyClosestThenFixedMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.tablet) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.desktopClosest, testee.agent(forUrl: Constants.url, isDesktop: true, privacyConfig: config)) + } + + func testWhenDefaultPolicyClosestAndDomainIsOnDefaultListThenDefaultAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.mobile, testee.agent(forUrl: Constants.ddgDefaultUrl, isDesktop: false, privacyConfig: config)) + } + + func testWhenDefaultPolicyClosestAndDomainIsOnFixedListThenFixedAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.mobile) + let config = makePrivacyConfig(from: closestConfig) + XCTAssertEqual(ExpectedAgent.mobileFixed, testee.agent(forUrl: Constants.ddgFixedUrl, isDesktop: false, privacyConfig: config)) + } + + let configWithVersions = """ + { + "features": { + "customUserAgent": { + "state": "enabled", + "settings": { + "defaultPolicy": "ddg", + "omitApplicationSites": [ + { + "domain": "cvs.com", + "reason": "Site reports browser not supported" + } + ], + "closestUserAgent": { + "versions": ["350", "360"] + }, + "ddgFixedUserAgent": { + "versions": ["351", "361"] + } + }, + "exceptions": [] + } + }, + "unprotectedTemporary": [] + } + """.data(using: .utf8)! + + func testWhenAtbDoesNotMatchVersionFromConfigThenDefaultUAIsUsed() { + let statisticsStore = MockStatisticsStore() + statisticsStore.atb = "v300-1" + let testee = UserAgent(defaultAgent: DefaultAgent.mobile, statistics: statisticsStore) + let config = makePrivacyConfig(from: configWithVersions) + XCTAssertEqual(ExpectedAgent.mobile, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenAtbMatchesVersionInClosestUserAgentThenClosestUAIsUsed() { + let statisticsStore = MockStatisticsStore() + statisticsStore.atb = "v360-1" + let testee = UserAgent(defaultAgent: DefaultAgent.mobile, statistics: statisticsStore) + let config = makePrivacyConfig(from: configWithVersions) + XCTAssertEqual(ExpectedAgent.mobileClosest, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenAtbMatchesVersionInDDGFixedUserAgentThenDDGFixedUAIsUsed() { + let statisticsStore = MockStatisticsStore() + statisticsStore.atb = "v361-1" + let testee = UserAgent(defaultAgent: DefaultAgent.mobile, statistics: statisticsStore) + let config = makePrivacyConfig(from: configWithVersions) + XCTAssertEqual(ExpectedAgent.mobileFixed, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenAtbWithoutDayComponentMatchesVersionInDDGFixedUserAgentThenDDGFixedUAIsUsed() { + let statisticsStore = MockStatisticsStore() + statisticsStore.atb = "v361" + let testee = UserAgent(defaultAgent: DefaultAgent.mobile, statistics: statisticsStore) + let config = makePrivacyConfig(from: configWithVersions) + XCTAssertEqual(ExpectedAgent.mobileFixed, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenOldWebKitVersionThenDefaultMobileAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.oldWebkitVersionMobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.oldWebkitVersionMobile, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenNewerWebKitVersionThenFixedAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.newWebkitVersionMobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.newWebkitVersionMobile, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + + func testWhenSameWebKitVersionThenFixedAgentUsed() { + let testee = UserAgent(defaultAgent: DefaultAgent.sameWebkitVersionMobile) + let config = makePrivacyConfig(from: ddgFixedConfig) + XCTAssertEqual(ExpectedAgent.sameWebkitVersionMobile, testee.agent(forUrl: Constants.url, isDesktop: false, privacyConfig: config)) + } + } +// swiftlint:enable file_length type_body_length diff --git a/PacketTunnelProvider/bg.lproj/Localizable.strings b/PacketTunnelProvider/bg.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/bg.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/cs.lproj/Localizable.strings b/PacketTunnelProvider/cs.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/cs.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/da.lproj/Localizable.strings b/PacketTunnelProvider/da.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/da.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/de.lproj/Localizable.strings b/PacketTunnelProvider/de.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/de.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/el.lproj/Localizable.strings b/PacketTunnelProvider/el.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/el.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/en.lproj/Localizable.strings b/PacketTunnelProvider/en.lproj/Localizable.strings new file mode 100644 index 0000000000..987ec1cb88 --- /dev/null +++ b/PacketTunnelProvider/en.lproj/Localizable.strings @@ -0,0 +1,12 @@ +/* The body of the notification shown when Network Protection fails to reconnect */ +"network.protection.failure.notification.body" = "Network Protection failed to connect. Please try again later."; + +/* The body of the notification shown when Network Protection's connection is interrupted */ +"network.protection.interrupted.notification.body" = "Network Protection was interrupted. Attempting to reconnect now..."; + +/* The title of the notifications shown from Network Protection */ +"network.protection.notification.title" = "DuckDuckGo"; + +/* The body of the notification shown when Network Protection reconnects successfully */ +"network.protection.success.notification.body" = "Network Protection is On. Your location and online activity are protected."; + diff --git a/PacketTunnelProvider/es.lproj/Localizable.strings b/PacketTunnelProvider/es.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/es.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/et.lproj/Localizable.strings b/PacketTunnelProvider/et.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/et.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/fi.lproj/Localizable.strings b/PacketTunnelProvider/fi.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/fi.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/fr.lproj/Localizable.strings b/PacketTunnelProvider/fr.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/fr.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/hr.lproj/Localizable.strings b/PacketTunnelProvider/hr.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/hr.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/hu.lproj/Localizable.strings b/PacketTunnelProvider/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/hu.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/it.lproj/Localizable.strings b/PacketTunnelProvider/it.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/it.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/lt.lproj/Localizable.strings b/PacketTunnelProvider/lt.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/lt.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/lv.lproj/Localizable.strings b/PacketTunnelProvider/lv.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/lv.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/nb.lproj/Localizable.strings b/PacketTunnelProvider/nb.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/nb.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/nl.lproj/Localizable.strings b/PacketTunnelProvider/nl.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/nl.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/pl.lproj/Localizable.strings b/PacketTunnelProvider/pl.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/pl.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/pt.lproj/Localizable.strings b/PacketTunnelProvider/pt.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/pt.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/ro.lproj/Localizable.strings b/PacketTunnelProvider/ro.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/ro.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/ru.lproj/Localizable.strings b/PacketTunnelProvider/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/ru.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/sk.lproj/Localizable.strings b/PacketTunnelProvider/sk.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/sk.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/sl.lproj/Localizable.strings b/PacketTunnelProvider/sl.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/sl.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/sv.lproj/Localizable.strings b/PacketTunnelProvider/sv.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/sv.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/PacketTunnelProvider/tr.lproj/Localizable.strings b/PacketTunnelProvider/tr.lproj/Localizable.strings new file mode 100644 index 0000000000..a71a759fe3 --- /dev/null +++ b/PacketTunnelProvider/tr.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + DuckDuckGo + + Created by Graeme Arthur on 29/09/2023. + Copyright © 2023 DuckDuckGo. All rights reserved. +*/ diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt index c67b8d6903..4942898476 100644 --- a/fastlane/metadata/default/release_notes.txt +++ b/fastlane/metadata/default/release_notes.txt @@ -1,4 +1,3 @@ -- Fix issue that caused crashes for some iOS 15 users -- Improved credential autofill on websites in Dutch, French, German, Italian, Spanish, and Swedish, making logging into accounts easier. More languages coming soon. +Bug fixes and other improvements. Join our fully distributed team and help raise the standard of trust online! https://duckduckgo.com/hiring diff --git a/scripts/loc_update.sh b/scripts/loc_update.sh index 1608e0e4cb..a80d0dcbf0 100755 --- a/scripts/loc_update.sh +++ b/scripts/loc_update.sh @@ -5,7 +5,7 @@ script_dir=$(dirname "$(readlink -f "$0")") base_dir="${script_dir}/.." # Add target sub-directories here when needed -set -- "${base_dir}/DuckDuckGo" "${base_dir}/Widgets" +set -- "${base_dir}/DuckDuckGo" "${base_dir}/Widgets" "${base_dir}/PacketTunnelProvider" for dir in "$@"; do echo "Processing ${dir}"