Compare commits
7 Commits
d78ef0b38b
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| c29590c51e | |||
| 544ffa82fd | |||
| 133f0992f9 | |||
| deb2fd536f | |||
| 46586dc2e4 | |||
| b255ef907a | |||
|
cf9b1cc6e2
|
@@ -57,23 +57,25 @@ class MainScreen : ComponentActivity() {
|
||||
|
||||
setContent {
|
||||
SysTheme {
|
||||
val currentPsvg = psvg
|
||||
val currentCss = css
|
||||
if (currentPsvg != null && currentCss != null) {
|
||||
Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.primary).statusBarsPadding(),) {
|
||||
AppNavHost(currentPsvg, currentCss)
|
||||
}
|
||||
Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.primary).statusBarsPadding(),) {
|
||||
AppNavHost()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AppNavHost(psvg: SVGWrapper, css: CSSWrapper) {
|
||||
fun AppNavHost() {
|
||||
val navController = rememberNavController()
|
||||
NavHost(navController, startDestination = "main") {
|
||||
composable("main") { MainScreenC(psvg,css, navController) }
|
||||
composable("settings") { SettingsMainScreen { navController.navigate("main")} }
|
||||
composable("main") {
|
||||
val currentPsvg = psvg
|
||||
val currentCss = css
|
||||
if (currentPsvg != null && currentCss != null) {
|
||||
MainScreenC(currentPsvg, currentCss, navController)
|
||||
}
|
||||
}
|
||||
composable("settings") { SettingsMainScreen { navController.navigate("main") } }
|
||||
composable("edit") { EditScreen { navController.navigate("main") } }
|
||||
composable("stats") { StatsScreen { navController.navigate("main") } }
|
||||
}
|
||||
|
||||
@@ -156,7 +156,7 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) {
|
||||
val keyProjection = stringResource(R.string.key_projection)
|
||||
val keyGroup = stringResource(R.string.key_group)
|
||||
val keyRegional = stringResource(R.string.key_regional)
|
||||
val keyRegionalStats = stringResource(R.string.key_regional_stats)
|
||||
val keyCascadeStats = stringResource(R.string.key_cascade_stats)
|
||||
val offString = stringResource(R.string.off)
|
||||
val onString = stringResource(R.string.on)
|
||||
|
||||
@@ -164,7 +164,7 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) {
|
||||
var projection by remember { mutableStateOf(prefs.getString(keyProjection, "default")!!) }
|
||||
var groups by remember { mutableStateOf(prefs.getString(keyGroup, offString)!!) }
|
||||
var regional by remember { mutableStateOf(prefs.getString(keyRegional, offString)!!) }
|
||||
var regionalStats by remember { mutableStateOf(prefs.getString(keyRegionalStats, offString)!!) }
|
||||
var cascadeStats by remember { mutableStateOf(prefs.getString(keyCascadeStats, offString)!!) }
|
||||
|
||||
var showGroupDialog by remember { mutableStateOf(false) }
|
||||
var showRegionalDialog by remember { mutableStateOf(false) }
|
||||
@@ -178,7 +178,10 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) {
|
||||
val g = Data.selected_group
|
||||
if (g != null) {
|
||||
Data.visits.reassignAllVisitedToGroup(g.key)
|
||||
Data.groups.keepOnly(g.key)
|
||||
Data.saveData()
|
||||
groups = offString
|
||||
prefs.edit { putString(keyGroup, offString) }
|
||||
}
|
||||
showGroupDialog = false
|
||||
})
|
||||
@@ -274,6 +277,7 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) {
|
||||
isChecked = groups == onString,
|
||||
onCheckedChange = { isChecked ->
|
||||
if (!isChecked) {
|
||||
Data.selected_group = null
|
||||
showGroupDialog = true
|
||||
} else {
|
||||
groups = onString
|
||||
@@ -304,17 +308,18 @@ fun SettingsScreen(navController: NavHostController = settingsNav()) {
|
||||
}
|
||||
}
|
||||
)
|
||||
if (regional == onString) {
|
||||
SettingSwitch(
|
||||
label = stringResource(R.string.pref_regional_stats),
|
||||
subtitle = stringResource(R.string.pref_regional_stats_desc),
|
||||
isChecked = regionalStats == onString,
|
||||
onCheckedChange = { isChecked ->
|
||||
regionalStats = if (isChecked) onString else offString
|
||||
prefs.edit { putString(keyRegionalStats, regionalStats) }
|
||||
}
|
||||
)
|
||||
}
|
||||
HorizontalDivider()
|
||||
}
|
||||
item {
|
||||
SettingSwitch(
|
||||
label = stringResource(R.string.pref_cascade_stats),
|
||||
subtitle = stringResource(R.string.pref_cascade_stats_desc),
|
||||
isChecked = cascadeStats == onString,
|
||||
onCheckedChange = { isChecked ->
|
||||
cascadeStats = if (isChecked) onString else offString
|
||||
prefs.edit { putString(keyCascadeStats, cascadeStats) }
|
||||
}
|
||||
)
|
||||
HorizontalDivider()
|
||||
}
|
||||
item {
|
||||
|
||||
@@ -20,6 +20,7 @@ import androidx.compose.material.TopAppBar
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
@@ -32,11 +33,14 @@ import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import net.helcel.beans.R
|
||||
import net.helcel.beans.countries.Country
|
||||
import net.helcel.beans.countries.GeoLoc
|
||||
import net.helcel.beans.countries.GeoLoc.LocType
|
||||
import net.helcel.beans.countries.World
|
||||
import net.helcel.beans.helper.AUTO_GROUP
|
||||
import net.helcel.beans.helper.Data
|
||||
import net.helcel.beans.helper.Groups
|
||||
import net.helcel.beans.helper.NO_GROUP
|
||||
import net.helcel.beans.helper.Settings
|
||||
import net.helcel.beans.helper.Theme.getContrastColor
|
||||
|
||||
@@ -116,80 +120,82 @@ fun StatsList(activeMode: LocType, countMode: Boolean) {
|
||||
@Composable
|
||||
fun StatsRow(group: Groups.Group, activeMode: LocType, countMode: Boolean) {
|
||||
val context = LocalContext.current
|
||||
val isRegionalStats = remember { Settings.isRegionalStats(context) }
|
||||
val isCascadeStats = remember { Settings.isCascadeStats(context) }
|
||||
val visits by Data.visits.visitsFlow.collectAsState()
|
||||
|
||||
val countries = remember { World.WWW.children.flatMap { it.children } }
|
||||
val continents = remember { World.WWW.children.toList() }
|
||||
|
||||
val count = remember(group, activeMode, isRegionalStats) {
|
||||
when (activeMode) {
|
||||
LocType.WORLD -> continents.filter { continent ->
|
||||
if (group.key == AUTO_GROUP) {
|
||||
val isUncat = Data.visits.getVisited(continent) == AUTO_GROUP || continent.children.any { Data.visits.getVisited(it) == AUTO_GROUP }
|
||||
val isInRealGroup = Data.groups.groupsFlow.value.any { g ->
|
||||
Data.visits.getVisited(continent) == g.key || continent.children.any { Data.visits.getVisited(it) == g.key }
|
||||
}
|
||||
isUncat && (!isRegionalStats || !isInRealGroup)
|
||||
} else {
|
||||
Data.visits.getVisited(continent) == group.key || (isRegionalStats && continent.children.any { Data.visits.getVisited(it) == group.key })
|
||||
}
|
||||
}.size
|
||||
|
||||
LocType.COUNTRY -> countries.filter { country ->
|
||||
if (group.key == AUTO_GROUP) {
|
||||
val isUncat = Data.visits.getVisited(country) == AUTO_GROUP || country.children.any { Data.visits.getVisited(it) == AUTO_GROUP }
|
||||
val isInRealGroup = Data.groups.groupsFlow.value.any { g ->
|
||||
Data.visits.getVisited(country) == g.key || country.children.any { Data.visits.getVisited(it) == g.key }
|
||||
}
|
||||
isUncat && (!isRegionalStats || !isInRealGroup)
|
||||
} else {
|
||||
Data.visits.getVisited(country) == group.key || (isRegionalStats && country.children.any { Data.visits.getVisited(it) == group.key })
|
||||
}
|
||||
}.size
|
||||
|
||||
LocType.STATE -> countries.flatMap { it.children }.filter { region ->
|
||||
Data.visits.getVisited(region) == group.key
|
||||
}.size
|
||||
|
||||
else -> 0
|
||||
val countries = remember {
|
||||
World.WWW.children.flatMap {
|
||||
if (it is Country) listOf(it) else it.children
|
||||
}
|
||||
}
|
||||
|
||||
val area = remember(group, activeMode, isRegionalStats) {
|
||||
when (activeMode) {
|
||||
LocType.WORLD -> continents.filter { continent ->
|
||||
if (group.key == AUTO_GROUP) {
|
||||
val isUncat = Data.visits.getVisited(continent) == AUTO_GROUP || continent.children.any { Data.visits.getVisited(it) == AUTO_GROUP }
|
||||
val isInRealGroup = Data.groups.groupsFlow.value.any { g ->
|
||||
Data.visits.getVisited(continent) == g.key || continent.children.any { Data.visits.getVisited(it) == g.key }
|
||||
}
|
||||
isUncat && (!isRegionalStats || !isInRealGroup)
|
||||
} else {
|
||||
Data.visits.getVisited(continent) == group.key || (isRegionalStats && continent.children.any { Data.visits.getVisited(it) == group.key })
|
||||
}
|
||||
}.sumOf { it.area }
|
||||
|
||||
LocType.COUNTRY -> countries.filter { country ->
|
||||
if (group.key == AUTO_GROUP) {
|
||||
val isUncat = Data.visits.getVisited(country) == AUTO_GROUP || country.children.any { Data.visits.getVisited(it) == AUTO_GROUP }
|
||||
val isInRealGroup = Data.groups.groupsFlow.value.any { g ->
|
||||
Data.visits.getVisited(country) == g.key || country.children.any { Data.visits.getVisited(it) == g.key }
|
||||
}
|
||||
isUncat && (!isRegionalStats || !isInRealGroup)
|
||||
} else {
|
||||
Data.visits.getVisited(country) == group.key || (isRegionalStats && country.children.any { Data.visits.getVisited(it) == group.key })
|
||||
}
|
||||
}.sumOf { it.area }
|
||||
|
||||
LocType.STATE -> countries.flatMap { it.children }.filter { region ->
|
||||
Data.visits.getVisited(region) == group.key
|
||||
}.sumOf { it.area }
|
||||
|
||||
else -> 0
|
||||
val visitedItems = remember(group, activeMode, isCascadeStats, visits) {
|
||||
val list = when (activeMode) {
|
||||
LocType.WORLD -> continents
|
||||
LocType.COUNTRY -> countries
|
||||
LocType.STATE -> countries.flatMap { it.children }
|
||||
else -> emptyList()
|
||||
}
|
||||
|
||||
fun getExplicitColor(l: GeoLoc): Int? {
|
||||
val c = visits.getOrDefault(l.code, 0)
|
||||
return if (c != NO_GROUP && c != AUTO_GROUP) c else null
|
||||
}
|
||||
|
||||
fun getEffectiveGroup(l: GeoLoc): Int {
|
||||
getExplicitColor(l)?.let { return it }
|
||||
|
||||
if (isCascadeStats) {
|
||||
// Parent -> Child (closest explicit ancestor)
|
||||
val country = countries.find { it.children.contains(l) }
|
||||
val countryColor = country?.let { getExplicitColor(it) }
|
||||
if (countryColor != null) return countryColor
|
||||
|
||||
val continent = continents.find {
|
||||
it.children.contains(l) || (country != null && it.children.contains(country))
|
||||
}
|
||||
val continentColor = continent?.let { getExplicitColor(it) }
|
||||
if (continentColor != null) return continentColor
|
||||
|
||||
val worldColor = getExplicitColor(World.WWW)
|
||||
if (worldColor != null) return worldColor
|
||||
|
||||
// Child -> Parent (most common explicit descendant)
|
||||
val descendants = mutableListOf<GeoLoc>()
|
||||
fun collect(curr: GeoLoc) {
|
||||
curr.children.forEach {
|
||||
descendants.add(it)
|
||||
collect(it)
|
||||
}
|
||||
}
|
||||
collect(l)
|
||||
val descendantColors = descendants.mapNotNull { getExplicitColor(it) }
|
||||
if (descendantColors.isNotEmpty()) {
|
||||
return descendantColors.groupBy { it }.maxByOrNull { it.value.size }?.key ?: AUTO_GROUP
|
||||
}
|
||||
} else {
|
||||
if (l.type == LocType.WORLD || l.type == LocType.COUNTRY) {
|
||||
val descendants = mutableListOf<GeoLoc>()
|
||||
fun collect(curr: GeoLoc) {
|
||||
curr.children.forEach { descendants.add(it); collect(it) }
|
||||
}
|
||||
collect(l)
|
||||
val dc = descendants.mapNotNull { getExplicitColor(it) }
|
||||
if (dc.isNotEmpty()) return dc.groupBy { it }.maxByOrNull { it.value.size }?.key ?: AUTO_GROUP
|
||||
}
|
||||
}
|
||||
|
||||
return AUTO_GROUP
|
||||
}
|
||||
|
||||
list.filter { getEffectiveGroup(it) == group.key }
|
||||
}
|
||||
|
||||
val displayValue = if (countMode) count.toString() else stringResource(R.string.number_with_unit, area, "km²")
|
||||
val count = visitedItems.size
|
||||
val area = visitedItems.sumOf { it.area.toLong() }
|
||||
|
||||
val displayValue = if (countMode) count.toString() else stringResource(R.string.number_with_unit, area.toInt(), "km²")
|
||||
|
||||
val backgroundColor = group.color.color
|
||||
val textColor = getContrastColor(backgroundColor)
|
||||
|
||||
@@ -43,6 +43,13 @@ class Groups(val id: Int, @SerialName("grps") private val groups: HashMap<Int, G
|
||||
updateFlow()
|
||||
}
|
||||
|
||||
fun keepOnly(key: Int) {
|
||||
val keep = groups[key] ?: return
|
||||
groups.clear()
|
||||
groups[key] = keep
|
||||
updateFlow()
|
||||
}
|
||||
|
||||
private fun updateFlow() {
|
||||
_groupsFlow.value = groups.values.toList()
|
||||
}
|
||||
|
||||
@@ -29,10 +29,10 @@ object Settings {
|
||||
)
|
||||
}
|
||||
|
||||
fun isRegionalStats(ctx: Context): Boolean {
|
||||
fun isCascadeStats(ctx: Context): Boolean {
|
||||
return getBooleanValue(
|
||||
ctx,
|
||||
sp.getString(ctx.getString(R.string.key_regional_stats), ctx.getString(R.string.off))
|
||||
sp.getString(ctx.getString(R.string.key_cascade_stats), ctx.getString(R.string.off))
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<string name="key_group">Groups</string>
|
||||
<string name="key_regional">Regional mode</string>
|
||||
<string name="key_regional_desc">Enable tracking of states and provinces</string>
|
||||
<string name="key_regional_stats">key_regional_stats</string>
|
||||
<string name="pref_regional_stats">Regional statistics</string>
|
||||
<string name="pref_regional_stats_desc">Count countries with visited regions</string>
|
||||
<string name="key_cascade_stats">key_cascade_stats</string>
|
||||
<string name="pref_cascade_stats">Cascade statistics</string>
|
||||
<string name="pref_cascade_stats_desc">Include parents and children in the counts</string>
|
||||
<string name="key_group_desc">Enable multiple colors</string>
|
||||
<string name="about">About</string>
|
||||
<string name="pref_category_appearance">Appearance</string>
|
||||
|
||||
@@ -2698,9 +2698,9 @@ lodash@4.18.1:
|
||||
integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
|
||||
|
||||
lru-cache@^11.3.5:
|
||||
version "11.5.1"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.1.tgz#f3daa3540847b9737ebc02499ddb36765e54db4a"
|
||||
integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==
|
||||
version "11.5.2"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.2.tgz#00e16665c90c620fba14a3c368732a976493f760"
|
||||
integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==
|
||||
|
||||
map-stream@0.0.7:
|
||||
version "0.0.7"
|
||||
@@ -2708,9 +2708,9 @@ map-stream@0.0.7:
|
||||
integrity sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==
|
||||
|
||||
mapshaper@^0.7.22:
|
||||
version "0.7.41"
|
||||
resolved "https://registry.yarnpkg.com/mapshaper/-/mapshaper-0.7.41.tgz#c03fa2aed375abbc92af47008dc81695a604ed23"
|
||||
integrity sha512-TC1KL8OtYZPRuq/Wl0AW2LQOic/q/AQbEEiPkCXlN5dGFXPIRj8+Qllc3EWBhN7aViHStI2IIthP2/L7BDzobQ==
|
||||
version "0.7.45"
|
||||
resolved "https://registry.yarnpkg.com/mapshaper/-/mapshaper-0.7.45.tgz#8af5e9df2e262e2b70ffe3d7a6576ed497f4f2e8"
|
||||
integrity sha512-ohTTOAKmhrdSy2Fcc/lhnwzs+J5t9Kt+duX8eUJCH7cBrga8S6flcGRzRMbUFhbzyU6HTS7a1vT0gpcvGnUmXQ==
|
||||
dependencies:
|
||||
"@bokuweb/zstd-wasm" "^0.0.27"
|
||||
"@ngageoint/geopackage" "^4.2.6"
|
||||
@@ -2737,7 +2737,7 @@ mapshaper@^0.7.22:
|
||||
idb-keyval "^6.2.0"
|
||||
jpeg-js "^0.4.4"
|
||||
kdbush "^3.0.0"
|
||||
mproj "0.1.3"
|
||||
mproj "0.1.5"
|
||||
msgpackr "^1.11.12"
|
||||
open "^11.0.0"
|
||||
pngjs "^7.0.0"
|
||||
@@ -2772,10 +2772,10 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
|
||||
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
|
||||
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
|
||||
|
||||
mproj@0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/mproj/-/mproj-0.1.3.tgz#295b990970a80380dac85b29d605a5f4f66b25ff"
|
||||
integrity sha512-XPxty3HPv1j5eXfxId1FSGX7JB8+KgozVOyCu5l40u/I0pW7gpWTaxouA8MNKHfEXN5oE8r9eowkM+0LuQduIQ==
|
||||
mproj@0.1.5:
|
||||
version "0.1.5"
|
||||
resolved "https://registry.yarnpkg.com/mproj/-/mproj-0.1.5.tgz#b6e9353bf394abe7cd9263082b45bed5ed5ea747"
|
||||
integrity sha512-HgUQtpYqzZzYD4gQXDiTFu2KgMJP7AAQCfYFR9lQpulx9hcspmnMOuCiMMs1bUUj9gPg9uAGnHQYU3We/5yipQ==
|
||||
dependencies:
|
||||
geographiclib "1.48.0"
|
||||
rw "~1.3.2"
|
||||
@@ -3293,17 +3293,17 @@ tinyqueue@^2.0.0, tinyqueue@^2.0.3:
|
||||
resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08"
|
||||
integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==
|
||||
|
||||
tldts-core@^7.4.6:
|
||||
version "7.4.6"
|
||||
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.4.6.tgz#4cc8ccdae554742f09e5999708cac5a7d83cb287"
|
||||
integrity sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==
|
||||
tldts-core@^7.4.8:
|
||||
version "7.4.8"
|
||||
resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.4.8.tgz#c729aee4ff9d3670741193682a98e25a3d780dd9"
|
||||
integrity sha512-c1P7u0EhACHj7lPy4MJm8iTFEU8+nB0LCtddH0fhP7noaVoXAqafMtOOeX+ulpuPBqnrRgRhw494RICT3mbhnw==
|
||||
|
||||
tldts@^7.0.5:
|
||||
version "7.4.6"
|
||||
resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.4.6.tgz#3af5da04b35afd0e00cf0fe2827af30393a28202"
|
||||
integrity sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==
|
||||
version "7.4.8"
|
||||
resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.4.8.tgz#f2edc0d81483ea76c45827d642ccd535a3a7a4f7"
|
||||
integrity sha512-htwgN/8KRB3z3vnC0BOETVh2m499g5GmyTK9Wq5JBLX3FNz6tSBveAd+fQhzy9hkjif8vy2jwDMR1sGhLtZl2A==
|
||||
dependencies:
|
||||
tldts-core "^7.4.6"
|
||||
tldts-core "^7.4.8"
|
||||
|
||||
token-types@^4.1.1:
|
||||
version "4.2.1"
|
||||
@@ -3328,9 +3328,9 @@ topojson-server@3.x:
|
||||
commander "2"
|
||||
|
||||
tough-cookie@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.1.tgz#a495f833836609ed983c19bc65639cfbceb54c76"
|
||||
integrity sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.2.tgz#7b1f22fcf2daf06c4ff9d53ec1845f44c6627062"
|
||||
integrity sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==
|
||||
dependencies:
|
||||
tldts "^7.0.5"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user