From 6dcd1c76aa31cc5540565f6dbe7c09c146f2fd98 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 22 Aug 2024 17:52:09 +0530 Subject: [PATCH 01/33] Update compose libs; Fix deprecations; Remove accompanist-navigation; --- app/build.gradle.kts | 2 +- .../java/com/kafka/user/home/AppNavigation.kt | 2 +- .../java/com/kafka/user/home/MainScreen.kt | 4 ++-- .../rail/HomeNavigationRailItemRow.kt | 4 ++-- gradle/libs.versions.toml | 8 +++---- navigation/build.gradle | 2 +- .../RememberBottomSheetNavigator.kt | 9 +++++--- .../java/org/rekhta/ui/auth/LoginWithEmail.kt | 2 +- ui/common/build.gradle | 1 - .../common/extensions/ComposeExtensions.kt | 23 ++++++++++++------- .../org/kafka/common/widgets/IconButton.kt | 4 ++-- .../kafka/ui/components/item/FeaturedItem.kt | 6 ++--- .../placeholder/PlaceholderHighlight.kt | 4 ++-- .../homepage/components/ContinueReading.kt | 2 +- .../java/org/kafka/item/detail/ItemDetail.kt | 2 +- .../main/java/org/kafka/item/files/Files.kt | 2 +- .../src/main/java/org/kafka/library/Tabs.kt | 4 ++-- .../java/org/rekhta/ui/profile/ProfileMenu.kt | 6 ++--- .../ui/profile/feedback/FeedbackScreen.kt | 4 ++-- .../java/com.kafka.search/RecentSearches.kt | 2 +- .../java/com.kafka.search/SearchWidget.kt | 4 ++-- ui/webview/build.gradle | 1 - 22 files changed, 52 insertions(+), 46 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d7a3ab505..e6244d596 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -152,7 +152,6 @@ dependencies { implementation(projects.ui.theme) implementation(projects.ui.webview) - implementation(libs.accompanist.navigation.material) implementation(libs.accompanist.permissions) implementation(libs.androidx.activity.compose) implementation(libs.androidx.hilt.compose) @@ -165,6 +164,7 @@ dependencies { implementation(libs.compose.animation.animation) implementation(libs.compose.foundation.foundation) implementation(libs.compose.foundation.layout) + implementation(libs.compose.material.navigation) implementation(libs.compose.ui.tooling) implementation(libs.compose.ui.ui) implementation(libs.compose.ui.util) diff --git a/app/src/main/java/com/kafka/user/home/AppNavigation.kt b/app/src/main/java/com/kafka/user/home/AppNavigation.kt index c8aaee57c..87f8426c5 100644 --- a/app/src/main/java/com/kafka/user/home/AppNavigation.kt +++ b/app/src/main/java/com/kafka/user/home/AppNavigation.kt @@ -5,6 +5,7 @@ import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.navigation.bottomSheet import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.Stable @@ -31,7 +32,6 @@ import androidx.navigation.compose.dialog import androidx.navigation.compose.navigation import androidx.navigation.navArgument import androidx.navigation.navDeepLink -import com.google.accompanist.navigation.material.bottomSheet import com.kafka.data.model.SearchFilter import com.kafka.reader.ReaderScreen import com.kafka.reader.online.OnlineReader diff --git a/app/src/main/java/com/kafka/user/home/MainScreen.kt b/app/src/main/java/com/kafka/user/home/MainScreen.kt index 84c132488..6063bb5de 100644 --- a/app/src/main/java/com/kafka/user/home/MainScreen.kt +++ b/app/src/main/java/com/kafka/user/home/MainScreen.kt @@ -2,6 +2,8 @@ package com.kafka.user.home import android.os.Build import androidx.compose.foundation.shape.CornerSize +import androidx.compose.material.navigation.BottomSheetNavigator +import androidx.compose.material.navigation.ModalBottomSheetLayout import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable @@ -15,8 +17,6 @@ import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController -import com.google.accompanist.navigation.material.BottomSheetNavigator -import com.google.accompanist.navigation.material.ModalBottomSheetLayout import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState diff --git a/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRailItemRow.kt b/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRailItemRow.kt index 6b86f1337..2070189f5 100644 --- a/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRailItemRow.kt +++ b/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRailItemRow.kt @@ -14,10 +14,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.selection.selectable -import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue @@ -54,7 +54,7 @@ internal fun HomeNavigationRailItemRow( enabled = enabled, role = Role.Tab, interactionSource = interactionSource, - indication = rememberRipple(bounded = true, color = activeColor) + indication = ripple(bounded = true, color = activeColor) ) .padding(horizontal = Dimens.Spacing40, vertical = Dimens.Spacing20) ) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1a6b8b2b1..e3548befd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,9 +4,8 @@ appupdate = "2.1.0" agp = "8.5.2" androidxhilt = "1.2.0" androidxlifecycle = "2.8.4" -navigation = "2.7.7" coil = "2.6.0" -compose-alpha = "2024.01.00-alpha01" +compose-alpha = "2024.08.00-alpha02" compose-bom = "2024.06.00" compose-multiplatform = "1.6.11" coroutines = "1.8.1" @@ -19,6 +18,7 @@ kotlininject = "0.7.1" material3 = "1.2.1" media3 = "1.3.1" mixpanel = "7.0.0" +navigation = "2.7.7" okhttp = "4.12.0" pdfviewer = "3.2.0-beta.1" retrofit = "2.9.0" @@ -103,8 +103,8 @@ androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = " coil-coil = { module = "io.coil-kt:coil", version.ref = "coil" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } -compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } -#compose-bom = { module = "dev.chrisbanes.compose:compose-bom", version.ref = "compose-alpha" } +#compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } +compose-bom = { module = "dev.chrisbanes.compose:compose-bom", version.ref = "compose-alpha" } compose-runtime-runtime = { module = "androidx.compose.runtime:runtime" } compose-animation-animation = { module = "androidx.compose.animation:animation" } compose-foundation-foundation = { module = "androidx.compose.foundation:foundation" } diff --git a/navigation/build.gradle b/navigation/build.gradle index 484413b22..4c5724c0e 100644 --- a/navigation/build.gradle +++ b/navigation/build.gradle @@ -15,7 +15,6 @@ dependencies { implementation(projects.data.repo) implementation(projects.ui.common) - implementation libs.accompanist.navigation.material implementation libs.androidx.core implementation libs.androidx.hilt.compose implementation libs.androidx.hilt.navigation @@ -26,6 +25,7 @@ dependencies { implementation libs.androidx.navigation.compose implementation libs.compose.material.material + implementation libs.compose.material.navigation implementation libs.compose.runtime.runtime implementation libs.hilt.android diff --git a/navigation/src/main/java/org/kafka/navigation/RememberBottomSheetNavigator.kt b/navigation/src/main/java/org/kafka/navigation/RememberBottomSheetNavigator.kt index 328d7c0ee..6959e0930 100644 --- a/navigation/src/main/java/org/kafka/navigation/RememberBottomSheetNavigator.kt +++ b/navigation/src/main/java/org/kafka/navigation/RememberBottomSheetNavigator.kt @@ -1,16 +1,19 @@ package org.kafka.navigation import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.SpringSpec +//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material.ModalBottomSheetValue -import androidx.compose.material.SwipeableDefaults +//noinspection UsingMaterialAndMaterial3Libraries +import androidx.compose.material.navigation.BottomSheetNavigator +//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import com.google.accompanist.navigation.material.BottomSheetNavigator @Composable fun rememberBottomSheetNavigator( - animationSpec: AnimationSpec = SwipeableDefaults.AnimationSpec, + animationSpec: AnimationSpec = SpringSpec(), skipHalfExpanded: Boolean = true, ): BottomSheetNavigator { val sheetState = rememberModalBottomSheetState( diff --git a/ui/auth/src/main/java/org/rekhta/ui/auth/LoginWithEmail.kt b/ui/auth/src/main/java/org/rekhta/ui/auth/LoginWithEmail.kt index dbf58b85c..63876ecdd 100644 --- a/ui/auth/src/main/java/org/rekhta/ui/auth/LoginWithEmail.kt +++ b/ui/auth/src/main/java/org/rekhta/ui/auth/LoginWithEmail.kt @@ -165,7 +165,7 @@ internal fun LoginTextField( }, keyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.None, - autoCorrect = false, + autoCorrectEnabled = false, keyboardType = loginTextField.keyboardType, imeAction = loginTextField.imeAction ), diff --git a/ui/common/build.gradle b/ui/common/build.gradle index c259af363..c74c1bb58 100644 --- a/ui/common/build.gradle +++ b/ui/common/build.gradle @@ -32,7 +32,6 @@ dependencies { api libs.compose.ui.util implementation libs.accompanist.flowlayout - implementation libs.accompanist.navigation.material implementation libs.icons.feather implementation libs.icons.font.awesome implementation libs.icons.tabler diff --git a/ui/common/src/main/java/org/kafka/common/extensions/ComposeExtensions.kt b/ui/common/src/main/java/org/kafka/common/extensions/ComposeExtensions.kt index 7dd71db33..1c080ea0c 100644 --- a/ui/common/src/main/java/org/kafka/common/extensions/ComposeExtensions.kt +++ b/ui/common/src/main/java/org/kafka/common/extensions/ComposeExtensions.kt @@ -5,7 +5,7 @@ import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement +import androidx.compose.material3.LocalMinimumInteractiveComponentSize import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisallowComposableCalls @@ -16,11 +16,13 @@ import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.autoSaver import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.flow.Flow @@ -33,7 +35,7 @@ fun TextStyle.semiBold() = merge(TextStyle(fontWeight = FontWeight.SemiBold)) @Composable inline fun rememberMutableState( key: Any? = null, - crossinline init: @DisallowComposableCalls () -> T + crossinline init: @DisallowComposableCalls () -> T, ) = remember(key) { mutableStateOf(init()) } @Composable @@ -49,7 +51,7 @@ fun AnimatedVisibilityFade( modifier: Modifier = Modifier, enter: EnterTransition = fadeIn(), exit: ExitTransition = fadeOut(), - content: @Composable AnimatedVisibilityScope.() -> Unit + content: @Composable AnimatedVisibilityScope.() -> Unit, ) { androidx.compose.animation.AnimatedVisibility( visible = visible, @@ -65,7 +67,7 @@ fun CollectEvent( flow: Flow, lifecycle: Lifecycle = LocalLifecycleOwner.current.lifecycle, minActiveState: Lifecycle.State = Lifecycle.State.STARTED, - collector: (T) -> Unit + collector: (T) -> Unit, ): Unit = LaunchedEffect(lifecycle, flow) { lifecycle.repeatOnLifecycle(minActiveState) { flow.collect { @@ -75,9 +77,14 @@ fun CollectEvent( } @Composable -fun ProvideInteractiveEnforcement(enforce: Boolean = true, content: @Composable () -> Unit) { +fun ProvideInteractiveEnforcement( + size: Dp = MinimumInteractiveComponentSize, + content: @Composable () -> Unit, +) { CompositionLocalProvider( - LocalMinimumInteractiveComponentEnforcement provides enforce, + value = LocalMinimumInteractiveComponentSize provides size, content = content ) -} \ No newline at end of file +} + +val MinimumInteractiveComponentSize = 48.dp diff --git a/ui/common/src/main/java/org/kafka/common/widgets/IconButton.kt b/ui/common/src/main/java/org/kafka/common/widgets/IconButton.kt index 294f22ca8..68378ce80 100644 --- a/ui/common/src/main/java/org/kafka/common/widgets/IconButton.kt +++ b/ui/common/src/main/java/org/kafka/common/widgets/IconButton.kt @@ -5,8 +5,8 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.size -import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -69,7 +69,7 @@ fun IconButton( role = Role.Button, onClickLabel = onClickLabel, interactionSource = interactionSource, - indication = rememberRipple( + indication = ripple( bounded = false, color = rippleColor, radius = rippleRadius diff --git a/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt b/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt index 797b2ef0f..fbd49a857 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt @@ -2,7 +2,6 @@ package org.kafka.ui.components.item import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope @@ -64,10 +63,9 @@ fun FeaturedItem( onClick: () -> Unit = {}, ) { Surface( - modifier = modifier - .fillMaxWidth() - .clickable { onClick() }, + modifier = modifier.fillMaxWidth(), border = BorderStroke(0.5.dp, gradient()), + onClick = onClick, shape = shape, ) { Box { diff --git a/ui/components/src/main/java/org/kafka/ui/components/placeholder/PlaceholderHighlight.kt b/ui/components/src/main/java/org/kafka/ui/components/placeholder/PlaceholderHighlight.kt index 7d6efcbc9..29cea152e 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/placeholder/PlaceholderHighlight.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/placeholder/PlaceholderHighlight.kt @@ -10,9 +10,9 @@ import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.rememberTransition import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween -import androidx.compose.animation.core.updateTransition import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -162,7 +162,7 @@ fun Modifier.placeholder( val transitionState = remember { MutableTransitionState(visible) }.apply { targetState = visible } - val transition = updateTransition(transitionState, "placeholder_crossfade") + val transition = rememberTransition(transitionState, "placeholder_crossfade") val placeholderAlpha by transition.animateFloat( transitionSpec = placeholderFadeTransitionSpec, diff --git a/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt b/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt index 6ca2d75ca..b9ad8f669 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt @@ -111,7 +111,7 @@ internal fun ContinueReading( items(readingList, key = { it.recentItem.itemId }) { continueReading -> ContinueReadingItem( item = continueReading, - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), onItemClicked = { openItemDetail(continueReading.recentItem.itemId) }, onItemRemoved = { removeRecentItem(it) } ) diff --git a/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt b/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt index 694b57380..8238e8cf6 100644 --- a/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt +++ b/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt @@ -273,7 +273,7 @@ private fun ItemDetail( if (state.isLoading) { item(span = { GridItemSpan(GridItemSpan) }) { - Delayed(modifier = Modifier.animateItemPlacement()) { + Delayed(modifier = Modifier.animateItem()) { InfiniteProgressBar() } } diff --git a/ui/item/src/main/java/org/kafka/item/files/Files.kt b/ui/item/src/main/java/org/kafka/item/files/Files.kt index 9516f43af..e240c27c3 100644 --- a/ui/item/src/main/java/org/kafka/item/files/Files.kt +++ b/ui/item/src/main/java/org/kafka/item/files/Files.kt @@ -97,7 +97,7 @@ private fun Files( onFileClicked = onFileClicked, onDownloadClicked = onDownloadClicked, downloadInfo = download?.downloadInfo, - modifier = Modifier.animateItemPlacement(), + modifier = Modifier.animateItem(), downloader = downloader, scope = scope ) diff --git a/ui/library/src/main/java/org/kafka/library/Tabs.kt b/ui/library/src/main/java/org/kafka/library/Tabs.kt index 7486946f4..a53cc6924 100644 --- a/ui/library/src/main/java/org/kafka/library/Tabs.kt +++ b/ui/library/src/main/java/org/kafka/library/Tabs.kt @@ -3,7 +3,7 @@ package org.kafka.library import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.PagerState -import androidx.compose.material3.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Tab @@ -35,7 +35,7 @@ fun Tabs( selectedTabIndex = pagerState.currentPage, containerColor = backgroundColor, contentColor = contentColor, - divider = { Divider(color = MaterialTheme.colorScheme.surfaceVariant) }, + divider = { HorizontalDivider(color = MaterialTheme.colorScheme.surfaceVariant) }, indicator = { tabPositions -> TabRowDefaults.SecondaryIndicator( Modifier.pagerTabIndicatorOffset(pagerState, tabPositions) diff --git a/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileMenu.kt b/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileMenu.kt index 9ddbdb864..61f530ba1 100644 --- a/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileMenu.kt +++ b/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileMenu.kt @@ -49,7 +49,7 @@ internal fun ProfileMenu(profileViewModel: ProfileViewModel, dismiss: () -> Unit icon = Icons.Sun, onClick = { profileViewModel.toggleTrueContrast() }, endContent = { - ProvideInteractiveEnforcement(false) { + ProvideInteractiveEnforcement { Switch( checked = state.trueContrast, onCheckedChange = { profileViewModel.toggleTrueContrast() }) @@ -69,7 +69,7 @@ internal fun ProfileMenu(profileViewModel: ProfileViewModel, dismiss: () -> Unit profileViewModel.openNotificationSettings(context) }, endContent = { - ProvideInteractiveEnforcement(false) { + ProvideInteractiveEnforcement { Switch( checked = false, onCheckedChange = { @@ -94,7 +94,7 @@ internal fun ProfileMenu(profileViewModel: ProfileViewModel, dismiss: () -> Unit icon = Icons.SafeMode, onClick = { profileViewModel.toggleSafeMode() }, endContent = { - ProvideInteractiveEnforcement(false) { + ProvideInteractiveEnforcement { Switch( checked = state.safeMode, onCheckedChange = { profileViewModel.toggleSafeMode() }) diff --git a/ui/profile/src/main/java/org/rekhta/ui/profile/feedback/FeedbackScreen.kt b/ui/profile/src/main/java/org/rekhta/ui/profile/feedback/FeedbackScreen.kt index 5561cce70..2d6656045 100644 --- a/ui/profile/src/main/java/org/rekhta/ui/profile/feedback/FeedbackScreen.kt +++ b/ui/profile/src/main/java/org/rekhta/ui/profile/feedback/FeedbackScreen.kt @@ -115,7 +115,7 @@ internal fun EmailTextField( }, keyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.None, - autoCorrect = false, + autoCorrectEnabled = false, keyboardType = KeyboardType.Email, imeAction = ImeAction.Next ), @@ -144,7 +144,7 @@ internal fun FeedbackTextField( }, keyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.Sentences, - autoCorrect = false, + autoCorrectEnabled = false, keyboardType = KeyboardType.Text, imeAction = ImeAction.Default ), diff --git a/ui/search/src/main/java/com.kafka.search/RecentSearches.kt b/ui/search/src/main/java/com.kafka.search/RecentSearches.kt index 28460dbcb..9c0e0aba0 100644 --- a/ui/search/src/main/java/com.kafka.search/RecentSearches.kt +++ b/ui/search/src/main/java/com.kafka.search/RecentSearches.kt @@ -46,7 +46,7 @@ fun RecentSearches( recentSearch = recentSearch, onSearchClicked = onSearchClicked, onRemoveSearch = onRemoveSearch, - modifier = Modifier.animateItemPlacement() + modifier = Modifier.animateItem() ) } } diff --git a/ui/search/src/main/java/com.kafka.search/SearchWidget.kt b/ui/search/src/main/java/com.kafka.search/SearchWidget.kt index 21dc66ac0..9676e567e 100644 --- a/ui/search/src/main/java/com.kafka.search/SearchWidget.kt +++ b/ui/search/src/main/java/com.kafka.search/SearchWidget.kt @@ -38,7 +38,7 @@ fun SearchWidget( searchText: String, modifier: Modifier = Modifier, setSearchText: (String) -> Unit, - onImeAction: (String) -> Unit + onImeAction: (String) -> Unit, ) { val keyboard = LocalSoftwareKeyboardController.current @@ -127,7 +127,7 @@ private fun SpeechIcon(text: String, onTextCleared: () -> Unit) { private val SearchKeyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.Sentences, - autoCorrect = false, + autoCorrectEnabled = false, keyboardType = KeyboardType.Text, imeAction = ImeAction.Search ) diff --git a/ui/webview/build.gradle b/ui/webview/build.gradle index f1bf09d09..e8183c025 100644 --- a/ui/webview/build.gradle +++ b/ui/webview/build.gradle @@ -18,7 +18,6 @@ dependencies { implementation projects.ui.theme implementation libs.accompanist.flowlayout - implementation libs.accompanist.navigation.material implementation libs.accompanist.placeholder implementation libs.accompanist.swiperefresh implementation libs.accompanist.web From 96e965b882da50290422eaeecf33c6da264721e4 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 22 Aug 2024 18:44:02 +0530 Subject: [PATCH 02/33] Update navigation; Use slide-in transition for navigating to screens with predictive back; --- .../java/com/kafka/user/home/AppNavigation.kt | 57 +++++++++++-------- gradle/libs.versions.toml | 2 +- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/kafka/user/home/AppNavigation.kt b/app/src/main/java/com/kafka/user/home/AppNavigation.kt index 87f8426c5..db6db7246 100644 --- a/app/src/main/java/com/kafka/user/home/AppNavigation.kt +++ b/app/src/main/java/com/kafka/user/home/AppNavigation.kt @@ -1,10 +1,16 @@ package com.kafka.user.home import android.app.Activity +import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.AnimatedContentTransitionScope.SlideDirection.Companion.End +import androidx.compose.animation.AnimatedContentTransitionScope.SlideDirection.Companion.Start +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxSize +//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material.navigation.bottomSheet import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -20,6 +26,7 @@ import androidx.core.view.WindowCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavGraphBuilder @@ -85,15 +92,13 @@ internal fun AppNavigation( SwitchStatusBarsOnPlayer(navController) - NavHost( - modifier = modifier.fillMaxSize(), + NavHost(modifier = modifier.fillMaxSize(), navController = navController, startDestination = RootScreen.Home.route, - enterTransition = { fadeIn(tween(200)) }, - exitTransition = { fadeOut(tween(200)) }, - popEnterTransition = { fadeIn(tween(200)) }, - popExitTransition = { fadeOut(tween(200)) } - ) { + enterTransition = { enter() }, + exitTransition = { fadeOut() }, + popEnterTransition = { fadeIn() }, + popExitTransition = { exit() }) { addHomeRoot(navController) addSearchRoot(navController) addLibraryRoot(navController) @@ -102,8 +107,7 @@ internal fun AppNavigation( private fun NavGraphBuilder.addHomeRoot(navController: NavController) { navigation( - route = RootScreen.Home.route, - startDestination = Screen.Home.createRoute(RootScreen.Home) + route = RootScreen.Home.route, startDestination = Screen.Home.createRoute(RootScreen.Home) ) { addHome(RootScreen.Home) addItemDetail(RootScreen.Home) @@ -168,18 +172,13 @@ private fun NavGraphBuilder.addHome(root: RootScreen) { private fun NavGraphBuilder.addSearch(root: RootScreen) { composable( - Screen.Search.createRoute(root), - arguments = listOf( - navArgument("keyword") { - type = NavType.StringType - defaultValue = "" - }, - navArgument("filters") { - type = NavType.StringType - defaultValue = SearchFilter.allString() - } - ), - deepLinks = listOf( + Screen.Search.createRoute(root), arguments = listOf(navArgument("keyword") { + type = NavType.StringType + defaultValue = "" + }, navArgument("filters") { + type = NavType.StringType + defaultValue = SearchFilter.allString() + }), deepLinks = listOf( navDeepLink { uriPattern = "${Config.BASE_URL}search?keyword={keyword}&filters={filters}" }, @@ -277,9 +276,7 @@ private fun NavGraphBuilder.addSummary(root: RootScreen) { private fun NavGraphBuilder.addWebView(root: RootScreen) { composable( route = Screen.Web.createRoute(root), - arguments = listOf( - navArgument("url") { type = NavType.StringType } - ) + arguments = listOf(navArgument("url") { type = NavType.StringType }) ) { val navigator = LocalNavigator.current WebView(it.arguments?.getString("url").orEmpty(), navigator::goBack) @@ -324,6 +321,18 @@ internal fun NavController.currentScreenAsState(): State { return selectedItem } +fun AnimatedContentTransitionScope.enter(): EnterTransition { + return slideIntoContainer(Start, tween(200)) { + (it / 1.5).toInt() + } + fadeIn(tween(200)) +} + +fun AnimatedContentTransitionScope.exit(): ExitTransition { + return slideOutOfContainer(End, tween(200)) { + (it / 1.5).toInt() + } + fadeOut(tween(200)) +} + @Composable inline fun activityHiltViewModel() = hiltViewModel(LocalView.current.findViewTreeViewModelStoreOwner()!!) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e3548befd..87def51ca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ kotlininject = "0.7.1" material3 = "1.2.1" media3 = "1.3.1" mixpanel = "7.0.0" -navigation = "2.7.7" +navigation = "2.8.0-rc01" okhttp = "4.12.0" pdfviewer = "3.2.0-beta.1" retrofit = "2.9.0" From 8e42feda630557979cfa137b9b5abd7cf4db6961 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 22 Aug 2024 19:34:47 +0530 Subject: [PATCH 03/33] Updated deps; --- gradle/libs.versions.toml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 87def51ca..fa86fe973 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,13 +33,10 @@ core-ktx = "1.13.1" androidx-test-ext-junit = "1.2.1" espresso-core = "3.6.1" uiautomator = "2.3.0" -benchmark-macro-junit4 = "1.2.4" -androidx-baselineprofile = "1.2.4" +benchmark-macro-junit4 = "1.3.0" +androidx-baselineprofile = "1.3.0" profileinstaller = "1.3.1" review = "2.0.1" -junit = "4.13.2" -appcompat = "1.7.0" -material = "1.12.0" [plugins] android-application = { id = "com.android.application", version.ref = "agp" } @@ -64,7 +61,6 @@ accompanist-flowlayout = { module = "com.google.accompanist:accompanist-flowlayo accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version.ref = "accompanist" } accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } accompanist-placeholder = { module = "com.google.accompanist:accompanist-placeholder-material", version.ref = "accompanist" } -accompanist-navigation-material = { module = "com.google.accompanist:accompanist-navigation-material", version.ref = "accompanist" } accompanist-web = { module = "com.google.accompanist:accompanist-webview", version.ref = "accompanist" } rebugger = "com.github.theapache64:rebugger:1.0.0-alpha06" @@ -202,7 +198,4 @@ android-gradlePlugin = { module = "com.android.tools.build:gradle", version.ref composeCompiler-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } spotless-gradlePlugin = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } -compose-gradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose-multiplatform" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } +compose-gradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose-multiplatform" } \ No newline at end of file From 5262459827e9b574e19c957a0a9c6f8b6a0b986d Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 23 Aug 2024 14:00:39 +0530 Subject: [PATCH 04/33] Set userId to analytics --- .../src/main/java/org/kafka/analytics/logger/AnalyticsImpl.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/analytics/src/main/java/org/kafka/analytics/logger/AnalyticsImpl.kt b/core/analytics/src/main/java/org/kafka/analytics/logger/AnalyticsImpl.kt index ae4fa0d3e..85fd5501e 100644 --- a/core/analytics/src/main/java/org/kafka/analytics/logger/AnalyticsImpl.kt +++ b/core/analytics/src/main/java/org/kafka/analytics/logger/AnalyticsImpl.kt @@ -51,6 +51,7 @@ class AnalyticsImpl @Inject constructor( } override fun updateUserProperty(userData: UserData) { + firebaseAnalytics.setUserId(userData.userId) firebaseAnalytics.setUserProperty("userId", userData.userId) firebaseAnalytics.setUserProperty("country", userData.country) From d1eff6fb951831ff3dfd2d0dcf5d33d32d8a8ffb Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 23 Aug 2024 16:10:42 +0530 Subject: [PATCH 05/33] Material3 Carousel --- .../com/kafka/user/injection/AppModule.kt | 4 +- .../remote/config/RemoteConfigExtensions.kt | 5 +- .../kafka/ui/components/item/FeaturedItem.kt | 15 +----- .../java/org/kafka/ui/components/item/Item.kt | 6 +-- .../main/java/org/kafka/homepage/Homepage.kt | 54 ++++--------------- .../kafka/homepage/components/Carousels.kt | 52 ++++++++---------- 6 files changed, 43 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/com/kafka/user/injection/AppModule.kt b/app/src/main/java/com/kafka/user/injection/AppModule.kt index 8c5bf9cf1..afc633ef4 100644 --- a/app/src/main/java/com/kafka/user/injection/AppModule.kt +++ b/app/src/main/java/com/kafka/user/injection/AppModule.kt @@ -51,9 +51,7 @@ class AppModule { @Singleton @Provides fun provideFirebaseAnalytics(app: Application): FirebaseAnalytics { - return FirebaseAnalytics.getInstance(app).apply { - setUserId("") - } + return FirebaseAnalytics.getInstance(app) } @Singleton diff --git a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt index 684f72faa..2fa4a6d8c 100644 --- a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt +++ b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt @@ -18,6 +18,7 @@ const val ITEM_DETAIL_DYNAMIC_THEME_ENABLED = "item_detail_dynamic_theme_enabled const val BORROWABLE_BOOK_MESSAGE = "borrowable_book_message" const val TRUE_CONTRAST_ENABLED = "true_contrast_enabled" const val SUMMARY_ENABLED = "summary_enabled" +const val SHOW_FEATURED_ITEM_LABELS = "show_featured_item_labels" fun RemoteConfig.getPlayerTheme() = get(REMOTE_CONFIG_PLAYER_THEME_KEY) @@ -35,7 +36,7 @@ fun RemoteConfig.isUseRecommendationEnabled() = getBoolean(USE_RECOMMENDATION_EN fun RemoteConfig.isRecommendationRowEnabled() = getBoolean(RECOMMENDATION_ROW_ENABLED) -fun RemoteConfig.recommendationRowIndex() = getLong(RECOMMENDATION_ROW_INDEX) +fun RemoteConfig.recommendationRowIndex() = getLong(RECOMMENDATION_ROW_INDEX).toInt() fun RemoteConfig.isRelatedContentRowEnabled() = getBoolean(RELATED_CONTENT_ROW_ENABLED) @@ -54,3 +55,5 @@ fun RemoteConfig.borrowableBookMessage() = get(BORROWABLE_BOOK_MESSAGE).replace( fun RemoteConfig.isTrueContrastEnabled() = getBoolean(TRUE_CONTRAST_ENABLED) fun RemoteConfig.isSummaryEnabled() = getBoolean(SUMMARY_ENABLED) + +fun RemoteConfig.showFeaturedItemLabels() = getBoolean(SHOW_FEATURED_ITEM_LABELS) diff --git a/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt b/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt index fbd49a857..4330445fa 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/item/FeaturedItem.kt @@ -1,6 +1,5 @@ package org.kafka.ui.components.item -import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -36,7 +35,7 @@ fun FeaturedItem( modifier: Modifier = Modifier, label: String? = null, imageUrl: String? = null, - shape: Shape = RoundedCornerShape(16.dp), + shape: Shape = RoundedCornerShape(Dimens.Radius16), onClick: () -> Unit = {}, ) { FeaturedItem( @@ -62,12 +61,7 @@ fun FeaturedItem( shape: Shape = RoundedCornerShape(16.dp), onClick: () -> Unit = {}, ) { - Surface( - modifier = modifier.fillMaxWidth(), - border = BorderStroke(0.5.dp, gradient()), - onClick = onClick, - shape = shape, - ) { + Surface(modifier = modifier.fillMaxWidth(), onClick = onClick, shape = shape) { Box { CoverImage( data = imageUrl ?: coverImage, @@ -144,8 +138,3 @@ fun FeaturedItemPlaceholder() { private fun scrim(color: Color) = Brush.verticalGradient( listOf(Color.Transparent, color.copy(alpha = 0.6f), color) ) - -@Composable -private fun gradient(color: Color = MaterialTheme.colorScheme.onSurface) = Brush.verticalGradient( - listOf(Color.Transparent, color.copy(alpha = 0.6f), color.copy(alpha = 0.8f)) -) diff --git a/ui/components/src/main/java/org/kafka/ui/components/item/Item.kt b/ui/components/src/main/java/org/kafka/ui/components/item/Item.kt index 1c4a2a74a..914474bfc 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/item/Item.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/item/Item.kt @@ -54,7 +54,7 @@ fun Item( mediaType: String?, coverImage: String?, modifier: Modifier = Modifier, - isInAppropriate: Boolean = false + isInAppropriate: Boolean = false, ) { Row( modifier = modifier.fillMaxWidth(), @@ -98,7 +98,7 @@ fun ItemDescription( title: @Composable () -> Unit, creator: @Composable () -> Unit, mediaType: @Composable () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier.padding(vertical = Dimens.Spacing04)) { title() @@ -164,7 +164,7 @@ fun ItemSmall( creator: String?, mediaType: String?, coverImage: String?, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Row( modifier = modifier.fillMaxWidth(), diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index a4ab23e1a..023117d0d 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -38,7 +38,6 @@ import com.kafka.data.entities.Item import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import org.kafka.common.extensions.AnimatedVisibilityFade -import org.kafka.common.extensions.rememberSavableMutableState import org.kafka.common.image.Icons import org.kafka.common.logging.LogCompositions import org.kafka.common.widgets.FullScreenMessage @@ -47,8 +46,6 @@ import org.kafka.homepage.components.ContinueReading import org.kafka.ui.components.LabelMedium import org.kafka.ui.components.MessageBox import org.kafka.ui.components.ProvideScaffoldPadding -import org.kafka.ui.components.item.FeaturedItem -import org.kafka.ui.components.item.FeaturedItemPlaceholder import org.kafka.ui.components.item.GenreItem import org.kafka.ui.components.item.Item import org.kafka.ui.components.item.ItemPlaceholder @@ -81,6 +78,7 @@ fun Homepage(viewModel: HomepageViewModel = hiltViewModel()) { homepage = viewState.homepage, recommendedContent = viewModel.recommendedContent, recommendationRowIndex = viewModel.recommendationRowIndex, + showCarouselLabels = viewModel.showCarouselLabels, appShareIndex = viewState.appShareIndex, openItemDetail = viewModel::openItemDetail, openRecommendationDetail = viewModel::openRecommendationDetail, @@ -116,6 +114,7 @@ private fun HomepageFeedItems( recommendedContent: List, appShareIndex: Int, recommendationRowIndex: Int, + showCarouselLabels: Boolean, openRecentItemDetail: (String) -> Unit, openItemDetail: (String) -> Unit, openRecommendationDetail: (String) -> Unit, @@ -196,16 +195,13 @@ private fun HomepageFeedItems( } is HomepageCollection.FeaturedItem -> { - if (collection.items.size > 1) { - item { - Carousels( - carouselItems = collection.items, - images = collection.image, - onBannerClick = openItemDetail - ) - } - } else { - featuredItems(collection = collection, openItemDetail = openItemDetail) + item { + Carousels( + carouselItems = collection.items, + images = collection.image, + showLabel = showCarouselLabels, + onBannerClick = openItemDetail + ) } } @@ -249,36 +245,6 @@ private fun HomepageFeedItems( } } -private fun LazyListScope.featuredItems( - collection: HomepageCollection.FeaturedItem, - openItemDetail: (String) -> Unit, -) { - if (collection.items.isNotEmpty()) { - items( - items = collection.items, - key = { "featured_${it.itemId}" }, - contentType = { "featured" } - ) { item -> - val image by rememberSavableMutableState(collection.image) { - collection.image.randomOrNull().orEmpty() - } - FeaturedItem( - item = item, - label = collection.label, - imageUrl = image, - onClick = { openItemDetail(item.itemId) }, - modifier = Modifier - .padding(horizontal = Dimens.Gutter) - .padding(top = Dimens.Gutter, bottom = Dimens.Spacing12) - ) - } - } else { - item(key = "featured_placeholder_${collection.image}") { - FeaturedItemPlaceholder() - } - } -} - @Composable private fun RowItems( items: ImmutableList, @@ -289,7 +255,7 @@ private fun RowItems( modifier = modifier, contentPadding = PaddingValues( horizontal = Dimens.Gutter, - vertical = Dimens.Spacing08 + vertical = Dimens.Spacing16 ), horizontalArrangement = Arrangement.spacedBy(Dimens.Spacing12) ) { diff --git a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt index 7e5a50cf5..690a7beaf 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt @@ -1,20 +1,18 @@ package org.kafka.homepage.components -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.carousel.HorizontalMultiBrowseCarousel +import androidx.compose.material3.carousel.rememberCarouselState import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import com.kafka.data.entities.Item import kotlinx.collections.immutable.ImmutableList import org.kafka.ui.components.item.FeaturedItem -import org.kafka.ui.components.material.CircleIndicator import ui.common.theme.theme.Dimens @Composable @@ -23,31 +21,27 @@ internal fun Carousels( images: List, onBannerClick: (String) -> Unit, modifier: Modifier = Modifier, + showLabel: Boolean = true, lazyListState: LazyListState = rememberLazyListState(), ) { - val state = rememberPagerState { carouselItems.size } - - Column( - modifier = modifier.padding(top = Dimens.Spacing12), - horizontalAlignment = Alignment.End - ) { - HorizontalPager( - state = state, - modifier = Modifier.padding(Dimens.Spacing02), - contentPadding = PaddingValues(horizontal = Dimens.Spacing24), - pageSpacing = Dimens.Spacing04, - ) { index -> - carouselItems.getOrNull(index)?.let { item -> - FeaturedItem( - item = item, - label = item.title, - imageUrl = images.getOrNull(index), - onClick = { onBannerClick(item.itemId) } - ) - } + val state = rememberCarouselState { carouselItems.size } + HorizontalMultiBrowseCarousel( + state = state, + modifier = modifier.padding(horizontal = Dimens.Spacing08, vertical = Dimens.Spacing08), + preferredItemWidth = CarouselItemPreferredWidth.dp, + itemSpacing = Dimens.Spacing04, + contentPadding = PaddingValues(horizontal = Dimens.Spacing16) + ) { index -> + carouselItems.getOrNull(index)?.let { item -> + FeaturedItem( + item = item, + label = item.title.takeIf { showLabel }, + imageUrl = images.getOrNull(index), + onClick = { onBannerClick(item.itemId) }, + modifier = Modifier.maskClip(shape = RoundedCornerShape(Dimens.Radius16)) + ) } - - Spacer(modifier = Modifier.padding(top = Dimens.Gutter)) - CircleIndicator(state = state, modifier = Modifier.padding(horizontal = Dimens.Gutter)) } } + +const val CarouselItemPreferredWidth = 500 From 01a141da9dd67a8a68a8f0f3211fcd5d6f64c36c Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 23 Aug 2024 17:00:01 +0530 Subject: [PATCH 06/33] Material3 Carousel --- .../src/main/java/org/kafka/homepage/HomepageViewModel.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index 482667c2c..fab7a6137 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -11,6 +11,7 @@ import com.kafka.data.model.SearchFilter import com.kafka.remote.config.RemoteConfig import com.kafka.remote.config.isRecommendationRowEnabled import com.kafka.remote.config.recommendationRowIndex +import com.kafka.remote.config.showFeaturedItemLabels import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collect @@ -49,7 +50,8 @@ class HomepageViewModel @Inject constructor( ) : ViewModel() { private val uiMessageManager = UiMessageManager() var recommendedContent by mutableStateOf(emptyList()) - val recommendationRowIndex = remoteConfig.recommendationRowIndex().toInt() + val recommendationRowIndex = remoteConfig.recommendationRowIndex() + val showCarouselLabels = remoteConfig.showFeaturedItemLabels() val state: StateFlow = combine( observeHomepage.flow, From d63b50e16cf936b0452adddb8f33755bc8dfbe5a Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 24 Aug 2024 02:47:52 +0530 Subject: [PATCH 07/33] Change lottie animation color for summary message box; --- .../main/java/org/kafka/ui/components/item/SummaryMessage.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/components/src/main/java/org/kafka/ui/components/item/SummaryMessage.kt b/ui/components/src/main/java/org/kafka/ui/components/item/SummaryMessage.kt index dbfb30636..73a9bca23 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/item/SummaryMessage.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/item/SummaryMessage.kt @@ -24,6 +24,7 @@ import com.airbnb.lottie.compose.LottieConstants import com.airbnb.lottie.compose.rememberLottieComposition import org.kafka.common.widgets.shadowMaterial import org.kafka.ui.components.R +import org.kafka.ui.components.animation.colorFilterDynamicProperty import ui.common.theme.theme.Dimens @Composable @@ -78,6 +79,8 @@ private fun SummaryAnimation( iterations = LottieConstants.IterateForever, modifier = modifier.align(Alignment.Center), isPlaying = true, + speed = 0.5f, + dynamicProperties = colorFilterDynamicProperty(color) ) } } From 530b441d56a291e1b25a6d704a2c570676f67a4d Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 24 Aug 2024 17:22:31 +0530 Subject: [PATCH 08/33] Type safe navigation --- app/proguard-rules.pro | 5 + .../java/com/kafka/user/home/AppNavigation.kt | 253 ++++++++---------- app/src/main/java/com/kafka/user/home/Home.kt | 38 ++- .../user/home/bottombar/HomeNavigationBar.kt | 2 +- .../home/bottombar/HomeNavigationItems.kt | 2 +- .../home/bottombar/rail/HomeNavigationRail.kt | 23 +- .../rail/ResizableHomeNavigationRail.kt | 6 +- .../kafka/user/playback/PlaybackViewModel.kt | 29 +- .../com/kafka/data/injection/NetworkModule.kt | 8 +- navigation/build.gradle | 3 + .../org/kafka/navigation/NavigationGraph.kt | 81 ------ .../java/org/kafka/navigation/Navigator.kt | 72 ++--- .../kafka/navigation/graph/NavigationGraph.kt | 97 +++++++ .../org/kafka/homepage/HomepageViewModel.kt | 30 +-- .../kafka/homepage/recent/RecentViewModel.kt | 4 +- .../java/org/kafka/item/detail/ItemDetail.kt | 2 +- .../kafka/item/detail/ItemDetailViewModel.kt | 36 ++- .../org/kafka/item/files/FilesViewModel.kt | 6 +- .../library/downloads/DownloadsViewModel.kt | 4 +- .../library/favorites/FavoriteViewModel.kt | 6 +- .../org/rekhta/ui/profile/ProfileViewModel.kt | 8 +- .../java/com.kafka.search/SearchViewModel.kt | 4 +- .../org/kafka/summary/SummaryViewModel.kt | 6 +- 23 files changed, 339 insertions(+), 386 deletions(-) delete mode 100644 navigation/src/main/java/org/kafka/navigation/NavigationGraph.kt create mode 100644 navigation/src/main/java/org/kafka/navigation/graph/NavigationGraph.kt diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 63c08bdc6..d91510b27 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -51,6 +51,7 @@ -dontwarn com.google.errorprone.annotations.* -keepclassmembers class com.kafka.data.entities.** { *; } +-keepclassmembers class org.kafka.navigation.graph.** { *; } -keep class com.kafka.data.entities.** { ; @@ -68,6 +69,10 @@ ; (...); } +-keep class org.kafka.navigation.graph.** { + ; + (...); +} -keep class com.google.android.gms.** { *; } -keep class com.google.firebase.** { *; } diff --git a/app/src/main/java/com/kafka/user/home/AppNavigation.kt b/app/src/main/java/com/kafka/user/home/AppNavigation.kt index db6db7246..c212f3ba3 100644 --- a/app/src/main/java/com/kafka/user/home/AppNavigation.kt +++ b/app/src/main/java/com/kafka/user/home/AppNavigation.kt @@ -1,24 +1,19 @@ package com.kafka.user.home +//noinspection UsingMaterialAndMaterial3Libraries import android.app.Activity import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.AnimatedContentTransitionScope.SlideDirection.Companion.End import androidx.compose.animation.AnimatedContentTransitionScope.SlideDirection.Companion.Start import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition -import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.fillMaxSize -//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material.navigation.bottomSheet import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.Stable -import androidx.compose.runtime.State import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalView import androidx.compose.ui.window.DialogProperties @@ -28,18 +23,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.navigation.NavBackStackEntry import androidx.navigation.NavController -import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController -import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.dialog import androidx.navigation.compose.navigation -import androidx.navigation.navArgument import androidx.navigation.navDeepLink -import com.kafka.data.model.SearchFilter +import androidx.navigation.toRoute import com.kafka.reader.ReaderScreen import com.kafka.reader.online.OnlineReader import com.kafka.search.SearchScreen @@ -56,11 +48,9 @@ import org.kafka.library.LibraryScreen import org.kafka.navigation.LocalNavigator import org.kafka.navigation.NavigationEvent import org.kafka.navigation.Navigator -import org.kafka.navigation.ROOT_SCREENS -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen -import org.kafka.navigation.Screen.Reader import org.kafka.navigation.deeplink.Config +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen import org.kafka.summary.SummaryScreen import org.kafka.webview.WebView import org.rekhta.ui.auth.LoginScreen @@ -78,7 +68,25 @@ internal fun AppNavigation( CollectEvent(navigator.queue) { event -> when (event) { is NavigationEvent.Destination -> { - navController.navigate(event.route) + when (val screen = event.route) { + is Screen.ItemDetail -> { + navController.navigate(Screen.ItemDetail.route(screen.itemId)) + } + + is Screen.ItemDescription -> { + navController.navigate(Screen.ItemDescription.route(screen.itemId)) + } + + Screen.Feedback, + Screen.Player, + -> { + navController.navigate(Screen.Player.route) + } + + else -> { + navController.navigate(screen) + } + } } is NavigationEvent.Back -> { @@ -92,13 +100,15 @@ internal fun AppNavigation( SwitchStatusBarsOnPlayer(navController) - NavHost(modifier = modifier.fillMaxSize(), + NavHost( + modifier = modifier.fillMaxSize(), navController = navController, - startDestination = RootScreen.Home.route, + startDestination = RootScreen.Home, enterTransition = { enter() }, exitTransition = { fadeOut() }, popEnterTransition = { fadeIn() }, - popExitTransition = { exit() }) { + popExitTransition = { exit() } + ) { addHomeRoot(navController) addSearchRoot(navController) addLibraryRoot(navController) @@ -106,90 +116,64 @@ internal fun AppNavigation( } private fun NavGraphBuilder.addHomeRoot(navController: NavController) { - navigation( - route = RootScreen.Home.route, startDestination = Screen.Home.createRoute(RootScreen.Home) - ) { - addHome(RootScreen.Home) - addItemDetail(RootScreen.Home) - addItemDescription(RootScreen.Home) - addFiles(RootScreen.Home) - addReader(RootScreen.Home) - addLibrary(RootScreen.Home) - addProfile(RootScreen.Home) - addFeedback(RootScreen.Home) - addSearch(RootScreen.Home) - addLogin(RootScreen.Home) - addPlayer(RootScreen.Home) - addWebView(RootScreen.Home) - addOnlineReader(RootScreen.Home, navController) - addRecentItems(RootScreen.Home) - addSummary(RootScreen.Home) + navigation(startDestination = Screen.Home) { + addHome() + addItemDetailGroup(navController) + addLibrary() + addProfile() + addFeedback() + addSearch() + addLogin() + addPlayer() + addWebView() + addRecentItems() } } private fun NavGraphBuilder.addSearchRoot(navController: NavController) { - navigation( - route = RootScreen.Search.route, - startDestination = Screen.Search.createRoute(RootScreen.Search) - ) { - addSearch(RootScreen.Search) - addItemDetail(RootScreen.Search) - addItemDescription(RootScreen.Search) - addFiles(RootScreen.Search) - addReader(RootScreen.Search) - addPlayer(RootScreen.Search) - addWebView(RootScreen.Search) - addOnlineReader(RootScreen.Search, navController) - addSummary(RootScreen.Search) + navigation(startDestination = Screen.Search()) { + addSearch() + addItemDetailGroup(navController) + addPlayer() + addWebView() } } private fun NavGraphBuilder.addLibraryRoot(navController: NavController) { - navigation( - route = RootScreen.Library.route, - startDestination = Screen.Library.createRoute(RootScreen.Library) - ) { - addLibrary(RootScreen.Library) - addItemDetail(RootScreen.Library) - addItemDescription(RootScreen.Library) - addFiles(RootScreen.Library) - addReader(RootScreen.Library) - addSearch(RootScreen.Library) - addPlayer(RootScreen.Library) - addWebView(RootScreen.Library) - addOnlineReader(RootScreen.Library, navController) - addLogin(RootScreen.Library) - addProfile(RootScreen.Library) - addSummary(RootScreen.Library) + navigation(startDestination = Screen.Library) { + addLibrary() + addItemDetailGroup(navController) + addSearch() + addPlayer() + addWebView() + addLogin() + addProfile() } } -private fun NavGraphBuilder.addHome(root: RootScreen) { - composable(Screen.Home.createRoute(root)) { +private fun NavGraphBuilder.addItemDetailGroup(navController: NavController) { + addItemDetail() + addItemDescription() + addFiles() + addReader() + addOnlineReader(navController) + addSummary() +} + +private fun NavGraphBuilder.addHome() { + composable { Homepage() } } -private fun NavGraphBuilder.addSearch(root: RootScreen) { - composable( - Screen.Search.createRoute(root), arguments = listOf(navArgument("keyword") { - type = NavType.StringType - defaultValue = "" - }, navArgument("filters") { - type = NavType.StringType - defaultValue = SearchFilter.allString() - }), deepLinks = listOf( - navDeepLink { - uriPattern = "${Config.BASE_URL}search?keyword={keyword}&filters={filters}" - }, - ) - ) { +private fun NavGraphBuilder.addSearch() { + composable { SearchScreen() } } -private fun NavGraphBuilder.addPlayer(root: RootScreen) { - bottomSheet(Screen.Player.createRoute(root)) { +private fun NavGraphBuilder.addPlayer() { + bottomSheet(Screen.Player.route) { val navigator = LocalNavigator.current val playbackViewModel = activityHiltViewModel() @@ -203,16 +187,15 @@ private fun NavGraphBuilder.addPlayer(root: RootScreen) { } } -private fun NavGraphBuilder.addLibrary(root: RootScreen) { - composable(Screen.Library.createRoute(root)) { +private fun NavGraphBuilder.addLibrary() { + composable { LibraryScreen() } } -private fun NavGraphBuilder.addItemDetail(root: RootScreen) { +private fun NavGraphBuilder.addItemDetail() { composable( - Screen.ItemDetail.createRoute(root), - arguments = listOf(navArgument("itemId") { type = NavType.StringType }), + route = Screen.ItemDetail.route, deepLinks = listOf( navDeepLink { uriPattern = "${Config.BASE_URL}item/{itemId}" }, navDeepLink { uriPattern = "${Config.BASE_URL_ALT}item/{itemId}" }, @@ -222,115 +205,93 @@ private fun NavGraphBuilder.addItemDetail(root: RootScreen) { } } -private fun NavGraphBuilder.addItemDescription(root: RootScreen) { - bottomSheet(Screen.ItemDescription.createRoute(root)) { +private fun NavGraphBuilder.addItemDescription() { + bottomSheet(Screen.ItemDescription.route) { DescriptionDialog() } } -private fun NavGraphBuilder.addFiles(root: RootScreen) { - composable(Screen.Files.createRoute(root)) { +private fun NavGraphBuilder.addFiles() { + composable { Files() } } -private fun NavGraphBuilder.addReader(root: RootScreen) { - composable(Screen.Reader.createRoute(root)) { +private fun NavGraphBuilder.addReader() { + composable { ReaderScreen() } } -private fun NavGraphBuilder.addLogin(root: RootScreen) { - composable(Screen.Login.createRoute(root)) { +private fun NavGraphBuilder.addLogin() { + composable { LoginScreen() } } -private fun NavGraphBuilder.addProfile(root: RootScreen) { - dialog( - route = Screen.Profile.createRoute(root), - dialogProperties = DialogProperties(usePlatformDefaultWidth = false) - ) { +private fun NavGraphBuilder.addProfile() { + dialog(dialogProperties = DialogProperties(usePlatformDefaultWidth = false)) { ProfileScreen() } } -private fun NavGraphBuilder.addFeedback(root: RootScreen) { - bottomSheet(route = Screen.Feedback.createRoute(root)) { +private fun NavGraphBuilder.addFeedback() { + bottomSheet(route = Screen.Feedback.route) { FeedbackScreen() } } -private fun NavGraphBuilder.addRecentItems(root: RootScreen) { - composable(route = Screen.RecentItems.createRoute(root)) { +private fun NavGraphBuilder.addRecentItems() { + composable { RecentItemsScreen() } } -private fun NavGraphBuilder.addSummary(root: RootScreen) { - composable(route = Screen.Summary.createRoute(root)) { +private fun NavGraphBuilder.addSummary() { + composable { SummaryScreen() } } -private fun NavGraphBuilder.addWebView(root: RootScreen) { - composable( - route = Screen.Web.createRoute(root), - arguments = listOf(navArgument("url") { type = NavType.StringType }) - ) { +private fun NavGraphBuilder.addWebView() { + composable { backStackEntry -> val navigator = LocalNavigator.current - WebView(it.arguments?.getString("url").orEmpty(), navigator::goBack) + WebView(backStackEntry.toRoute().url, navigator::goBack) } } -private fun NavGraphBuilder.addOnlineReader(root: RootScreen, navController: NavController) { - composable( - route = Screen.OnlineReader.createRoute(root), - arguments = listOf(navArgument("itemId") { type = NavType.StringType }) - ) { - val currentRoot by navController.currentScreenAsState() +private fun NavGraphBuilder.addOnlineReader(navController: NavController) { + composable { val currentDestination = navController.currentDestination?.route OnlineReader { fileId -> - navController.navigate(Reader.createRoute(currentRoot, fileId)) { + navController.navigate(Screen.Reader(fileId)) { popUpTo(currentDestination.orEmpty()) { inclusive = true } } } } } -// todo: app closes on back from player - -@Stable -@Composable -internal fun NavController.currentScreenAsState(): State { - val selectedItem = remember { mutableStateOf(RootScreen.Home) } - val rootScreens = ROOT_SCREENS - DisposableEffect(this) { - val listener = NavController.OnDestinationChangedListener { _, destination, _ -> - rootScreens.firstOrNull { rs -> destination.hierarchy.any { it.route == rs.route } } - ?.let { selectedItem.value = it } - } - addOnDestinationChangedListener(listener) +fun AnimatedContentTransitionScope.enter(): EnterTransition { + val initialNavGraph = initialState.destination.parent?.route + val targetNavGraph = targetState.destination.parent?.route - onDispose { - removeOnDestinationChangedListener(listener) - } + if (initialNavGraph != targetNavGraph) { + return fadeIn() } - return selectedItem -} - -fun AnimatedContentTransitionScope.enter(): EnterTransition { - return slideIntoContainer(Start, tween(200)) { - (it / 1.5).toInt() - } + fadeIn(tween(200)) + return slideIntoContainer(Start) { (it / 1.5).toInt() } + fadeIn() } fun AnimatedContentTransitionScope.exit(): ExitTransition { - return slideOutOfContainer(End, tween(200)) { - (it / 1.5).toInt() - } + fadeOut(tween(200)) + val initialNavGraph = initialState.destination.parent?.route + val targetNavGraph = targetState.destination.parent?.route + + if (initialNavGraph != targetNavGraph) { + return fadeOut() + } + + return slideOutOfContainer(End) { (it / 1.5).toInt() } + fadeOut() } @Composable diff --git a/app/src/main/java/com/kafka/user/home/Home.kt b/app/src/main/java/com/kafka/user/home/Home.kt index a8fe4d4a6..acaaa0eaa 100644 --- a/app/src/main/java/com/kafka/user/home/Home.kt +++ b/app/src/main/java/com/kafka/user/home/Home.kt @@ -11,8 +11,9 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.zIndex import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -28,12 +29,14 @@ import com.sarahang.playback.core.models.LocalPlaybackConnection import com.sarahang.playback.ui.components.isWideLayout import com.sarahang.playback.ui.player.mini.MiniPlayer import com.sarahang.playback.ui.sheet.materialYouPlayerTheme +import org.kafka.analytics.logger.Analytics import org.kafka.common.widgets.LocalSnackbarHostState import org.kafka.navigation.LocalNavigator -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen +import org.kafka.navigation.currentScreenAsState +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen +import org.kafka.navigation.graph.navigationRoute import org.kafka.navigation.selectRootScreen -import org.kafka.analytics.logger.Analytics import org.kafka.ui.components.ProvideScaffoldPadding import org.kafka.ui.components.snackbar.DismissableSnackbarHost import ui.common.theme.theme.Dimens @@ -50,15 +53,10 @@ internal fun Home( snackbarHostState: SnackbarHostState = LocalSnackbarHostState.current, ) { val selectedTab by navController.currentScreenAsState() - val navigator = LocalNavigator.current val playbackState by playbackConnection.playbackState.collectAsStateWithLifecycle() val nowPlaying by playbackConnection.nowPlaying.collectAsStateWithLifecycle() val isPlayerActive = (playbackState to nowPlaying).isActive - LaunchedEffect(selectedTab) { - navigator.updateRoot(selectedTab) - } - BoxWithConstraints(modifier.fillMaxWidth()) { val isWideLayout = isWideLayout() val maxWidth = maxWidth @@ -71,9 +69,7 @@ internal fun Home( navController = navController, analytics = analytics, onPlayingArtistClick = { - navController.navigate( - Screen.Search.createRoute(RootScreen.Search, nowPlaying.artist) - ) + navController.navigate(Screen.Search(nowPlaying.artist.orEmpty())) }, ) } @@ -108,11 +104,9 @@ private fun BottomBar( selectedTab: RootScreen, isPlayerActive: Boolean, analytics: Analytics, - playerTheme: String + playerTheme: String, ) { val navigator = LocalNavigator.current - val currentRoot by navigator.currentRoot.collectAsStateWithLifecycle() - if (!isWideLayout) Column { MiniPlayer( @@ -120,16 +114,14 @@ private fun BottomBar( modifier = Modifier .padding(Dimens.Spacing08) .zIndex(2f), - openPlaybackSheet = { - navigator.navigate(Screen.Player.createRoute(currentRoot)) - }, + openPlaybackSheet = { navigator.navigate(Screen.Player) }, playerTheme = playerTheme, ) HomeNavigationBar( selectedTab = selectedTab, onNavigationSelected = { selected -> - analytics.log { this.homeTabSwitched(selectedTab.route, "navigation_bar") } + analytics.log { homeTabSwitched(selectedTab.analyticsKey, "navigation_bar") } navController.selectRootScreen(selected) }, isPlayerActive = isPlayerActive, @@ -139,11 +131,13 @@ private fun BottomBar( else Spacer(Modifier.navigationBarsPadding()) } - @Composable private fun shouldShowBottomBar(navController: NavController): Boolean { val currentRoute by navController.currentBackStackEntryAsState() - val destination = currentRoute?.destination?.route?.split("/")?.getOrNull(1) + val destination by remember(currentRoute) { + derivedStateOf { currentRoute?.destination?.route?.substringBefore("/") } + } - return destination != "reader" && destination != "reader_online" + return destination != Screen.Reader.navigationRoute + && destination != Screen.OnlineReader.navigationRoute } diff --git a/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationBar.kt b/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationBar.kt index 1c4d0c719..308bd0edd 100644 --- a/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationBar.kt +++ b/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationBar.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import org.kafka.common.test.testTagUi -import org.kafka.navigation.RootScreen +import org.kafka.navigation.graph.RootScreen internal object HomeNavigationBarDefaults { val colors diff --git a/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationItems.kt b/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationItems.kt index dc3dfd4ba..1d0548db0 100644 --- a/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationItems.kt +++ b/app/src/main/java/com/kafka/user/home/bottombar/HomeNavigationItems.kt @@ -4,7 +4,7 @@ import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector import com.kafka.user.R import org.kafka.common.image.Icons -import org.kafka.navigation.RootScreen +import org.kafka.navigation.graph.RootScreen internal val HomeNavigationItems = listOf( HomeNavigationItem.ImageVectorIcon( diff --git a/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRail.kt b/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRail.kt index a59b9ded7..74faeef4e 100644 --- a/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRail.kt +++ b/app/src/main/java/com/kafka/user/home/bottombar/rail/HomeNavigationRail.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kafka.user.home.bottombar.HomeNavigationItemIcon import com.kafka.user.home.bottombar.HomeNavigationItems import com.kafka.user.home.bottombar.rail.HomeNavigationRailDefaults.ExpandedPlaybackControlsMinWidth @@ -49,8 +48,8 @@ import com.sarahang.playback.ui.sheet.PlaybackNowPlayingDefaults import com.sarahang.playback.ui.sheet.rememberFlowWithLifecycle import org.kafka.navigation.LocalNavigator import org.kafka.navigation.Navigator -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen import ui.common.theme.theme.Dimens import ui.common.theme.theme.LocalTheme import ui.common.theme.theme.shouldUseDarkColors @@ -90,12 +89,7 @@ internal fun HomeNavigationRail( playbackConnection: PlaybackConnection = LocalPlaybackConnection.current, navigator: Navigator = LocalNavigator.current, ) { - val currentRoot by navigator.currentRoot.collectAsStateWithLifecycle() - Surface( - tonalElevation = 0.dp, - shadowElevation = 8.dp, - modifier = modifier, - ) { + Surface(modifier = modifier, tonalElevation = 0.dp, shadowElevation = 8.dp) { BoxWithConstraints { extraContent() val maxWidth = maxWidth @@ -170,10 +164,9 @@ internal fun HomeNavigationRail( PlaybackArtworkPagerWithNowPlayingAndControls( nowPlaying = nowPlaying, playbackState = playbackState, - onArtworkClick = { - navigator.navigate(Screen.Player.createRoute(currentRoot)) - }, - titleTextStyle = PlaybackNowPlayingDefaults.titleTextStyle.copy(fontSize = MaterialTheme.typography.bodyLarge.fontSize), + onArtworkClick = { navigator.navigate(Screen.Player) }, + titleTextStyle = PlaybackNowPlayingDefaults.titleTextStyle + .copy(fontSize = MaterialTheme.typography.bodyLarge.fontSize), artistTextStyle = PlaybackNowPlayingDefaults.artistTextStyle.copy( fontSize = MaterialTheme.typography.titleSmall.fontSize ), @@ -186,9 +179,7 @@ internal fun HomeNavigationRail( .padding(Dimens.Spacing08) .zIndex(2f), useDarkTheme = LocalTheme.current.shouldUseDarkColors(), - openPlaybackSheet = { - navigator.navigate(Screen.Player.createRoute(currentRoot)) - } + openPlaybackSheet = { navigator.navigate(Screen.Player) } ) } } diff --git a/app/src/main/java/com/kafka/user/home/bottombar/rail/ResizableHomeNavigationRail.kt b/app/src/main/java/com/kafka/user/home/bottombar/rail/ResizableHomeNavigationRail.kt index f58043f69..44637ddab 100644 --- a/app/src/main/java/com/kafka/user/home/bottombar/rail/ResizableHomeNavigationRail.kt +++ b/app/src/main/java/com/kafka/user/home/bottombar/rail/ResizableHomeNavigationRail.kt @@ -17,9 +17,9 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import com.sarahang.playback.ui.components.ResizableLayout import com.sarahang.playback.ui.sheet.rememberFlowWithLifecycle -import org.kafka.navigation.RootScreen -import org.kafka.navigation.selectRootScreen import org.kafka.analytics.logger.Analytics +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.selectRootScreen @Composable internal fun RowScope.ResizableHomeNavigationRail( @@ -46,7 +46,7 @@ internal fun RowScope.ResizableHomeNavigationRail( HomeNavigationRail( selectedTab = selectedTab, onNavigationSelected = { selected -> - analytics.log { homeTabSwitched(selected.route, "navigation_rail") } + analytics.log { homeTabSwitched(selected.analyticsKey, "navigation_rail") } navController.selectRootScreen(selected) }, onPlayingArtistClick = onPlayingArtistClick, diff --git a/app/src/main/java/com/kafka/user/playback/PlaybackViewModel.kt b/app/src/main/java/com/kafka/user/playback/PlaybackViewModel.kt index 610029722..5ee2b648b 100644 --- a/app/src/main/java/com/kafka/user/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/kafka/user/playback/PlaybackViewModel.kt @@ -14,8 +14,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen -import org.kafka.navigation.Screen.Search +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen +import org.kafka.navigation.graph.Screen.Search import javax.inject.Inject @HiltViewModel @@ -23,20 +24,15 @@ class PlaybackViewModel @Inject constructor( private val playbackConnection: PlaybackConnection, private val fileDao: FileDao, private val navigator: Navigator, - private val remoteConfig: RemoteConfig + private val remoteConfig: RemoteConfig, ) : ViewModel() { val playerTheme by lazy { remoteConfig.getPlayerTheme() } fun goToAlbum() { viewModelScope.launch(Dispatchers.IO) { - val currentRoot = navigator.currentRoot.value - val nowPlaying = playbackConnection.nowPlaying.value - - nowPlaying.id.toMediaId().value.let { id -> + playbackConnection.nowPlaying.value.id.toMediaId().value.let { id -> fileDao.getOrNull(id)!!.let { file -> - navigator.navigate( - Screen.ItemDetail.createRoute(currentRoot, file.itemId) - ) + navigator.navigate(Screen.ItemDetail(file.itemId)) } } } @@ -44,14 +40,11 @@ class PlaybackViewModel @Inject constructor( fun goToCreator() { viewModelScope.launch { - val currentRoot = navigator.currentRoot.value - val creator = playbackConnection.nowPlaying.value.artist - - navigator.navigate(Search.createRoute( - root = currentRoot, - keyword = creator, - filter = SearchFilter.Creator.name - )) + val artist = playbackConnection.nowPlaying.value.artist.orEmpty() + navigator.navigate( + route = Search(keyword = artist, filters = SearchFilter.Creator.name), + root = RootScreen.Search + ) } } } diff --git a/data/repo/src/main/java/com/kafka/data/injection/NetworkModule.kt b/data/repo/src/main/java/com/kafka/data/injection/NetworkModule.kt index 4d57389f9..a5ef32df0 100644 --- a/data/repo/src/main/java/com/kafka/data/injection/NetworkModule.kt +++ b/data/repo/src/main/java/com/kafka/data/injection/NetworkModule.kt @@ -109,9 +109,9 @@ class NetworkModule { .writeTimeout(Config.API_TIMEOUT, TimeUnit.MILLISECONDS) .retryOnConnectionFailure(true) } -} -object Config { - val API_TIMEOUT = Duration.ofSeconds(40).toMillis() - val DOWNLOADER_TIMEOUT = Duration.ofMinutes(3).toMillis() + object Config { + val API_TIMEOUT = Duration.ofSeconds(40).toMillis() + val DOWNLOADER_TIMEOUT = Duration.ofMinutes(3).toMillis() + } } diff --git a/navigation/build.gradle b/navigation/build.gradle index 4c5724c0e..60c22dabf 100644 --- a/navigation/build.gradle +++ b/navigation/build.gradle @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose.compiler) alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.kotlin.serialization) } android { @@ -29,5 +30,7 @@ dependencies { implementation libs.compose.runtime.runtime implementation libs.hilt.android + implementation libs.kotlin.serialization + kapt libs.hilt.compiler } diff --git a/navigation/src/main/java/org/kafka/navigation/NavigationGraph.kt b/navigation/src/main/java/org/kafka/navigation/NavigationGraph.kt deleted file mode 100644 index 35b47e5ec..000000000 --- a/navigation/src/main/java/org/kafka/navigation/NavigationGraph.kt +++ /dev/null @@ -1,81 +0,0 @@ -package org.kafka.navigation - -import com.kafka.data.model.SearchFilter -import java.net.URLEncoder -import java.nio.charset.StandardCharsets - -sealed class RootScreen(val route: String) { - data object Home : RootScreen("home_root") - data object Search : RootScreen("search_root") - data object Library : RootScreen("library_root") - data object Profile : RootScreen("profile_root") -} - -sealed class Screen(private val route: String) { - fun createRoute(root: RootScreen) = "${root.route}/$route" - - data object Profile : Screen("profile") - data object Feedback : Screen("feedback") - data object Library : Screen("library") - data object Home : Screen("home") - data object Login : Screen("login") - data object Player : Screen("player") - data object RecentItems : Screen("recent_items") - - data object ItemDetail : Screen("item/{itemId}") { - fun createRoute(root: RootScreen, itemId: String): String { - return "${root.route}/item/$itemId" - } - } - - data object Summary : Screen("summary/{itemId}") { - fun createRoute(root: RootScreen, itemId: String): String { - return "${root.route}/summary/$itemId" - } - } - - data object ItemDescription : Screen("item_description/{itemId}") { - fun createRoute(root: RootScreen, itemId: String): String { - return "${root.route}/item_description/$itemId" - } - } - - data object Files : Screen("files/{itemId}") { - fun createRoute(root: RootScreen, itemId: String): String { - return "${root.route}/files/$itemId" - } - } - - data object Reader : Screen("reader/{fileId}") { - fun createRoute(root: RootScreen, fileId: String): String { - return "${root.route}/reader/$fileId" - } - } - - data object Search : Screen("search?keyword={keyword}&filters={filters}") { - fun createRoute( - root: RootScreen, - keyword: String? = null, - filter: String = SearchFilter.allString(), - ): String { - val routeKeyword = keyword?.replace("'", " ") - return "${root.route}/search".let { - if (routeKeyword != null) "$it?keyword=$routeKeyword&filters=$filter" else it - } - } - } - - data object Web : Screen("web/{url}") { - fun createRoute(root: RootScreen, url: String): String { - return "${root.route}/web/${url.encodeUrl()}" - } - } - - data object OnlineReader : Screen("reader_online/{itemId}") { - fun createRoute(root: RootScreen, itemId: String): String { - return "${root.route}/reader_online/${itemId}" - } - } -} - -private fun String.encodeUrl(): String = URLEncoder.encode(this, StandardCharsets.UTF_8.toString()) \ No newline at end of file diff --git a/navigation/src/main/java/org/kafka/navigation/Navigator.kt b/navigation/src/main/java/org/kafka/navigation/Navigator.kt index fb48754db..a21bceeab 100644 --- a/navigation/src/main/java/org/kafka/navigation/Navigator.kt +++ b/navigation/src/main/java/org/kafka/navigation/Navigator.kt @@ -2,6 +2,11 @@ package org.kafka.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.staticCompositionLocalOf import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController @@ -11,17 +16,15 @@ import androidx.navigation.NavGraph import androidx.navigation.NavGraph.Companion.findStartDestination import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.receiveAsFlow -import org.kafka.base.debug +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen +import org.kafka.navigation.graph.navigationRoute interface Navigator { - fun navigate(route: String) + fun navigate(route: Screen, root: RootScreen? = null) fun goBack() - fun updateRoot(root: RootScreen) val queue: Flow - val currentRoot: StateFlow } val LocalNavigator = staticCompositionLocalOf { @@ -44,62 +47,65 @@ private fun NavigatorHost( CompositionLocalProvider(LocalNavigator provides navigator, content = content) } -sealed class NavigationEvent(open val route: String) { - object Back : NavigationEvent("Back") +sealed class NavigationEvent(open val route: Screen) { + data object Back : NavigationEvent(Screen.Back) data class Destination( - override val route: String, - val root: RootScreen? = null + override val route: Screen, + val root: RootScreen? = null, ) : NavigationEvent(route) - - override fun toString() = route } class NavigatorImpl : Navigator { private val navigationQueue = Channel(Channel.CONFLATED) - private val currentRootChannel = MutableStateFlow(RootScreen.Home) override val queue = navigationQueue.receiveAsFlow() - override val currentRoot = currentRootChannel - - override fun navigate(route: String) { - debug { "Navigating to $route" } - - val rootPath = route.split("/").firstOrNull() - val rootScreen = ROOT_SCREENS.firstOrNull { it.route == rootPath } - - debug { "Navigating to $route with root $rootScreen" } - navigationQueue.trySend(NavigationEvent.Destination(route, rootScreen)) - } - override fun updateRoot(root: RootScreen) { - currentRootChannel.tryEmit(root) + override fun navigate(route: Screen, root: RootScreen?) { + navigationQueue.trySend(NavigationEvent.Destination(route, root)) } override fun goBack() { - debug { "Going back" } navigationQueue.trySend(NavigationEvent.Back) } } fun NavController.selectRootScreen(tab: RootScreen) { - debug { "Selecting root screen $tab" } - navigate(tab.route) { - launchSingleTop = true - restoreState = true - + navigate(tab) { popUpTo(graph.findStartDestination().id) { saveState = true } + launchSingleTop = true + restoreState = true val currentEntry = currentBackStackEntry val currentDestination = currentEntry?.destination val hostGraphRoute = currentDestination?.hostNavGraph?.route - val isReselected = hostGraphRoute == tab.route + val isReselected = hostGraphRoute == tab.navigationRoute if (isReselected) { navigateUp() } } } +@Stable +@Composable +fun NavController.currentScreenAsState(): State { + val selectedItem = remember { mutableStateOf(RootScreen.Home) } + val rootScreens = ROOT_SCREENS + DisposableEffect(this) { + val listener = NavController.OnDestinationChangedListener { _, destination, _ -> + rootScreens.firstOrNull { rs -> destination.hierarchy.any { it.route == rs.navigationRoute } } + ?.let { selectedItem.value = it } + } + addOnDestinationChangedListener(listener) + + onDispose { + removeOnDestinationChangedListener(listener) + } + } + + return selectedItem +} + val ROOT_SCREENS = listOf(RootScreen.Home, RootScreen.Search, RootScreen.Library, RootScreen.Profile) diff --git a/navigation/src/main/java/org/kafka/navigation/graph/NavigationGraph.kt b/navigation/src/main/java/org/kafka/navigation/graph/NavigationGraph.kt new file mode 100644 index 000000000..f1875f840 --- /dev/null +++ b/navigation/src/main/java/org/kafka/navigation/graph/NavigationGraph.kt @@ -0,0 +1,97 @@ +@file:Suppress("ConstPropertyName") + +package org.kafka.navigation.graph + +import com.kafka.data.model.SearchFilter +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +@Serializable +sealed class RootScreen(val analyticsKey: String) { + @Serializable + data object Home : RootScreen("home_root") + + @Serializable + data object Search : RootScreen("search_root") + + @Serializable + data object Library : RootScreen("library_root") + + @Serializable + data object Profile : RootScreen("profile_root") +} + +@Serializable +sealed class Screen { + @Serializable + data object Profile : Screen() + + @Serializable + data object Library : Screen() + + @Serializable + data object Home : Screen() + + @Serializable + data object Login : Screen() + + @Serializable + data object Player : Screen() { + const val route = "player" + } + + @Serializable + data object Feedback : Screen() { + const val route = "feedback" + } + + @Serializable + data object RecentItems : Screen() + + @Serializable + data class ItemDetail(@SerialName("itemId") val itemId: String) : Screen() { + companion object { + const val route = "item/{itemId}" + fun route(itemId: String) = "item/$itemId" + } + } + + @Serializable + data class ItemDescription(@SerialName("itemId") val itemId: String) : Screen() { + companion object { + const val route = "item_description/{itemId}" + fun route(itemId: String) = "item_description/$itemId" + } + } + + @Serializable + data class Search( + @SerialName("keyword") val keyword: String = "", + @SerialName("filters") val filters: String = SearchFilter.allString(), + ) : Screen() + + @Serializable + data class Summary(@SerialName("itemId") val itemId: String) : Screen() + + @Serializable + data class Files(@SerialName("itemId") val itemId: String) : Screen() + + @Serializable + data class Reader(@SerialName("fileId") val fileId: String) : Screen() + + @Serializable + data class Web(@SerialName("url") val url: String) : Screen() + + @Serializable + data class OnlineReader(@SerialName("itemId") val itemId: String) : Screen() + + @Serializable + data object Back : Screen() +} + +fun String.encodeUrl(): String = URLEncoder.encode(this, StandardCharsets.UTF_8.toString()) + +val Any.navigationRoute + get() = this::class.qualifiedName?.removeSuffix(".Companion") diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index fab7a6137..7c49a06fc 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -30,8 +30,8 @@ import org.kafka.domain.observers.ObserveHomepage import org.kafka.domain.observers.ObserveShareAppIndex import org.kafka.domain.observers.ObserveUser import org.kafka.navigation.Navigator -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen import org.kafka.navigation.deeplink.Config import javax.inject.Inject @@ -95,7 +95,7 @@ class HomepageViewModel @Inject constructor( } fun openProfile() { - navigator.navigate(Screen.Profile.createRoute(navigator.currentRoot.value)) + navigator.navigate(Screen.Profile) } fun openRecommendationDetail(itemId: String) { @@ -104,43 +104,31 @@ class HomepageViewModel @Inject constructor( fun openItemDetail(itemId: String, source: String = "homepage") { analytics.log { openItemDetail(itemId, source) } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } fun openRecentItemDetail(itemId: String) { analytics.log { openRecentItem(itemId) } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } fun openSubject(name: String) { analytics.log { openSubject(name, "homepage") } - navigator.navigate( - Screen.Search.createRoute( - root = RootScreen.Search, - keyword = name, - filter = SearchFilter.Subject.name - ) - ) + navigator.navigate(Screen.Search(name, SearchFilter.Subject.name), RootScreen.Search) } fun openSearch() { - navigator.navigate(Screen.Search.createRoute(RootScreen.Search)) + navigator.navigate(Screen.Search(), RootScreen.Search) } fun openRecentItems() { analytics.log { this.openRecentItems() } - navigator.navigate(Screen.RecentItems.createRoute(RootScreen.Home)) + navigator.navigate(Screen.RecentItems) } fun openCreator(name: String) { analytics.log { this.openCreator("homepage") } - navigator.navigate( - Screen.Search.createRoute( - root = RootScreen.Home, - keyword = name, - filter = SearchFilter.Creator.name - ) - ) + navigator.navigate(Screen.Search(name, SearchFilter.Creator.name), RootScreen.Search) } fun shareApp(context: Context) { diff --git a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt index 6bdc81fbb..6bd0c41ab 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt @@ -15,7 +15,7 @@ import org.kafka.base.extensions.stateInDefault import org.kafka.domain.interactors.recent.RemoveAllRecentItems import org.kafka.domain.observers.ObserveRecentItems import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import javax.inject.Inject @HiltViewModel @@ -38,7 +38,7 @@ class RecentViewModel @Inject constructor( fun openItemDetail(itemId: String) { analytics.log { this.openItemDetail(itemId = itemId, source = "reading_list") } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } fun clearAllRecentItems() { diff --git a/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt b/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt index 8238e8cf6..e04c02ae3 100644 --- a/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt +++ b/ui/item/src/main/java/org/kafka/item/detail/ItemDetail.kt @@ -127,7 +127,7 @@ private fun ItemDetail( ItemDetail( state = state, relatedContent = viewModel.recommendedContent, - openDescription = viewModel::showDescription, + openDescription = viewModel::openItemDescription, goToCreator = viewModel::goToCreator, onPrimaryAction = { viewModel.onPrimaryAction(it) diff --git a/ui/item/src/main/java/org/kafka/item/detail/ItemDetailViewModel.kt b/ui/item/src/main/java/org/kafka/item/detail/ItemDetailViewModel.kt index 2752fd9c4..7b6d97dbd 100644 --- a/ui/item/src/main/java/org/kafka/item/detail/ItemDetailViewModel.kt +++ b/ui/item/src/main/java/org/kafka/item/detail/ItemDetailViewModel.kt @@ -52,15 +52,16 @@ import org.kafka.domain.observers.library.ObserveDownloadByItemId import org.kafka.domain.observers.library.ObserveFavoriteStatus import org.kafka.item.R import org.kafka.navigation.Navigator -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen -import org.kafka.navigation.Screen.ItemDescription -import org.kafka.navigation.Screen.OnlineReader -import org.kafka.navigation.Screen.Reader -import org.kafka.navigation.Screen.Search +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen +import org.kafka.navigation.graph.Screen.ItemDescription +import org.kafka.navigation.graph.Screen.OnlineReader +import org.kafka.navigation.graph.Screen.Reader +import org.kafka.navigation.graph.Screen.Search import org.kafka.navigation.deeplink.Config import org.kafka.navigation.deeplink.DeepLinksNavigation import org.kafka.navigation.deeplink.Navigation +import org.kafka.navigation.graph.encodeUrl import org.kafka.play.AppReviewManager import javax.inject.Inject @@ -88,9 +89,6 @@ class ItemDetailViewModel @Inject constructor( ) : ViewModel() { private val itemId: String = checkNotNull(savedStateHandle["itemId"]) private val loadingState = ObservableLoadingCounter() - private val currentRoot - get() = navigator.currentRoot.value - var recommendedContent by mutableStateOf(emptyList()) val state: StateFlow = combine( @@ -159,7 +157,7 @@ class ItemDetailViewModel @Inject constructor( fun openFiles(itemId: String) { analytics.log { this.openFiles(itemId) } - navigator.navigate(Screen.Files.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.Files(itemId)) } private fun openReader(itemId: String) { @@ -173,10 +171,10 @@ class ItemDetailViewModel @Inject constructor( if (isOnlineReaderEnabled || itemDetail.isAccessRestricted) { logOnlineReader(itemDetail = itemDetail) - navigator.navigate(OnlineReader.createRoute(currentRoot, itemDetail.itemId)) + navigator.navigate(OnlineReader(itemDetail.itemId)) } else { analytics.log { readItem(itemId = itemId, type = "offline") } - navigator.navigate(Reader.createRoute(currentRoot, itemDetail.primaryFile!!)) + navigator.navigate(Reader(itemDetail.primaryFile!!)) } } else { analytics.log { fileNotSupported(itemId = itemId) } @@ -218,21 +216,21 @@ class ItemDetailViewModel @Inject constructor( fun openItemDetail(itemId: String, source: String) { analytics.log { this.openItemDetail(itemId = itemId, source = source) } - navigator.navigate(Screen.ItemDetail.createRoute(currentRoot, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } fun goToSubjectSubject(keyword: String) { analytics.log { this.openSubject(keyword, "item_detail") } - navigator.navigate(Search.createRoute(RootScreen.Search, keyword, Subject.name)) + navigator.navigate(Search(keyword, Subject.name), RootScreen.Search) } fun goToCreator(keyword: String?) { analytics.log { this.openCreator("item_detail") } - navigator.navigate(Search.createRoute(RootScreen.Search, keyword, Creator.name)) + navigator.navigate(Search(keyword.orEmpty(), Creator.name), RootScreen.Search) } - fun showDescription(itemId: String) { - navigator.navigate(ItemDescription.createRoute(currentRoot, itemId)) + fun openItemDescription(itemId: String) { + navigator.navigate(ItemDescription(itemId)) } fun isShareEnabled() = remoteConfig.isShareEnabled() && state.value.itemDetail != null @@ -249,12 +247,12 @@ class ItemDetailViewModel @Inject constructor( fun openArchiveItem() { analytics.log { this.openArchiveItem(itemId) } - navigator.navigate(Screen.Web.createRoute(currentRoot, Config.archiveDetailUrl(itemId))) + navigator.navigate(Screen.Web(Config.archiveDetailUrl(itemId).encodeUrl())) } fun openSummary(itemId: String) { analytics.log { this.openSummary(itemId) } - navigator.navigate(Screen.Summary.createRoute(currentRoot, itemId)) + navigator.navigate(Screen.Summary(itemId)) } fun showAppRatingIfNeeded(context: Context) { diff --git a/ui/item/src/main/java/org/kafka/item/files/FilesViewModel.kt b/ui/item/src/main/java/org/kafka/item/files/FilesViewModel.kt index cf619bb20..11992e328 100644 --- a/ui/item/src/main/java/org/kafka/item/files/FilesViewModel.kt +++ b/ui/item/src/main/java/org/kafka/item/files/FilesViewModel.kt @@ -26,7 +26,7 @@ import org.kafka.domain.interactors.recent.AddRecentItem import org.kafka.domain.observers.ObserveFiles import org.kafka.domain.observers.library.ObserveDownloadedItems import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import tm.alashow.datmusic.downloader.Downloader import javax.inject.Inject @@ -76,9 +76,7 @@ class FilesViewModel @Inject constructor( if (file.isAudio()) { playbackConnection.playAudio(file.asAudio()) } else { - navigator.navigate( - Screen.Reader.createRoute(navigator.currentRoot.value, file.fileId) - ) + navigator.navigate(Screen.Reader(file.fileId)) } } diff --git a/ui/library/src/main/java/org/kafka/library/downloads/DownloadsViewModel.kt b/ui/library/src/main/java/org/kafka/library/downloads/DownloadsViewModel.kt index 7642ba1d2..cb986e6a6 100644 --- a/ui/library/src/main/java/org/kafka/library/downloads/DownloadsViewModel.kt +++ b/ui/library/src/main/java/org/kafka/library/downloads/DownloadsViewModel.kt @@ -14,7 +14,7 @@ import org.kafka.common.UiMessageManager import org.kafka.common.snackbar.UiMessage import org.kafka.domain.observers.library.ObserveDownloadedItems import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import tm.alashow.datmusic.downloader.Downloader import javax.inject.Inject @@ -49,7 +49,7 @@ class DownloadsViewModel @Inject constructor( fun openItemDetail(itemId: String) { analytics.log { this.openItemDetail(itemId = itemId, source = "downloads") } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } private fun requestNewDownloadLocation() { diff --git a/ui/library/src/main/java/org/kafka/library/favorites/FavoriteViewModel.kt b/ui/library/src/main/java/org/kafka/library/favorites/FavoriteViewModel.kt index 51a59abef..b37777c73 100644 --- a/ui/library/src/main/java/org/kafka/library/favorites/FavoriteViewModel.kt +++ b/ui/library/src/main/java/org/kafka/library/favorites/FavoriteViewModel.kt @@ -15,7 +15,7 @@ import org.kafka.base.extensions.stateInDefault import org.kafka.domain.observers.ObserveUser import org.kafka.domain.observers.library.ObserveFavorites import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import org.kafka.ui.components.item.LayoutType import javax.inject.Inject @@ -59,11 +59,11 @@ class FavoriteViewModel @Inject constructor( fun openItemDetail(itemId: String) { analytics.log { this.openItemDetail(itemId = itemId, source = "favorites") } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } fun goToLogin() { - navigator.navigate(Screen.Login.createRoute(navigator.currentRoot.value)) + navigator.navigate(Screen.Login) } } diff --git a/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileViewModel.kt b/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileViewModel.kt index 45482328e..610d950f6 100644 --- a/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileViewModel.kt +++ b/ui/profile/src/main/java/org/rekhta/ui/profile/ProfileViewModel.kt @@ -37,7 +37,7 @@ import org.kafka.common.snackbar.UiMessage import org.kafka.domain.interactors.account.LogoutUser import org.kafka.domain.observers.ObserveUser import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import org.kafka.profile.R import javax.inject.Inject @@ -121,16 +121,16 @@ class ProfileViewModel @Inject constructor( fun openFeedback() { navigator.goBack() - navigator.navigate(Screen.Feedback.createRoute(navigator.currentRoot.value)) + navigator.navigate(Screen.Feedback) } fun openLogin() { analytics.log { openLogin() } - navigator.navigate(Screen.Login.createRoute(navigator.currentRoot.value)) + navigator.navigate(Screen.Login) } fun openLibrary() { - navigator.navigate(Screen.Library.createRoute(navigator.currentRoot.value)) + navigator.navigate(Screen.Library) } private fun getVersionName(): String? { diff --git a/ui/search/src/main/java/com.kafka.search/SearchViewModel.kt b/ui/search/src/main/java/com.kafka.search/SearchViewModel.kt index d02b0620d..e7b3e6482 100644 --- a/ui/search/src/main/java/com.kafka.search/SearchViewModel.kt +++ b/ui/search/src/main/java/com.kafka.search/SearchViewModel.kt @@ -25,7 +25,7 @@ import org.kafka.domain.interactors.RemoveRecentSearch import org.kafka.domain.interactors.SearchQueryItems import org.kafka.domain.observers.ObserveRecentSearch import org.kafka.navigation.Navigator -import org.kafka.navigation.Screen +import org.kafka.navigation.graph.Screen import javax.inject.Inject @HiltViewModel @@ -163,7 +163,7 @@ class SearchViewModel @Inject constructor( fun openItemDetail(itemId: String) { analytics.log { this.openItemDetail(itemId, "search") } - navigator.navigate(Screen.ItemDetail.createRoute(navigator.currentRoot.value, itemId)) + navigator.navigate(Screen.ItemDetail(itemId)) } } diff --git a/ui/summary/src/main/java/org/kafka/summary/SummaryViewModel.kt b/ui/summary/src/main/java/org/kafka/summary/SummaryViewModel.kt index bd89b15fa..ae7d967b8 100644 --- a/ui/summary/src/main/java/org/kafka/summary/SummaryViewModel.kt +++ b/ui/summary/src/main/java/org/kafka/summary/SummaryViewModel.kt @@ -13,8 +13,8 @@ import org.kafka.base.extensions.stateInDefault import org.kafka.domain.observers.ObserveItemDetail import org.kafka.domain.observers.summary.ObserveSummary import org.kafka.navigation.Navigator -import org.kafka.navigation.RootScreen -import org.kafka.navigation.Screen.Search +import org.kafka.navigation.graph.RootScreen +import org.kafka.navigation.graph.Screen.Search import javax.inject.Inject @HiltViewModel @@ -45,7 +45,7 @@ class SummaryViewModel @Inject constructor( fun goToCreator(keyword: String?) { analytics.log { this.openCreator("summary") } - navigator.navigate(Search.createRoute(RootScreen.Search, keyword, Creator.name)) + navigator.navigate(Search(keyword.orEmpty(), Creator.name), RootScreen.Search) } } From 42979682cf591850de219ac07ff2c6103ef697eb Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sun, 25 Aug 2024 01:24:17 +0530 Subject: [PATCH 09/33] Minor refactoring to prepare converting favorites to lists --- .../java/com/kafka/data/entities/FavoriteItem.kt | 2 ++ .../com/kafka/data/feature/FavoritesRepository.kt | 12 +++++------- .../kafka/data/feature/firestore/FirestoreGraph.kt | 6 +++--- .../org/kafka/domain/interactors/UpdateFavorite.kt | 7 ++++++- .../domain/observers/library/ObserveFavorites.kt | 3 ++- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/data/database/src/main/java/com/kafka/data/entities/FavoriteItem.kt b/data/database/src/main/java/com/kafka/data/entities/FavoriteItem.kt index edc77eaeb..ed08369d9 100644 --- a/data/database/src/main/java/com/kafka/data/entities/FavoriteItem.kt +++ b/data/database/src/main/java/com/kafka/data/entities/FavoriteItem.kt @@ -22,3 +22,5 @@ fun FavoriteItem.toItem() = Item( mediaType = mediaType, coverImage = coverImage, ) + +const val listIdFavorites = "items" \ No newline at end of file diff --git a/data/repo/src/main/java/com/kafka/data/feature/FavoritesRepository.kt b/data/repo/src/main/java/com/kafka/data/feature/FavoritesRepository.kt index 083ccee99..313a500b5 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/FavoritesRepository.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/FavoritesRepository.kt @@ -16,18 +16,16 @@ class FavoritesRepository @Inject constructor( private val firestoreGraph: FirestoreGraph, private val accountRepository: AccountRepository, ) { - fun observeFavorites(uid: String) = firestoreGraph.getFavoritesCollection(uid) + fun observeList(uid: String, listId: String) = firestoreGraph.getListCollection(uid, listId) .orderBy("createdAt", Query.Direction.DESCENDING) .snapshots() - .map { snapshots -> - snapshots.map { it.toObject() } - } + .map { snapshots -> snapshots.map { it.toObject() } } - suspend fun updateFavorite(favoriteItem: FavoriteItem, isFavorite: Boolean) { + suspend fun updateList(favoriteItem: FavoriteItem, listId: String, isAdded: Boolean) { accountRepository.currentFirebaseUser?.uid - ?.let { firestoreGraph.getFavoritesCollection(it) } + ?.let { firestoreGraph.getListCollection(it, listId) } ?.run { - if (isFavorite) { + if (isAdded) { document(favoriteItem.itemId).set(favoriteItem) } else { document(favoriteItem.itemId).delete() diff --git a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt index 1b7452201..60c153134 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt @@ -31,10 +31,10 @@ class FirestoreGraph @Inject constructor( val summaryCollection: CollectionReference get() = firestoreKt.collection("summary") - fun getFavoritesCollection(id: String) = firestore + fun getListCollection(uid: String, listId: String) = firestore .collection("favorites") - .document(id) - .collection("items") + .document(uid) + .collection(listId) fun getDownloadsCollection(id: String) = firestore .collection("downloads") diff --git a/domain/src/main/java/org/kafka/domain/interactors/UpdateFavorite.kt b/domain/src/main/java/org/kafka/domain/interactors/UpdateFavorite.kt index 983b021ef..9614be93b 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/UpdateFavorite.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/UpdateFavorite.kt @@ -3,6 +3,7 @@ package org.kafka.domain.interactors import com.kafka.data.dao.ItemDetailDao import com.kafka.data.entities.FavoriteItem import com.kafka.data.entities.ItemDetail +import com.kafka.data.entities.listIdFavorites import com.kafka.data.feature.FavoritesRepository import com.kafka.data.feature.auth.AccountRepository import kotlinx.coroutines.withContext @@ -37,7 +38,11 @@ class UpdateFavorite @Inject constructor( } val itemDetail = itemDetailDao.get(params.itemId) - favoritesRepository.updateFavorite(mapFavoriteItem(itemDetail), params.markFavorite) + favoritesRepository.updateList( + favoriteItem = mapFavoriteItem(itemDetail), + listId = listIdFavorites, + isAdded = params.markFavorite + ) debug { "Favorite updated: ${params.itemId} isFavorite: ${params.markFavorite}" } withContext(dispatchers.io) { diff --git a/domain/src/main/java/org/kafka/domain/observers/library/ObserveFavorites.kt b/domain/src/main/java/org/kafka/domain/observers/library/ObserveFavorites.kt index dc69832c3..cbb21d0f8 100644 --- a/domain/src/main/java/org/kafka/domain/observers/library/ObserveFavorites.kt +++ b/domain/src/main/java/org/kafka/domain/observers/library/ObserveFavorites.kt @@ -1,6 +1,7 @@ package org.kafka.domain.observers.library import com.kafka.data.entities.Item +import com.kafka.data.entities.listIdFavorites import com.kafka.data.entities.toItem import com.kafka.data.feature.FavoritesRepository import com.kafka.data.feature.auth.AccountRepository @@ -23,7 +24,7 @@ class ObserveFavorites @Inject constructor( return accountRepository.observeCurrentFirebaseUser() .flatMapLatest { user -> user?.let { - favoritesRepository.observeFavorites(user.uid) + favoritesRepository.observeList(user.uid, listIdFavorites) } ?: flowOf(emptyList()) } .map { favorites -> favorites.map { it.toItem() } } From be480f7a2d29aa5f0e658a52d874d2678d752f75 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sun, 25 Aug 2024 01:35:00 +0530 Subject: [PATCH 10/33] Removed unused fields from responses --- .../kotlin/com/kafka/data/model/item/Doc.kt | 4 ---- .../kotlin/com/kafka/data/model/item/File.kt | 2 -- .../kafka/data/model/item/ItemDetailResponse.kt | 12 +----------- .../kotlin/com/kafka/data/model/item/Metadata.kt | 7 ------- .../com/kafka/data/model/item/ResponseHeader.kt | 14 -------------- .../com/kafka/data/model/item/SearchResponse.kt | 2 -- 6 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 data/models/src/commonMain/kotlin/com/kafka/data/model/item/ResponseHeader.kt diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Doc.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Doc.kt index 308d0341d..dfe620316 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Doc.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Doc.kt @@ -25,8 +25,6 @@ data class Doc( val format: List? = null, @SerialName("identifier") val identifier: String, - @SerialName("item_size") - val itemSize: Long, @SerialName("language") @Serializable(with = StringListSerializer::class) val language: List? = null, @@ -38,8 +36,6 @@ data class Doc( @SerialName("title") @Serializable(with = StringListSerializer::class) val title: List, - @SerialName("week") - val week: Int? = 0, @SerialName("avg_rating") val rating: Double? = null, ) diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/File.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/File.kt index e46bc3b60..1b7043d19 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/File.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/File.kt @@ -26,8 +26,6 @@ data class File( val size: List? = null, @SerialName("title") val title: String? = null, - @SerialName("source") - val source: String? = null, ) { // todo: improve file ids to make them unique // this will require a migration to new file ids which might be a breaking change diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ItemDetailResponse.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ItemDetailResponse.kt index 96c60f626..41c690d24 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ItemDetailResponse.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ItemDetailResponse.kt @@ -5,24 +5,14 @@ import kotlinx.serialization.Serializable @Serializable data class ItemDetailResponse( - @SerialName("created") - val created: Int, - @SerialName("d1") - val d1: String, @SerialName("dir") val dir: String, @SerialName("files") val files: List, @SerialName("files_count") - val filesCount: Int, - @SerialName("item_size") - val itemSize: Long = 0L, + val filesCount: Int = 0, @SerialName("metadata") val metadata: Metadata, @SerialName("server") val server: String = "", - @SerialName("uniq") - val uniq: Int = 0, - @SerialName("workable_servers") - val workableServers: List = emptyList(), ) diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Metadata.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Metadata.kt index a65580caf..de4a6a4ad 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Metadata.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/Metadata.kt @@ -6,17 +6,12 @@ import kotlinx.serialization.Serializable @Serializable data class Metadata( - @SerialName("addeddate") - val addeddate: String? = null, @SerialName("creator") @Serializable(with = StringListSerializer::class) val creator: List? = null, @SerialName("collection") @Serializable(with = StringListSerializer::class) val collection: List? = null, - @SerialName("date") - @Serializable(with = StringListSerializer::class) - val date: List? = null, @SerialName("description") @Serializable(with = StringListSerializer::class) val description: List? = null, @@ -27,8 +22,6 @@ data class Metadata( val identifier: String, @SerialName("mediatype") val mediatype: String? = null, - @SerialName("runtime") - val runtime: String? = null, @SerialName("title") @Serializable(with = StringListSerializer::class) val title: List? = null, diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ResponseHeader.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ResponseHeader.kt deleted file mode 100644 index 52727503f..000000000 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/ResponseHeader.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.kafka.data.model.item - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ResponseHeader( - @SerialName("QTime") - val qTime: Int, - @SerialName("params") - val params: Params, - @SerialName("status") - val status: Int, -) diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/SearchResponse.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/SearchResponse.kt index 8113245cb..15edf0bc6 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/item/SearchResponse.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/item/SearchResponse.kt @@ -7,6 +7,4 @@ import kotlinx.serialization.Serializable data class SearchResponse( @SerialName("response") val response: Response? = null, - @SerialName("responseHeader") - val responseHeader: ResponseHeader? = null, ) From 66283eb5d01ffd0b837c65352ea8dd2c11bace00 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Mon, 26 Aug 2024 13:56:26 +0530 Subject: [PATCH 11/33] cleanup --- .../main/java/org/kafka/homepage/components/Carousels.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt index 690a7beaf..d7817e393 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt @@ -2,8 +2,6 @@ package org.kafka.homepage.components import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.carousel.HorizontalMultiBrowseCarousel import androidx.compose.material3.carousel.rememberCarouselState @@ -11,18 +9,16 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.kafka.data.entities.Item -import kotlinx.collections.immutable.ImmutableList import org.kafka.ui.components.item.FeaturedItem import ui.common.theme.theme.Dimens @Composable internal fun Carousels( - carouselItems: ImmutableList, + carouselItems: List, images: List, onBannerClick: (String) -> Unit, modifier: Modifier = Modifier, showLabel: Boolean = true, - lazyListState: LazyListState = rememberLazyListState(), ) { val state = rememberCarouselState { carouselItems.size } HorizontalMultiBrowseCarousel( From 9ee56734b90bbfcf2d01f5096b697e9bc010f836 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Mon, 26 Aug 2024 22:59:56 +0530 Subject: [PATCH 12/33] Fix bug where progress bar would show indefinitely on online reader --- .../java/com/kafka/reader/online/OnlineReader.kt | 12 ++++++------ .../com/kafka/reader/online/OnlineReaderViewModel.kt | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/ui/reader/src/main/java/com/kafka/reader/online/OnlineReader.kt b/ui/reader/src/main/java/com/kafka/reader/online/OnlineReader.kt index ed57ce4f4..35f48076b 100644 --- a/ui/reader/src/main/java/com/kafka/reader/online/OnlineReader.kt +++ b/ui/reader/src/main/java/com/kafka/reader/online/OnlineReader.kt @@ -14,12 +14,14 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.google.accompanist.web.WebContent import com.google.accompanist.web.WebViewState import com.kafka.data.feature.item.DownloadInfo import com.kafka.data.feature.item.DownloadStatus @@ -32,8 +34,6 @@ import org.kafka.ui.components.file.DownloadStatusIcons import org.kafka.ui.components.material.CloseButton import org.kafka.ui.components.material.TopBar import org.kafka.ui.components.topScaffoldPadding -import tm.alashow.datmusic.downloader.Downloader -import tm.alashow.datmusic.ui.downloader.LocalDownloader import com.google.accompanist.web.WebView as AccompanistWebView @SuppressLint("SetJavaScriptEnabled") @@ -44,8 +44,11 @@ fun OnlineReader( ) { val context = LocalContext.current val state by viewModel.state.collectAsStateWithLifecycle() - val webViewState by viewModel.webViewState.collectAsStateWithLifecycle() val fileId = state.readerState?.fileId.orEmpty() + val readerState by viewModel.readerState.collectAsStateWithLifecycle() + val webViewState by remember(readerState?.url) { + mutableStateOf(readerState?.url?.let { WebViewState(WebContent.Url(url = it)) }) + } Scaffold( topBar = { @@ -116,7 +119,6 @@ private fun TopBar( if (fileId != null) { DownloadIcon( - fileId = fileId, downloadInfo = download?.downloadInfo, onDownloadClicked = downloadItem, openOfflineReader = openOfflineReader @@ -133,9 +135,7 @@ private fun TopBar( @Composable fun DownloadIcon( - fileId: String, downloadInfo: DownloadInfo?, - downloader: Downloader = LocalDownloader.current, onDownloadClicked: () -> Unit, openOfflineReader: () -> Unit, ) { diff --git a/ui/reader/src/main/java/com/kafka/reader/online/OnlineReaderViewModel.kt b/ui/reader/src/main/java/com/kafka/reader/online/OnlineReaderViewModel.kt index e3497da32..ce1ca70ee 100644 --- a/ui/reader/src/main/java/com/kafka/reader/online/OnlineReaderViewModel.kt +++ b/ui/reader/src/main/java/com/kafka/reader/online/OnlineReaderViewModel.kt @@ -49,13 +49,9 @@ class OnlineReaderViewModel @Inject constructor( savedStateHandle: SavedStateHandle, ) : ViewModel() { private val itemId: String = savedStateHandle["itemId"] ?: error("Url not provided") - private val readerState = MutableStateFlow(null) + val readerState = MutableStateFlow(null) private val urlState = MutableStateFlow("") - val webViewState = readerState.map { state -> - state?.url?.let { WebViewState(WebContent.Url(url = it)) } - }.stateInDefault(viewModelScope, null) - val state: StateFlow = combine( urlState, readerState, From 22691a35d6218bf18da448165ce94dad39ea0d6c Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Wed, 28 Aug 2024 15:41:23 +0530 Subject: [PATCH 13/33] respectCacheHeaders = false in coil --- .../src/main/java/org/kafka/common/image/CoilAppInitializer.kt | 2 ++ .../src/main/java/org/kafka/homepage/HomepageViewModel.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt b/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt index a8fe9c327..e8525222c 100644 --- a/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt +++ b/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt @@ -16,12 +16,14 @@ class CoilAppInitializer @Inject constructor( private val dispatchers: CoroutineDispatchers, private val okHttpClient: OkHttpClient, ) : AppInitializer { + override fun init() { Coil.setImageLoader { ImageLoader.Builder(context) .okHttpClient(okHttpClient) .dispatcher(dispatchers.io) .fetcherDispatcher(dispatchers.io) + .respectCacheHeaders(false) .diskCache( DiskCache.Builder().directory(File(context.cacheDir, "images_cache")).build() ) diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index 7c49a06fc..5967da221 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -30,9 +30,9 @@ import org.kafka.domain.observers.ObserveHomepage import org.kafka.domain.observers.ObserveShareAppIndex import org.kafka.domain.observers.ObserveUser import org.kafka.navigation.Navigator +import org.kafka.navigation.deeplink.Config import org.kafka.navigation.graph.RootScreen import org.kafka.navigation.graph.Screen -import org.kafka.navigation.deeplink.Config import javax.inject.Inject @HiltViewModel From fae3122fb5b384f190a47c7b6609c5cfc1414c0d Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Wed, 28 Aug 2024 16:49:27 +0530 Subject: [PATCH 14/33] Firebase CLI --- firebase.json | 22 ++++++++- firestore.indexes.json | 4 ++ firestore.rules | 110 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 firestore.indexes.json create mode 100644 firestore.rules diff --git a/firebase.json b/firebase.json index f5ce7e9c1..1896840e2 100644 --- a/firebase.json +++ b/firebase.json @@ -15,5 +15,25 @@ "destination": "/index.html" } ] - } + }, + "firestore": { + "rules": "firestore.rules", + "indexes": "firestore.indexes.json" + }, + "functions": [ + { + "source": "functions", + "codebase": "default", + "ignore": [ + "node_modules", + ".git", + "firebase-debug.log", + "firebase-debug.*.log", + "*.local" + ], + "predeploy": [ + "npm --prefix \"$RESOURCE_DIR\" run lint" + ] + } + ] } diff --git a/firestore.indexes.json b/firestore.indexes.json new file mode 100644 index 000000000..415027e5d --- /dev/null +++ b/firestore.indexes.json @@ -0,0 +1,4 @@ +{ + "indexes": [], + "fieldOverrides": [] +} diff --git a/firestore.rules b/firestore.rules new file mode 100644 index 000000000..aa7379a13 --- /dev/null +++ b/firestore.rules @@ -0,0 +1,110 @@ +rules_version = '2'; + +service cloud.firestore { + match /databases/{database}/documents { + // --------------------------------------------------------- + // Rowy rules start + // --------------------------------------------------------- + // Automatically generated and managed by Rowy + // ⚠️ Do not edit this block directly, as it will be overwritten + // To edit the security rules, please do it on different block or manage from rowy settings + // initialized on 5/25/2023 + match /{collectionId}/{docId} { + allow read: if colRule(["homepage-collection"], ["ADMIN","EDITOR","VIEWER","OWNER"]); + allow create, update, delete: if colRule(["homepage-collection"], ["ADMIN","OWNER"]); + + match /{subTableCollectionID}/{document=**}{ + allow read: if colRule(["homepage-collection"], ["ADMIN","EDITOR","VIEWER","OWNER"]); + allow create, update, delete: if colRule(["homepage-collection"], ["ADMIN","OWNER"]); + + } + function colRule(collections, roles){ + return collectionId in collections && hasAnyRole(roles); + } + + } + match /{somePath=**}/{collectionGroupId}/{docId}{ + allow read, create, update, delete: if colRule(["recent_items","homepage/collection/items"], ["ADMIN","OWNER"]); + + function colRule(collections, roles){ + return collectionGroupId in collections && hasAnyRole(roles); + } + + } + + // --------------------------------------------------------- + // Rowy rules end + // --------------------------------------------------------- + // Allow admins to read and write all documents + match /{document=**} { + allow read, write: if hasAnyRole(["ADMIN", "OWNER"]); + } + + // Rowy: Allow signed in users to read Rowy configuration and admins to write + match /_rowy_/{docId} { + allow read: if request.auth.token.roles.size() > 0; + allow write: if hasAnyRole(["ADMIN", "OWNER"]); + match /{document=**} { + allow read: if request.auth.token.roles.size() > 0; + allow write: if hasAnyRole(["ADMIN", "OWNER"]); + } + match /schema/{tableId} { + allow update: if canModify(tableId,'pc') + match /{document=**} {allow read,write: if canModify(tableId,'pc')} + } + match /groupSchema/{tableId} { + allow update: if canModify(tableId,'cg') + match /{document=**} {allow read,write: if canModify(tableId,'cg')} + } + function canModify(tableId,tableType) { + return hasAnyRole(get(/databases/$(database)/documents/_rowy_/settings) + .data.tablesSettings[tableType][tableId].modifiableBy) + } +} +// Rowy: Allow users to edit their settings +match /_rowy_/userManagement/users/{userId} { + allow get, update, delete: if isDocOwner(userId); + allow create: if request.auth.token.roles.size() > 0; +} +// Rowy: Allow public to read public Rowy configuration +match /_rowy_/publicSettings { + allow get: if true; +} + +// Rowy: Utility functions +function isDocOwner(docId) { + return request.auth != null && (request.auth.uid == resource.id || request.auth.uid == docId); +} +function hasAnyRole(roles) { + return request.auth != null && request.auth.token.roles.hasAny(roles); +} + +match /homepage/ids { + allow read: if true; +} + +match /homepage-collection/{document=**} { + allow read, write: if true; +} + +match /homepage-collection-debug/{document=**} { + allow read, write: if true; +} + +match /downloads/{document=**} { + allow read, write: if true; +} + +match /homepage/{document=**} { + allow read, write: if true; +} + +match /feedback/{document=**} { + allow read, write: if true; +} + +match /{document=**} { + allow read, write: if request.auth != null; +} +} +} \ No newline at end of file From 379f6b1e6f73f9ebc2640a9b9dc3620304b33f18 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Wed, 28 Aug 2024 17:59:56 +0530 Subject: [PATCH 15/33] Optimize fetching ids in too many calls on homepage --- .../kafka/domain/interactors/UpdateHomepage.kt | 17 +++++++++++++---- .../main/java/org/kafka/homepage/Homepage.kt | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt index bb1b7ed8e..e22712b6c 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt @@ -22,11 +22,20 @@ class UpdateHomepage @Inject constructor( override suspend fun doWork(params: Unit) { withContext(dispatchers.io) { - homepageRepository.getHomepageIds().mapAsync { ids -> - val unFetchedIds = ids.filter { !itemRepository.exists(it) } + val unFetchedIds = homepageRepository.getHomepageIds().map { ids -> + ids.filter { !itemRepository.exists(it) } + } + + // If there are less than 50 un-fetched IDs, we make a single request + val formattedIds = if (unFetchedIds.sumOf { it.size } <= 50) { + listOf(unFetchedIds.flatten()) + } else { + unFetchedIds + } - if (unFetchedIds.isNotEmpty()) { - val query = ArchiveQuery().booksByIdentifiers(unFetchedIds) + formattedIds.mapAsync { ids -> + if (ids.isNotEmpty()) { + val query = ArchiveQuery().booksByIdentifiers(ids) val items = itemRepository.updateQuery(buildRemoteQuery(query)) itemRepository.saveItems(items) } diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index 023117d0d..03a5fc9f5 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -255,7 +255,7 @@ private fun RowItems( modifier = modifier, contentPadding = PaddingValues( horizontal = Dimens.Gutter, - vertical = Dimens.Spacing16 + vertical = Dimens.Spacing12 ), horizontalArrangement = Arrangement.spacedBy(Dimens.Spacing12) ) { From 7008d48240644c995c0593571f47847629c73b18 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Wed, 28 Aug 2024 18:45:00 +0530 Subject: [PATCH 16/33] Improve rating visibility --- .../detail/description/DescriptionDialog.kt | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/ui/item/src/main/java/org/kafka/item/detail/description/DescriptionDialog.kt b/ui/item/src/main/java/org/kafka/item/detail/description/DescriptionDialog.kt index 5023863c8..3e5019e5a 100644 --- a/ui/item/src/main/java/org/kafka/item/detail/description/DescriptionDialog.kt +++ b/ui/item/src/main/java/org/kafka/item/detail/description/DescriptionDialog.kt @@ -21,8 +21,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.text.withStyle import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kafka.data.entities.ItemDetail @@ -79,7 +81,7 @@ internal fun DescriptionText( modifier: Modifier = Modifier, style: TextStyle = MaterialTheme.typography.bodyMedium, maxLines: Int = Int.MAX_VALUE, - overflow: TextOverflow = TextOverflow.Clip + overflow: TextOverflow = TextOverflow.Clip, ) { SelectionContainer { Text( @@ -94,16 +96,32 @@ internal fun DescriptionText( } @Composable -private fun ratingText(rating: Int): AnnotatedString { +private fun ratingText(uiRating: Int): AnnotatedString { return AnnotatedString.Builder().apply { - repeat(rating) { + repeat(uiRating) { append("✪") } - repeat(MaxRating - rating) { + repeat(MaxRating - uiRating) { append("✪") } - addStyle(SpanStyle(color = MaterialTheme.colorScheme.primary), 0, rating) + addStyle( + style = SpanStyle(color = MaterialTheme.colorScheme.primary), + start = 0, + end = uiRating + ) + addStyle( + style = SpanStyle(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f)), + start = uiRating, + end = MaxRating + ) + + if (uiRating != 0) { + withStyle(style = SpanStyle(fontWeight = FontWeight.SemiBold)) { + append(" $uiRating/$MaxRating ") + } + } + append(" ") }.toAnnotatedString() } From 2cb1b0494337462c05391b71476a6356ad07924c Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 30 Aug 2024 17:21:17 +0530 Subject: [PATCH 17/33] Fix log writers; respectCacheHeaders from coil; --- .../main/java/com/kafka/user/initializer/Initializers.kt | 7 ++++++- app/src/main/java/com/kafka/user/injection/AppModule.kt | 4 ++-- .../main/java/org/kafka/common/image/CoilAppInitializer.kt | 1 - 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/kafka/user/initializer/Initializers.kt b/app/src/main/java/com/kafka/user/initializer/Initializers.kt index 6a9bf8f27..fb92b7d20 100644 --- a/app/src/main/java/com/kafka/user/initializer/Initializers.kt +++ b/app/src/main/java/com/kafka/user/initializer/Initializers.kt @@ -2,6 +2,7 @@ package com.kafka.user.initializer import android.content.Context import co.touchlab.kermit.ExperimentalKermitApi +import co.touchlab.kermit.LogcatWriter import co.touchlab.kermit.Logger import co.touchlab.kermit.Severity import co.touchlab.kermit.crashlytics.CrashlyticsLogWriter @@ -21,7 +22,11 @@ import javax.inject.Inject @OptIn(ExperimentalKermitApi::class) class LoggerInitializer @Inject constructor() : AppInitializer { override fun init() { - Logger.setLogWriters(CrashlyticsLogWriter(minCrashSeverity = Severity.Error)) + val logWriters = listOf( + LogcatWriter(), + CrashlyticsLogWriter(minCrashSeverity = Severity.Error) + ) + Logger.setLogWriters(logWriters) } } diff --git a/app/src/main/java/com/kafka/user/injection/AppModule.kt b/app/src/main/java/com/kafka/user/injection/AppModule.kt index afc633ef4..f8397cb16 100644 --- a/app/src/main/java/com/kafka/user/injection/AppModule.kt +++ b/app/src/main/java/com/kafka/user/injection/AppModule.kt @@ -68,8 +68,8 @@ class AppModule { @ApplicationContext context: Context, ): PreferencesStore = PreferencesStore( PreferenceDataStoreFactory.create( - produceFile = { context.preferencesDataStoreFile(dataStoreFileName) } - )) + produceFile = { context.preferencesDataStoreFile(dataStoreFileName) } + )) @Singleton @Provides diff --git a/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt b/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt index e8525222c..6f24bd813 100644 --- a/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt +++ b/ui/common/src/main/java/org/kafka/common/image/CoilAppInitializer.kt @@ -23,7 +23,6 @@ class CoilAppInitializer @Inject constructor( .okHttpClient(okHttpClient) .dispatcher(dispatchers.io) .fetcherDispatcher(dispatchers.io) - .respectCacheHeaders(false) .diskCache( DiskCache.Builder().directory(File(context.cacheDir, "images_cache")).build() ) From 13a5cfb0c986d8052107abf9d57c4b0e1f0df1be Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 30 Aug 2024 17:29:38 +0530 Subject: [PATCH 18/33] Revert Carousel - Material3 Carousel has UI issues with recompositions; --- .../kafka/homepage/components/Carousels.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt index d7817e393..eff204fd2 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/components/Carousels.kt @@ -1,11 +1,15 @@ package org.kafka.homepage.components +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.carousel.HorizontalMultiBrowseCarousel import androidx.compose.material3.carousel.rememberCarouselState import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.kafka.data.entities.Item @@ -19,6 +23,38 @@ internal fun Carousels( onBannerClick: (String) -> Unit, modifier: Modifier = Modifier, showLabel: Boolean = true, +) { + val state = rememberPagerState { carouselItems.size } + + Column( + modifier = modifier.padding(top = Dimens.Spacing12), + horizontalAlignment = Alignment.End + ) { + HorizontalPager( + state = state, + modifier = Modifier.padding(Dimens.Spacing02), + contentPadding = PaddingValues(horizontal = Dimens.Spacing24), + pageSpacing = Dimens.Spacing04, + ) { index -> + carouselItems.getOrNull(index)?.let { item -> + FeaturedItem( + item = item, + label = item.title.takeIf { showLabel }, + imageUrl = images.getOrNull(index), + onClick = { onBannerClick(item.itemId) } + ) + } + } + } +} + +@Composable +internal fun CarouselsMaterial3( + carouselItems: List, + images: List, + onBannerClick: (String) -> Unit, + modifier: Modifier = Modifier, + showLabel: Boolean = true, ) { val state = rememberCarouselState { carouselItems.size } HorizontalMultiBrowseCarousel( From 0acd1fa0bcfd85d988615de3eb5fad271b3fa7ab Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 30 Aug 2024 18:00:56 +0530 Subject: [PATCH 19/33] Minor Ui adjustments --- app/build.gradle.kts | 4 ++-- .../kafka/domain/observers/ObserveHomepage.kt | 4 ++-- .../main/java/org/kafka/homepage/Homepage.kt | 23 ++++++++++++------- .../org/kafka/homepage/HomepageViewModel.kt | 4 ++-- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e6244d596..fba056c1f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,8 @@ android { defaultConfig { applicationId = "com.kafka.user" - versionCode = 76 - versionName = "0.36.0" + versionCode = 78 + versionName = "0.38.0" val properties = Properties() properties.load(project.rootProject.file("local.properties").inputStream()) diff --git a/domain/src/main/java/org/kafka/domain/observers/ObserveHomepage.kt b/domain/src/main/java/org/kafka/domain/observers/ObserveHomepage.kt index a0707b729..65554b224 100644 --- a/domain/src/main/java/org/kafka/domain/observers/ObserveHomepage.kt +++ b/domain/src/main/java/org/kafka/domain/observers/ObserveHomepage.kt @@ -22,10 +22,10 @@ class ObserveHomepage @Inject constructor( observeRecentItems.execute(Unit), homepageRepository.observeHomepageCollection(), ) { recentItems, collection -> - val collectionWithRecentItems = collection.mapNotNull { + val collectionWithRecentItems = collection.map { when (it) { is HomepageCollection.RecentItems -> { - if (recentItems.isEmpty()) null else it.copy(items = recentItems) + it.copy(items = recentItems) } else -> it diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index 03a5fc9f5..7730a3d07 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -158,13 +159,19 @@ private fun HomepageFeedItems( when (collection) { is HomepageCollection.RecentItems -> { item(key = "recent", contentType = "recent") { - ContinueReading( - readingList = homepage.continueReadingItems, - openItemDetail = openRecentItemDetail, - removeRecentItem = removeRecentItem, - modifier = Modifier.padding(top = Dimens.Gutter), - openRecentItems = openRecentItems - ) + if (homepage.continueReadingItems.size > 0) { + ContinueReading( + readingList = homepage.continueReadingItems, + openItemDetail = openRecentItemDetail, + removeRecentItem = removeRecentItem, + modifier = Modifier.padding(top = Dimens.Gutter), + openRecentItems = openRecentItems + ) + } else { + Spacer(modifier = Modifier + .fillMaxWidth() + .height(Dimens.Spacing12)) + } } } @@ -255,7 +262,7 @@ private fun RowItems( modifier = modifier, contentPadding = PaddingValues( horizontal = Dimens.Gutter, - vertical = Dimens.Spacing12 + vertical = Dimens.Spacing08 ), horizontalArrangement = Arrangement.spacedBy(Dimens.Spacing12) ) { diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index 5967da221..2f6fcf796 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -50,8 +50,8 @@ class HomepageViewModel @Inject constructor( ) : ViewModel() { private val uiMessageManager = UiMessageManager() var recommendedContent by mutableStateOf(emptyList()) - val recommendationRowIndex = remoteConfig.recommendationRowIndex() - val showCarouselLabels = remoteConfig.showFeaturedItemLabels() + val recommendationRowIndex by lazy { remoteConfig.recommendationRowIndex() } + val showCarouselLabels by lazy { remoteConfig.showFeaturedItemLabels() } val state: StateFlow = combine( observeHomepage.flow, From 5918af72b23fc1d398e0fb002d3df1f254f4f90a Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 16:53:09 +0530 Subject: [PATCH 20/33] Trending recommendations --- .gitignore | 2 + functions/.eslintrc.js | 28 + functions/.gitignore | 2 + functions/index.js | 73 + functions/package-lock.json | 7175 ++++++++++++++++++++++++++ functions/package.json | 28 + functions/recommendation/trending.js | 45 + functions/utils/bigQueryUtils.js | 42 + 8 files changed, 7395 insertions(+) create mode 100644 functions/.eslintrc.js create mode 100644 functions/.gitignore create mode 100644 functions/index.js create mode 100644 functions/package-lock.json create mode 100644 functions/package.json create mode 100644 functions/recommendation/trending.js create mode 100644 functions/utils/bigQueryUtils.js diff --git a/.gitignore b/.gitignore index 6114060d2..7e5e1b113 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,5 @@ fastlane/readme.md /.idea/misc.xml /Sarahang/ + +/node_modules/ diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js new file mode 100644 index 000000000..f4cb76caa --- /dev/null +++ b/functions/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + env: { + es6: true, + node: true, + }, + parserOptions: { + "ecmaVersion": 2018, + }, + extends: [ + "eslint:recommended", + "google", + ], + rules: { + "no-restricted-globals": ["error", "name", "length"], + "prefer-arrow-callback": "error", + "quotes": ["error", "double", {"allowTemplateLiterals": true}], + }, + overrides: [ + { + files: ["**/*.spec.*"], + env: { + mocha: true, + }, + rules: {}, + }, + ], + globals: {}, +}; diff --git a/functions/.gitignore b/functions/.gitignore new file mode 100644 index 000000000..21ee8d3d1 --- /dev/null +++ b/functions/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +*.local \ No newline at end of file diff --git a/functions/index.js b/functions/index.js new file mode 100644 index 000000000..b76ff388b --- /dev/null +++ b/functions/index.js @@ -0,0 +1,73 @@ +const { logger } = require("firebase-functions"); +const { onRequest } = require("firebase-functions/v2/https"); + +// The Firebase Admin SDK to access Firestore. +const { initializeApp } = require("firebase-admin/app"); + +initializeApp(); + + +const functions = require('firebase-functions'); +const { + calculateTopReadWeekly, + calculateTopPlayedWeekly, + calculateTopReadMonthly, + calculateTopPlayedMonthly, + calculateTopFavoritedWeekly +} = require('./recommendation/trending'); + +// Weekly scheduled function +exports.weeklyUpdateTopItems = functions.pubsub.schedule('every monday 00:00').timeZone('UTC').onRun(async (context) => { + try { + await Promise.all([ + calculateTopReadWeekly(), + calculateTopPlayedWeekly(), + calculateTopFavoritedWeekly() + ]); + console.log('Weekly top items update completed successfully'); + } catch (error) { + console.error('Error in weekly top items update:', error); + } +}); + +// Monthly scheduled function +exports.monthlyUpdateTopItems = functions.pubsub.schedule('1 of month 00:00').timeZone('UTC').onRun(async (context) => { + try { + await Promise.all([ + calculateTopReadMonthly(), + calculateTopPlayedMonthly() + ]); + console.log('Monthly top items update completed successfully'); + } catch (error) { + console.error('Error in monthly top items update:', error); + } +}); + +// http://127.0.0.1:5001/kafka-books/us-central1/manualUpdateTopItems?type=weekly +exports.manualUpdateTopItems = onRequest(async (req, res) => { + const { type } = req.query; + + try { + switch(type) { + case 'weekly': + await Promise.all([ + calculateTopReadWeekly(), + calculateTopPlayedWeekly(), + calculateTopFavoritedWeekly() + ]); + break; + case 'monthly': + await Promise.all([ + calculateTopReadMonthly(), + calculateTopPlayedMonthly() + ]); + break; + default: + throw new Error('Invalid update type specified'); + } + res.json({ result: `${type} top items update completed successfully` }); + } catch (error) { + console.error(`Error in manual ${type} top items update:`, error); + res.status(500).json({ error: `An error occurred during ${type} top items update` }); + } +}); diff --git a/functions/package-lock.json b/functions/package-lock.json new file mode 100644 index 000000000..ad3598cad --- /dev/null +++ b/functions/package-lock.json @@ -0,0 +1,7175 @@ +{ + "name": "functions", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "functions", + "dependencies": { + "@google-cloud/bigquery": "^7.9.0", + "@google-cloud/storage": "^7.12.1", + "firebase-admin": "^12.1.0", + "firebase-functions": "^5.1.1" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0", + "firebase-functions-test": "^3.1.0" + }, + "engines": { + "node": "22" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.4", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.0.0.tgz", + "integrity": "sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==", + "license": "MIT" + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-types": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/component": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.8.tgz", + "integrity": "sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.9.7", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.7.tgz", + "integrity": "sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.8", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.7", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.7.tgz", + "integrity": "sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.8", + "@firebase/database": "1.0.7", + "@firebase/database-types": "1.0.4", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.7", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.4.tgz", + "integrity": "sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.9.7" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.7.tgz", + "integrity": "sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@google-cloud/bigquery": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz", + "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/common": "^5.0.0", + "@google-cloud/paginator": "^5.0.2", + "@google-cloud/precise-date": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "arrify": "^2.0.1", + "big.js": "^6.0.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "is": "^3.3.0", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/bigquery/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/common": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", + "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "extend": "^3.0.2", + "google-auth-library": "^9.0.0", + "html-entities": "^2.5.2", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.9.0.tgz", + "integrity": "sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", + "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", + "license": "Apache-2.0", + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/precise-date": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", + "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.12.1.tgz", + "integrity": "sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "duplexify": "^4.1.3", + "fast-xml-parser": "^4.4.1", + "gaxios": "^6.0.2", + "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", + "mime": "^3.0.0", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", + "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", + "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "license": "MIT", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz", + "integrity": "sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/farmhash-modern": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", + "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firebase-admin": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.4.0.tgz", + "integrity": "sha512-3HOHqJxNmFv0JgK3voyMQgmcibhJN4LQfZfhnZGb6pcONnZxejki4nQ1twsoJlGaIvgQWBtO7rc5mh/cqlOJNA==", + "license": "Apache-2.0", + "dependencies": { + "@fastify/busboy": "^3.0.0", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^22.0.1", + "farmhash-modern": "^1.1.0", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.1.0", + "node-forge": "^1.3.1", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.7.0", + "@google-cloud/storage": "^7.7.0" + } + }, + "node_modules/firebase-functions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-5.1.1.tgz", + "integrity": "sha512-KkyKZE98Leg/C73oRyuUYox04PQeeBThdygMfeX+7t1cmKWYKa/ZieYa89U8GHgED+0mF7m7wfNZOfbURYxIKg==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.5", + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "protobufjs": "^7.2.2" + }, + "bin": { + "firebase-functions": "lib/bin/firebase-functions.js" + }, + "engines": { + "node": ">=14.10.0" + }, + "peerDependencies": { + "firebase-admin": "^11.10.0 || ^12.0.0" + } + }, + "node_modules/firebase-functions-test": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.3.0.tgz", + "integrity": "sha512-X+OOA34MGrsTimFXTDnWT0psAqnmBkJ85bGCoLMwjgei5Prfkqh3bv5QASnXC/cmIVBSF2Qw9uW1+mF/t3kFlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "^4.14.104", + "lodash": "^4.17.5", + "ts-deepmerge": "^2.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "firebase-functions": ">=4.9.0", + "jest": ">=28.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "license": "MIT", + "optional": true + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-auth-library": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.14.0.tgz", + "integrity": "sha512-Y/eq+RWVs55Io/anIsm24sDS8X79Tq948zVLGaa7+KlJYYqaGwp1YI37w48nzrNi12RgnzMrQD4NzdmCowT90g==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.9.tgz", + "integrity": "sha512-tcjQr7sXVGMdlvcG25wSv98ap1dtF4Z6mcV0rztGIddOcezw4YMb/uTXg72JPrLep+kXcVjaJjg6oo3KLf4itQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.7.0", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.2", + "protobufjs": "^7.3.2", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", + "license": "MIT", + "dependencies": { + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "debug": "^4.3.4", + "jose": "^4.14.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jwks-rsa/node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proto3-json-serializer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", + "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "license": "MIT", + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "license": "MIT", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "license": "MIT" + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "license": "Apache-2.0", + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-deepmerge": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", + "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", + "dev": true, + "license": "ISC" + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/functions/package.json b/functions/package.json new file mode 100644 index 000000000..5507b83c3 --- /dev/null +++ b/functions/package.json @@ -0,0 +1,28 @@ +{ + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "22" + }, + "main": "index.js", + "dependencies": { + "@google-cloud/bigquery": "^7.9.0", + "@google-cloud/storage": "^7.12.1", + "firebase-admin": "^12.1.0", + "firebase-functions": "^5.1.1" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0", + "firebase-functions-test": "^3.1.0" + }, + "private": true +} diff --git a/functions/recommendation/trending.js b/functions/recommendation/trending.js new file mode 100644 index 000000000..9ac50244f --- /dev/null +++ b/functions/recommendation/trending.js @@ -0,0 +1,45 @@ +const { getDateRange, queryBigQuery, updateFirestore } = require('../utils/bigQueryUtils'); +const { logger } = require("firebase-functions"); + +const calculateTopItems = async (eventName, period, docName) => { + const startDate = getDateRange(period); + const query = ` + SELECT + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'item_id') AS item_id, + COUNT(*) AS count + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + event_name = '${eventName}' + AND event_date >= '${startDate}' + GROUP BY + item_id + ORDER BY + count DESC + LIMIT 100 + `; + + try { + const itemIds = await queryBigQuery(query); + await updateFirestore(`recommendations/${docName}`, itemIds); + logger.info(`Successfully updated ${docName} with ${itemIds.length} items`); + return itemIds; + } catch (error) { + logger.error(`Error calculating top ${eventName} items for ${period}:`, error); + throw error; + } +}; + +const calculateTopReadWeekly = () => calculateTopItems('read_item', 'weekly', 'top_read_weekly'); +const calculateTopPlayedWeekly = () => calculateTopItems('play_item', 'weekly', 'top_played_weekly'); +const calculateTopReadMonthly = () => calculateTopItems('read_item', 'monthly', 'top_read_monthly'); +const calculateTopPlayedMonthly = () => calculateTopItems('play_item', 'monthly', 'top_played_monthly'); +const calculateTopFavoritedWeekly = () => calculateTopItems('add_favorite', 'weekly', 'top_favorited_items'); + +module.exports = { + calculateTopReadWeekly, + calculateTopPlayedWeekly, + calculateTopReadMonthly, + calculateTopPlayedMonthly, + calculateTopFavoritedWeekly +}; \ No newline at end of file diff --git a/functions/utils/bigQueryUtils.js b/functions/utils/bigQueryUtils.js new file mode 100644 index 000000000..a28eb5778 --- /dev/null +++ b/functions/utils/bigQueryUtils.js @@ -0,0 +1,42 @@ +const { BigQuery } = require('@google-cloud/bigquery'); +const { getFirestore } = require('firebase-admin/firestore'); +const { logger } = require("firebase-functions"); + +const bigquery = new BigQuery(); +const db = getFirestore(); + +const getDateRange = (period) => { + const now = new Date(); + let startDate; + if (period === 'weekly') { + startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); + } else if (period === 'monthly') { + startDate = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()); + } else { + throw new Error('Invalid period specified'); + } + return startDate.toISOString().slice(0, 10).replace(/-/g, ''); +}; + +const queryBigQuery = async (query) => { + try { + const [rows] = await bigquery.query({ query }); + return rows.map(row => row.item_id); + } catch (error) { + logger.error('Error querying BigQuery:', error); + throw error; + } +}; + +const updateFirestore = async (docPath, itemIds) => { + try { + const docRef = db.doc(docPath); + await docRef.set({ itemIds }); + logger.info(`Updated ${docPath} with ${itemIds.length} items`); + } catch (error) { + logger.error(`Error updating Firestore document ${docPath}:`, error); + throw error; + } +}; + +module.exports = { getDateRange, queryBigQuery, updateFirestore }; \ No newline at end of file From 366db19140b52c693c3afe338d596a3fe36d9709 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 17:57:28 +0530 Subject: [PATCH 21/33] Fill in item ids in homepage-collection-debug when a new recommendation is generated --- functions/index.js | 19 +++++++++-------- functions/recommendation/trending.js | 31 ++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/functions/index.js b/functions/index.js index b76ff388b..316ffb2e5 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,19 +1,18 @@ -const { logger } = require("firebase-functions"); const { onRequest } = require("firebase-functions/v2/https"); +const functions = require('firebase-functions'); // The Firebase Admin SDK to access Firestore. const { initializeApp } = require("firebase-admin/app"); initializeApp(); - -const functions = require('firebase-functions'); const { calculateTopReadWeekly, calculateTopPlayedWeekly, calculateTopReadMonthly, calculateTopPlayedMonthly, - calculateTopFavoritedWeekly + calculateTopFavoritedWeekly, + calculateTopFavoritedMonthly } = require('./recommendation/trending'); // Weekly scheduled function @@ -35,7 +34,8 @@ exports.monthlyUpdateTopItems = functions.pubsub.schedule('1 of month 00:00').ti try { await Promise.all([ calculateTopReadMonthly(), - calculateTopPlayedMonthly() + calculateTopPlayedMonthly(), + calculateTopFavoritedMonthly() ]); console.log('Monthly top items update completed successfully'); } catch (error) { @@ -51,15 +51,16 @@ exports.manualUpdateTopItems = onRequest(async (req, res) => { switch(type) { case 'weekly': await Promise.all([ - calculateTopReadWeekly(), - calculateTopPlayedWeekly(), - calculateTopFavoritedWeekly() + calculateTopReadWeekly() + // calculateTopPlayedWeekly(), + // calculateTopFavoritedWeekly() ]); break; case 'monthly': await Promise.all([ calculateTopReadMonthly(), - calculateTopPlayedMonthly() + calculateTopPlayedMonthly(), + calculateTopFavoritedMonthly() ]); break; default: diff --git a/functions/recommendation/trending.js b/functions/recommendation/trending.js index 9ac50244f..bedb544a4 100644 --- a/functions/recommendation/trending.js +++ b/functions/recommendation/trending.js @@ -1,6 +1,9 @@ const { getDateRange, queryBigQuery, updateFirestore } = require('../utils/bigQueryUtils'); +const { getFirestore } = require('firebase-admin/firestore'); const { logger } = require("firebase-functions"); +const db = getFirestore(); + const calculateTopItems = async (eventName, period, docName) => { const startDate = getDateRange(period); const query = ` @@ -16,12 +19,30 @@ const calculateTopItems = async (eventName, period, docName) => { item_id ORDER BY count DESC - LIMIT 100 + LIMIT 50 `; try { const itemIds = await queryBigQuery(query); - await updateFirestore(`recommendations/${docName}`, itemIds); + + // Update recommendations document + // await updateFirestore(`recommendations/${docName}`, itemIds); + + // Check if the document exists + const docRef = db.doc(`homepage-collection-debug/${docName}`); + const docSnapshot = await docRef.get(); + + if (docSnapshot.exists) { + const itemIdsString = itemIds + .filter(id => id != null) + .join(', '); + + await docRef.update({ itemIds: itemIdsString }); + logger.info(`Updated existing homepage-collection/${docName} with first item ID`); + } else { + logger.warn(`Document homepage-collection/${docName} does not exist. Skipping update.`); + } + logger.info(`Successfully updated ${docName} with ${itemIds.length} items`); return itemIds; } catch (error) { @@ -34,12 +55,14 @@ const calculateTopReadWeekly = () => calculateTopItems('read_item', 'weekly', 't const calculateTopPlayedWeekly = () => calculateTopItems('play_item', 'weekly', 'top_played_weekly'); const calculateTopReadMonthly = () => calculateTopItems('read_item', 'monthly', 'top_read_monthly'); const calculateTopPlayedMonthly = () => calculateTopItems('play_item', 'monthly', 'top_played_monthly'); -const calculateTopFavoritedWeekly = () => calculateTopItems('add_favorite', 'weekly', 'top_favorited_items'); +const calculateTopFavoritedWeekly = () => calculateTopItems('add_favorite', 'weekly', 'top_favorited_weekly'); +const calculateTopFavoritedMonthly = () => calculateTopItems('add_favorite', 'monthly', 'top_favorited_monthly'); module.exports = { calculateTopReadWeekly, calculateTopPlayedWeekly, calculateTopReadMonthly, calculateTopPlayedMonthly, - calculateTopFavoritedWeekly + calculateTopFavoritedWeekly, + calculateTopFavoritedMonthly }; \ No newline at end of file From 711203180ff56b606b0e0f6e7599b4eefcb5eca2 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 18:51:31 +0530 Subject: [PATCH 22/33] trending recommendations deployed --- .../data/feature/firestore/FirestoreGraph.kt | 2 +- functions/.eslintrc.js | 4 + functions/index.js | 92 ++++++++++--------- functions/recommendation/trending.js | 32 +++---- functions/utils/bigQueryUtils.js | 24 ++--- 5 files changed, 83 insertions(+), 71 deletions(-) diff --git a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt index 60c153134..0709fa92a 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt @@ -23,7 +23,7 @@ class FirestoreGraph @Inject constructor( val homepageCollection: CollectionReference get() = firestoreKt - .collection("homepage-collection") + .collection("homepage-collection-debug") val feedbackCollection: CollectionReference get() = firestoreKt.collection("feedback") diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js index f4cb76caa..b193520c6 100644 --- a/functions/.eslintrc.js +++ b/functions/.eslintrc.js @@ -14,6 +14,10 @@ module.exports = { "no-restricted-globals": ["error", "name", "length"], "prefer-arrow-callback": "error", "quotes": ["error", "double", {"allowTemplateLiterals": true}], + "no-trailing-spaces": "off", + "eol-last": "off", + "indent": "off", + "max-len": "off", }, overrides: [ { diff --git a/functions/index.js b/functions/index.js index 316ffb2e5..b2ffe00d9 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,8 +1,8 @@ -const { onRequest } = require("firebase-functions/v2/https"); -const functions = require('firebase-functions'); +const {onRequest} = require("firebase-functions/v2/https"); +const functions = require("firebase-functions"); // The Firebase Admin SDK to access Firestore. -const { initializeApp } = require("firebase-admin/app"); +const {initializeApp} = require("firebase-admin/app"); initializeApp(); @@ -12,63 +12,71 @@ const { calculateTopReadMonthly, calculateTopPlayedMonthly, calculateTopFavoritedWeekly, - calculateTopFavoritedMonthly -} = require('./recommendation/trending'); + calculateTopFavoritedMonthly, +} = require("./recommendation/trending"); // Weekly scheduled function -exports.weeklyUpdateTopItems = functions.pubsub.schedule('every monday 00:00').timeZone('UTC').onRun(async (context) => { - try { - await Promise.all([ - calculateTopReadWeekly(), - calculateTopPlayedWeekly(), - calculateTopFavoritedWeekly() - ]); - console.log('Weekly top items update completed successfully'); - } catch (error) { - console.error('Error in weekly top items update:', error); - } -}); +exports.weeklyUpdateTopItems = functions.pubsub + .schedule("every monday 00:00") + .timeZone("UTC") + .onRun(async (context) => { + try { + await Promise.all([ + calculateTopReadWeekly(), + calculateTopPlayedWeekly(), + calculateTopFavoritedWeekly(), + ]); + console.log("Weekly top items update completed successfully"); + } catch (error) { + console.error("Error in weekly top items update:", error); + } + }); // Monthly scheduled function -exports.monthlyUpdateTopItems = functions.pubsub.schedule('1 of month 00:00').timeZone('UTC').onRun(async (context) => { - try { - await Promise.all([ - calculateTopReadMonthly(), - calculateTopPlayedMonthly(), - calculateTopFavoritedMonthly() - ]); - console.log('Monthly top items update completed successfully'); - } catch (error) { - console.error('Error in monthly top items update:', error); - } -}); +exports.monthlyUpdateTopItems = functions.pubsub + .schedule("1 of month 00:00") + .timeZone("UTC") + .onRun(async (context) => { + try { + await Promise.all([ + calculateTopReadMonthly(), + calculateTopPlayedMonthly(), + calculateTopFavoritedMonthly(), + ]); + console.log("Monthly top items update completed successfully"); + } catch (error) { + console.error("Error in monthly top items update:", error); + } + }); // http://127.0.0.1:5001/kafka-books/us-central1/manualUpdateTopItems?type=weekly exports.manualUpdateTopItems = onRequest(async (req, res) => { - const { type } = req.query; - + const {type} = req.query; + try { - switch(type) { - case 'weekly': + switch (type) { + case "weekly": await Promise.all([ - calculateTopReadWeekly() - // calculateTopPlayedWeekly(), - // calculateTopFavoritedWeekly() + calculateTopReadWeekly(), + calculateTopPlayedWeekly(), + calculateTopFavoritedWeekly(), ]); break; - case 'monthly': + case "monthly": await Promise.all([ calculateTopReadMonthly(), calculateTopPlayedMonthly(), - calculateTopFavoritedMonthly() + calculateTopFavoritedMonthly(), ]); break; default: - throw new Error('Invalid update type specified'); + throw new Error("Invalid update type specified"); } - res.json({ result: `${type} top items update completed successfully` }); + res.json({result: `${type} top items update completed successfully`}); } catch (error) { console.error(`Error in manual ${type} top items update:`, error); - res.status(500).json({ error: `An error occurred during ${type} top items update` }); + res.status(500).json({ + error: `An error occurred during ${type} top items update`, + }); } -}); +}); \ No newline at end of file diff --git a/functions/recommendation/trending.js b/functions/recommendation/trending.js index bedb544a4..70f5422c9 100644 --- a/functions/recommendation/trending.js +++ b/functions/recommendation/trending.js @@ -1,6 +1,6 @@ -const { getDateRange, queryBigQuery, updateFirestore } = require('../utils/bigQueryUtils'); -const { getFirestore } = require('firebase-admin/firestore'); -const { logger } = require("firebase-functions"); +const {getDateRange, queryBigQuery} = require("../utils/bigQueryUtils"); +const {getFirestore} = require("firebase-admin/firestore"); +const {logger} = require("firebase-functions"); const db = getFirestore(); @@ -13,8 +13,8 @@ const calculateTopItems = async (eventName, period, docName) => { FROM \`kafka-books.analytics_195726967.events_*\` WHERE - event_name = '${eventName}' - AND event_date >= '${startDate}' + event_name = "${eventName}" + AND event_date >= "${startDate}" GROUP BY item_id ORDER BY @@ -29,15 +29,15 @@ const calculateTopItems = async (eventName, period, docName) => { // await updateFirestore(`recommendations/${docName}`, itemIds); // Check if the document exists - const docRef = db.doc(`homepage-collection-debug/${docName}`); + const docRef = db.doc(`homepage-collection/${docName}`); const docSnapshot = await docRef.get(); if (docSnapshot.exists) { const itemIdsString = itemIds - .filter(id => id != null) - .join(', '); + .filter((id) => id != null) + .join(", "); - await docRef.update({ itemIds: itemIdsString }); + await docRef.update({itemIds: itemIdsString}); logger.info(`Updated existing homepage-collection/${docName} with first item ID`); } else { logger.warn(`Document homepage-collection/${docName} does not exist. Skipping update.`); @@ -51,12 +51,12 @@ const calculateTopItems = async (eventName, period, docName) => { } }; -const calculateTopReadWeekly = () => calculateTopItems('read_item', 'weekly', 'top_read_weekly'); -const calculateTopPlayedWeekly = () => calculateTopItems('play_item', 'weekly', 'top_played_weekly'); -const calculateTopReadMonthly = () => calculateTopItems('read_item', 'monthly', 'top_read_monthly'); -const calculateTopPlayedMonthly = () => calculateTopItems('play_item', 'monthly', 'top_played_monthly'); -const calculateTopFavoritedWeekly = () => calculateTopItems('add_favorite', 'weekly', 'top_favorited_weekly'); -const calculateTopFavoritedMonthly = () => calculateTopItems('add_favorite', 'monthly', 'top_favorited_monthly'); +const calculateTopReadWeekly = () => calculateTopItems("read_item", "weekly", "top_read_weekly"); +const calculateTopPlayedWeekly = () => calculateTopItems("play_item", "weekly", "top_played_weekly"); +const calculateTopReadMonthly = () => calculateTopItems("read_item", "monthly", "top_read_monthly"); +const calculateTopPlayedMonthly = () => calculateTopItems("play_item", "monthly", "top_played_monthly"); +const calculateTopFavoritedWeekly = () => calculateTopItems("add_favorite", "weekly", "top_favorited_weekly"); +const calculateTopFavoritedMonthly = () => calculateTopItems("add_favorite", "monthly", "top_favorited_monthly"); module.exports = { calculateTopReadWeekly, @@ -64,5 +64,5 @@ module.exports = { calculateTopReadMonthly, calculateTopPlayedMonthly, calculateTopFavoritedWeekly, - calculateTopFavoritedMonthly + calculateTopFavoritedMonthly, }; \ No newline at end of file diff --git a/functions/utils/bigQueryUtils.js b/functions/utils/bigQueryUtils.js index a28eb5778..55b85c32a 100644 --- a/functions/utils/bigQueryUtils.js +++ b/functions/utils/bigQueryUtils.js @@ -1,6 +1,6 @@ -const { BigQuery } = require('@google-cloud/bigquery'); -const { getFirestore } = require('firebase-admin/firestore'); -const { logger } = require("firebase-functions"); +const {BigQuery} = require("@google-cloud/bigquery"); +const {getFirestore} = require("firebase-admin/firestore"); +const {logger} = require("firebase-functions"); const bigquery = new BigQuery(); const db = getFirestore(); @@ -8,22 +8,22 @@ const db = getFirestore(); const getDateRange = (period) => { const now = new Date(); let startDate; - if (period === 'weekly') { + if (period === "weekly") { startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); - } else if (period === 'monthly') { + } else if (period === "monthly") { startDate = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()); } else { - throw new Error('Invalid period specified'); + throw new Error("Invalid period specified"); } - return startDate.toISOString().slice(0, 10).replace(/-/g, ''); + return startDate.toISOString().slice(0, 10).replace(/-/g, ""); }; const queryBigQuery = async (query) => { try { - const [rows] = await bigquery.query({ query }); - return rows.map(row => row.item_id); + const [rows] = await bigquery.query({query}); + return rows.map((row) => row.item_id); } catch (error) { - logger.error('Error querying BigQuery:', error); + logger.error("Error querying BigQuery:", error); throw error; } }; @@ -31,7 +31,7 @@ const queryBigQuery = async (query) => { const updateFirestore = async (docPath, itemIds) => { try { const docRef = db.doc(docPath); - await docRef.set({ itemIds }); + await docRef.set({itemIds}); logger.info(`Updated ${docPath} with ${itemIds.length} items`); } catch (error) { logger.error(`Error updating Firestore document ${docPath}:`, error); @@ -39,4 +39,4 @@ const updateFirestore = async (docPath, itemIds) => { } }; -module.exports = { getDateRange, queryBigQuery, updateFirestore }; \ No newline at end of file +module.exports = {getDateRange, queryBigQuery, updateFirestore}; \ No newline at end of file From aefcc872db71e7068647cde7e37efdd893203401 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 19:05:07 +0530 Subject: [PATCH 23/33] remove inappropriate items from homepage --- .../main/java/org/kafka/domain/interactors/UpdateHomepage.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt index e22712b6c..bc7887411 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt @@ -37,7 +37,7 @@ class UpdateHomepage @Inject constructor( if (ids.isNotEmpty()) { val query = ArchiveQuery().booksByIdentifiers(ids) val items = itemRepository.updateQuery(buildRemoteQuery(query)) - itemRepository.saveItems(items) + itemRepository.saveItems(items.filterNot { it.isInappropriate }) } } } From cbd5ddf6b98e2db1fd1a8147e0c651955d29b611 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 19:17:54 +0530 Subject: [PATCH 24/33] remove immutable lists --- .../java/com/kafka/data/entities/Homepage.kt | 34 +++++++++---------- .../data/feature/homepage/HomepageMapper.kt | 24 ++++++------- .../feature/homepage/HomepageRepository.kt | 3 +- .../main/java/org/kafka/homepage/Homepage.kt | 14 ++++---- .../homepage/components/ContinueReading.kt | 3 +- .../homepage/recent/RecentItemsScreen.kt | 3 +- .../kafka/homepage/recent/RecentViewModel.kt | 5 ++- 7 files changed, 38 insertions(+), 48 deletions(-) diff --git a/data/database/src/main/java/com/kafka/data/entities/Homepage.kt b/data/database/src/main/java/com/kafka/data/entities/Homepage.kt index ed10d5d2b..9fca00d0a 100644 --- a/data/database/src/main/java/com/kafka/data/entities/Homepage.kt +++ b/data/database/src/main/java/com/kafka/data/entities/Homepage.kt @@ -1,13 +1,11 @@ package com.kafka.data.entities import androidx.compose.runtime.Immutable -import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toPersistentList @Immutable -data class Homepage(val collection: ImmutableList) { - val continueReadingItems: ImmutableList +data class Homepage(val collection: List) { + val continueReadingItems: List get() = collection.recentItems.subList( fromIndex = 0, toIndex = ContinueReadingItemsThreshold.coerceAtMost(collection.recentItems.size), @@ -21,9 +19,9 @@ data class Homepage(val collection: ImmutableList) { } } -val ImmutableList.recentItems +val List.recentItems get() = filterIsInstance() - .firstOrNull()?.items.orEmpty().toPersistentList() + .firstOrNull()?.items.orEmpty() @Immutable sealed class HomepageCollection { @@ -32,22 +30,22 @@ sealed class HomepageCollection { @Immutable data class FeaturedItem( val label: String?, - val items: ImmutableList, - val image: ImmutableList = persistentListOf(), + val items: List, + val image: List = persistentListOf(), val shuffle: Boolean, override val enabled: Boolean = true, ) : HomepageCollection() @Immutable data class RecentItems( - val items: ImmutableList, + val items: List, override val enabled: Boolean = true, ) : HomepageCollection() @Immutable data class PersonRow( - val items: ImmutableList, - val images: ImmutableList, + val items: List, + val images: List, val clickable: Boolean = true, val shuffle: Boolean, override val enabled: Boolean = true, @@ -55,8 +53,8 @@ sealed class HomepageCollection { @Immutable data class Row( - val labels: ImmutableList, - val items: ImmutableList, + val labels: List, + val items: List, val clickable: Boolean = true, val shuffle: Boolean, override val enabled: Boolean = true, @@ -66,8 +64,8 @@ sealed class HomepageCollection { @Immutable data class Column( - val labels: ImmutableList, - val items: ImmutableList, + val labels: List, + val items: List, val clickable: Boolean = true, val shuffle: Boolean, override val enabled: Boolean = true, @@ -77,8 +75,8 @@ sealed class HomepageCollection { @Immutable data class Grid( - val labels: ImmutableList, - val items: ImmutableList, + val labels: List, + val items: List, val clickable: Boolean = true, val shuffle: Boolean, override val enabled: Boolean = true, @@ -88,7 +86,7 @@ sealed class HomepageCollection { @Immutable data class Subjects( - val items: ImmutableList, + val items: List, val clickable: Boolean = true, val shuffle: Boolean, override val enabled: Boolean = true, diff --git a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt index ec5078e93..2dacae72a 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt @@ -4,9 +4,7 @@ import com.kafka.data.dao.ItemDao import com.kafka.data.entities.HomepageCollection import com.kafka.data.feature.homepage.HomepageMapperConfig.shuffleIndices import com.kafka.data.model.homepage.HomepageCollectionResponse -import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf @@ -43,8 +41,8 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { return itemDao.observe(itemIdList).map { items -> val sortedItems = items.sortedBy { item -> itemIdList.indexOf(item.itemId) } HomepageCollection.Row( - labels = label.splitLabel().toPersistentList(), - items = sortedItems.toPersistentList(), + labels = label.splitLabel(), + items = sortedItems, clickable = clickable, shuffle = shuffle ) @@ -58,8 +56,8 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { val images = indices.map { index -> image.getOrNull(index) } val personRow = HomepageCollection.PersonRow( - items = itemIdList.toPersistentList(), - images = images.mapNotNull { it?.downloadURL }.toPersistentList(), + items = itemIdList, + images = images.mapNotNull { it?.downloadURL }, enabled = enabled, clickable = clickable, shuffle = shuffle @@ -73,7 +71,7 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { .let { if (shuffle) it.shuffleInSync() else it } val subjects = HomepageCollection.Subjects( - items = itemIdList.toPersistentList(), + items = itemIdList, clickable = clickable, enabled = enabled, shuffle = shuffle @@ -89,8 +87,8 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { return itemDao.observe(itemIdList).map { items -> val sortedItems = items.sortedBy { item -> itemIdList.indexOf(item.itemId) } HomepageCollection.Column( - labels = label.splitLabel().toPersistentList(), - items = sortedItems.toPersistentList(), + labels = label.splitLabel(), + items = sortedItems, clickable = clickable, shuffle = shuffle ) @@ -104,8 +102,8 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { return itemDao.observe(itemIdList).map { items -> val sortedItems = items.sortedBy { item -> itemIdList.indexOf(item.itemId) } HomepageCollection.Grid( - labels = label.splitLabel().toPersistentList(), - items = sortedItems.toPersistentList(), + labels = label.splitLabel(), + items = sortedItems, clickable = clickable, shuffle = shuffle ) @@ -114,7 +112,7 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { // todo: items are filled later on domain layer, find a way to fill them here private fun HomepageCollectionResponse.RecentItems.mapRecentItems() = - flowOf(HomepageCollection.RecentItems(persistentListOf(), enabled)) + flowOf(HomepageCollection.RecentItems(listOf(), enabled)) private fun HomepageCollectionResponse.FeaturedItem.mapFeatured(): Flow { val indices = itemIds.split(", ").indices @@ -131,7 +129,7 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { HomepageCollection.FeaturedItem( label = label, - items = sortedItems.toPersistentList(), + items = sortedItems, image = images.mapNotNull { it?.downloadURL }.toImmutableList(), enabled = enabled, shuffle = shuffle diff --git a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageRepository.kt b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageRepository.kt index 68832d322..a532fffdd 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageRepository.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageRepository.kt @@ -6,7 +6,6 @@ import com.kafka.data.model.homepage.HomepageCollectionResponse import dagger.Reusable import dev.gitlive.firebase.firestore.DocumentSnapshot import dev.gitlive.firebase.firestore.QuerySnapshot -import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.serialization.modules.SerializersModule @@ -33,7 +32,7 @@ class HomepageRepository @Inject constructor( .sortedBy { it.index } .also { debug { "homepage is : $it" } } .run { homepageMapper.map(this) } - .map { it.toList().toPersistentList() } + .map { it.toList() } /** * Get the list of ids of the homepage items to fetch the items from archive api diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index 7730a3d07..ba3961575 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -36,8 +36,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kafka.data.entities.Homepage import com.kafka.data.entities.HomepageCollection import com.kafka.data.entities.Item -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toImmutableList import org.kafka.common.extensions.AnimatedVisibilityFade import org.kafka.common.image.Icons import org.kafka.common.logging.LogCompositions @@ -138,7 +136,7 @@ private fun HomepageFeedItems( modifier = subjectModifier ) RowItems( - items = recommendedContent.toImmutableList(), + items = recommendedContent.toList(), openItemDetail = openRecommendationDetail ) } @@ -159,7 +157,7 @@ private fun HomepageFeedItems( when (collection) { is HomepageCollection.RecentItems -> { item(key = "recent", contentType = "recent") { - if (homepage.continueReadingItems.size > 0) { + if (homepage.continueReadingItems.isNotEmpty()) { ContinueReading( readingList = homepage.continueReadingItems, openItemDetail = openRecentItemDetail, @@ -254,7 +252,7 @@ private fun HomepageFeedItems( @Composable private fun RowItems( - items: ImmutableList, + items: List, modifier: Modifier = Modifier, openItemDetail: (String) -> Unit, ) { @@ -289,8 +287,8 @@ private fun RowItems( @Composable private fun Authors( - titles: ImmutableList, - images: ImmutableList, + titles: List, + images: List, modifier: Modifier = Modifier, goToCreator: (String) -> Unit, ) { @@ -397,7 +395,7 @@ private fun GridItems( } @Composable -private fun SubjectItems(labels: ImmutableList, goToSubject: (String) -> Unit) { +private fun SubjectItems(labels: List, goToSubject: (String) -> Unit) { Row( horizontalArrangement = Arrangement.spacedBy(Dimens.Spacing04), modifier = subjectModifier diff --git a/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt b/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt index b9ad8f669..36592e212 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/components/ContinueReading.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.kafka.data.entities.RecentItem import com.kafka.data.entities.RecentItemWithProgress -import kotlinx.collections.immutable.ImmutableList import org.kafka.common.image.Icons import org.kafka.common.simpleClickable import org.kafka.common.widgets.shadowMaterial @@ -64,7 +63,7 @@ import ui.common.theme.theme.Dimens @Composable internal fun ContinueReading( - readingList: ImmutableList, + readingList: List, modifier: Modifier = Modifier, openItemDetail: (String) -> Unit, removeRecentItem: (String) -> Unit, diff --git a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentItemsScreen.kt b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentItemsScreen.kt index b69dd94b3..22bb1a24d 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentItemsScreen.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentItemsScreen.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kafka.data.entities.RecentItem -import kotlinx.collections.immutable.ImmutableList import org.kafka.common.elevation import org.kafka.common.extensions.rememberMutableState import org.kafka.common.image.Icons @@ -71,7 +70,7 @@ fun RecentItemsScreen(viewModel: RecentViewModel = hiltViewModel()) { @Composable private fun RecentItems( - items: ImmutableList, + items: List, openItemDetail: (String) -> Unit, lazyListState: LazyListState, modifier: Modifier = Modifier, diff --git a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt index 6bd0c41ab..3b935aee6 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/recent/RecentViewModel.kt @@ -4,7 +4,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kafka.data.entities.RecentItem import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.collect @@ -23,7 +22,7 @@ class RecentViewModel @Inject constructor( observeRecentItems: ObserveRecentItems, private val removeAllRecentItems: RemoveAllRecentItems, private val navigator: Navigator, - private val analytics: Analytics + private val analytics: Analytics, ) : ViewModel() { val state = observeRecentItems.flow.map { recentItems -> RecentViewState(recentItems = recentItems.map { it.recentItem }.toPersistentList()) @@ -50,5 +49,5 @@ class RecentViewModel @Inject constructor( } data class RecentViewState( - val recentItems: ImmutableList = persistentListOf() + val recentItems: List = persistentListOf(), ) From f660cb0a45102cdc7af119e418252dee6274bdc6 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sat, 31 Aug 2024 19:20:36 +0530 Subject: [PATCH 25/33] Minor refactoring to prepare converting favorites to lists --- .../java/com/kafka/data/feature/firestore/FirestoreGraph.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt index 0709fa92a..60c153134 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt @@ -23,7 +23,7 @@ class FirestoreGraph @Inject constructor( val homepageCollection: CollectionReference get() = firestoreKt - .collection("homepage-collection-debug") + .collection("homepage-collection") val feedbackCollection: CollectionReference get() = firestoreKt.collection("feedback") From 31fa18de480d9990c2994d7b27cb39c211d26601 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Sun, 1 Sep 2024 15:23:04 +0530 Subject: [PATCH 26/33] respect clickable field from homepage response --- .../kafka/ui/components/item/SubjectItem.kt | 4 ++-- .../main/java/org/kafka/homepage/Homepage.kt | 20 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/ui/components/src/main/java/org/kafka/ui/components/item/SubjectItem.kt b/ui/components/src/main/java/org/kafka/ui/components/item/SubjectItem.kt index b69f5b3e4..d57708dd9 100644 --- a/ui/components/src/main/java/org/kafka/ui/components/item/SubjectItem.kt +++ b/ui/components/src/main/java/org/kafka/ui/components/item/SubjectItem.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.unit.dp import ui.common.theme.theme.Dimens @Composable -fun SubjectItem(text: String, modifier: Modifier = Modifier, onClicked: () -> Unit = {}) { +fun SubjectItem(text: String, modifier: Modifier = Modifier, onClicked: (() -> Unit)? = null) { Surface( modifier = modifier, shape = RoundedCornerShape(50), @@ -23,7 +23,7 @@ fun SubjectItem(text: String, modifier: Modifier = Modifier, onClicked: () -> Un text = text, style = MaterialTheme.typography.labelSmall, modifier = Modifier - .clickable { onClicked() } + .then(onClicked?.let { Modifier.clickable(onClick = it) } ?: Modifier) .padding( horizontal = Dimens.Spacing12, vertical = Dimens.Spacing08 diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index ba3961575..3ee58d19c 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -166,9 +166,11 @@ private fun HomepageFeedItems( openRecentItems = openRecentItems ) } else { - Spacer(modifier = Modifier - .fillMaxWidth() - .height(Dimens.Spacing12)) + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(Dimens.Spacing12) + ) } } } @@ -212,14 +214,14 @@ private fun HomepageFeedItems( is HomepageCollection.Row -> { item(key = collection.key, contentType = "row") { - SubjectItems(collection.labels, goToSubject) + SubjectItems(collection.labels, collection.clickable, goToSubject) RowItems(items = collection.items, openItemDetail = openItemDetail) } } is HomepageCollection.Grid -> { item(key = collection.key, contentType = "grid") { - SubjectItems(collection.labels, goToSubject) + SubjectItems(collection.labels, collection.clickable, goToSubject) GridItems( collection = collection, openItemDetail = openItemDetail, @@ -229,7 +231,9 @@ private fun HomepageFeedItems( } is HomepageCollection.Column -> { - item(key = collection.key) { SubjectItems(collection.labels, goToSubject) } + item(key = collection.key) { + SubjectItems(collection.labels, collection.clickable, goToSubject) + } columnItems(collection, openItemDetail) } } @@ -395,13 +399,13 @@ private fun GridItems( } @Composable -private fun SubjectItems(labels: List, goToSubject: (String) -> Unit) { +private fun SubjectItems(labels: List, clickable: Boolean, goToSubject: (String) -> Unit) { Row( horizontalArrangement = Arrangement.spacedBy(Dimens.Spacing04), modifier = subjectModifier ) { labels.forEach { label -> - SubjectItem(text = label, onClicked = { goToSubject(label) }) + SubjectItem(text = label, onClicked = { goToSubject(label) }.takeIf { clickable }) } } } From 2d37035abc23e974199ab4b53302b99a690bd2a1 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Mon, 2 Sep 2024 13:11:56 +0530 Subject: [PATCH 27/33] update agp --- .../tm/alashow/datmusic/downloader/DownloadInitializer.kt | 2 ++ gradle/libs.versions.toml | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/downloader/src/main/java/tm/alashow/datmusic/downloader/DownloadInitializer.kt b/core/downloader/src/main/java/tm/alashow/datmusic/downloader/DownloadInitializer.kt index ddf66e845..8675f32a4 100644 --- a/core/downloader/src/main/java/tm/alashow/datmusic/downloader/DownloadInitializer.kt +++ b/core/downloader/src/main/java/tm/alashow/datmusic/downloader/DownloadInitializer.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.launch import org.kafka.base.AppInitializer import org.kafka.base.CoroutineDispatchers import org.kafka.base.ProcessLifetime +import org.kafka.base.debug import org.kafka.base.errorLog import tm.alashow.datmusic.downloader.manager.createFetchListener import javax.inject.Inject @@ -51,6 +52,7 @@ class DownloadInitializer @Inject constructor( private suspend fun addDownload(download: Download) { downloadRequestsDao.getByRequestIdOrNull(download.id)?.let { downloadRequest -> + debug { "Adding download: $downloadRequest" } val file = fileDao.getOrNull(downloadRequest.id) val item = itemDao.getOrNull(file?.itemId.orEmpty()) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fa86fe973..cb6414207 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] accompanist = "0.34.0" appupdate = "2.1.0" -agp = "8.5.2" +agp = "8.6.0" androidxhilt = "1.2.0" androidxlifecycle = "2.8.4" coil = "2.6.0" @@ -87,8 +87,8 @@ androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle- androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" } -lottie-core = "com.airbnb.android:lottie:6.1.0" -lottie-compose = "com.airbnb.android:lottie-compose:6.1.0" +lottie-core = "com.airbnb.android:lottie:6.4.0" +lottie-compose = "com.airbnb.android:lottie-compose:6.4.0" androidx-palette = "androidx.palette:palette:1.0.0" @@ -118,7 +118,7 @@ compose-ui-util = { module = "androidx.compose.ui:ui-util" } fetch = "com.github.abbas7777:fetch2-android14:3.2.0-beta07" -google-bom = "com.google.firebase:firebase-bom:33.1.2" +google-bom = "com.google.firebase:firebase-bom:33.2.0" google-analytics = { module = "com.google.firebase:firebase-analytics" } google-crashlytics = { module = "com.google.firebase:firebase-crashlytics" } google-auth = { module = "com.google.firebase:firebase-auth" } From 4057db08134e95eb8f696f68509d478baee81123 Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Mon, 2 Sep 2024 15:50:29 +0530 Subject: [PATCH 28/33] speech ti text in search --- .../java/com.kafka.search/SearchWidget.kt | 116 ++++++++++++------ ui/search/src/main/res/values/strings.xml | 2 + 2 files changed, 78 insertions(+), 40 deletions(-) diff --git a/ui/search/src/main/java/com.kafka.search/SearchWidget.kt b/ui/search/src/main/java/com.kafka.search/SearchWidget.kt index 9676e567e..a317a81b9 100644 --- a/ui/search/src/main/java/com.kafka.search/SearchWidget.kt +++ b/ui/search/src/main/java/com.kafka.search/SearchWidget.kt @@ -1,10 +1,12 @@ package com.kafka.search -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.expandIn -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.shrinkOut +import android.app.Activity +import android.content.Intent +import android.speech.RecognizerIntent +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row @@ -19,8 +21,8 @@ import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction @@ -32,6 +34,7 @@ import org.kafka.common.test.testTagUi import org.kafka.common.widgets.IconResource import org.kafka.search.R import ui.common.theme.theme.Dimens +import java.util.Locale @Composable fun SearchWidget( @@ -62,10 +65,21 @@ fun SearchWidget( } }, trailingIcon = { - ClearIcon(searchText) { - setSearchText("") - keyboard?.show() + AnimatedContent(targetState = searchText, label = "trailing_icon") { text -> + if (text.isEmpty()) { + SpeechIcon { + setSearchText(it) + onImeAction(it) + keyboard?.hide() + } + } else { + ClearIcon { + setSearchText("") + keyboard?.show() + } + } } + }, keyboardOptions = SearchKeyboardOptions, onValueChange = { setSearchText(it) }, @@ -88,41 +102,63 @@ fun SearchWidget( } @Composable -private fun ClearIcon(text: String, onTextCleared: () -> Unit) { - AnimatedVisibility( - visible = text.isNotEmpty(), - enter = fadeIn() + expandIn(expandFrom = Alignment.TopCenter), - exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.TopCenter) - ) { - IconResource( - modifier = Modifier - .testTagUi("search_clear") - .clickable(onClick = { onTextCleared() }) - .padding(Dimens.Spacing12) - .size(24.dp), - imageVector = Icons.X, - tint = MaterialTheme.colorScheme.onSurface, - contentDescription = stringResource(R.string.cd_clear_text) - ) - } +private fun ClearIcon(onTextCleared: () -> Unit) { + IconResource( + modifier = Modifier + .testTagUi("search_clear") + .clickable(onClick = { onTextCleared() }) + .padding(Dimens.Spacing12) + .size(24.dp), + imageVector = Icons.X, + tint = MaterialTheme.colorScheme.onSurface, + contentDescription = stringResource(R.string.cd_clear_text) + ) } @Composable -private fun SpeechIcon(text: String, onTextCleared: () -> Unit) { - AnimatedVisibility( - visible = text.isEmpty(), - enter = fadeIn() + expandIn(expandFrom = Alignment.BottomCenter), - exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.BottomCenter) - ) { - IconResource( - modifier = Modifier - .clickable(onClick = { onTextCleared() }) - .padding(Dimens.Spacing12) - .size(Dimens.Spacing24), - imageVector = Icons.Mic, - tint = MaterialTheme.colorScheme.onSurface - ) +private fun SpeechIcon(onText: (String) -> Unit) { + val context = LocalContext.current + + val speechRecognizerLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val data = result.data + val results = data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) + if (!results.isNullOrEmpty()) { + onText(results[0]) + } + } + } + + fun promptSpeechInput() { + val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { + putExtra( + RecognizerIntent.EXTRA_LANGUAGE_MODEL, + RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH + ) + putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()) + putExtra(RecognizerIntent.EXTRA_PROMPT, context.getString(R.string.speech_prompt)) + } + try { + speechRecognizerLauncher.launch(intent) + } catch (e: Exception) { + Toast.makeText( + context, + context.getString(R.string.speech_not_supported), + Toast.LENGTH_SHORT + ).show() + } } + + IconResource( + modifier = Modifier + .padding(Dimens.Spacing12) + .size(Dimens.Spacing24), + imageVector = Icons.Mic, + tint = MaterialTheme.colorScheme.onSurface, + onClick = { promptSpeechInput() }, + ) } private val SearchKeyboardOptions = KeyboardOptions( diff --git a/ui/search/src/main/res/values/strings.xml b/ui/search/src/main/res/values/strings.xml index 9b3381cd2..f06717b56 100644 --- a/ui/search/src/main/res/values/strings.xml +++ b/ui/search/src/main/res/values/strings.xml @@ -3,4 +3,6 @@ Search... Recent searches Clear text + Try Saying Something + Speech not supported From b2aba356d9806c9f7d7f04ca4e2a38296bf22b4f Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 5 Sep 2024 04:39:02 +0530 Subject: [PATCH 29/33] Recommendation row support on homepage --- app/build.gradle.kts | 5 -- .../com/kafka/user/injection/AppModule.kt | 6 ++- .../base/extensions/CoroutineExtensions.kt | 7 +++ .../remote/config/RemoteConfigExtensions.kt | 3 ++ .../java/com/kafka/data/entities/Homepage.kt | 15 +++--- .../data/model/homepage/HomepageResponse.kt | 10 ++++ .../data/feature/firestore/FirestoreGraph.kt | 7 +++ .../data/feature/homepage/HomepageMapper.kt | 16 +++++-- .../RecommendationRepository.kt | 47 ++++++++++++++++++- .../domain/interactors/UpdateHomepage.kt | 8 +--- .../interactors/UpdateRecommendations.kt | 40 ++++++++++++++++ .../domain/observers/ObserveRecentItems.kt | 3 -- .../main/java/org/kafka/homepage/Homepage.kt | 25 +++------- .../org/kafka/homepage/HomepageViewModel.kt | 18 ++----- 14 files changed, 145 insertions(+), 65 deletions(-) create mode 100644 domain/src/main/java/org/kafka/domain/interactors/UpdateRecommendations.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fba056c1f..7d995d567 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -35,11 +35,6 @@ android { "PIPELESS_AUTH_TOKEN", properties["PIPELESS_AUTH_TOKEN"]?.toString() ?: System.getenv("PIPELESS_AUTH_TOKEN") ) - buildConfigField( - "String", - "OPEN_AI_API_KEY", - properties["OPEN_AI_API_KEY"]?.toString() ?: System.getenv("OPEN_AI_API_KEY") - ) } compileOptions { diff --git a/app/src/main/java/com/kafka/user/injection/AppModule.kt b/app/src/main/java/com/kafka/user/injection/AppModule.kt index f8397cb16..e9380df01 100644 --- a/app/src/main/java/com/kafka/user/injection/AppModule.kt +++ b/app/src/main/java/com/kafka/user/injection/AppModule.kt @@ -11,6 +11,8 @@ import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.messaging.FirebaseMessaging import com.kafka.data.prefs.PreferencesStore +import com.kafka.remote.config.RemoteConfig +import com.kafka.remote.config.getOpenAiApiKey import com.kafka.user.BuildConfig import com.kafka.user.initializer.AudioProgressInitializer import com.kafka.user.initializer.FirebaseInitializer @@ -94,10 +96,10 @@ class AppModule { @Provides - fun provideSecretsProvider() = object : SecretsProvider { + fun provideSecretsProvider(remoteConfig: RemoteConfig) = object : SecretsProvider { override val googleServerClientId: String = BuildConfig.GOOGLE_SERVER_CLIENT_ID override val pipelessAuthToken: String = BuildConfig.PIPELESS_AUTH_TOKEN - override val openAiApiKey: String = BuildConfig.OPEN_AI_API_KEY + override val openAiApiKey: String = remoteConfig.getOpenAiApiKey() } } diff --git a/base/domain/src/commonMain/kotlin/org/kafka/base/extensions/CoroutineExtensions.kt b/base/domain/src/commonMain/kotlin/org/kafka/base/extensions/CoroutineExtensions.kt index de579244b..e6c59d77f 100644 --- a/base/domain/src/commonMain/kotlin/org/kafka/base/extensions/CoroutineExtensions.kt +++ b/base/domain/src/commonMain/kotlin/org/kafka/base/extensions/CoroutineExtensions.kt @@ -1,6 +1,9 @@ package org.kafka.base.extensions import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn @@ -13,3 +16,7 @@ fun Flow.stateInDefault( initialValue: T, started: SharingStarted = SharingStarted.WhileSubscribed(5_000), ) = stateIn(scope, started, initialValue) + +suspend fun List.mapAsync( + mapper: suspend (T) -> R, +): List = coroutineScope { map { async { mapper(it) } }.awaitAll() } diff --git a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt index 2fa4a6d8c..4f6b3a53a 100644 --- a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt +++ b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt @@ -19,6 +19,7 @@ const val BORROWABLE_BOOK_MESSAGE = "borrowable_book_message" const val TRUE_CONTRAST_ENABLED = "true_contrast_enabled" const val SUMMARY_ENABLED = "summary_enabled" const val SHOW_FEATURED_ITEM_LABELS = "show_featured_item_labels" +const val OPEN_AI_API_KEY = "open_ai_api_key" fun RemoteConfig.getPlayerTheme() = get(REMOTE_CONFIG_PLAYER_THEME_KEY) @@ -57,3 +58,5 @@ fun RemoteConfig.isTrueContrastEnabled() = getBoolean(TRUE_CONTRAST_ENABLED) fun RemoteConfig.isSummaryEnabled() = getBoolean(SUMMARY_ENABLED) fun RemoteConfig.showFeaturedItemLabels() = getBoolean(SHOW_FEATURED_ITEM_LABELS) + +fun RemoteConfig.getOpenAiApiKey() = get(OPEN_AI_API_KEY) diff --git a/data/database/src/main/java/com/kafka/data/entities/Homepage.kt b/data/database/src/main/java/com/kafka/data/entities/Homepage.kt index 9fca00d0a..41078eb23 100644 --- a/data/database/src/main/java/com/kafka/data/entities/Homepage.kt +++ b/data/database/src/main/java/com/kafka/data/entities/Homepage.kt @@ -25,7 +25,6 @@ val List.recentItems @Immutable sealed class HomepageCollection { - abstract val enabled: Boolean @Immutable data class FeaturedItem( @@ -33,13 +32,18 @@ sealed class HomepageCollection { val items: List, val image: List = persistentListOf(), val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() @Immutable data class RecentItems( val items: List, - override val enabled: Boolean = true, + ) : HomepageCollection() + + @Immutable + data class Recommendations( + val labels: List, + val type: String, + val items: List, ) : HomepageCollection() @Immutable @@ -48,7 +52,6 @@ sealed class HomepageCollection { val images: List, val clickable: Boolean = true, val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() @Immutable @@ -57,7 +60,6 @@ sealed class HomepageCollection { val items: List, val clickable: Boolean = true, val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() { val key = labels.joinToString(separator = ",") } @@ -68,7 +70,6 @@ sealed class HomepageCollection { val items: List, val clickable: Boolean = true, val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() { val key = labels.joinToString(separator = ",") } @@ -79,7 +80,6 @@ sealed class HomepageCollection { val items: List, val clickable: Boolean = true, val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() { val key = labels.joinToString(separator = ",") } @@ -89,7 +89,6 @@ sealed class HomepageCollection { val items: List, val clickable: Boolean = true, val shuffle: Boolean, - override val enabled: Boolean = true, ) : HomepageCollection() { val key = items.joinToString(separator = ",") } diff --git a/data/models/src/commonMain/kotlin/com/kafka/data/model/homepage/HomepageResponse.kt b/data/models/src/commonMain/kotlin/com/kafka/data/model/homepage/HomepageResponse.kt index 0dc990c6d..f59cc3d03 100644 --- a/data/models/src/commonMain/kotlin/com/kafka/data/model/homepage/HomepageResponse.kt +++ b/data/models/src/commonMain/kotlin/com/kafka/data/model/homepage/HomepageResponse.kt @@ -41,6 +41,16 @@ sealed class HomepageCollectionResponse { override val topics: String = "", ) : HomepageCollectionResponse() + @Serializable + @SerialName("recommendation") + data class Recommendation( + val label: String, + val itemIds: String, + override val index: Float, + override val enabled: Boolean = true, + override val topics: String = "", + ) : HomepageCollectionResponse() + @Serializable @SerialName("subject") data class Subjects( diff --git a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt index 60c153134..8f48ef6da 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/firestore/FirestoreGraph.kt @@ -36,6 +36,13 @@ class FirestoreGraph @Inject constructor( .document(uid) .collection(listId) + fun getRecommendationCollection() = firestore.collection("recommendations") + + fun getRecommendationCollection(uid: String, recommendationId: String) = + getRecommendationCollection() + .document(uid) + .collection(recommendationId) + fun getDownloadsCollection(id: String) = firestore .collection("downloads") .document(id) diff --git a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt index 2dacae72a..54f5c04c5 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/homepage/HomepageMapper.kt @@ -3,6 +3,7 @@ package com.kafka.data.feature.homepage import com.kafka.data.dao.ItemDao import com.kafka.data.entities.HomepageCollection import com.kafka.data.feature.homepage.HomepageMapperConfig.shuffleIndices +import com.kafka.data.feature.recommendation.RecommendationRepository import com.kafka.data.model.homepage.HomepageCollectionResponse import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow @@ -15,7 +16,10 @@ object HomepageMapperConfig { val shuffleIndices = (0 until 50).shuffled() } -class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { +class HomepageMapper @Inject constructor( + private val itemDao: ItemDao, + private val recommendationRepository: RecommendationRepository, +) { fun map(collection: List): Flow> { return combine( @@ -28,6 +32,7 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { is HomepageCollectionResponse.Grid -> homepageItem.mapGrid() is HomepageCollectionResponse.PersonRow -> homepageItem.mapPersonRow() is HomepageCollectionResponse.Subjects -> homepageItem.mapSubjects() + is HomepageCollectionResponse.Recommendation -> homepageItem.mapRecommendations() is HomepageCollectionResponse.Unknown -> flowOf(null) } }, @@ -49,6 +54,10 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { } } + private fun HomepageCollectionResponse.Recommendation.mapRecommendations() = + recommendationRepository.observeRecommendations(itemIds) + .map { items -> HomepageCollection.Recommendations(listOf(label), itemIds, items) } + private fun HomepageCollectionResponse.PersonRow.mapPersonRow(): Flow { val indices = itemIds.split(", ").indices .let { if (shuffle) it.shuffleInSync() else it } @@ -58,7 +67,6 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { val personRow = HomepageCollection.PersonRow( items = itemIdList, images = images.mapNotNull { it?.downloadURL }, - enabled = enabled, clickable = clickable, shuffle = shuffle ) @@ -73,7 +81,6 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { val subjects = HomepageCollection.Subjects( items = itemIdList, clickable = clickable, - enabled = enabled, shuffle = shuffle ) @@ -112,7 +119,7 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { // todo: items are filled later on domain layer, find a way to fill them here private fun HomepageCollectionResponse.RecentItems.mapRecentItems() = - flowOf(HomepageCollection.RecentItems(listOf(), enabled)) + flowOf(HomepageCollection.RecentItems(listOf())) private fun HomepageCollectionResponse.FeaturedItem.mapFeatured(): Flow { val indices = itemIds.split(", ").indices @@ -131,7 +138,6 @@ class HomepageMapper @Inject constructor(private val itemDao: ItemDao) { label = label, items = sortedItems, image = images.mapNotNull { it?.downloadURL }.toImmutableList(), - enabled = enabled, shuffle = shuffle ) } diff --git a/data/repo/src/main/java/com/kafka/data/feature/recommendation/RecommendationRepository.kt b/data/repo/src/main/java/com/kafka/data/feature/recommendation/RecommendationRepository.kt index e7701573d..6652dc09d 100644 --- a/data/repo/src/main/java/com/kafka/data/feature/recommendation/RecommendationRepository.kt +++ b/data/repo/src/main/java/com/kafka/data/feature/recommendation/RecommendationRepository.kt @@ -1,5 +1,9 @@ package com.kafka.data.feature.recommendation +import com.google.firebase.firestore.snapshots +import com.kafka.data.dao.ItemDao +import com.kafka.data.feature.auth.AccountRepository +import com.kafka.data.feature.firestore.FirestoreGraph import com.kafka.data.feature.recommendation.network.RecommendationService import com.kafka.data.model.recommendation.RecommendationRequestBody import com.kafka.data.model.recommendation.RecommendationRequestBody.RecommendationEvent @@ -7,6 +11,12 @@ import com.kafka.data.model.recommendation.RecommendationRequestBody.Recommendat import com.kafka.data.model.recommendation.RecommendationRequestBody.RecommendationEvent.Relationship import com.kafka.data.model.recommendation.RecommendationRequestBody.RecommendationEvent.StartObject import com.kafka.data.resultApiCall +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.tasks.await import org.kafka.base.CoroutineDispatchers import org.threeten.bp.LocalDateTime import org.threeten.bp.format.DateTimeFormatter @@ -16,9 +26,42 @@ import javax.inject.Singleton @Singleton class RecommendationRepository @Inject constructor( + private val accountRepository: AccountRepository, private val recommendationService: RecommendationService, - private val dispatchers: CoroutineDispatchers + private val itemDao: ItemDao, + private val firestoreGraph: FirestoreGraph, + private val dispatchers: CoroutineDispatchers, ) { + fun observeRecommendations(recommendationId: String) = + accountRepository.observeCurrentFirebaseUser() + .filterNotNull() + .flatMapLatest { user -> + getRecommendations( + userId = user.uid, + recommendationId = recommendationId + ) + } + .flatMapLatest { itemDao.observe(it) } + .onStart { emit(emptyList()) } + .flowOn(dispatchers.io) + + private fun getRecommendations(userId: String, recommendationId: String) = firestoreGraph + .getRecommendationCollection(userId, recommendationId) + .snapshots() + .map { snapshots -> snapshots.map { it.id } } + + suspend fun getRecommendationItemIds(userId: String): List { + val collection = firestoreGraph.getRecommendationCollection().get().await() + + return collection.map { recommendationSnapshot -> + val recommendationId = recommendationSnapshot.id + firestoreGraph.getRecommendationCollection(userId, recommendationId) + .get() + .await() + .documents + .map { it.id } + }.flatten() + } suspend fun getRecommendedContent(userId: String) = resultApiCall(dispatchers.io) { val requestBody = ContentRecommendationRequestBody.fromUser(userId) @@ -33,7 +76,7 @@ class RecommendationRepository @Inject constructor( suspend fun postEvent( recommendationObjectFrom: RecommendationObject, recommendationRelationship: RecommendationRelationship, - recommendationObjectTo: RecommendationObject + recommendationObjectTo: RecommendationObject, ) = resultApiCall(dispatchers.io) { val event = RecommendationEvent( StartObject( diff --git a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt index bc7887411..0325c1e98 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/UpdateHomepage.kt @@ -4,12 +4,10 @@ import com.kafka.data.feature.homepage.HomepageRepository import com.kafka.data.feature.item.ItemRepository import com.kafka.data.model.ArchiveQuery import com.kafka.data.model.booksByIdentifiers -import kotlinx.coroutines.async -import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.withContext import org.kafka.base.CoroutineDispatchers import org.kafka.base.domain.Interactor +import org.kafka.base.extensions.mapAsync import org.kafka.domain.interactors.query.BuildRemoteQuery import javax.inject.Inject @@ -43,7 +41,3 @@ class UpdateHomepage @Inject constructor( } } } - -private suspend fun List.mapAsync( - mapper: suspend (T) -> R, -): List = coroutineScope { map { async { mapper(it) } }.awaitAll() } diff --git a/domain/src/main/java/org/kafka/domain/interactors/UpdateRecommendations.kt b/domain/src/main/java/org/kafka/domain/interactors/UpdateRecommendations.kt new file mode 100644 index 000000000..d9825ce0b --- /dev/null +++ b/domain/src/main/java/org/kafka/domain/interactors/UpdateRecommendations.kt @@ -0,0 +1,40 @@ +package org.kafka.domain.interactors + +import com.google.firebase.auth.FirebaseAuth +import com.kafka.data.feature.item.ItemRepository +import com.kafka.data.feature.recommendation.RecommendationRepository +import com.kafka.data.model.ArchiveQuery +import com.kafka.data.model.booksByIdentifiers +import com.kafka.remote.config.RemoteConfig +import com.kafka.remote.config.isRecommendationRowEnabled +import kotlinx.coroutines.withContext +import org.kafka.base.CoroutineDispatchers +import org.kafka.base.domain.Interactor +import org.kafka.domain.interactors.query.BuildRemoteQuery +import javax.inject.Inject + +class UpdateRecommendations @Inject constructor( + private val dispatchers: CoroutineDispatchers, + private val firebaseAuth: FirebaseAuth, + private val recommendationRepository: RecommendationRepository, + private val itemRepository: ItemRepository, + private val buildRemoteQuery: BuildRemoteQuery, + private val remoteConfig: RemoteConfig, +) : Interactor() { + + override suspend fun doWork(params: Unit) { + withContext(dispatchers.io) { + val uid = firebaseAuth.currentUser?.uid + val isRecommendationEnabled = remoteConfig.isRecommendationRowEnabled() + + if (uid != null && isRecommendationEnabled) { + val ids = recommendationRepository.getRecommendationItemIds(uid) + if (ids.isNotEmpty()) { + val query = ArchiveQuery().booksByIdentifiers(ids) + val items = itemRepository.updateQuery(buildRemoteQuery(query)) + itemRepository.saveItems(items) + } + } + } + } +} diff --git a/domain/src/main/java/org/kafka/domain/observers/ObserveRecentItems.kt b/domain/src/main/java/org/kafka/domain/observers/ObserveRecentItems.kt index ab0d56ed5..4c6f3bb56 100644 --- a/domain/src/main/java/org/kafka/domain/observers/ObserveRecentItems.kt +++ b/domain/src/main/java/org/kafka/domain/observers/ObserveRecentItems.kt @@ -15,9 +15,6 @@ import org.kafka.base.CoroutineDispatchers import org.kafka.base.domain.SubjectInteractor import javax.inject.Inject -/** - * Interactor for updating the homepage. - * */ class ObserveRecentItems @Inject constructor( private val dispatchers: CoroutineDispatchers, private val accountRepository: AccountRepository, diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index 3ee58d19c..f57292bfc 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -42,7 +42,6 @@ import org.kafka.common.logging.LogCompositions import org.kafka.common.widgets.FullScreenMessage import org.kafka.homepage.components.Carousels import org.kafka.homepage.components.ContinueReading -import org.kafka.ui.components.LabelMedium import org.kafka.ui.components.MessageBox import org.kafka.ui.components.ProvideScaffoldPadding import org.kafka.ui.components.item.GenreItem @@ -75,12 +74,10 @@ fun Homepage(viewModel: HomepageViewModel = hiltViewModel()) { AnimatedVisibilityFade(visible = viewState.homepage.collection.isNotEmpty()) { HomepageFeedItems( homepage = viewState.homepage, - recommendedContent = viewModel.recommendedContent, recommendationRowIndex = viewModel.recommendationRowIndex, showCarouselLabels = viewModel.showCarouselLabels, appShareIndex = viewState.appShareIndex, openItemDetail = viewModel::openItemDetail, - openRecommendationDetail = viewModel::openRecommendationDetail, openRecentItemDetail = viewModel::openRecentItemDetail, removeRecentItem = viewModel::removeRecentItem, goToSearch = viewModel::openSearch, @@ -110,13 +107,11 @@ fun Homepage(viewModel: HomepageViewModel = hiltViewModel()) { @Composable private fun HomepageFeedItems( homepage: Homepage, - recommendedContent: List, appShareIndex: Int, recommendationRowIndex: Int, showCarouselLabels: Boolean, openRecentItemDetail: (String) -> Unit, openItemDetail: (String) -> Unit, - openRecommendationDetail: (String) -> Unit, removeRecentItem: (String) -> Unit, goToSearch: () -> Unit, goToSubject: (String) -> Unit, @@ -129,19 +124,6 @@ private fun HomepageFeedItems( contentPadding = scaffoldPadding() ) { homepage.collection.forEachIndexed { index, collection -> - if (index == recommendationRowIndex && recommendedContent.isNotEmpty()) { - item(key = "recommendations") { - LabelMedium( - text = stringResource(id = R.string.recommended_for_you), - modifier = subjectModifier - ) - RowItems( - items = recommendedContent.toList(), - openItemDetail = openRecommendationDetail - ) - } - } - if (index == appShareIndex) { item { MessageBox( @@ -219,6 +201,13 @@ private fun HomepageFeedItems( } } + is HomepageCollection.Recommendations -> { + item(contentType = "row") { + SubjectItems(collection.labels, false, goToSubject) + RowItems(items = collection.items, openItemDetail = openItemDetail) + } + } + is HomepageCollection.Grid -> { item(key = collection.key, contentType = "grid") { SubjectItems(collection.labels, collection.clickable, goToSubject) diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index 2f6fcf796..1bb66a237 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -1,15 +1,10 @@ package org.kafka.homepage import android.content.Context -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.kafka.data.entities.Item import com.kafka.data.model.SearchFilter import com.kafka.remote.config.RemoteConfig -import com.kafka.remote.config.isRecommendationRowEnabled import com.kafka.remote.config.recommendationRowIndex import com.kafka.remote.config.showFeaturedItemLabels import dagger.hilt.android.lifecycle.HiltViewModel @@ -24,8 +19,8 @@ import org.kafka.common.UiMessageManager import org.kafka.common.collectStatus import org.kafka.common.shareText import org.kafka.domain.interactors.UpdateHomepage +import org.kafka.domain.interactors.UpdateRecommendations import org.kafka.domain.interactors.recent.RemoveRecentItem -import org.kafka.domain.interactors.recommendation.GetRecommendedContent import org.kafka.domain.observers.ObserveHomepage import org.kafka.domain.observers.ObserveShareAppIndex import org.kafka.domain.observers.ObserveUser @@ -42,14 +37,13 @@ class HomepageViewModel @Inject constructor( observeShareAppIndex: ObserveShareAppIndex, private val updateHomepage: UpdateHomepage, private val removeRecentItem: RemoveRecentItem, - private val getRecommendedContent: GetRecommendedContent, + private val updateRecommendations: UpdateRecommendations, private val navigator: Navigator, private val analytics: Analytics, private val loadingCounter: ObservableLoadingCounter, private val remoteConfig: RemoteConfig, ) : ViewModel() { private val uiMessageManager = UiMessageManager() - var recommendedContent by mutableStateOf(emptyList()) val recommendationRowIndex by lazy { remoteConfig.recommendationRowIndex() } val showCarouselLabels by lazy { remoteConfig.showFeaturedItemLabels() } @@ -68,9 +62,7 @@ class HomepageViewModel @Inject constructor( observeShareAppIndex(Unit) viewModelScope.launch { - if (remoteConfig.isRecommendationRowEnabled()) { - recommendedContent = getRecommendedContent(Unit).getOrNull().orEmpty() - } + updateRecommendations(Unit).collect() } updateItems() @@ -98,10 +90,6 @@ class HomepageViewModel @Inject constructor( navigator.navigate(Screen.Profile) } - fun openRecommendationDetail(itemId: String) { - openItemDetail(itemId, "recommendation") - } - fun openItemDetail(itemId: String, source: String = "homepage") { analytics.log { openItemDetail(itemId, source) } navigator.navigate(Screen.ItemDetail(itemId)) From 956e57823928b095948709c7ec30d7d03525d75f Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 5 Sep 2024 17:58:11 +0530 Subject: [PATCH 30/33] Cloud function to fetch archive metadata and save in firestore --- functions/.eslintrc.js | 16 +- functions/index.js | 50 +- functions/metadata.js | 119 +++ functions/package-lock.json | 987 +++++++++++++++++- functions/package.json | 4 +- functions/recommendation/collaborative.js | 245 +++++ functions/recommendation/content_filtering.js | 264 +++++ 7 files changed, 1643 insertions(+), 42 deletions(-) create mode 100644 functions/metadata.js create mode 100644 functions/recommendation/collaborative.js create mode 100644 functions/recommendation/content_filtering.js diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js index b193520c6..0f4ce80cf 100644 --- a/functions/.eslintrc.js +++ b/functions/.eslintrc.js @@ -18,10 +18,21 @@ module.exports = { "eol-last": "off", "indent": "off", "max-len": "off", + "quotes": "off", + "comma-dangle": "off", + "object-curly-spacing": "off", + "semi": "off", + "padded-blocks": "off", + "no-multiple-empty-lines": "off", + "require-jsdoc": "off", + "arrow-parens": "off", + "guard-for-in": "off", + "no-unused-vars": "off", + "no-dupe-keys": "off", }, overrides: [ { - files: ["**/*.spec.*"], + files: ["**.spec.*"], env: { mocha: true, }, @@ -30,3 +41,6 @@ module.exports = { ], globals: {}, }; + + + diff --git a/functions/index.js b/functions/index.js index b2ffe00d9..6b09b8d66 100644 --- a/functions/index.js +++ b/functions/index.js @@ -79,4 +79,52 @@ exports.manualUpdateTopItems = onRequest(async (req, res) => { error: `An error occurred during ${type} top items update`, }); } -}); \ No newline at end of file +}); + +// Import the calculateCollaborativeRecommendations function +const { calculateCollaborativeRecommendations } = require('./recommendation/collaborative'); + +// http://127.0.0.1:5001/kafka-books/us-central1/manualCollaborativeRecommendations +exports.manualCollaborativeRecommendations = onRequest(async (req, res) => { + try { + await calculateCollaborativeRecommendations(); + res.json({ result: 'Collaborative recommendations calculation completed successfully' }); + } catch (error) { + console.error('Error in manual collaborative recommendations calculation:', error); + res.status(500).json({ + error: 'An error occurred during collaborative recommendations calculation', + }); + } +}); + +// Import the calculateContentBasedRecommendations function +const { generateContentBasedRecommendations } = require('./recommendation/content_filtering'); + +// http://127.0.0.1:5001/kafka-books/us-central1/manualContentBasedRecommendations +exports.manualContentBasedRecommendations = onRequest(async (req, res) => { + try { + await generateContentBasedRecommendations(); + res.json({ result: 'Content-based recommendations calculation completed successfully' }); + } catch (error) { + console.error('Error in manual content-based recommendations calculation:', error); + res.status(500).json({ + error: 'An error occurred during content-based recommendations calculation', + }); + } +}); + +// Import the fetchAndSaveMetadata function +const { fetchAndSaveMetadata } = require('./metadata'); + +// http://127.0.0.1:5001/kafka-books/us-central1/manualFetchAndSaveMetadata +exports.manualFetchAndSaveMetadata = onRequest(async (req, res) => { + try { + await fetchAndSaveMetadata(req, res); + } catch (error) { + console.error('Error in manual fetch and save metadata:', error); + res.status(500).json({ + error: 'An error occurred during fetch and save metadata', + }); + } +}); + diff --git a/functions/metadata.js b/functions/metadata.js new file mode 100644 index 000000000..69ef9c083 --- /dev/null +++ b/functions/metadata.js @@ -0,0 +1,119 @@ +/** + * make this curl request to fetch following fields from internet archive. + * + * https://archive.org/advancedsearch.php?q=kafka&fl%5B%5D=collection&fl%5B%5D=creator&fl%5B%5D=description&fl%5B%5D=downloads&fl%5B%5D=genre&fl%5B%5D=language&fl%5B%5D=mediatype&fl%5B%5D=name&fl%5B%5D=subject&sort%5B%5D=&sort%5B%5D=&sort%5B%5D=&rows=50&page=1&output=json&callback=callback&save=yes + * (use similar format to fetch these response fields but use another url to fetch response by giving item ids as below) + * API to fetch items using ids: + + https://archive.org/advancedsearch.php?q=identifier:(mehdi-hassan OR the-judgement_202408 OR in-the-penal-colony)&output=json&rows=200&page=1&sort=-downloads + * + +response = {"responseHeader":{"status":0,"QTime":44,"params":{"query":"(( ( (title:kafka^100 OR salients:kafka^50 OR subject:kafka^25 OR description:kafka^15 OR collection:kafka^10 OR language:kafka^10 OR text:kafka^1) ) AND !collection:(podcasts OR radio OR uspto))^2 OR ( ( (title:kafka^100 OR salients:kafka^50 OR subject:kafka^25 OR description:kafka^15 OR collection:kafka^10 OR language:kafka^10 OR text:kafka^1) ) AND collection:(podcasts OR radio OR uspto))^0.5)","qin":"kafka","fields":"collection,creator,description,downloads,genre,language,mediatype,name,subject","wt":"json","rows":"50","json.wrf":"callback","start":0}},"response":{"numFound":4737,"start":0,"docs":[{"collection":["opensource_audio","community"],"creator":"Kafka","description":"Kafka - Obra dos Sonhos (1989) - mp3 320kbps","downloads":77,"mediatype":"audio","subject":["kafka","kafka banda","kafka band","m\u00fasica brasileira","raro"]},{"collection":["opensource_audio","community"],"creator":"Franz Kafka","description":"Micro-Fiction by Franz Kafka. Recorded by Kafka Archives. Please note that this audio has inconsistent pauses due to an error in recording.","downloads":156,"language":"eng","mediatype":"audio","subject":["micro-fiction","short story","Kafka Archives"]} + * + * save this response in firestore collection called metadata. + * + */ + +const functions = require('firebase-functions'); +const admin = require('firebase-admin'); +const axios = require('axios'); + +const db = admin.firestore(); + +const removeUndefined = (obj) => { + return Object.fromEntries( + Object.entries(obj).filter(([_, v]) => v !== undefined) + ); +}; + + +exports.fetchAndSaveMetadata = functions.https.onRequest(async (req, res) => { + // Define a constant set of item IDs + const itemIds = 'munshi-premchand_202404,gumaan-ghazals,shayad-jaun-eliya,LekinByJaunElia,manto_202310,harishankar-parsai,gunahon-ka-devta-by-dharmaveer-bharti,the-stranger-camus,metamorphosis_librivox,invincible-compendiums,BadeGharKiBeti,brothers_karamazov_1002_librivox,the-myth-of-sisyphus_202407,ShaidByJaunElia,franz-kafka-the-trial,ghazals_ghalib_0809_librivox,khushboo-parveen-shakir,madame-bovary-gustave-flaubert_202407,the-handmaid-s-tale-graphic-novel-by-margaret-atwood,MahaGeetaByOshoInHindiPart1,gulaab-ke-phool,rabindranath-thakur-short-stories,ashadkaekdinhindi,crime_and_punishment_0902_librivox,yaani-ghazals,Godan-Hindi,HindiBhajansOfKabirByJagjitSinghOtherMp3,kafka-short-stories,AlbertCamusTheMythOfSisyphus,NamakKaDaroga,letterstoayoungpoetpdfdrive.com,TheKillingJoke_201804,nirmalvermameripriyakahaniyaanhindi,Manto-Kahaniyan-Hindi,beyond_good_and_evil_librivox,whitenights0000dost,gambler_1011_librivox,notes_from_the_underground,dli.sangeet.thumri.7,mushayre-jaun,farnood-adbi-duniya,dc-comics-batman-the-killing-joke_202103,07UskoManzilMilGayiUskoKinaraMohdRafiSonOfHatimtai,andhere-mein-radio-play,The_Comedy_Of_Errors_TOS,gunahon-ka-devta,letters_post_impr_1306_librivox,crimepunishment00dostuoft,tolstoy-by-premchand,romeo_and_juliet_librivox,FarnoodByJaunElia,sociedad-de-acomar-juguetona-1999-38,salems-lot-BBC,sbrief,GodanByPremchand,diiwan-e-ghalib,alloshobooks39883p,WaitingforGodotCBC1997_201902,KholDoThandaGosht-Hindi,naqsh-e-faryadi_202310,sherlock-holmes_202112,KafanPremchand,TheStranger,janan-janan-audio-book,MirzaGhalib-AHundredMoods,richdadpoordadwh0000kiyo_c5p7,mansarovar-premchand,short-stories-001,mahabharat_202408,in.ernet.dli.2015.551270,vaishnav-ki-fisalan,premchand-godan,parmatma-ka-kutta,the-yellow-wallpaper_202407,ost-english-metamorphosis-by-franz-kafka,in.ernet.dli.2015.446885,crime_punishment_1511_librivox,whitenightsother00dostiala,jadeed-urdu-poetry,GoodOmensBBCr4,lettertomyfather0000kafk,in.ernet.dli.2015.499492,problemsofphilo00russuoft,premchandshatranjkekhiladiauranyakahaniyaanhindi,short-stories_202408,mushayra-ahmed-faraz,lotrdragashtracked,PooskiRaatByPremchand,the-psychology-of-money-morgan-housel,krishan_chander,OSHOSambhogSeSamadhiKiAur,diiwan-e-ghalib-adbi-duniya,in.gov.ignca.279,meditationsofmar00marc_0,the48lawsofpowerpdfdrive.com,gitanjali_1002_librivox,classical-urdu-poetry_202408,anatomyofhumanbo1918gray,languageofflower00lond,dilli-ki-aakhri-shama,in.ernet.dli.2015.540781,prideprejudice00aust,ghulam-abbas_202311,YaniByJaunElia,animal-farm.sna,ThakurKaKuan,satya-ke-sath-mere-prayog,NineteenEightyFour_1953,an-era-of-darkness,suraj-ka-saatva-ghoda,AhmadFaraz,DhapolshankhMaster,savitabhabi,AnkhenByManto,AksEKhushboo,canvas-irfan,BoodhiKaki,idiot_mg_librivox,MadhushalaMannaDey,the-fall-camus,maut-ki-kitaab,evergreen-songs-of-gulzar-sahab-saintees-gaane-2020,lucknow-ki-paanch-raaten,sadhana_realisation_librivox,lettersofjohnkeats_1909_librivox,ikigai-the-japanese-secret-to-a-long-and-happy-life-by-hector-garcia-and-francesc-miralles-2016-2003,AnimalFarmByGeorgeOrwell,UsneKahaThaChandradharSharmaGuleri,GumanByJaunElia,nagraj-comic-book-collection,theimmortalsofmeluhashivatrilogy1,marvel-super-heroes-secret-wars-issue-1,richdadpoordadhindi,suitableboy0000seth,StoriesByPremchand,frankenstein_shelley,BecharaBhalaAdami,mehdi-hassan,atomic-habits,dream_psychology_librivox,neemkapedhindiedition,IllustratedClassicsMacbeth,pride_and_prejudice_librivox,udaas-chabutra,zikr-e-meer-adbi-duniya,kulliyaat-e-mir-adbi-duniya,anandmath_202408,Dhammapad,0D4784E34567V847,insha-karachi-may-1960,MaaByPremchand,antim-aranya-hindi-edition,PCShikariRajkumarMG,rashmirathi_202404,crime-and-punishment-fyodor-dostoyevsky-pdf,ramayan-urdu-children,019-ack-hanuman-english,sociedad-de-acomar-lo-mejor-de...-1997-873,savita-bhabi-english-hindi,daredevil-born-again,audio_poetry_39_2006,letterstomilena0000fran,dostoevsky_short_stories_2001_librivox,manchanda-bani-ghazals-adbi-duniya,mantokiutkrishtkahaniyan,APNIAPNIBEEMARIHINDIPARSAI,antonchekhovBBCr4,george-orwell-audio,tothelighthouse_2303_librivox,metamorphosis_1401_librivox,whatibelieve_1101_librivox,AntonChekhov-SelectedShortStories,behan-ne-chhote-bhai-se-choot-chudwa-kar-maja,UVVl_ashadh-ka-ek-din-mohan-rakesh,the-art-of-seduction-robert-greene,RamdhariSinghDinkerKurukshetra,three_men_boat_librivox,shayad-by-jaun-elia_202010,the_consolation_of_philosophy_librivox,lp_the-diary-of-a-young-girl_anne-frank-elinor-basescu,white_nights_1012_librivox,ThandaGoshtBySaadatHassanManto,sociedad-de-acomar-amor-mio-1999-236,ada-y-los-apasionados-vete-al-diablo-2000-273,HindiAudio-OshoPravashanOdioMp3,nirala_202408,tirichh,mohanrakeshmeripriyakahaniyaanhindi,agatha-christie-death-in-the-clouds,MandirAurMasjid,dostoyevskyshortstories_1310_librivox,godaan-by-munshi-premchand-ebook_202310,greatgatsby_2101_librivox,the-constitution-of-india-original-1950,DeewanEGhalib_201212,astronomyforamat00flam,atomic-habits-pdfdrive,bhagat-singhs-writings-in-hindi-pdfdrive.com,sylviaplathssele0000plat,in.ernet.dli.2015.380988,PehliBarishNasirKazmi,haunting-adeline,UsneKahaThaByChandradharSharmaGuleri,TobaTekSingh-Hindi,janeaustenbbcr42024feb,murder-on-the-orient-express_202202,MPDo.bailo.ki.kathaAC,basti-intizar-hussain,my-gita,jaise-unke-din-phire,the-fault-in-our-stars-john-green,mantothandaghoshtauranyakahaniyaanhindiedition_202002,storyofrobinhood00chic,BBC-presents-AlfredHitchcock,maila-aanchal-hindi_202408,Madhushala,history_christian_church_0906_librivox,shab-e-darmiyaan,PavitrQuranHindi,slavoj-zizek-less-than-nothing-hegel-and-the-shadow-of-dialectical-materialism-theoryreader,s01e00hhgttgdouglasadamsbbcboo,macbeth-2022,PeerEKamil,Bhagavadgeeta,brief_history_engliterature_0903_librivox,CasefilePodcast,marvel-comics-encyclopedia-new-edition,brotherskaramaz00dost,HarukiMurakamiNorwegianWood,harivanshmerishreshthakavitayenhindi,rahim-ke-dohe,ekpremkahanisaadathasanmanto_201907,harf-e-mautabar,Badli,cd_echoes_jagjit-singh--chitra-singh,dli.sangeet.thumri.1,DoBailonKiKatha-Hindi-Premchand,love_letter_collection_2008_0802_librivox,divaneghalib-v3,samuel-beckett-waiting-for-godot,dni.ncaa.SAK-381-AC,shakespeare_sonnets_ch,macbeth_0810_librivox,GulzarInPdfByMohsinAftabKelapuri,raat-bahut-hava-chali,MantoKayAfsaney,art_of_war_librivox,the-republic-of-plato-book-10,harariyuvalnoahsapiensabriefhistoryofh_201909,WatchmenCompleteCorrected,the-hidden-hindu,Nirmala-Hindi,CvBt_atma-katha-mohan-das-gandhi,malvikagnimitram-01,manga_Berserk,wonderfulwizardo00baumiala,kafkaonshore00mura_0,crimepunishment00dostiala,IdgaahByMunshiPremchand,iqbal-bano-ghazals,shell_osho,crimeandpunishment_1911_librivox,PremchandStreeAurPurush,adabi-interviews,unmasking-a-confident-trickster,Mundan,OshoTheBookOfSecrets,philosophy-nineteenth-century,modern_ghost_stories_0801_librivox,bhai-bahan-choda-chodi,kafan-premchand,radio-plays-hindi,odyssey_butler_librivox,Gaban-Hindi-Premchand,shelleypoems_lw_librivox,true_stories_celebrated_crimes_2301_librivox,WatchmenByAlanMooreAndDaveGibbons,last-performance-in-holland-1996,the-psychology-of-money-morgan-housel-z-library-1,savita,oxford-english-grammar-course-advanced-2011,hindi-audio-sex-story-kirayedar-ladkon-chut-gand,byomkesh-bakshi-ki-rahasyamayi-kahaniyan-hindi-edition-by-bandyopadhyay-saradindu-z-lib.org,ikigai-the-japanese-secret-to-a-long-and-happy-life-pdfdrive.com,udaas-naslein-adbi-duniya,in.ernet.dli.2015.346183,godaanmasterpiec0000muns,laila-majnu-radio-play,indianconstituti00aiyauoft,in.ernet.dli.2015.262150,RamayanAurMahabharat-Hindi-IbneInsha,MahaGeetaByOshopart2,bashirbadrmusafirhindi,DogaKaCurfewWww.nagrajcomicscollection.blogspot.com,savita-bhabhi-episode-71-pussy-on-the-catwalk,prince_pa_librivox,ChoohaAurMain-Hindi-HarishankarParsai,06-full-ramayan-sundara-kanda-by-mukesh,godan_202005,historyofenglish00comp,journalsofsylvia00plat_0,in.ernet.dli.2015.185152,12_creepytales_1206_librivox,castle01kafk,skvS_tin-ekant-by-nirmal-verma-1979-radha-krishna-publication-new-delhi,ada-y-los-apasionados-yo-te-queria-2018-757,osho-literature-in-hindi,PoemsByFaiz-Trans_VictorGKiernan-1971,madame_bovary_0809_librivox,sEAf_kamasutra-of-vatsyayan-with-hindi-trans.-by-ramanand-sharma-series-no.-4-bitthal-das-sanskrit-s,Kafan-Hindi-Premchand,gameofthronesill0000mart,kafka_galerie_librivox,to-kill-a-mockingbird_202107,problems_of_philosophy_librivox,3978-chanda-se-honga-wo-pyara-main-bhi-ladki-hoo,NuskhaERazaDiwanEGhalibKamil,osho-the-book-of-secrets-112-meditations-to-discover-the-mystery-within-st.-martins-griffin-2010,metamorphosis_1203_librivox,GeorgeOrwell-1984romanDeutsch,MansarovarPart1-Hindi-MunshiPremchand,alexander_great_ld_librivox,elephants-can-remember,it-ends-with-us-colleen-hoover-z-lib.org_202304,priyanshi-jain,AshtavakraGitaHindiAudiobook,MEENABAZARHINDI,anandi-ghulam-abbas,TheKiteRunnerPDF_201905,topishukla0000rahi,dhan-sampatti-ka-manovigyan-the-psychology-of-money-hindi-edition,RichDadPoorDadRobertKiyosakiAudiobookUnabridged,dojing12-d1,Episode11Final_201711,war_and_peace_01_librivox,verity-by-colleen-hoover_202401,Triveniyan-Hindi-Gulzar,harrypotterphilo0000rowl_j1k7,historyindiahin00cowegoog_202107,psychopathology_everyday_life_ms_librivox,GundaJaishankarPrasad,abhigyanshakuntalamdr.rajdevmishra,bhagwat-geeta_202112,11TheQuidditchMatch,deadpool-kills-the-marvel-universe-001-2012,sociedad-de-acomar-sociedad-de-acomar-2010-660,NzuV_rashmi-rathi-by-ramdhari-simha-dinkar-udayachal-rashtra-kavi-dinkar-path-patna,raagdarbarinovel00sukl,Qpbd_gunaho-ka-devta-by-dharmavir-bharati-bharatiya-gyanpith-new-delhi,Level41984_201407,yahudi-ki-ladki,patterndesignboo00dayl,french_revolution_1001_librivox,white_nights_librivox,richdadpoordadwh00kiyo_0,heer-ranjha-raadio-play,EPI63,jeth-se-chut-chudai-ka-maja-audio-sex-story,art_public_speaking_1101_librivox,adventures_holmes,puramanto-v1,Best_of_Rekha_Bhardwaj,raushni-ae-raushni,K.K.AzizTheMurderOfHistory,ChandradharSharmaGuleriJiKiKahaniUsneKahaTha,CharBete,oshosearch.net___tofind_more,premchand-manasarovar-1,hindustanigazlenkamleshwar,the-walking-dead-compendium-1-4,apology_plato_bn_librivox,PoosKiRaatPremchand,godofsmallthings00roya_0,romeoandjuliet_ss_0901_librivox,jaise-unke-din-fire-parsai-H,notesfromundergr0000dost_c7o5,afsana-hajra-masroor,existentialism_202302,meditations_0708_librivox,kiterunner00hoss_0,metamorphosis00kafk_0,idiot00whisgoog,PARKPLAYManavKaul,invisibleman_1209_librivox_cb,figuredrawingcom00hatt,narazhindi,OceanofPDF.comTheAlchemist,12RulesForLifeJordanB.PetersonAnAntidoteToChaos,gair-mard-chut-chudai-antarvasna-hindi-audio-sex-stories,in.ernet.dli.2015.307307,notesfromtheunde00600gut,usne-kaha-tha-chandradhar-sharma-guleri,Azubi-Teenies_01,metaphysics_1108_librivox,dni.ncaa.SAK-662_1-AC,in.ernet.dli.2015.397992,gCov_rashmirathi-by-ramdhari-simha-dinakar-patna-1967-udayachala,lajwanti-l-l-l-rajinder-singh-bedi,divine_comedy_librivox,kirtu-siterip-eng-savita-bhabhi-episode_202105,AhmadFaraz2,20210523_20210523_0901,TheLegendOfZeldaEncyclopedia,PremchandKiKahaniyan-Hindi-MunshiPremchand,beyond-good-and-evil_202105,krishna-the-man-and-his-philosophy-osho_202101,Tarkash,RaviShankarNYC1,OneHundredYearsOfSolitude_201710,new_20240626,sitara-e-safar,5_20210606_20210606,the-sherlock-holmes-society-of-london-presents,TheFall_421,abida-parveen,SavitaBhabhiEpisode2_201901,OSHOSambhogSeSamadhiKiAur_201603,comicxxxcarnalcomicsrebeccalord,manga_Girls_Saurus_DX,the-hidden-hindu-by-akshat-gupta-translation-in-hindi-volume-1,PutraPremByPremchand,ankhondekhapakistanhindi,kafkaonshore0000mura,velamma-ep-97-hindi-anyverselinks,roast-moose,ibne-insha-OK_compressed,1984_20220119,lp_a-selection-of-hindi-film-songs_kalyanji-anandji-mukesh,CamusAlbertTheStranger,mom-sex-story-mom-ki-chudai-bete-ne,oshomainkaunhun,in.ernet.dli.2015.442240,guleri-usne-kaha-tha,SambhogSeSamadhiKiOre-Hindi,batmanthelonghalloween1998digitalzoneempire,gandhisatyakesathmereprayoghindi,belljarbysylviap0000unse,Kurukshetra-HindiPoem-RamdhariSinghDinkar,mysticism-in-arabic-and-islamic-philosophy,lkdr-1-bade-ghulam-alimkhan-bhoopali-kamod,crime_punishment_3_1708_librivox,Sex_over_Sex_16,pili-chhatri-wali-ladki,a-little-life-hanya-yanagihara,MantoKe100BehtreenAfsane,COLLECTIONOFBESTSTORIESPREMCHAND,SufferingOfBeingKafkahebrew-Excerpt,suryakaa,kalishalwar,gandharva,the-stranger-albert-camus,TanhaTanhaBookspk.net,hunting-adeline_202307,le_mythe_de_sisyphe,ByShriRajendraDasJi,in.ernet.dli.2015.348947,sapiens-hindi-edition-audiobook_202407,BaapBetiKiChudaiAudioSexStory,AhmedFaraz,Badchalan,Kulyat-e-Iqbal,gOjJ_khattar-kaka-by-prof.-hari-mohan-jha-patna-1971-rajkamal-prakashan,hound_baskervilles_bn_librivox,ShivKumarBatalviHindYugm,how-to-paint-realistic-skin,iduh_rashmirathi-of-dinkar-by-kedarnath-singh-udayan-press,EkGadheKiVapasi,stephen-king_202206,savita-bhabhi-episode-30,Pleasure-mag-116,VardaanByPremchand,azadi-by-arundhati-roy,osho-hindi-books-scan,i-have-no-mouth-and-i-must-scream_202202,richdadpoordadwi0000kiyo,in.ernet.dli.2015.398567,oshoYoga,mushtaq-ahmad-yusufi,gulliverstravels1918swif,novelsoffyodordo12dost,WorldHistoryPatternsOfInteraction,metamorphosis00kupe,no-longer-human-dazai-osamu_202311,sex-matters-from-sex-to-superconsciousness-by-osho,YatharthGeetaHindiAudio,narishareerkerahashyahindi,AmritByMunshiPremchand,thousandsplendid00ho,23-kitne-pakistan-kamleshwar,nolongerhuman0000daza_m5l2,AppealKaJadoo,brotherskaramazo00dost,illustratedlondo00burn_0,ashadh-ka-ek-din-mohan-rakesh,SahajPath-Part1-Bangla,KholDo,thandagoshtmuqaddamamanto,power-les-48-lois-de-pouvoir-robert-greene,premchandboodhikakihindi,in.ernet.dli.2015.347952,letterstomilena0000kafk,HindiBhajansMp3-meeraKrishnaBhajan,thelawsofhumannaturebyrobertgreene2018,couldnotstop_1305_librivox,nayi-nazm-ka-safar,it-starts-with-us,mythsreimaginedbbcr4,cleopatra_0810_librivox,metamorphosis05200gut,the-hidden-part-1-book-in-hindi,poe-short-stories,indiainslowmotio0000tull,lp_classical-music-of-india_various,premchandrangbhoomihindi,GeorgeOrwells1984,AtmaKatha-Hindi-AmritaPritam,badegharkibetiauranyakahaniyaanhindi,kamasutra00vats,loomis_FIGURE_draw,the-lord-of-the-rings-bbc-radio-drama,threemeninboatto00jeroiala,lettertohisfathe0000fran,rich-dad-poor-dad-by-robert-t.-kiyosaki,MantosPrayer-English-SaadatHasanManto,ShayadByJaunEliaZemtime.com,37_20220328_202203,howtoreadabook1972edition,shakespeare_monologues_vol_1_librivox,hamlet_0911_librivox,fyodor-dostoyevskyfyodor-dostoyevsky,alf-laila-o-laila-ek-hazaar-ek-raatein,godofsmallthings0000roya_u4r6,the-book-of-women-osho,the-trial,songs_kabir_1006_librivox,Idgah-English-Premchand,GulliDanda,ek-aur-zindgi-mohan-rakesh,Hut33BBCr4,renu_compressed,dynasour,savita-bhabhi-episode-113,srinkhalakikadiyanhindi,JhamkatNadiyaBahiniLage,khatootighalib-v2_202008,aleeebrkt_gmail_20180622,easy_lessons_einstein_1103_librivox,aajkeprasidhshayarbashirbadrahindi,premchandkisarvashreshtakahaniyanhindi,TobaTekSingh,dickinson_poems_bm_librivox,trial00kafk_0,isbn_9780099590088,OrsonWelles_MercurySummer,dostoevskykierke00hubb,spider-man-batman-marvel-dc,unabridged-mahabharata-6-volumes-set-in-hindi-by-veda-vyasa-compressed,YogiKathamrita,velamma-hindi-episode-1,memoir_jane_austen_0805_librivox,thetrial07849gut,GunahonKaDevta,MunshiPremchandAfsane,Rafi-Lata-Collection,berserk-volume-1,isbn_9780679423157,sewasadan0000muns,RasidiTicket-Hindi-AutobiographyOfAmritaPritam,maavaraa-adbi-duniya,the-hidden_202310,na-ane-wala-kal-by-mohan-rakesh-1,collected_lovecraft_0810_librivox,mahatmabuddhakikahaniyanhindiedition,HINDISHAYARIBOOK,orgies-barbares-t-3-erich-hartmann,brushworkelement00huds,Mantra_357,osho-rajneesh-sambhog-se-samadhi-ki-or,NineteenEightyFour-Novel-GeorgeOrwell,MainNastikKyoonHoon-Hindi-BhagatSingh,the-book-of-gold-leaves-by-mirza-waheed,GraphicHorror,twisted-1.-twisted-love-ana-huang,mana-one-piece-digital-colored-comics,in.ernet.dli.2015.269141,albertcamusoutsi0000unse,itendswithus0000hoov,atomic-habits-james-clear-full-audiobook-bookclub-e-01,merchant_of_venice_1005_librivox,divaneghalib-v4,MirzaGhalib-Hindi,atomic-habits-perubahan-kecil-yang-memberikan-hasil-luar-biasa-james,ZeroToOneByPeterThiel,batman150,in.ernet.dli.2015.489953,Kulliyat-e-iqbalUrduOrCompleteCollectionOfIqbalsPoetryByAllamaIqbal,aimsee-metamorphosis_202110,Idgah-Hindi-Premchand,AhmadFaraz3,history_julius_caesar_1102_librivox,adventures_sherlockholmes_1007_librivox,Do-ladko-se-chut-aur-gand-chatwayi-antarvasna-hindi-audio-sex-stories,savita-bhabhi-qf069,savita-bhabhi-ep-04-visiting-cousin,invincible-collection,annakarenina1_1011_librivox,in.ernet.dli.2015.287638,frank-herberts-dune-saga-collection-books-1-6-by-frank-herbert,SawaSerGehun,ROMEOANDJULIETHINDI,megaclimax90,HOUSEOFHAMMER,invincibleultima0003robe,kirtu-indian-porn-comics-siterip-fsicomics,lp_his-songs-of-love-from-hindi-films_gulzar-bhupinder-kishore-kumar-lata-manges,buttman-volume-0401,TheFountainheadUnabridged,maus-a-survivors-tale-my-father-bleeds-history-by-art-spiegelman,hindi-meal,poe_poems_stl_librivox,before-the-coffee-gets-cold-9781529029598,EkMadhyamvargeeyKutta,velamma-episode-61-naked-cleaning,leo-third-grader,in.ernet.dli.2015.349882,communistmanifesto_librivox,why-i-am-a-hindu,36SasurAurMeriMummiKiChudaiAntarvasnaHindiAudioSexStories,KhushbooParveenShakirUrduShairi.com,steallikeartist10000kleo_z5o7,SavitaBhabhiPDFDrive.com1,rilke-rainer-maria-letters-to-a-young-poet,dli.sangeet.music.Rabindra,in.ernet.dli.2015.307296,albertcamusstran0000mcca,an-assorted-collection-of-jay-naylor-comics,brotherskaramazov2_1606_librivox,dni.ncaa.SAK-308-AC,ShadiKiVajahByPremchand,TTUBBCR4,sasukeretsuden,Ashleel,BukowskiPoems,cd_the-latest-ghazals-nazms_jagjit-singh-chitra-singh-chitra-singh-ja,lametamorfosis_2101_librivox,letterstoyoungpo00rilk,AnaathLadkiByMunshiPremchand,ernest-hemingway-the-old-man-and-the-sea,raven,dualism_202302,audiobook-thinkandgrowrich,rand-ayn-the-fountainhead,Watchmen1987,gulerikahaniyan,wg826,twisted_games,Kumarsambhav,dc-marvel-comics-batman-vs-punisher_202103,as_a_man_thinketh_mc_librivox,wandered_lonely_as_a_cloud_librivox,mohan-rakesh-shreshth-kahaniyan-by-rajendra-yadav,TheCompleteThinMan,midnights-children,artofalicemadnessreturnsPDF,dracula-2021,devar-ne-bhabhi-ko-maa-banaya-audio,frankenstein0000mary_d5f7,AutobiographyOfAYogiHindi,Mini_Sex-mag-05,gard-e-mehtaab-ahmed-mushtaq,YuvalNoahHarariSapiens1,rss_dune,westernphilosoph035502mbp,el-extranjero-albert-camus,terror_mystery_0707_librivox,MLKDream,short_history_2005_librivox,phaedo_1105_librivox,sex_life_gods_1208_librivox,the-48-laws-of-power_202301,ACountryDoctor,RaagDarbari_201707,art_war_ps_librivox,san_0788,dostoevskyletter00dostuoft,AllamaIqbalBooks,powerofyoursubco0000murp_c5j2,notesfromunderground_bn_librivox,DeputyCollector,juliuscaesar_1002_librivox,short_story_047_1102_librivox,elvis-presley_elvis-presley,CRIMEANDPUNISHMENTByFyodorDostoyevskyFULLAudioBookP.13GreatestAudioBooksV3,OSHOSadhanaSutra,Susheela,MahabharataEp01Beginnings,bhagwat-geeta_20200718,wet-and-wild-1998,hegels-aesthetics,gunaho-ka-devta,SADAKKEKINAREHINDI,audio_poetry_27_2006,Taboo_Old_and_Young_Adult_Photo_Magazine_July_2019,duniyamereaagenidafazli,biblecurious,the-book-of-man-osho,darkhorseekankahidastanhnilotpalmrinal,DanielKahnemanThinkingFastAndSlow,prince_librivox,527320845-the-wheel-of-time-books-1-10,vintage-hardcore-magazines-t-collection,rahimasumrazaautobioh,meditationsofmar00marc,ghost_stories_004_librivox,poems-by-pb-shelly,HindiBook-kabir-ke-dohe,proses_202010,10.-morenadas-enganchadas,AutobiographyOfAYogiByParamahansaYogananda_201903,horror_001_librivox,isbn_9780679420293,history-of-today-yuval-noah-harari-21-lessons-for-the-21st-century-vintage-2019,21.-a-wifes-confession-savita-bhabhi,OSHOEkOmkarSatnam,in.ernet.dli.2015.68346,FSFitzBBCr4,TheArtOfDying,TheArtOfWarBySunTzu,mohanrakeshpertalekizameenhindiedition,in.ernet.dli.2015.481205,TheProphetByKhalilGibran,indianindependenceactof1947susanmuaddidarraj_387_h,the-hidden-hindu-part-2,wealth_nations01_se,fahrenheit-451-by-ray-bradbury,atomichabitseasy0000clea,MahaGeetaInHindiByOshopart33,MasnaviRumiWithUrduTranslationByQaziSajjad,bhanje-ki-kartut-antarvasna-audio-sex-stories,TAOUPANISHADHINDIPDFOSHOBHAAG1,Pussy_Galore,mcamx238yimjggwf8dbc7voc9s9nf03gkai92jyx,SDBhi1407GitaPravachanBhagwatGeetaHindiGitaPravachanBhagwatGeetaHindiBhagavad,count_montecristo_1308_librivox,in.ernet.dli.2015.342327,hunchback_notre_dame_mn_libriox,autobiography_charles_darwin_am_librivox,Manhaj.Kalamullah,hindimahabharat1005055mbp,savita-bhabhi-ep-02-cricket,in.ernet.dli.2015.541036,shortstories00dost,duniyajisekahtehainhindiedition,the-psychology-of-money-by-morgan-housel-complete-book-in-hindi-audio,tome-02-tournage-amateur,dune-by-frank-herbert,heraldryfloralfo00colerich,ldpd_7138216_000,shakespeare-hamlet-john-gielgud-1948,hitchhikers-guide-to-the-galaxy-bbcr4,pack_20220328_202203,marvel-secret-wars-by-jonathan-hickman,in.ernet.dli.2015.347248,beauty_202302,plague00camu_khb,war_and_peace_vol1_dole_mas_librivox,a-hunger-artist,Holy-Quran-Urdu-Translation,TobaTekSingh-Hindi-Manto,IntroductionToIndianPhilosophy,kiterunner00hoss,CrimeAndPunishment-GraphicComic,midsummer_nights_dream_0806_librivox,it-ends-with-us-colleen-hoover-z-lib.org-1,sociedad-de-acomar-juguetona-flac,unabridgedjourna0000plat,cd_letters-to-a-young-poet_mark-zanter,BatmanTheKillingJokeDeluxeHCEdition2008MinutemenY2K,in.ernet.dli.2015.307256,ChaubeJi,metamorphosisv5_2005_librivox,apni-apni-beemari-hari-shankar-parsai-1,albert-camus-the-myth-of-sisyphus-vintage-2018,HindioldSongs_20170409,PanchParmeshwar-Hindi,OTRR_Sound_of_War_Singles,jungletaiteiCh8,antichrist_librivox_,in.ernet.dli.2015.552016,LaghukathaByManto,the-shadow-1941-hitlers-astrologer-1988-marvel-graphic-novel,in.ernet.dli.2015.261618,strangeralbertca0000unse,a_day_with_great_poets_1308_librivox,in.ernet.dli.2015.415754,TheStoryOfPhilosophyWillDurant,heartOfABrokenSoul,los-ronisch-traicionera-1996-642,1_20191103_20191103_1326,in.ernet.dli.2015.482229,7swoddvgji65fifc7r7fgotu5whhm67kgbttgslk,metamorphosis0000kafk_p0w0,YogaVasistha-VairagyaPrakaran-HindiAudioBook,JannatKPattayNovelByNimraAhmedComplete,the-hobbit-bbc-radio-drama,rahat-indori-poem-hindi,thinkgrowrichthe00hill,the-art-of-being-alone-solitude-is-my-home-loneliness-was-my-cage,priyanshi-jain_20230926_1609,Birthday-Sex,in.ernet.dli.2015.539069,Inner.Engineering.Hindi.Pdf,animalfarm00orwe_0,romeo-y-julieta-texto-completo,DostoevskyBBCr4,manga_AkiSora-v01,harrypotterdeath0000rowl_c0f9,chalu-ladki-se-phone-sex-chat,HPYes.sir,PoosKiRaat-Hindi-Premchand,OSHO-BhaktiSutra-Hindi-Audio,bhagatsinghwhyiamanatheist,steallikeartistj0000kleo,in.ernet.dli.2015.551015,PauloCoelhoTheAlchemist,dni.ncaa.SAK-1045_1-AC,ShaidJaunEliyaUrduShairi.com,Ulysses-Audiobook,KUPRINKIKAHANIYANHINDI,FriedrichNietzscheTheWillToPower,enlightenment_202302,bhai-ne-bahan-ki-gand-me-lund-diya,godaan-by-munshi-premchand-ebook,urdu_20190820,adventuresofsher00doylrich,TheStoryOfMyExperimentsWithTruth-MahatmaGandhi,sylviaplathbellj0000reif,Pleasure-mag-101,HindiIslamicBooks_MAE,TheGovernmentOfIndiaAct1935,SHIVPURANHINDI,in.ernet.dli.2015.539223,1984-george-orwell,AudioOrgasm,in.ernet.dli.2015.88942,in.ernet.dli.2015.402936,vagabond_201909,mythofsisyphus0000unse,thus-spoke-zarathustra,savita-bhabhi-ep-01-bra-salesman,bestwomenserotic00viol,kafka-on-the-shore-by-haruki-murakami,RABINDRARACHANABALI,the-forty-rules-of-love-elif-shafak,sadhana_0907_librivox,Gorwellbeutew1,OTRR_Crime_Classics_Singles,ost-english-crimepunishment00dostuoft,truestoriesofcrime_1808_librivox,letterstomilena0000kafk_u9s0,GoldenAgeOfMarvelComics,the-girl-in-room-105-chetan-bhagat,psychologyunders033255mbp,fountainhead00aynr_1,themeditationsofmarcusaurelius_1801_librivox,brothers_karamazov_v3_2002_librivox,sapiens_202112,kafka-on-the-shore-pt-i,the_911_report_librivox,TheCompleteWorksOfHPLovecraft_201412,4-bholaram-ka-jeev-parsai,collectedpoems0000plat,sharq-mere-shimaal-mein-part-3,twisted-hate-ana-huang,dark-psychology_202111,platos_republic_0902_librivox1,in.ernet.dli.2015.379036,notesfromundergr0000fyod,WaitingForGodot_886,selected_stories_fitzgerald_0902_librivox,TheArtOfSeduction1,Episode9WeAreBackTake2,franz-kafka-the-complete-stories,diariesofleotols00tols,and-the-mountains-echoed,sfdsj,The_New_Nude_Photo_Magazine_Premiere_Issue,wi8xbcrumjoa1z2smj96s2xq6wcowypg9omw322z,athousandsplendidsun,Anal_sex-mag-44,RichDadPoorDadListenTheCompleteAudioBookRobertKiyosaki,isbn_9780439064866,32_20200516,walkingdead00kirk_1,manga-demon-slayer-kimetsu-no-yaiba,colorclimaxmegaclimax77_201908,in.ernet.dli.2015.539020,cu31924013141985,in.ernet.dli.2015.351175,kama_sutra_1008_librivox,anthem_librivox,ibook_201705,B-001-014-606,WingsOfFireAnAutobiographAPJAbdulKalam3873,HornyStoriesComix04,detectivecrimebbcr4,straybirds015459mbp,lettertofather0000kafk_y6m9,novelsoffyodordo04dost,KabirKeDOHEByJAGJITANDKABIR,the48lawsofpower_201912,sophies-world-jostein-gaarder-z-library,themetamorphosis_version_4_1706_librivox,kamasutra-clara-morgane-le-livre,collector-sahiba-104,jane_eyre_ver03_0809_librivox,franco-rojas-y-su-grupo-sinceridad-tu-llamada-2000-293,MakingOfTheAtomicBomb,briefego00goghuoft,rag-darbari,it-starts-with-us-colleen-hoover-z-lib.org_20221128,eroticmanga0000unse,onehundredpoemso00kabiuoft,the-midnight-library-by-matt-haig_202406,Party_Girls_Vol._98_2016,ManuSmritHindi-GpDwivedi,the-trial-by-franz-kafka,MukhtasarSahiBukhariInHindiLanguageVolume-1To3Pdf,gitanjalisongoff00tagouoft,Gharjamai,sahihbukharisharifhindivol1.00010813_202004,peerekaamal.byumeraahmed,871-amazing-spiderman,FreedomFromTheKnownJ.Krishnamurti,confessions1_2_mg_librivox,StephenHawkingTheUniverseInANutshellBookFi,dni.ncaa.ICCR-27-AC,twisted-love-1,albertcamus-letranger-1942_20190820,hist_greece_bury2_0903_librivox3,ZindagiGulzarHaiPdfbooksfree.pk,the-orange-book-the-meditation-techniques-of-bhagwan-shree-rajneesh-by-bhagwan-s,cd_the-rough-guide-to-bollywood-legends-mohd._mohd.-rafi-asha-bhosle-mohd.-rafi-chorus,YeMeriNazmeNAhmedFaraz,no-longer-human-dazai-osamu,in.ernet.dli.2015.480857,bookoflife_1212_librivox,sonnets_librivox,HindSwaraj-Speech-03-1,AndThenThereWereNoneByAgathaChristie_201810,virginia-woolf-mrs-dalloway,deadpool-family,apni-apni-bimari-harishankar-prasad,lp_twelve-great-love-songs-by-chatma_ch-atma,Shayad-urdu-poetry-book,intelligentinves0000pysh,kulliyat-e-faiz-faiz-ahmad-faiz,Suno.Kahani,in.ernet.dli.2015.381795,cinderallagraphicnovel,TombRaiderAdult,CompleteAUDIOBOOKAnimalFarmBYGeorgeOrwell,Playboy_March_2015_ZA,the-psychology-of-money-audiobook-in-english-morgan-housel-ebook-on-description,lord-of-the-rings-10_202401,manga_Household_Affairs,sylviaplathsbell0000unse,OSHOAntarKiKhoj,LoveInTheTimeOfCholera,AmishTheOathOfTheVayuputras,lp_hindi-classical-songs-from-films_various-asha-bhosle-kamal-barot-khan-sahib,howtotalktoanyon0000lown_w4w8,invisible_man_librivox,diariesoffranzka00kafkrich,HindiBook-shrimadBhagwatGitaWithTika.pdf,princemac00machuoft,AutobiographyOfYogi,pyasi-punjaban-desi-bhabhi-ki-chudai-devar-se,oshotaotzu,sudama-ke-chaval-parsai-H,abhigyanshakuntalsanskrit,BoreByParsai,thousandsplendid00khal,TheSettingSunOsamuDazai,PanditHariprasadChaurasiaAtRamakrishnaMissionDelhi20140119,DehliKiAakhriShama,a-course-in-meditation-a-21-day-workout-for-your-consciousness-by-osho-z-lib.org,isbn_9780140455120,mlxde5yihgt41,in.ernet.dli.2015.307260,IndiaAfterGandhiByRamchandraGuha,completefrenchgr00fras,ashlil-film-se-nahin-chitt-se-mukti-hindi-talks-by-osho,NoamChomskyAudioLibrary,ASongOfIceAndFire5ADanceWithDragons,nayafat-ahmad-faraz,2017_20200226,powerofyoursubc00murp,cd_kamasutra_adassa,priyanshi-jain_20230926_1554,emma_solo_librivox,ultimate-spider-man-v-01-power-responsibility-2009-digital-f-kileko-empire,letterstoyoungpo0000rilk_g0m4,pritosho_1,ShikariAurateinBySaadatHasanMantoUrduShairi.com,RaviAliAkhbarRagas4,OshoVijnanaBhairavaTantra,the-palace-of-illusion,lettersoffyodorm00dostiala,dni.ncaa.SAK-158-AC,in.ernet.dli.2015.444467,diaryofawimpykidbookseriesbyjeffkinney_202004,baburnama017152mbp,punjahang,kupdf.net_the-subtle-art-of-not-giving-a-fuck_text,letterstoyoungpo00rilkrich,byomkeshbakshih,kulliyatghalib-v3,in.ernet.dli.2015.482124,pakistanthepartitionofindiabrambedkar1946_425_i,unset0000unse_n2l1,howtowinfriendsi00carn,ganjayfarishtay,crocodile_1607_librivox,41-anmol-kahaniya-41-priceless-stories-b-09-hw-3-klz-1-33_202112,OADTM001ADHYATMUPNISHAD01HgKvalitet,the-fellowship-of-the-ring_soundscape-by-phil-dragash,women00buko_1,hentai-no-15,UkhadeKhambhe,franzkafkabiogra00brod,UrduPoetryShayariIndianPakistaniPoet24,KhaufHorrorStoriesHindiUrdu,yani-by-jaun-elia,ThithurtaGantantr,HindiBook-the-secretInHindi,isbn_9780453677455,GunahonKaDevta-Hindi-DharamveerBharti,NayaSaal,in.ernet.dli.2015.442421,pharmacienne-la-hd,chesterfield_letters_1102_librivox,the-stranger-albert-camus_202407,dni.ncaa.ICCR-1473-AC,HindiSongsfamous-instrumental,romeo_juliet_1001_librivox,AshuddhBevaqoof,KulliyatEIqbalFarsiWithUrduTranslation,TheBookOfForbiddenKnowledge,deep-work-rules-for-focused-success-in-a-distracted-world-pdfdrive,srimad-bhagavat-mahapuran-2-volume-set-sanskrit-hindi,lccn_078073006991,politics_0802_librivox,simbaby_202102,possessed_1404_librivox,AshadKaEkDinMohanRakesh_201809,MUMMYHINDI,godan-by-munshi-premchand-gyannidhi.com,letterstomilena0000kafk_t2y2,illiad_0801_librivox3,KABULIWALA_201501,shakespeareworks09claruoft,Albert-Camus_Les-Justes,KamaSutraFor21stCenturyLovers100SexualPositionsEBook,HarishankarParsai,lucknow-ki-panch-ratain-ali-sardar-jafri,20210515_20210515,sex-god-method-2nd-edition.com,20230923_20230923_1528,KatraBiArzoo-Hindi,love_freindship_cs_librivox,beyondgoodandevil_1910_librivox,HowToTalkAnyone,MathnaviVol1-2UrduOrCoupletsOfDeepSpiritualMeaningsByJalaluddinRumi,PasEAndaazMausamByAhmadFarazUrduinpage.com,tab-kii-bat-aur-thi-parsai,yayatihindi,premchandgabanhindi,nagayan-sampoorna-collector-edition-full-hd,artofwar_1402_librivox,Geethmala,dr.ambedkaratmakathaevamjansamvadhindi,othello_1005_librivox,Adhyay6GeetaManovigyanOsho,King-children-of-the-corn,BooksSea.com1984,devar-ke-sath-sex,the-hidden-hindu-part-3,great_expectations_mfs_0812_librivox,in.ernet.dli.2015.349356,short_ghohor_001_librivox,los-ronisch-de-cbba-vol-01-1989,KongOfSkullIsland,kafkasmetamorphosis_20201130,complete_works_of_friedrich_nietzsche_vol3_2011_librivox,lawspower,the-daily-stoic-366-meditations-on-wisdom-perseverance-and-the-art-of-living-pdfdrive.com,HindiBookAstangaHrdayam,fiftyshadesofgre0001jame,fortyrulesoflove0000shaf_f2u6,fahrenheit-451-by-ray-bradbury_202201,RasidiTicketByAmritaPritam,TumAisiHiTohAcchiHoByAmandeepSinghHindiPoetryYQSwipeWrite,jaishankar-prasad-kavya-sangrah,SitaWarriorOfMithila,shayad-by-jaun-elia,fansadox-brothel,HorrorComics,Mrs.HicksTheKiteRunner,why-i-am-an-atheist,SherlockHolmesStories-DramatisedInHindi,lp_the-diary-of-a-young-girl_anne-frank-elinor-basescu_0,RyanKiteRunner1,550670-the-fault-in-our-stars-by-john-green-extract,powerofyoursubco0000jose,ghost_stories_001_librivox,anti-imperialist_twain_1210_librivox,india-that-is-bharat-9789354350047_compress,Ocean_in_a_Drop,godofsmallthings0000roya,best-of-mayfair-issue-60,Songs.PKKingOfGhazalJagjitSingh03ChithiNaKoiSandesh,norwegianwood00mura,wg966,socratesh,john_keats_selected_poems_lw_librivox,frost_selections_librivox,gov.uscourts.arb.750313,MansarovarPart2-Hindi-MunshiPremchand,HindiBookGandhiVadhKyoNathuramGodse,ihsa104,ggbb123,unknown0000unse_j2t3,ApniKarniByPremchand,franzkafkasmetam00bloo,timemachine_sjm_librivox,BeAawazGaliKuchonMainByAhmedFaraz,the-courage-to-be-disliked-how-to-change-your-life-and-achieve-real-happiness,apology_rz_librivox,TheAlchemist_410,KyaVeUnhen,BarelyLegalMagazine,Rain_without_clouds,LKDy_sophi-ka-sansar-of-justin-garder-hindi-trans.-by-satyapal-gautam-rajkamal-publications-new-delh,HGWellsBBCr4,bbc-radio-4-james-bond-collection,whymarry_1112_librivox,ulti-ganga-bhai-behan-ki-chudai-ki-audio-sex-story,audio_poetry_54_2006,AadhaarbyPremchand,Mein-Kampf2,kamleshwarpriyah,the-palace-of-illusions-com-v4-0,the-complete-works-of-osho.org,premchandkarmabhoomihindi,01BolKeLabFinalMIx,think-and-grow-rich-audio-book-full-version-hindi-by-nepoleon-hill-the-fina,unicorndancinggi0000faiz,AnnihilationOfCasteDr.B.r.ambedkar,aleeebrkt_gmail_201806,maine-apne-student-se-choot-chudai,SAMUELBECKETTWaitingForGodot,manga_Akira-FullColor-v01,peer-e-kamil-novel-by-umera-ahmed,1DhruvRomanHatyara,in.ernet.dli.2015.184806,the-courage-to-be-disliked_202210,atomic-habits-by-james-clear-,Pxlq_bina-divaron-ke-ghar-by-mannu-bhandari-akshar-publication-private-limited,book-of-wisdom_pdf,JFSP56,001-nagraj,annakarenina_mas_1202_librivox,khayyam-ki-madhushala-1935-bachchan-1,xVpW_kesari-prabodh-by-kesari-mahotsav-mandal-1931-marathi-laxman-balvant-bhopatkar-p,metamorphosisnew0000kafk,HindiBook-sabaSayanaEakMatByShriOsho,apostate-imam-deen-of-deception-libgen.li,pride_prejudice_krs_librivox,JustBeforeMidnightBBC,epaperpdf.download-it-ends-with-us-168,tragedyofmacwest00shak,zarathustra_0809_librivox,18_20211120,letterstofelice00kafk,lincolnvol1_1305_librivox,DotCompleteBBCr4,ShrimadValmikiRamayan-SanskritTextWithHindiTranslation-DpSharma10,PeerEKamilEngPdfStuff.blogspot.com,letterstoanartis013844mbp,Swaraj-Gandhi-1947-05-11,SpiderManComics_201310,28.FireAndBlood,HindiBookHindutvaVinayakDamodarSavarkar.,Mature_Ladies_Adult_Photo_Magazine_April_2018,UrduPoetry1,berserk-manga,barely-legal-april-2022,RTFM-Harp-940210,badhyabhumirutsab,doujing11-d35,BadeBhaisahib-Hindi-Premchand,bhagavad_gita_0803_librivox,SeventeenMagazineSylviaPlath1950,hindutva-vinayak-damodar-savarkar-pdf,childhood_russian_librivox,EinsteinAndOppenheimer2010,tradinginzonemas00doug,dni.ncaa.SAK-732-AC,YuvalNoahHarariSapiensUneBrveHistoirezLib.org_201905,platsd,intro_philosophy_history_dew_librivox,thousandsplendid00hoss,collectionofletters_2209_librivox,darkpsychology,OTRR_This_Is_Your_FBI_Singles,book-of-five-rings,TheBrothersKaramazovFyodorDostoyevskyPart3,Future.Sex.Issue.01,picture_doriangray_1012_librivox,in.ernet.dli.2015.403047,fellowship-of-the-ring-2023-version,Interracial_Adult_Photo_Magazine_November_2017,HowToDrawSexyAnimeCharacters,selectedshortsto00fran,talkingfilmsconv0000akht,Devar-se-chud-kar-Karwachauth-manayi-audio-sex-story,vagabond0000inou,bwb_KS-365-216,the-book-thief_202101,thekingofpornjohnholmesswedisherotican.310,PatniSePati,1984_thegraphicnovel,JaunBhuiayanKhele,arthla-sangram-sindhu-gatha-p-vivek-kumar,AnneFrank_446,Porno_Play_1,ThinkAndGrowRichPDF_201706,TedhiLakeerByIsmatChughtai,OSHOPremDarshan,no-longer-human-complete-manga,manga_Billy_Bat,ikigai_202310,SAHIRLUDHIYANVIHINDI,TrainToPakistan_201805,bhagatsinghwhyiamanathiest,InspiringThoughts-MahatmaGandhi,short_poetry_001_librivox,in.ernet.dli.2015.467025,Rpbi2013-09-17.radioPlaybackIndia,Lottery-Hindi-Premchand,annefrank00anne,megaclimax92,the48lawsofpowerbyrobertgreene1998,sasur-bahu-antarvasna-audio-sex-story,AdolfHitlersMeinKampf-CompleteAudioBookMp3,idgah-h-comic,incest-magazine-special-oedipussy-1,in.ernet.dli.2015.552094,agatha-75cf8c083b674137b88baad8f49bca68,KanzUlUmmal,diary_uboat_commander_mfs_librivox,Pussycat_01,dni.ncaa.ICCR-548-AC,sophiesworld0000gaar,cd_the-legend-mehdi-hassan-ghazals-from-fil_mehdi-hassan,audio_poetry_30_2006,SexBookUrdu,thehobbitaudio,Kulliyat-e-Dagh,the-mountain-is-you-transforming-self-sabotage-into-self-mastery-ryo-dr-notes,shiv-kumar-bbatalvi,sex_0810_librivox,LolitaVladimirNabokov,howtotalktoanyon0000lown,dorian_gray_librivox,28LikeARollingStoneLiveVersion320LameCbrEx,SindoLA_METAMORPHOSIS-EMERGENCE-HENSHIN-177013_English,Ramleela-Hindi-Premchand,manga_Velvet_Kiss,KAMASUTRA_201806,1891_collection_bt_librivox,poems_wm_blake_ss_librivox,lettertoyoungpoe0000wool,Bohni,dunwich_horror_1511_librivox,Snatak-Hindi-BachelorOfArts,20170802194455,secrethistory0000tart,PowerOfSubconsciousMind,HindiBook-chanakya-neeti-darpan,wano_lo.-thilakanche-kesaritil-lekh-part-4-by-n-c-kelkar-1930-marathi-kesari-maratha-,AashadKaEkDinByMohanRakesh,Peer-e-Kamil-eng,the-power-of-your-subconscious-mind-joseph-murphy-complete-hindi-audiobo,RajaGidh_201311,andrew-loomis-drawing-the-head-hands,098-ack-pundalik-and-sakhu-eng,AkhiriTohfaPremchand,the-idiot_202104,dni.ncaa.SAK-82-AC,gunahon-ka-devta-by-dharmaveer-bharti_202407,Sabhyata,a-good-girls-guide-to-murder-holly-jackson,dni.ncaa.ICCR-184-AC,fire-blood-by-george-r-r-martin,OshoOnVipassanaMeditation01,ikigaijapanesese0000garc,erotic-desires-volume-1-500,MahabharataEpisode4,briefhistoryofti0000hawk,hindswaraj.ambedkar.hindi.15,SangeetNatakMuseum,BehaveTheBiologyOfHumansAtOurBestAndWorst,IsteefaByPremchand,pictureofdoriang00wildiala,queen-the-platinum-collection-disk-1,mystery_yellow_room_0901_librivox,kamasutraofvatsy0000vats_y8y8,vagabond_202111,giftedhands00cars,the-power-of-your-subconscious-mind,in.ernet.dli.2015.483936,sunny-leone-wet-and-wild-xxx-imageset,Urdu-Ki-Aakhri-Kitab-By-Ibn-e-Insha,MoujzatanHundPaigaam,loveisdogfromhel00buko,Sports_Illustrated_February_20_2015_USA,Sandman_201906,vincentscolors00gogh,OSHOSapnaYehSansar01,neuromancer-william-gibson,cd_the-very-best-of-mehdi-hassan_mehdi-hassan,seventeen-dutch-387,dni.ncaa.SAK-662_2-AC,nearly-all-the-men-in-lagos-are-mad-damilare-kuku-z-library,ignitedmindsabdulkalamapj_879_e,compositions_202001,chacha-chaudhary,quran-roman-urdu-hindi,bachchandochattaneinhindiedition,happy_days_a_play_by_samuel_beckett,dli.ernet.292551,koi-deewana-kehta-hai-by-.-kumar-vishwas-z-lib.org,UsneKahaTha-Urdu-NationalBookTrust,MemoriesDreamsReflectionsCarlJung_201608,yt-1s.com-sleepy-sex-bakugo-katsuki-x-fem-listener-asmr-18,BatmanTheDarkKnightReturns03of041986,the-apothecary-diaries-light-novel-series,los-ronisch-regresa,TheDelhiSultanateAPoliticalAndMilitaryHistoryCambridgeStudiesInIslamicCivilization,Kuliyat-e-Iqbalurdu,NazeerKiShayri,RajivDixitAudioLecturesConvertInHindiTextSoftCopy,UltimateHitchhikersGuideToTheGalaxyTheDouglasAdams,bbc-radio-4-the-adventures-of-tintin_202105,beti-ne-baap-se-chut-chudai-story,letterstomilena0000unse,palaceofillusion0000diva,blood-meridian-no-page-numbers,men-only-v-65-08,blood-meridian-or-the-evening-redness-in-the-west_202402,andheri-nagri-opt-1,chaos-charles-manson-the-cia-and-the-secret-history-of-the-sixties-audiobook_202212,in.ernet.dli.2015.404232,principles-of-power-system-by-v-k-mehta-rohit-mehta,ooperneechedarmiyanmanto,rework0000frie,jackpot-11,in.ernet.dli.2015.269142,powerpolitics00roya,interpretationofdreams_1401_librivox,ihavenomouthimus0000harl,waitingforgodott00beck_0,TheSilmarillionIllustratedJ.R.R.TolkienTedNasmith,how-to-talk-to-anyone-hindi,paradise_lost_08083_librivox,dainikprernahindiedition,in.ernet.dli.2015.380057,sheikh-yameen-100-best-selling-self-help-books_202107,warofworlds00well_3,HindiBhajans-collection,mastery-by-robert-greene,cd_best-of-jagjit-chitra-singh-aah-ko-chah_jagjit-singh-chitra-singh-kuldeep-singh-ba,KarlMarxDasKapitalpdf,in.ernet.dli.2015.402115,why-i-killed-gandhi,Playboy_Venezuela_February_2016,ciadocumentscollection,the-48-laws-of-power_202111,federalist_papers_librivox,warandpeace030164mbp,Chalte-Ho-To-Cheen-Ko-Chaliye-By-Ibn-E-Insha,SabitaBhabhiBengaliEpisode2,god-of-fury-a-dark-mm-college-romance-legacy-of-gods-book-5-rina-kent-english-z-lib.io,storyofaristotlesphilosophy_2102_librivox,ChiefInspDoverbbcR4,completeworksofw00shakrich,white_nights,wit_humor_america1_1102,adventures_sherlock_holmes_rg_librivox,the-subtle-art-of-not-giving-a-f-ck_202406,in.ernet.dli.2015.464311,33TheThreeBodyProblemChapter33,107._20200327_202003,nadi-final,WingsOfFire,meinkampf035176mbp,philosophicaless00russ,ego-is-the-enemy-by-ryan-holiday-z-lib-o,Ashar1,ApradhAurDand-Hindi-CrimeAndPunishment,agatha-christie-dumb-witness,manualofeasterno0000orth_w8t0,emma_mt_librivox,how-to-talk-to-anyone-audiobook-in-hindi-communication-skills-book-summa,sociedad-se-fue-de-mi_202304,RebusCompleteBBCr4,MailaAanchal-TanveerZehraBukhari,sapiens-a-brief-history-of-humankind-audiobook-yuval-noah-harari-hd-audio-books-16,AshtavakraGitaEnglishAudioBook,jagat-mein-jhoothi-dekhi-preet-part-1-mr-jatt.com-1_202011,thinkgrowrichbyn00hill,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Vol._2,in.ernet.dli.2015.442173,lp_yaadon-ki-baaraat_r-d-burman-asha-bhosle-chorus-kishore-kuma,The_Four_Seasons_Vivaldi-10361,happydays_202001,houseofdeadorpri00dostuoft,oceanof-pdf.com-the-art-of-laziness-library-mindset,how-to-win-friends-full-audio-book-nepali-dale-carnegie-online-audio-converter.com,walden_librivox,lughaterozmarrahshamsurrahmanfaruqi,book-1-the-hunger-games_202311,modernhindipoetr0000unse,hustler-july-1980,Tamingoftheshrew_Shakespeare_TOS,QatilByPremchand,InSearchOfLostTimeCompleteVolumes,heaven-officials-blessing-vol-3-vol-4-mo-xiang-tong-xiu,LevNikolayevichTolstoy-SelectedShortStories,suitableboynovel0000seth,Playboy062009Ru,NoExit,notesfromundergr0000unse,zbih_rashmi-rathi-by-ramdhari-singh-dinkar-1954-shri-anjana-press-limited,cu31924014422020,satishchandrahistoryofmedievalindia,jagjitsinghghazal,PEEREKAMILP.B.U.HUrduinpage.com,wa939506_gmail_201806,in.ernet.dli.2015.482516,wg816,heera-lal-ka-bhoot,PlatoTheRepublicCambridgeTomGriffith,power_concentration_0810_librivox,iron-flame,stealingfirehows0000kotl,ArtOfSeduction,manssearchformea0000vikt_x0q6,voyage-en-profondeurs-hd_202102,chanakya-Neeti,worlds_best_mystery_1_librivox,trialanddeathofs00platiala,kirtu,wazayefenadeali_202001,NightMeditation,unset0000unse_o3y0,48Laws48,MeinKampfAudio,15PoemsOfDushyantKumar-Hindi-DushyantKumar,126-nagraj-dahankand,MahabharataEp23AmbasPlight,in.ernet.dli.2015.415890,ffs104,introductiontoma00russuoft,game_of_life_0911_librivox,Voice012_201603,thebestofrodoxbestof40yearsdanishhardcorecolorclimax,BholaramKaJivByHarishankarParsai_266,who-framed-roger-rabbit_202212,hunkarhindi,stonernovel0000will,sixofcrows0000bard,standthe,MenAreFromMarsAndWomenAreFromVenus,miracle-of-love-stories-about-neem-karoli-baba,inglorious-empire,TheLittlePrince-English,Chandaurmain,thomas-erikson-surrounded-by-idiots,vagabond_202108,KuliyatEMeerTaqi,idiot_part_03_04_jm_1511_librivox,alchemist_1207_librivox,boysvolumeonenam0000enni_h6j2,in.ernet.dli.2015.551022,call-me-by-your-name-andre-aciman,Bi-Sex,fp_Silent_Spring-Rachel_Carson-1962,in.ernet.dli.2015.444482,powerofyoursubco0000murp_e9e1,lettersofsylviap0002plat,FranzKafkaMetamorphosisebookfromProjectGutenberg,goddelusi00dawk,Finger1980D.D.TeoliJr.A.C.1,2013.122014.01PbItaly,PornPassBrazzers,twisted-lies-4,VForVendettaComics,beyondgoodandevi00nietuoft,126-nagraj-dahankand_202103,UltaDarakth-Hindi-KrishanChander,IlmBadiDaulatHai-Hindi-IbneInsha,dni.ncaa.ICCR-1726-AC,peer-e-kamil-english,SahajPath-Part2-Bangla,the-almanack-of-naval-ravikant,PakshiAurDimak,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi_202307,caminhoparawoodb0000robe,life_poem_21_dickinson,raj-comics-thrill-horror-set-1-in-hindi,Episode10_20170926,02.-mahabharata-volume-2,trial00kafk_1,dni.ncaa.SAK-320-AC,hustler-magazine-1990-1999,the-silence-of-the-lambs_202101,in.ernet.dli.2015.272126,trial00kafkrich,DaagKiShayari,Level4MurderOnTheOrientExpress_20140730_1417,ost-english-pictureofdoriang00wildiala,separacinconscie0000thom,Tazkirat-ulAuliyaByAttarurduTranslation,manifest-while-you-sleep-law-of-attraction-affirmations,TheGandhiStoryInHisOwnWords-MahatmaGandhi,mythofsisyphusot00camu,faiz-ahmad-faiz-aur-unki-shayri-prakash-pandit_20230915,13QuestLettersToAYoungPoet,AtlasOfHumanAnatomySixthEditionFrankH.NetterM.D_201803,metamorphosis-by-shindo-l-manga,Madhushala-Hindi-HarvanshraiBachchan,20th-century-boys-21st-century-boys-naoki-urasawa,in.ernet.dli.2015.281236,audio_poetry_3_2005,in.ernet.dli.2015.549420,DavidHareBBCr4,barely-legal-2021,war_worlds_solo_librivox,dead-mans-folly,Kasauti,creedsandy_gmail,first_love_mg_librivox,takayuki-takeya-drawings-arrangement-and-design,themetamorphoses21765gut,albert-camus-el-mito-de-sisifo,fyodor-dostoyevsky-crime-and-punishment-01-02,mancalledove0000back,TanhaTanhaByAhmedFarazUrduinpage.com,crimepunishmentc00dost,30ghoststories_1909_librivox,lIgd_sanskriti-ke-char-adhyay-by-ramdhari-singh-dinakar-1962-patna-udayachal-publications,MasnaviByRumiEnglishTranslation,Cats-200405,hNuK_chanakya-niti-with-hindi-and-english-translation-by-satya-vrat-shastri-bharatiya,fountainhead0000aynr,thealchemist_201908,nagraj-comic-collection,TheBellJar_194,mohammadrubel550_gmail_20151204_1036,1_20200516_20200516_1356,sociedad-album-desconocido-488,harukimurakaminorwegianwood_201912,nonfiction026_librivox,FRRB3,NauseaByJeanPaulSartre,Ambedkar_CompleteWorks,GuptDhan-Hindi,pratigya-pledge-b-09-hl-261-rp-09,count_monte_cristo_0711_librivox,01MadSciBespoke,secretofnagasboo0000amis,GBShawBBCr4,131049155-162497575382869-5073886964141735161-n,usatrilogybbcr4,best-of-mayfair-issue-25,heavy-metal-the-illustrated-fantasy-magazine-summer-1988,guman-by-jaun-elia,cd_ghazals-forever_various-artists-ghulam-ali-malika-pukhraj,toaz.info-fansadox-collection-173-wolfcreekpdf-pr_daf49bfe97679eea19c0b9ecbd8a2b27,KafkaKanzlerUndDaKnacktNichts,kny_vol_17-23,steal-like-an-artist,HindiGita,manualzilla-id-6059251,kafka_laerm_librivox,Taboo_Old_and_Young_Adult_Photo_Magazine_January_2019,jaya_20220620,Manto9LettersToUncleSam,EkGadhaNefaMein,art_of_money_getting_librivox,Mera.Jivan.Tatha.Dhyeya.by.Swami.Vivekananda.djvu,JurmOSazaByDostoevsky,Vivaldi-TheFourSeasonscomplete,KurukshetraDinkar,pratibhajidraupadihindi,constitution,studyinscarletsi08doyl,48lawsofpowercd1,pdf-savita,as_you_like_it_0902_librivox,black_magic_1710_librivox,multilingual_poetry_collection_001_librivox,the-boy-with-a-broken-heart-durjoy-dutta,236404182VladimirNabokovLolita,disgrace100coet,the-love-hypothesis-by-ali-hazelwood-5,gudarati-hayinichche-adbhuta-rati-by-adi-guduru-lo-res,ravan-samhita-1,the-silver-eyes-five-nights-at-freddys-graphic-novel-1-scott-cawthon-kira-breed-wrisley-z-lib.org,pirate45,LearnUrduPoetryEasily,discoveryofindiabyjawaharlalnehru,068-ack-tukaram_202010,manga_Futari_Ecchi,journey-to-the-centre-of-the-earth-by-jules-verne,sir-arthur-conan-doyle-a-study-in-scarlet,rich-dad-poor-dad_202106,annakareninatols00tolsiala,los-ronish-destrozas-mi-corazon-2001-601,Pleasure-mag-022,TereKhushbuMeinBaseKhatUrduShayariRajendraNathRahbar,007-khooni-yatra,foulplaybbcr4,Sadgati-Hindi-Premchand,age_reason_0910_librivox,indiafrommidnigh00thar,king_lear_librivox,velamma-episode-velamma-siterip-eng,kingdom_of_god_1004_librivox,ShivajiKonHota-Marathi-GovindPansare,HowToDrawComicsTheMarvelWay,mythofsisyphusot0000camu_j4j5,20210330_20210330_1641,Deewan-e-hafizfarsiWithUrduTranslation,premchandmangalsutrahindi,simon-sinek-start-with-why_201709,cd_greatest-hits-of-iqbal-bano-vol-1_iqbal-bano,TheStoryOfCivilizationcomplete,ramashankar-yadav-vidrohi,gktM_tar-saptak-agyeya,NewsQuiz6173,in.ernet.dli.2015.377578,OSHOAUDIOLIBROLASEMOCIONES,dli.ernet.436900,diwan_2004_librivox,essentialkafka0000john,BaapBadal,OSHO_Suno_Bhai_Sadho_Hindi,elon-musk-by-walter-isaacson,AGNIDEEKHSANIKOLAIOSTROVISKY,mantomeenabazarhindiedition,my-hanuman-chalisa,private-sex-magazine-cleopatra-orgias-sexo-mamadas-anal-porno-lesbianas-desnudas,1001HindiJokesEBook,kamasutra-idiots-guide,Thus_Spake_Zarathustra_Audiobook,dsc-girl-reshma-sex-chat,Superstars_of_Porn_01,gul-e-rana,oshosamadhikesapatdwar,project-mary-hail,TomtctwsgYear1-HarryPotterAndTheSorcerersStonem4bAudiobook,PauloCoelhoTheAlchemist1Of4,being-in-love-osho,the-two-towers_soundscape-by-phil-dragash,stranger0000albe_o7m3,2_20210725,beyondentreprene0000coll,Quran_Hin,in.ernet.dli.2015.301091,MaAarifEMathnawi,Lolita_523,HouToDrawExpanded,in.ernet.dli.2015.483757,kingdomofhappiness_2305_librivox,shrimad-bhagwat-geeta-hindi-sanskrit-gorkhpur-press,osho-es-dhammo-sanantano-027,the-rudest-book-ever_202404,onehundredyears000garc,osho-ego-sesli-kitap,TrialsofWarBBCr4,reworkchangewayy0000frie,m-rag-darbari-1,RamayanInHindiMp3ByShriMukeshJi,thelettersofapos40393gut,shelley-1888-frankenstein,isbn_9781590171998,20230414_20230414_0912,siddhartha_ap_librivox,kabirkedoheinhindiwithmeaning,audio_poetry_1_2005,in.ernet.dli.2015.307267,AkhiriTohfaByPremchand,2.bhagavatagitagitapressgorakhpur_201910,worshipping-false-gods-ambedkar-and-the-facts-which-have-been-erased-arun-shourie,10TheAlchemist25thAnniversaryEditionPauloCoelho,deewar-mein-ek-khidki-rehti-thi-vinod-kumar-shukal,TheWheelOfTime,PrincipalUpanishads,it-ends-with-us-by-colleen-hoover-z-lib.org.epub_202212,kinsley-david-2008-1997.-tantric-visions-of-the-the-divine-feminine-the-ten-mahavidyas,20240530_20240530_1133_1998,satyajitraythecompleteadventuresoffeludavol1.1penguinbooks_202002,hermann-hesse_siddhartha_gunther-olesch_anke-dreher_amy-coulter_stefan-langer_semyon-chaichenets,14TheCouncilOfElrond256_201810,pubmed-PMC3936183,20220606_20220606_1150,Bijak.Kabir.Saheb.with.Hindi.Tika,MereMunhMeKhaak-Hindi-MushtaqAhmedYusufi,24_20211123,completenietasch10nietuoft,268803571-mrutyunjay-marathi-novel-by-shivaji-sawant,dracula_ks_1608_librivox,riddlesinhinduismofambedkarb.hinditranslationbysurendraagyat_973_x,DCIStone1to6,jaishankar-prasad-ki-shrestha-kahaniyaan-hindi,20shortsfstories_1908_librivox,UdasNaslainByAbdullahHussainPdfbooksfree.pk,OrsonWelles-MercuryTheater-1938Recordings,in.ernet.dli.2015.263821,GitaHindi,es-dhammo-sanantano,AldousHuxleyBBCr4,48LawsOfPowerTrickin1,waitingforgodot0000beck,alhaudalkiveergathahindiedition,cycle-year-3-1-220520,in.ernet.dli.2015.464223,thedouble_1401_librivox,HindiAudioBooks,whatisart00tolsuoft,SSepisode15_201803,darius-foroux-think-straight-change-your-thoughts-change-your-life-darius-foroux-2017,Arsch_und_Fotze_02,littlelifenovel0000yana_p3t9,kuldeepemergencykiinsidestoryhindiedition,Cards_747,realsexforrealwo0000berm,the-swastika-earliest-known-symbol-thomas-wilson-7x-10,Nirvasan,friedrich-nietzsche_beyond-good-and-evil_helen-zimmern,dni.ncaa.SAK-570_1-AC,naturistlifed.d.teolijr.a.c.2,uglylovenovel0000hoov,WEALTHAffirmationsWhileYouSLEEPProgramYourMindPowerForABUNDANCE,stephen-king-it-audiobook,hhugsesgp2hm6oipkl8zq751hrm0rpo2hbf1fh6j,AmarbailByUmairaAhmed,quran-shareef-hindi-translation-anuvad-download,IndianPhilosophyVol.1,cham-tay-hoa-vang.sna,song-of-achilles,mantoke18gumshudaafsane,poems_every_child_should_know_librivox,rat-pashmeene-ki-urdu-gulzar,cards-on-the-table,poetics_librivox,UnderstandingComicsTheInvisibleArtByScottMcCloud,diet-mountain-dew_202202,the-art-of-seduction_202401,outsider0000camu_i2b3,ThePsychologyOfPersuasion,Samasya,Pulh_life-ahead-by-k.-krishnamurti-krishnamurti-foundation-india,games-people-play-the-psycholo-eric-berne,mahadevipathkesathihindi,Barely_Legal_2016_10_Original,Erotic_Desire_11,RoaldDahl_ServedTwist,KatieHimsBBCr4,josettesonawomantowomen,dracula_librivox,FQORAAN,sharaticharitraheenhindiedition,PartI_20150910,republic_version_2_1310_librivox,mountain_2023-04,ChristieStyles,little_women_0711_librivox,Maximum_Perversum-mag-51,stories_from_tagore_1911_librivox,RajaGidhByBanoQudsia-pdfbooksfree.pk,tuesdayswithmorr0000albo,onehundredyearso00garcx,B-001-004-443-ALL,ramdharisinghdin0000soni,twenty-four_hours_a_day_librivox,the-art-of-seduction-robert-greene_202306,MoorkhonKaSwarg-Hindi,best-of-mayfair-issue-33,landlady_2205_librivox,girl_boat_1109_librivox,little-stranger-a-dark-taboo-romance-leigh-rivers-english-2023-z-library,in.ernet.dli.2015.187760,DASBODH,general_intro_psychoanalysis_1403_librivox,Psychotronic_Video_36,MantraByPremchand,menwithoutwomens0000mura,KamayaniJaiShankarPrasad_201904,manga_Kanokon,RoeT_auto-biography-of-a-yogi-by-paramahansa-yogananda-yogada-satsanga-society-of-india-kolkata,thinkingfastslow0000kahn_b1q8,office-of-film-and-literature-classification_1200900.015,completestories00fran,podfic-it-ends-with-us,twisted-lies_202403,in.ernet.dli.2015.464304,chANakya-hindI-audio,sexual-fantasy-15,crux_2304_librivox,gonewithwind01mitc,it-ends-with-us-colleen-hoover-hoover-colleen,TheIdiotByFyodorDOSTOYEVSKYFULLAudiobook,SatanicIlluminatiBloodlines,WhyNationsFailTheOriginsODaronAcemoglu,camus-albert-stranger-vintage-1989,Pleasure-mag-098,dni.ncaa.SAK-280-AC,in.ernet.dli.2015.125150,missedensletters00edenuoft,khali-hai-abi-jaam-main-kuch-soch-raha-hoon-by-shayari-or-kahani,jdSi_kularnav-tantra-with-kalyani-hindi-tika-of-chitaranjan-malaviya-by-sudhakar-mala,smut0000unse,robert-glover-no-more-mr-nice-guy-id-353324692-size-612,berserk-volume-41_20231228,sapiensbriefhist0000hara,one-arranged-murder-chetan-bhagat-z-lib.org,YatharthGeetaHindi,a-thousand-splendid-suns-by-khaled-hosseini,one-hundred-years-of-solitude-gabriel-garcia-marquez-gregory-rabassa_201906,illustratedhomeb00powerich,consolationofphilosophy_2008_librivox,mindsetthenewpsychologyofsuccesspdfdrive.com,theromanceoflust30254gut,music_0802_librivox,TheGeniusOfTheCrowd,CelebritySkinMagazine,HotelNightShift,in.ernet.dli.2015.444089,Vanka-Hindi-AntonChekov,manga_Berserk-v02,atomic-habits-audiobook-atomic-habits-audiobook-in-hindi-atomic-habits-f,lettertofather0000unse_r3s9,crime_and_pun,SpiderManComics,how-to-draw-a-moving-pose-sexy-character-edition,yaaram-novel,5-akal-aur-bhains-renu,GODANHINDIPOETRYBOOKSigned,rashmirathi_202408,5FooledByRandomnessNassimTaleb,lustforlifestory00ston,velamma-episode-103,demon-slayer-kimetsu-no-yaiba-vol.-1,bbcr4chen,bprdvolume1hollo0000mike,ShowGirlzLatina2January202011,homeandtheworld_0908_librivox,volo-magazine-the-1st-indian-issue-2017-worlds-no-1-nude-art-magazine,poemsbyjohnkeats00keat,XxxPack_201707,101-things-i-learned-in-architecture-school,ThreeMistakesOfMyLife,sense_sensibility_ver3_ek,philosophy_fun_algebra_librivox,in.ernet.dli.2015.539251,sophiesworld00jost,dreampsychologyp00freuuoft,im_nobody_librivox,Zoo_Magazine_April_17_2015_UK,normalpeoplebysallyrooney,Psychotronic_Video_23,prince_bn_librivox,canterville-ghost-in-hindi-unabridged,commie-book,san_0940,mashi_1110_librivox,all-spiderman-comics,unset0000unse_w4r4,in.ernet.dli.2015.342300,in.ernet.dli.2015.483120,deepworkrulesfor0000newp,MahatmaGandhiSpeech,warren-vampirella-001.cbr,discworld-audiobooks,HindSwaraj.IndianOpinion.2.vol34,in.ernet.dli.2015.551322,isaac-asimov-the-last-question,quran-juz-1-hindi-anuvad-translation,TheBrothersKaramazov,hpmor,The7HabitsOfHighlyEffectivePeople_201809,DurgaKaMandir,HowToWinFriendsInfluencePeople,mantoboohindi,martyrs_of_science_1308_librivox,PornocracyBookComplete,memoirs_holmes_0709_librivox,bharatkasamvidhanhindi,salmanrushdiemid0000unse,osho_collection01,simbaroarsfromli0000disn,TombRaiderLiteAdult,pramoedya-bumi-manusia_20240531,Psychotronic_Video_38,chunkyassesvol.1no.1d.d.teolijr.a.c21,wNfs_shri-rama-rasayana-by-rajendra-chadrayan-sultanpur-1982-rashmirathi-sahitya-prakashan,HPBadchalan,sexualitypsychol00freu,manssearchformea00vikt_0,EconomicAndCulturalRelationsBetweenPakistanAndTheSovietUnionDuring,premchandnirmalahindi,deathofasalesmandavidsuchetzo,priyanshi-jain_20230926_1614,meri-shrestha-kavitayein-bachchan-1,emerald-table,TantraSutra,meditations_descartes_dew_librivox,tat-ki-khoj-parsai,TheMetamorphosisPg5200,XJudgeDreddX,the-best-of-penthouse-pets-volume-1,a-brief-history-of-modern-india-spectrum-2019,VikterFrankl_manIsSearchingForMeaning,Kabuliwala-Hindi-RabindranathTagore,diaryofwimpykidh0000kinn,the-stranger-albert-camus_202202,doujin_My_Daughter_Has_Been_Hiding_Mother_Daughter_Incest_Porn_Books...,cd_the-rough-guide-to-bollywood_various-artists-alka-yagnik-asha-bhosle-ch,finally-legal-2008-13-holiday,notesfromundergr00dost_0,in.ernet.dli.2015.271967,WhoAmI-RamanaMaharshiEnglishAudiobook,richard-dawkins-the-selfish-gene,in.gov.ignca.18598,in.ernet.dli.2015.272001,isbn_9789352661213,HarryPotter-hedwigTheme,puran_garuda,Madhushala_201607,mancalledove0000back_n8o6,tokillmockingbir0000leeh,quiet-the-power-of-introverts-in-a-world-that-cant-stop-talking-susan-cain_202007,return_holmes_0708_librivox,iyengarpatanjaliyogsutrahindi,lp_sylvia-plath-reading-her-poetry_sylvia-plath,faiz-ahmed-faiz-translations-by-v.-g.-kiernan-1971,possessednovelin00dost,wg250,agatha-christie-the-body-in-the-library,in.ernet.dli.2015.443782,WhoAmI-RamanaMaharshiHindiAudiobook,100m-offers,8thanniversary_1308_librivox,Chetan_Bhagat_-_2_States_The_Story_of_My_Marriage.pdf,playboy-the-celebrities,manic_doujin_00024,divaneghalib-v6,ariel-sylvia-plath-sylvia-plath-z-lib.org,walkingdeadriseo0000jayb,b7bhns71y7ea0wo7psnjev6xus9lewhzj1chp6nv,munshi-premchand-comic-h,does-it-hurt,how-to-draw-female-small-gestures-illustration-pose-collection-reference-book,hustlers-taboo-september-october-2020,letterstoyoungpo0000rilk,sammaxsurfinthehighway,xatar2007_yandex_1_201804,in.ernet.dli.2015.37875,ada-y-la-nueva-pasion-llorando-tu-partida-1998-846,TMBSR4,learning-to-silence-the-mind-wellness-through-meditation-osho,notesfromundergr0000dost_c9t2,AmishTripathiImmortalsOfTheMeluhaBookZZ.org,in.ernet.dli.2015.442174,Kuttaydogs,gov.uscourts.ilnb.1067210,thinking-fast-and-slow_202308,thinkgrowrich0000hill_i2s5,j-r-r-tolkien-lord-of-the-rings-01-the-fellowship-of-the-ring-retail-pdf,shayari,memoirsofsherlockholmesv3_1502_librivox,KhoyaPaani-Hindi-MushtaqAhmedYusufi,greatexpectation1890dick,dhammapada_0707_librivox,manga_Akira-c01,deathivanilyitch_1104_librivox,gyaru-doujin,the-fall-albert-camus-z-lib.org,hpAy_shamsur-rehman-farooqi-aur-tafheem-i-ghalib-criticism-urdu-rehana-akhtar,beowulf_te_librivox,sexnaturalhistor00rodg,AncientIndiaRSSharmaNCERT,bizarre-sex-05-1976,thelawsofhumannature,HindiBook-mahabharatPart-1,SigmundFreud,NAMAK,fucking-trans-women-mira-bellwether-october-2010.cleaned,whenpeoplearebig00welc,priyanshi-jain_20230926,joothanuntouchab0000valm,dozakhnamaconversationsinhellbetweenghalibandmantobyrabisankarbalarunavasinhatrans,hmv-7-epe-1458-ghazals,wutheringheights01bron,eyeofworld0000unse,alices_adventures_1003,GreatExpectationsUrduSyedIrfanAli,forrest.gumplevel3_201907,MahabharataEp11,manga-vagabond-vizbig-edition-vol.-1,i-have-no-mouth-and-i-must-scream_202112,jujutsu-kaisen-volume-01-pdf-room_202401,cathedralscastle00erla,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Vol._1,ulyssesshake1927,whitenightsgentl0000dost,warpeace3498tols,EkGadheKiVapasi_974,littlelife0000yana,oppai_images,tlotrunabridged,GulzarAllam,mangamag_Weekly_Playboy,ZeldovichYaglomHigherMathematics,the-mahabharata-set-of-10-volumes,Balbharati,KahaniNachiketaKiKahani,TheHobbitAudiobook,greece_to_alexander1_0803_librivox1,HindiBhajanmp3-HanumanChalisaAartiyaan,TumanbayR42015,wisr8ein9zipfrh8r5q3cnysvvhtqmk7g9srgepc,Pocket_Porn_Special_15_The_Best_Of_Cum_3,threemeninboatto00jerorich,your_invisible_power_2104_librivox,in.ernet.dli.2015.454650,how-to-talk-to-anyone_202107,deathofivanilyic0000tols,AlanGarnerBBCr4,multilingual_short_works_020_poetry_prose_1810_librivox,wayofkings0000sand,ramayana_book1_0211_librivox,gitanjali00unse,mas-addict-manga,whitenightsother00dost,super-skill-techniques-for-drawing-people-toshi,in.ernet.dli.2015.507759,raseedi-ticket-amrita-pritam,Batman201-250,priyanshi-jain_20230926_1544,magorkihindi,in.ernet.dli.2015.526357,BBCr4Brideshead,republicshorey01platuoft,naukarani-ke-pati-se-tan-ki-aag-bujhayi,camus-albert-la-peste,sketches_of_fair_sex_1010_librivox,kids-stuf-the-right-stuf-international-2000-catalog_202212,RTFM-Harp-950221,devdashindi,in.ernet.dli.2015.447169,WarOfTheWorlds1938RadioBroadcast256kbps,collection-bdfr-tout-herge-herge-tintin-et-les-autres-plus-de-57-albums,hentai-no-1,RapeOfTheMind-ThePsychologyOfThoughtControl-A.m.MeerlooMd,lp_vidai-geet-marriage-songs-from-films_various-asha-bhosle-chorus-geeta-dutt-jagj,AbnormalPsychologyLectures,the-setting-sun-dazai-osamu,glimpses_of_bengal_1903_librivox,EatThatFrogHF,ParichayRamdhariSinghDinkar,andrew-loomis-fun-with-a-pencil,HarukiMurakami,patanjali-yoga-sutra-by-osho-in-hindi-pdf-free-download-2,pran_20210209,HalfGirlfriendChetanBhagat,psychology_of_the_unconscious_2011_librivox,isbn_9780804137386,manic_doujin_00002,wg958,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi,logicalchess_movebymove,san1919kiekbaat,notesfromundergr00dost,bhagavadgitaasitisoriginal1972edition,agatha-christie-the-murder-of-roger-ackroyd,goldengatenovel00seth,darktower00king,ost-english-brave_new_world_aldous_huxley,open-mic-night-part-1,castlenewtransla00kafk,theimogenquydramas,bestrussianshort13437gut,ekaurathazaardeewane,vigyan-bhairav-tantra-hindi_202012,20210206_20210206_2026,meluhakemritunjayimmortalsof,humarimohabbatnazm,TheDiscoveryOfIndia-Eng-JawaharlalNehru,isbn_9781522025665,1989-jungle-emperor-coloring-book-by-showa-japanese,the_fault_in_our_stars,i-have-no-mouth-and-i-must-scream_20220202,ramcharitmanas_202204,harrypotterphilo0000rowl_k0s6,KafkasProcess,oceanof-pdf.com-reverend-insanity-c-1-2063-gu-zhen-ren,metph00cela,creatingwebpages00vand,ABDL-Hypnosis,PersonaNoSekaiPromo2013,hamlet2_1206_librivox,Maximum_Perversum-mag-12,rONv_ande-ke-chhilke-mohan-rakesh,cd_the-legend-mehdi-hassan-ghazals-from-films_mehdi-hassan,CallOfCthulhu,PoemsOfKabir,Murdarakshas,Eom97Porn247-DungForYou,Cats-199810,manga_AkiSora-v05,its-a-sin,TheBestOfClassicalMusicMozartBeethovenBachChopin...ClassicalMusicPianoPlaylistMix,ancient_greek_philosopher_scientists_0809_librivox,1_20210930_20210930_1307,adeline-duet-01-h.-d.-carlton-haunting-adeline-2021-libgen.li,wg1098,prideandprejudice_1005_librivox,HindiBook-shriRamChritManas-1.pdf,0144.4.3,franzkafkasmetam0000unse,sherlockholmeskilokpriyakahaniyanhindi,chomskyonanarchism_202001,AagKaDaryaByQuratUlAinHairder,tempest_1002_librivox,english_literature_1310_librivox,DurjoyDattaDattaDurjoyIfItsNotForeverItsNotLove2013PenguinBooksLtd,lifeofdickens_1712_librivox,dracula_1006_librivox,BlueboySept1984Vol91,crimen_y_castigo_2105_librivox,SwamiVivekanandaSwamiVivekananda1893Speech,01-pratham-khanda-siddhartha-gautam-bodhisatva-buddha-kase-zale-bhag-pahila-janm,tales_chekhov_vol01_0906_librivox,PlatosRepublictrans.BloomText,buttman-volume-1405-original,bade-ghar-ki-beti-comic,houseofthedead_1311_librivox,PRIDEANDPREJUDICECOMICHINDI,PanchtantraKiShresthaKahaniyan,SurajKaSatvanGhoda-Hindi-DharamveerBharti,lp_classical-songs-from-films_various-asha-bhosle-khan-sahib-amir-khan-l,osho-es-dhammo-sanantano-065,theycalledusenem00take,the-power-of-habit-hindi-book-life-feeling,WealthOfNationsAdamSmith,05_20211108_202111,Nuts_2010-02-26,kafkaselectedlet0000fran,lp_mughal-e-azam_naushad-chorus-lata-mangeshkar-mohd-rafi-s,hindi-story-audiobook,manic_doujin_00039,edgequestionseriesjohnbrockmanthisexplainseverythingdeepbeautifulandeleganttheor,ShikwaAndJawab-e-shikwa,savarkar-yancha-athavani_by_renavikar,SahihBukhariHadithInUrduAllVolumes1-8,pir-e-kamil,norse-mythology_202201,the_sweetest_oblivion,1-shatter-me-destroy-me-unravel-me-fracture-me-ignite-me,death-on-the-nile_202203,pdfy-eJsc0BWsJFPlmB7O,poemsofrobertfro029898mbp,tuesdayswithmorr00albo_0,wuthering_heights_rg_librivox,vleu_saphal-manav-jeevan-vaidya-shambhu-nath-kaul,18_Wild_Vol.4_2016,80-20_202307,10-bramhananni-shudranna-adhogatis-kase-nele,AabEHayatByUmeraAhmedCompleteNovelZemtime.com,The_Psychotronic_Video_Guide_1996,amulet-8-supernova,whateverybodyissayingbyjoenavarro,ChhatrapatiShivajiMaharaj,sociedad-de-acomar-08-cuando-me-amara-s_202303,the-great-gatsby,NayafatAhmadFarazUrduShairi.com,chatursenvaishalikinagarvadhuhindi,relativity_librivox,Big_asses_90_Hot_and_sexy_girls,little_women_1101_librivox,TheHobbit_201905,fyodor-dostoevsky-richard-pevear-larissa-volokhonsky-crime-and-punishment,voyageout_1005_librivox,ShriRamcharitManasInHindiMp3ByShriMukeshJi,colorlesstsukuru0000mura_a1d0,RanjishHiSahiMehdiHassan,persuasion_0905_librivox,manga_BarefootGen-v01,WordForWordMeaningOfQuran3VolumeSet,lastnightofearth00buko,RaagDarbari,please-freeze-please,letterstoyoungpo0000unse,EverythingYouEverReallyNeededToKnowAboutPersonalFinanceOnJustOne,autobiographyst00gand,vol.-2_202104,hustler-usa-november-2004,terence-mckenna-complete-audio-archive,grey-fifty-shades-of-grey-as-told-by-christian_20200424,HusnaHiteshSonikFeatPiyushMishraCokeStudioMTVSeason2,AG3JumarKhutbaIslamerDristiteProcholitoVotePoddotiByDrMuhammadAsadullahAlGalibwww.jumarkhutba.com,Manzil-by-Shaykh-al-Hadith-Maulana-Muhammad-Zakariyya-r-a.pdf,bookofsecretssci0000osho,hayvanciftligigeorgeorwellkesmirlisamudra,genealogyofmoral00nietuoft,manga_Virgin_na_Kankei,in.ernet.dli.2015.346226,78_how-to-win-friends-and-influence-people_ruby-newman-and-his-orchestra-ray-norton-ri_gbia0158195a,overtime2_201907,mathematicalphilosophy_1508_librivox,poems_1706_librivox,Khomar-E-Gundom-By-Ibn-e-Insha,20230202_20230202_1325,penthouse-1978-10,lettersofvincent0000gogh,problemsofphilosophy_1706_librivox,cd_marasim_jagjit-singh-gulzar,it00king_1,NhaTaNuongTuKhongThichHopTH,dicrustBBCr4,fartherreacheso000masl,the-indus-valley-adventure,vikramovarshisanskritclassicshindi,goodnight-punpun_202312,hardcorehistory_20240414,podcast_diary-u-boat-commander-by_section-07_316938859,LalKitab1941,dni.ncaa.SAK-394_1-AC,if_kipling_librivox,stories-of-anton-chekov-1,hindswaraj.ambedkar.hindi.1,ammritaimarozaik0000tril,need-ka-nirman-fir-atmacharitra-harvanshrai-bachchan-1,GulliDandaByPremchand,Episode1-NovelChitralekhaByBhagawatiCharanBarma-2016-04-29ChisapaniNepal_201607,sociedad-de-acomar-08-cuando-me-amara-s_20230309,aqtujuhwcqeotfra1pfwrcex3j9s3ftp9h4ww5i8,1_20220306_20220306_1220,trialmetamorphos0000berk,AvadhutaGita-HindiAudiobook,RichDadPoorDadEBook_201803,VairagyaByPremchand,lifefatebbcr4,Hustler_Barely_Legal_March_2016,isbn_9788172341817,franco-rojas-y-su-grupo-sinceridad-prueba-de-amor-1999-314,across-the-spider-verse-the-art-of-the-movie,macbeth_1608_librivox,alcibiades1_1212_librivox,rawyouth00dostuoft,sleepstoriesadult,moby_dick_librivox,sociedad-de-acomar-juguetona,sexuallifeinanci00meye,wodehouse_shorts_1103_librivox,dni.ncaa.SAK-637-AC,best-of-mayfair-issue-17,fiftyshadesofgre0001jame_b2u2,CalculusMadeEasy,First_U_Think-11109276_atomic_habits,Krishna-Comic,trialpenguinmode00fran,howtowinfriendsi00carn_2,FinanceBehindTheVeilOfMoney,batmanyearone0000mill,adultmagazinsundarjivanbengali,MichaelFordLuciferianWitchcraftGrimoireOfTheSerpent,powerless-lauren-roberts-english-2023-z-library,DhanYatra-Hindi-MushtaqAhmedYusufi,manga_BokuraNoHentai-v01,hardrainfalling00carp_1,TheGodConspiracyOsho,the-kite-runner_202311,MarathiGita,podcast_bibliophilia_the-trial-by-franz-kafka_380824444,trial0000fran_y1i8,rbjd7ukszhk9sbtc7oodiddaqfmxbp3cgcfx85gu,bhagvadgeeta,MuhammadAliJinnah,journalsofsylvia00plat,biography-of-bhagat-singh,trial00kafk_2,the-return-of-the-king_soundscape-by-phil-dragash,3_20200517,AagKaDariya-Hindi,verwandlung_mw_0811_librivox,isbn_9780006550686,ShrimadBhagwadGeeta,house-of-leaves-by-mark-z.-danielewski,yogasutras1917edition_2008_librivox,girlwhoknewtoomu0000khan,Amritvani1,in.ernet.dli.2015.446967,agatha-christie_the-mysterious-affair-at-styles,stoner0000will,demon-slayer-kimetsu-no-yaiba_202312,ThreeMenInABoat,ahistorychristi01cheegoog,PCBalak,23_20200406,harrypottersorce0000rowl_h8m5,mrutunjay,lifeandlettersof00sanbrich,jaishankartitlihindi,maila-anchal-kannada-renu,theidiot02638gut,tuesdayswithmorr01997albo,Cheating_Housewives_USA_Vol._99_2016,kiterunnerriverh00khal_0,in.ernet.dli.2015.378435,LolitaAudioBook,18_Wild_Vol.96_2015,6WayPornBrasilAndPornMexico,frauds_forgeries_fake_news_2101_librivox,alice_in_wonderland_librivox,hanuman-chalisa-mahaviri,dni.ncaa.SAK-570_2-AC,JamesBondAudioBooks,the-malgudi-days,hari_om_tat_sat,sense_sensibility_1207_librivox,Sahaba.Kalamullah,The.Ramayana.of.Valmiki.by.Hari.Prasad.Shastri,abroadcranethoma00craniala,isbn_9780143418955,ageofrevolutiona00breu,in.ernet.dli.2015.101166,Das_Schloss_Franz_Kafka_1953,manga_Jungle_Taitei,lp_songs-to-remember-from-hindi-films_various-asha-bhosle-hemant-kumar-lakshmi-s,in.ernet.dli.2015.345847,in.ernet.dli.2015.484153,the-dictionary-of-body-language-a-field-guide-to-human-behavior-1,freedom-summer-hindi-audiobook,PrayaagShuklUsneKahaTha,NickMagPresentsWinter2006,1949SimoneDeBeauvoirTheSecondSex,ParayeGhonsleMein-Hindi-FyodorDostovesky,cd_gulistan-vol.-3_iqbal-bano,Psychotronic_Video_17,ASYOULIKEITHINDI,kripke-1980-naming-and-necessity,nonstop-agrremnt,SangamNusratjavedAkhtar,qhtt5motgvzw18aebyr0rag5pz8c0bpuqokowigc,TheFellowshipOfTherRingAudiobook,OldTimeRadio-1940s,manga_Ookii_Onnanoko_wa_Daisuki_Desu_ka,sisyphe-pdf-fr,colourpurple0000alic,the-adventures-of-captain-underpants,afterdark0000mura,evangelion-re-take-3-pt-br_202104,divanighalib-v9,twisted-hate-3,lessonsfromhistory-121224033058-phpapp01,shoedogmemoirbyc0000knig_m1k3,algebraofinfinit00roya,GirgitKaSapna-Hindi-MohanRakesh,merchantofvenrol00shakuoft,mayfair-lingerie-special-issue-38,young_adults_001_0907_librivox,csr049,manga_BillyBat-v01a,Bhagavad-Gita.with.the.Commentary.of.Sri.Shankaracharya,theremains-of-the-day-by-kazuo-ishiguro,premchandpremashramhindi,uglylove0000hoov,trading-in-the-zone-mark-douglas,11bajotumanto,godsgoddessesfro0000kama,a1544n,OSHO_Ram_Duware_Jo_Mare,heart_of_darkness,arabian_nights_01_0806,cainamystery_1503_librivox,being_earnest_librivox,RigvedInHindi,APJAbdulKalamIgnitedMindsPenguin,LeoTolstoyBBCDramaCollection,B-001-001-263,finally-legal-2009-01,artofwar3_pc_librivox,the-world-of-ice-fire,Barely_Legal_2008_08,warispeace00arun,shining-pdf,isbn_9780765377067,thought_vibration_ap_librivox,sal-mayweather-anti-politik,HindiPravachanMp3-shrimadBhagwatgeetaByPt.somnathSharma,rag-darbari-odia,20240429_20240429_1456,barely-legal-november-2022,GeetaiMarathiAudiobookHighQuality-Stereo,young-hustler-nl-42,wizardofoz_1001_librivox,eatthatfrog21gre00trac,cd_the-rough-guide-to-the-music-of-pakistan_various-artists-abida-parveen-adnan-sami-f,20201021_20201021_1105,demons00dost,ABRIEFHISTORYOFMODERNINDIASPECTRUM,FameistheSpurBBCr4,InterracialAdultPhotoIssue22017,MahabharataEp12,Swaraj-Gandhi-1947-12-20,think-and-grow-rich,nagraj-comics-collection,carnalcomicsjasminstclairecomixeroticsexhistoryofporn_201908,fightclub0000pala,adkar_up_by_ayoub-islam,a_good_girls_guide_to_murder_-_holly_jackson,studyinscarlet_0811_librivox,2-oedipus-at-colonus,ObeahSocietyOfBlackMastersMistressesD.D.TeoliJr.A.C.1,mythofsisyphusot0000albe,philosophybook0000unse,gabrielgarcamrqu0000unse_2002,AlfaazByMohsinAftabKelapuri,derfallalbertcamus1957_201907,LuckyLukeCollectionPDF,powerofyoursubc000jose,Cheri-2015,dni.ncaa.ICCR-1615-AC,SabhTonKhatarnaakPaashPunjabiLibrary,art-of-seduction-seema-anand,ps2_Avatar-_The_Last_Airbender_USA,dli.ernet.240835,TeluguMahatmaGandhiAudioFiles,midnightschi00rush,know-the-only-truth,40-rules-of-love,stories-of-vikram-betal,demon-slayer-chap-187,TheMonkWhoSoldHisFerrariRobinS.Sharma,jap-how-to-draw-girls-body-draw-a-sexy-girl-by-grasping-character-bone-and-flesh-sensation,in.ernet.dli.2015.308719,dni.ncaa.SAK-394_8-AC,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi-128k,surrounded-by-idiots,historyofcynicis032872mbp,Psychotronic_Video_05,ghasiramkotwalh,the-53-best-vintage-porn-movies,friendslovers00robe,siddhartha_1912_librivox,manssearchformea00fran_0,tobateksinghetc,Psychotronic_Video_35,NUTS_Magazine_7_June_2013,in.ernet.dli.2015.473553,crescent_moon_1608_librivox,JisKeHamMamaHain-Hindi-SharadJoshi,religionofmanbei027987mbp,san2020-142,hindi-book-hindutva-vinayak-damodar-savarkar.,insheepsclothing0000simo,hobbitortherebac0000tolk_a2n1,handbookofplantf00hatt,pdfcoffee.com_before-the-coffee-gets-cold-toshikazu-kawaguchi-pdf-free,zerotoonenoteson0000thie,hind_swarajya_mk_gandhi_2010,nationalism00tagorich,ComManifesto,batman-animated-1998-scan-stacalkas,dli.sangeet.thumri.4,20240325_20240325_0618,22immutablelawso00alri,amulet_202301,cu31924070625854,in.ernet.dli.2015.444123,in.ernet.dli.2015.282497,tom_sawyer_librivox,auaben0050,Batman50100,critique_pure_reason_0709_librivox,1_20191115_20191115,communist_manifesto_mfs_librivox,warriors-manga-graphic-novels,Erotica_Universalis,NancyFridayMySecretGardenWomensSexualFantasies,trattato-di-anatomia-umana-anastasi-vol.-1-versione-blu,delhikaekyaadgarmushaira,kafkathetrial00fran,jawahar-bhai-mahadevi-H,ADSu_ret-samadhi-geetanjali-shri,practical_guide_to_self-hypnosis_af_librivox,ricadaidapuarada0000kiyo,AgathaChristie12RadioMysteries,in.ernet.dli.2015.412039,thinkgrowrichb00kimb,dvoJ_sankshipt-shiv-puran-with-illustration-gita-press,PlatosSymposium,Namal,The_Art_of_Perspective_Phil_Metzger_Digital,logic_of_hegel_1610_librivox,wars_of_the_jews_0908_librivox,Amateur_MILF_Photo_Magazine_Issue_29_2019,SlaveGirlManualV1.4,limitless-upgrade-your-brain-jim-kwik,NutukMustafaKemalATATRKSesliKitap,Bar_Sex,Karmayoga11022017,TAOTECHINGEnglistHindiTranslation,osho-rajneesh-main-mrityu-sikhata-hun,sombra-digital-footprint,renderingsfromghalib,in.ernet.dli.2015.445873,the-handmaids-tale_pdf,happinessadvanta00acho,HarlandBBCr4,UNFAKCC,OTRR_Maintained_Magic_Island,NorteYSurParte1,sexy-housewife-gair-mard,App-Say-Kaya-Parda-By-Ibn-e-Insha,lp_safar_kalyanji-anandji-kalyanji-anandji-kishore,settingsun0000daza,zindaginaqaabchehre,war_of_the_worlds_librivox,Ahankar-Hindi,Anal_sex-mag-12,04-the-tallyman,book_irish_poetry_1911_librivox,MyBrother_201809,fireandblood,ShayariOnly,salammbo_1309_librivox,genghiskhan_1710_librivox,63_20211019_20211019_1744,journeytothewestwuchengen1592,ebookcomicenglisheroticcarnalcomicsadultfilmstarschessiemoore_201908,UsneKahaTha-Hindi-GrouchoMarx,spcl-0346-h-ec-katpit-ki-lakdi,sampuran-kav-sangreh,heal_20220819,lettersofemilydi00dick,3_20200517_20200517,pg000026,the-48-laws-of-power-by-robert-greene_202201,in.ernet.dli.2015.176580,Works_of_Sankaracharya_with_Hindi_Translation,dni.ncaa.SAK-303-AC,Aab-e-hayatByMohammedHussainAzad,unfortunatelyitw0000darw,20240122_20240122_1249,20240325_20240325_0619,in.ernet.dli.2015.20640,twelveangrypigs_bradford,studiesinamosque00laneuoft,oedipus_rex_1008_librivox,this_side_paradise_librivox,v-for-vendetta-by-alan-moore-david-lloyd,04.BHARTIYADARSHANCharvakDarshan,in.ernet.dli.2015.403425,economics_1408_librivox,the-complete-works-of-khalil-gibran,lesbrownmindset,AtmaSangeet,in.ernet.dli.2015.409708,sachnoi.vnHarryPotter1-HonDaPhuThuy,happydeath00camu,BriefLivesBBCr4,zero-to-one-peter-thiel-and-blake-masters,unset0000unse_e9a3,TheJoyOfSex,hum-hai-tohar-babita-bhabhi_201805,juggs-no.-01-1978-c,audio_poetry_149_2006,IISHRigVeda,odyssey00gare,memory_rm_librivox,poesia-completa-sylvia-plath-z-lib.org,00493HikayatERumi,in.ernet.dli.2015.430918,Acc.No.6472AdvaitaVedanta1976,never-split-the-difference-negotiating-as-if-your-life-depended-on-it_202101,frank-herberts-dune-saga-collection-books-1-6-by-frank-herbert-z-lib.org_202204,DaleCarnegieHOWTODEVELOPSELFCONFIDENCEANDINFLUENCEPEOPLE,audio_poetry_99_2006,Dragnet_OTR,DasteSabaFaizAhmadFaizUrdu,princessbride0000will,invincible-v-24-the-end-of-all-things-part-01-2017-digital-zone-empire,DiwanGalib,ashoka-h,pacifica_radio_archives-BC0515A,TwentyLovePoemsAndASongOfDespair-PabloNeruda,discworld_202007,37_american_poems_0908_librivox,kiterunnergraphi0000hoss_y8n1,namaz-kai-silsile-main-yousuf-ludhiyaanwi-sahab-kai-chand-aitrazaat-or-unke-jawabaat,104-106-a-thousand-splendid-suns,the-5-am-club,girp_friedrich-nietzsche-the-birth-of-tragedy-translated-by-shaun-whiteside-penguin-books,InkarParveenShakirPdfbooksfree.pk,one-piece-volume-1_202308,touhou-illustration-techniques-by-copic-painters-from-coloring-to-illustration-making,OsamuDazaiCollection,in.ernet.dli.2015.155854,yazeedazmanto,barely-legal-2022,TAOUPANISHADHINDIPDFOSHOBHAAG1_201802,Book2EnergyEnhancementRemovalOfEnergyBlockagesManagingEnergyConnectionsAndMasteryOfRelationships,the-rational-male,kidf6ithkfbpfhnribg00qol6kmy7unecedqrpkg,TFR76-PussyParty-GoregrindPornAssault,ArminianismVsCalvinism,KavitaChalnaHamaraKamHaiShivmangalSinghSuman,YaadonKaIdiotBoxWithNeeleshMisraSeason1_201710,AkabirKaRamzanByShaykh-ul-HadithMuhammadZakariyyaKandhelvir.a,ifwewerevillains0000riom,Psychotronic_Video_03,AlanMooreCollectionIVAmericasBestComics,dune_20230417,TanhaTanhaByAhmadFarazWww.urdunoveldownload.blogspot.com,ghalibkechandpehlu,bobbyfischerteacheschess,PIYUSHMISHRABySunil,riddlesinhinduismambedkarb.r._912_s,NotesOnAnarchism,Anandmath,NikolaTeslaKaJeevan-Hindi,Youth.Kalamullah_201405,LabyrinthLibrary182OneHundredYearsOfSolitude,macbethgraphicno0000mcdo,JMWH_shaha-aur-mat-by-rajendra-yadav-bharatiya-gnanapith-kashi,powerofyoursubco0000murp_q2m9,spcl-0374-h-ec-dracula-ka-hamla,in.ernet.dli.2015.539222,1q840000mura_l6c0,kamasutraeroticf00marc,DushyantKumar,franzkafkathemetamorphosisen,lolita-1v-2-verzauberte-jager,ghazaliyatifarsi,william-shakespeare-merchant-of-venice-in-hindi,HUST0318ALLReduced,oPYj_apane-apane-ajanabi-by-agyeya-bharatiya-gyanpith-publication,kamasutrailustradoanonimo,wet-dreams-2018z,compoundeffectmu00hard,y-2mate.com-mohamed-tarek-mohamed-youssef-ft-zia-mohyeddin-burdah-sarsabz-dua,the-cruel-prince-holly-black-z-library,chorichupe,3TheHandmaidsTaleByMargaretAtwood,untitled-document-2_202310,sevenhplovecraftstories_pc_librivox,in.ernet.dli.2015.347883,tsunades-sexual-therapy-tsunade-no-inchiryou-2007,five_sci-fi_piper_librivox,completeillustra0000vats,Mix.Kalamullah,ariel00plat,100yearsofsolitu00senn,travis-scott-utopia-2023,awaramasihahindi,shekharau_gmail_201509,in.ernet.dli.2015.400605,history-of-ancient-and-early-medieval-india,proposal_0901_librivox,ThinkAndGrowRichHINDIAUDIOBOOKChunk2,RigvedaSamhithaAudioAndTextBhashyam_KannadaLanguafe,HindiBookManusmriti,rawyouth_1808_librivox,audio_poetry_2_2005,how-to-win-friends-and-influence-people-audiobook-in-hindi,ghaliboudihindi,eroticliterature0000mulc,Anal_sex-mag-47,thegambler02197gut,prophet1_1901_librivox,fanny_hill_librivox,overtime_201705,genealogy_of_morals_1507_librivox,short_scifi_038_1007_librivox,leave-it-to-psmith-1981,in.ernet.dli.2015.446914,MatsyaPurana,AsantoshKeDin-Hindi,pratibharaikonarkhindiedition,wishes-h,themetamorphoses26073gut,arthurthekingbbcr4,CollectionOfHindiPoems,in.ernet.dli.2015.451816,best-of-mayfair-issue-58,sociedad-se-fue-de-mi,WhoWasDr.VictorFrankl-Hindi-Dr.HenriAbramson,dli.ministry.14636,tohfa-shaadi-ma-illaj-o-amraaz,beowulf,scanned-document-3_20200910,selectionsfromdi0000ghal,MiyamotoMusashi-BookOfFiveRingsgoRinNoSho,1-2_20230202_20230202,kathopanishad-01,TheWayoftheSuperiorMan,hmrio,IndrajaalVidya,the-illustrated-book-of-signs-and-symbols-1000s-of-signs-and-symbols-from-around-the-world,1606010047-the-bell-jar,savarkarsmrutibydamle,the-fourty-rules-of-love-rumi,OSHO_Kahe_Hot_Adheer,time-warp_202011,rogersheringhamBBCr4,ac-dc-live-at-caste-donington-england-august-17-1991-full-concert-hd-50fps,jekyll_and_hyde_klh_0904_librivox,lihaafthequilteng,play-best-blondes-2015,EbookVersionOfToKillAMockingbird,MuftiKaramatula20181,conflux-the-lost-girls-jordan-wakefield,ulyssesshakes1925dec_2,XscD_20th-century-english-marathi-dictionary-vol.-2-jangamwadi-math-collection,originofspecies00darwuoft,thuviamaidofmars_1308_librivox,mamu-ki-gand-chud-gai,best-of-mayfair-issue-32,1984-george-orwell_20220511,in.ernet.dli.2015.380325,in.ernet.dli.2015.514894,20201009_20201009_1927,SherlockHolmes01,30_20190930_20190930,GrossmanStalingradBBCr4,shaklexicon01schmuoft,RangilaGandhi_72,famous_men_greece_0805_librivox,thedivinecomedyb08789gut,dongritodubaisix0000zaid,TheKamaSutraOfVatsyayana,naughty-school-girls-spring-2020,king_in_yellow_librivox,thebet_1708_librivox,travis-scott-utopia-flac-24-bits-88200khz,sociedad-de-acomar-08-cuando-me-amara-s_20230309_0347,peerekamilnovelbyumeraahmed,ACMJ_H15,AwaaraGardKiDiary,hindu_book_of_astrology_jp_librivox,ZeroToOnePeterThielUnabridged,Van.gogh.paintings,the-fourth-wing-pdf,cercle-vicieux,isbn_9781091477155,Cats-199802,TheConspiracyAgainstTheHumanRace,QadirNamaGalibMushaihdRazvi,euthyphro_librivox,world-history-from-the-ancient-world-to-the-digital-age,ThreeQuestions_LevTolstoy,poemsbyemilydick030021mbp,tamas-by-sahni-bhisham,HaightAshburyFreePressVol.1No.61968D.D.TeoliJr.A.C.1,wg280,HaiKahaKaIradaTumharaSanamMp3NusratFatehAliKhan,TheWinnerStandsAlone,purely-18-2013-08,gilpinsspace0000bret,sigmund-freud-the-future-of-an-illusion,yesno056TheFrankenstoneaKidsRefugeFromTheAdult,AshtavakraGita-MarathiAudiobook,BasKiYatraHarishankarParsai,lolita00nabo_2,KhutbaBanglaNoboborshoUdzaponByProf.Dr.M.AsadullahAlGhalib07.04.2017,DrGideonFellBBCRadio,whitenightsandot36034gut,ImcOnairPresents...RagasGhazalsAndGoethe2009Part13,sylvia-plath,shaitan-ka-interview-hindi,TrappedBBCr4Series,unclesdream_1412_librivox,the-hobbit_202304,bookoffiverings0000miya_g5e4,personal_anthology_shakespeare_librivox,JoeJackson-1979LAFMWhiskyAGoGo,Real_World_Digital_Photography,in-my-pocket-hindi-audiobook,harrypotterchamb0002rowl,poorfolkgambler00dost,Puruskar-Hindi,serkishobbit,hustler-usa-september-2018,goddelusion00dawk,DeathComesDancingCelebratingLifeWitSatyaBhartiMa,hustler-09-2015,philosophyofimmanuelkant_2102_librivox,los-ronisch-de-cbba-vol-01-1989_202212,stuartlifebackwa00mast,shortstories40745gut,Dr.BabasahebAmbedkarWritingsAndSpeechespdfsAllVolumes,paldea-mom-edmun-pokemon-rule-34,Nude_Photography_The_Art_And_the_Craft,Namal01to10,MaarifulQuranEnglsih8Volumes,conversationswit0000roon_t0o7,soundcloud-porn-wjbbgg,babylonblue00davi,Poemsofemilydick00dick_201303,BankaZamindar,childhood_english_librivox,OneHundredYearsOfSolitude,TheCloaktheOvercoatAndOtherStories,326329839-hindi-book-santon-ki-bani-maharaj-charan-singh_202101,Tensai_Bakabon_1988_J,2012-05-09AllamaIqbalMedicalCollege,richestbbcr4,gandhiforgivenessh,18eighteen-2024,thingshiddensinc0000gira,psychologyofstoc00seldrich,the-chakra-book-osho,Pleasure-mag-085,howtotalktoanyonepdfdrive.com,fightclubnovel0000pala,playboy-02-2020-edition-allemande-special-digital-edition,in.ernet.dli.2015.275553,To_His_Coy_Mistress,A1_Angels_Sexy_Girls_Adult_Photo_Magazine_Issue_01_2017,the-judge-will-never-die,lapvona-a-novel-ottessa-moshfegh-z-library,the-kite-runner_202101,iwillteachyoutob0000seth,aye-mere-watan-ke-08.41mts-lata,Mount_Athos__Selection_Of_Orthodox_Chants_,howtocookeveryth0000bitt_u8w4,osho-english-discources-a-e,vinland-saga-v-01-13-2013-2022-omnibus-edition-digital-danke-empire,lalkitabist75_gmail,HarivanshraiBachchanKiKavitayen-Hindi-HarivanshraiBachchan,avatar-the-last-airbender-the-art-of-the-animated-series,the-secret-of-the-nagas-hindi-audio-book,conan-the-barbarian-1-24,love-sex-fear-death-the-inside-story-of-the-process-church-of-the-final-judgment,metamorphosis0000kafk_c1d6,slutsoundsepisode17,holyquran_wordbyword_urdutranslation_pdf,HISTORYOFWESTERNPHILOSOPHYBYBERTRANDRUSSELL1945,Serial-Killer-Zodiac,one-h,atomic-habits-book-pdf-in-hindi-1,AlpanaVermaHindiPoems,PurusharthParamDev,1984ByGeorgeOrwell_167,MortalKombatComicBookCollection,in.ernet.dli.2015.450381,17-do-bhai-premchand,andrew-loomis-creative-illustration,in.ernet.dli.2015.474575,AClashOfKingsAStormOfSwordsAGameOfThrones,smartgirlsguidet00blue,bwb_KR-492-829,john-steinbeck-of-mice-and-men,RiwayatEFalsafaStoryOfPhilosophy_201612,in.ernet.dli.2015.415872,MurderOnTheOrientExpress_201803,men-only-volume-86-number-3-february-2022,raccolta-su..-comic-art-selezione-di-liberi-e-copertine-b-n-e-tuttocolore-comic-,love-time-mag-porn,rs-catalog,majorworksofalbe0000unse,productionbookfo00bake,18-eighteen-magazine-2012-04-original,in.ernet.dli.2015.458873,city_worlds_end_1203_librivox,TheGreatBookOfBestQuotesOfAllTime,ultimate-marvel-earth-1610,i-too-had-a-love-story,Dean_Yeagle_Adult_Cartoon_Anthology,thebrontesisters_202301,ella-fitzgerald-75-original-recordings,avatarlastairben0000yang_t0n6,wg848,cd_lolita_bob-harris-hal-hopper-james-mason-nelson-r,OshoMusicFromTheWorldOfOshoCD005Song005RhythmOfLife,bim_eighteenth-century_a-letter-of-advice-to-a-_e-f_1721,Debonair_v05n30_1968-11,AutobiographyOfASpirituallyOsho,walkingdeadcompe0000robe,themuslimahsexmanualahalalguidetomindblowingsex,4.01.-appendix-a_202402,ShriShivaGitaAudioBookenglish,Amazing_Fantasy_vol1_15_201607,nby_82803,worldoficefireun0000mart,Erotica_07,bestlesbianeroti00clei,Psychotronic_Video_39,premchandkankaalhindi,Cats-199703,agni-ki-udaan,venchikparasayee0000shri,jaishankarprasadkishresthakahaniyaanhindi,u9d5pjjnp0wgaige4xmsb8fcqj2ulcqr5dz5vmm8,kILz_schoolom-ko-patra-part-2-by-j-krishnamurthy-2001-india-krishnamurthy-foundation-trust,from-cyrus-to-alexander-a-history-of-the-persian-empire,movementinstones0000unse,manic_doujin_00007,astavakr-mahageeta-5,animal-farm-by-george-orwell-book-summary-in-hindi-audiobooks-in-hindi,MysticalPoemsOfRumiArberry,GhulamAliGhazals25,UndercoverBBCr4,EkGadheKiVapasi2,bone-jeff-smith,pados-ki-didi-ke-devar-se-chut-chudai,02MythOfSisyphus,a-game-of-thrones-illustrated-edition-george-r.-r.-martin,kamasutraofvatsy00vatsuoft,Extreme_Special_15_Teeny_Exzesse,whyyoushouldread0000hawe,OTRR_Broadway_Is_My_Beat_Singles,hardrainfalling0000carp,OTRR_Secrets_Of_Scotland_Yard_Singles,masterybyrobertgreenesection1_201911,esave-dark-psychology,KarmbhumiPremchand,runaways_202303,03-06_202104,memoirs_sherlock_holmes_1007_librivox,VivekachudamaniHindiAudiobook,KuchhToDuniyaKiAbhishekTiwari,TheHouseBBCr4,mantothandaghoshtauranyakahaniyaanhindiedition,dictionaryofengl01johnuoft,2401862-takahashi-takuhai-saki-de......-anoko-wa-ijimerarete-boku-ni-haji-o-sara,manga_Henshin_Kafka,besturdubooks9,bIbf_usne-kaha-tha-aur-anya-kahaniyan-kailash-prakash,in.ernet.dli.2015.445586,TheFranklinCover-upByFormerGreenBeretJohnDecamp,Anal_sex-mag-08,puran_bhagwat,AksEKhusbooByParveenShakir,ultadarkhtkrishanchander,fire_and_ice_librivox,rigveda-hindi-dr-ganga-sahay-sharma,Underworld_Beaucoup_Fish_1998,redneck-land-comic,the-courage-to-be-disliked-how-to-change-your-life-and-achieve-real-happiness_202402,TOBATEKSINGHHINDI,Mature_Ladies_Adult_Photo_Magazine_November_2017,MadhurikeNaach,metamorphosisoth0000kafk,tragedyofromeoan00shakuoft,the-book-of-secrets-by-osho_202203,fyodor-dostoevsky-the-idiot-in-hindi_20240507,sayings_of_confucius_librivox,Speed_Gibson_Of_The_International_Secret_Police,cd_supreme-collection-greatest-ghazals_mehdi-hassan,ecsd-2981-2-yjw-776,how-to-draw-underwear,KhutbaOfProf.Dr.Ghalib-2,solo-leveling-complete,milkhoney0000kaur,marvel-comics-1939-1949_202204,TheBrothersKaramazovRoyMarsden,mostbeautifulwom0000buko,romeojuliet_v4_1502_librivox,HeresySeries10,IntroductionToCriminalPsychology,eroticapoems00kennuoft,Nazm-FaizAhmadfaiz,return_of_tarzan_rs_librivox,USPlayboy196803,Incest_01,in.ernet.dli.2015.378862,theantichrist19322gut,beyond-order-12-more-rules-for-life-by-jordan-b.-peterson,raseediticket,avatarlastairben0000koni,thecallofcthulhu_2206_librivox,billofrights_madison_0801_librivox,higher-engineering-mathematics,VA-DJ_Lavish_Lee_-_Sex_Playlist_2-2017,manga_To_Love-Ru_Darkness_Digital_Colored_Comics,AsrarEKhudiByAllamaMuhammadIqbalUrduTranslationUrduinpage.com,devkurnidraupadikimahabharat,HindiBookMan.Ki.Shaktiyan.Tatha.JivanagathanKi.Sadhana.by.Swami.VivekanandJi,secretofnagas0000amis,NekiByPremchand,sata-jones-why-we-fall-in-love-xxx-imageset,ColorClimax2,BBC_Radio_4_Extra_20190909_090000,TowardsUnderstanding1,AFREEKIKAHANIHINDI,harrypottergoble0000rowl_o3u1,jekyll_and_hyde_librivox,psychocybernetic0000malt_i3v2,Vijnana-Bhairava-Tantra,FREE_background_music_dhalius,GeorgeCragge,howtowinfriendin0000dale,isbn_9781906787370,WinkMagazineDecember1947D.D.TeoliJr.A.C.1,knightofsevenkin0000mart_o8q3,poorscholarcomed00nevi,famous_men_middle_ages_0802_librivox1,doglapan-by-ashneer-grover-the-hard-truth-about-life-and-start-ups-full,TheOldManAndTheSea-Eng-Ernest,gaban-premchand,ThreeGhostStories_201702,pubmed-PMC3847687,IhyaUlumAlDinVol1,TrollopeBBCr4,cheri-volume-288-march-2020,redneck-land,photo-album-sex-positions-techniques-64s,crimepunishmentb0000unse,a-pocket-full-of-rye_202201,OTRR_Richard_Diamond_Private_Detective_Singles,96p-franz-kafka-the-metamorphosis-archive.org,PKetkarGC,phantom_opera_1304_librivox,cd_propaganda-and-control-of-the-public-mind_noam-chomsky,moonwalkingwitheinsteinfoerjoshua_201910,ehlY_my-experiment-with-truth-by-m.-k.-gandhi-trans.-by-m.-p.-poddar-2011-daimond-books,Group_Sex,Letters,2041920aatmarpan1,DirkGentlyBBCr4,secret-history-of-the-thulegesellschaft,adult-film-music,ragdarbari0000jaym,zarathustra-48_202309,negar,arniedarlingstar00corb,JagjitSinghHindYugm,gandhisautobiogr01gand,raghuvanshsanskritclassicshindi,PeshawarExprss-Hindi-KrishnaChander,premchand-soze-vatan,in.ernet.dli.2015.348763,BishopFanniHall1977D.D.TeoliJr.A.C.1,tafsir-ibn-kathir-hindi,SilentHillComicBookCollection,AlienTheIllustratedStory,anna_karenina_deutsch_1610_librivox,www.VintageSense.com-Vintage-Indian-Music-38n,BestUrduBooks15,shakespeareshaml01shak,wings-of-fire-all-books,Chapter05DiagonAlley,solo_pride_librivox,fortyrulesoflove0000shaf,Maah-O-Saal-E-Aashnayi-Memoir-By-Faiz-Ahmed-Faiz,VEDAVEDAMVEDICYAJURVEDAKRISHNAYAJURVEDACOMPLETEAUDIOSAMHITAARANYAKABRAHMANAMSriK,injuryandinsult00dostgoog,CharlesDuhigg.ThePowerOfHabit_201808,the-nude-beach-field-trip,understandingmed00mclu,21-arcadia,audio_poetry_126_2006,sexincomics0000horn,ElonMuskTeslaSpaceX,KuliatEIqbal,Alan_Watts_67_Lectures,in.ernet.dli.2015.539108,aliceinwonderland_1102_librivox,blacklacequickie00vari,BuriAatma,sleazoid_202201,AudioBooksGeorgeOrwell19843Of14_201811,sex-education.480p,god_of_war_-_Rina_Kent_OceanofPDF.com,genesisbigbangdi00schr,AnimalFarm-English-GeorgeOrwell,TheHobbitAnUnexpectedJourney,master-your-emotions-a-practical-guide-to-overcome-negativity-and-better-manage-_202403,sex_20190913,amateurs-series-softcore-monica-rise-xxx-imageset,revolution-2020-hindi-by-chetan-bhagat,prideprejudice00austuoft,in.ernet.dli.2015.483139,hypnotism_alpheus_0906_librivox,Bill-Nighy-as-Charles-Paris-by-book-order,Anandmath-Hindi,permanent_husband_ls_1709_librivox,pus-k-i-rat-premchand-hindi-audiobook,MansarovarPart3-Hindi-MunshiPremchand,wauem_1986007,VijayByPremchand,Batman250-300,UrduBooks_201302,cognitiveneurosc02edgazz,devils_202111,premchand-gaban,dailystoic366med0000holi,notesfromundergr00dost_3,bwb_T3-AGI-129,deadpoetssociety00klei,howtowinfriendsi0000carn_k4n5,bookofsecrets1120000osho,HindiBookValmikiRamayanPartIByGitaPress,Dhumil,audio_poetry_210_2007,in.ernet.dli.2015.341905,IndianBackgroundFluteMusicInstrumentalMeditationMusicYogaMusicSpaMusicForRelaxation,MinhajEInqalabNabwiSALLAHOAliheWasSallam,briefhistoryofev00wilb,annefrank00fran_0,Hindu.Dharma.by.Swami.Vivekananda,20230717_20230717_1512,thusspokezarathu00nietuoft,communistmani00marx,chanakya-niti,Vincent_van_Gogh,in.ernet.dli.2015.464252,100ClassicalMusicMasterpieces,Psychotronic_Video_26,J.C.CatfordALinguisticTheoryOfTranslationOxfordUniv.Press1965,MansarovarPart8-Hindi-MunshiPremchand,bushido_0912_librivox,ThePowerOfNowEckhartTolle_201806,in.ernet.dli.2015.483556,JudgeDredd2000AD,ChetanBhagatOneIndianGirl2016,chankyanitiaudiobook,1_20200503_20200503_1440,Young_Lesbian,TalkhiyanUrduSahirLudhiyanwi,hardcore-history,the-48-laws-of-power_202405,love_letters_ehl,nha-gia-kim.sna,videooze-8-spring-1996-gorbag,jhootan1_201909,HindiBookTaantrikKiDiaryPdf,abrahamlincoln_1306_librivox,newmarketwizards0000schw,OldHindiFilmSongs-HappyMood,shabkhoon-v1,age_of_innocence_librivox,Psychotronic_Video_02,Frankenstein1818Edition,hitler-speeches,MansarovarPart6-Hindi-MunshiPremchand,dharmayoddha-kalki-avatar-of-vishnu-by-kevin-missal-book-drive.com,think-like-a-monk-979,think-and-grow-rich-hindi-pdf-book,laozi_tao-te-ching,tomb-of-sand-by-geetanjali-shree,introduction_to_metaphysics_0909_librivox,the_four_agreements,viktor-emil-frankl-mans-search-for-meaning,HalaahalHarivanshRaiBacchan1946,WTRU_srimad-valmiki-ramayana-of-maharshi-valmiki-with-hindi-trans.-part-2-sundara-khn,the-success-sutra,GulzarKiTriveniyan,antichrist02niet,bolt-action-second-edition-rulebook,gonefishinBBCr4,ShatruAgyeya,cosmos_201910,02MadSciBespoke,AllTheBrightPlaces_201805,AmrataPreetamAleHasan1972,in.ernet.dli.2015.489471,PedagogyOfTheOppressed-English-PauloFriere,san2020-263,03.-no-me-agas-llorar,GHALIBHINDI,DonHaworthBBCr4,sociedad-se-fue-de-mi_20230724,midnightschildre00rush,in.ernet.dli.2015.296518,the-god-delusion-audiobook,premvani,factotum00buko_1,cd_welcome-to-the-world-of-the-classics_various-artists-anton-lesser-benedict-flyn,it-starts-with-us-life-feeling_202307,h8gwptovqvoj6g9onhjqyil1fdzoleay6kfd0svv,greatgatsby0000unse_c4w8,ministryofutmost0000roya_p7b0,OgZO_hindi-gadya-ka-vikas-by-gyanendra-kumar-uday-shankar-bhatt-gulab-rai-dr.-satya-p,deep_in_the_quiet_wood_1504.poem_librivox,ekladkiekjaamamritapritam,what_men_live_by_librivox,zarathustra-48,Psychotronic_Video_11,hindu_yogi_science_breath_mj_1509_librivox,ruqone-and-tha-god-fahim-and-mach-hommy,in.ernet.dli.2015.415434,Batman150-200,deartheoautobiog00gogh,percy-jackson-the-complete-series,meditation-GeorgeHays,BBCMarlowe,kamasutra_202005,dli.sangeet.thumri.8,le-ke-aya-hoon-mein-kuch-mohabbat-ke-phool-nusrat-fateh-ali-khan,in.ernet.dli.2015.484154,kanch-ke-tukde-urdu-krishan-chandar_202101,mindsetnewpsycho0000dwec_g9z4,dr.strangeanddr.doomtriumphandtorment1989,TheSealedNectar-Alhamdulillah-library.blogspot.in.pdf,franzkafkaparabl00poli,PsychopathologyOfEverydayLife,scion-of-ikshvaku-ram-chandra-amish-tripathi,how-to-day-trade-for-a-living-andrew-aziz-wealthgif-1,KaisaBachcha-Hindi,theconsolationof00boetuoft,Arsch_und_Fotze_01,20200930_20200930_0317,isbn_9780692627044,mullanaseeruddinkianokhiduniya,crimepunishmentf0000unse,colleen-hoover-it-ends-with-us-2020-simon-schuster,pakistanthepartitionofindiabrambedkar1945_137_K,12th-fail-novel-pdf-in-hindi-download,booksihaveloved0000bhag,ramayanam-audio,clubi-2302,jillkellycarnalcomics,howtobakeeveryth0000bitt,AkeliSiByMannuBhandari,courage00osho,collectednovelso0000fran,WhatIsSufism-martinLings,OceanofPDF.comAnnihilation,kiterunnerportra0000beni,TheSpiderV26N03194204,strangecaseofdr00stevuoft,in.ernet.dli.2015.279506,newtonspmathema00newtrich,BBC_Radio_2_20160928_053000_The_Chris_Evans_Breakfast_Show,the_twilight_of_the_idols_librivox,Gheesa,ramdhari-rashmi,in.ernet.dli.2015.300710,Batman100-150,TumhariBaatByMohsinAftabKelapuri,BuddhaAndHisDhamma,hot-girls-40,KalaamEMirMirTaqiMir_201410,AmishTripathiShiva03TheOathOfTheVayuputrasepub,twopoetales_ce_librivox,BBCIAIR,JosephMurphyThePowerOfYourSubconciousMind1988,VeerSavarkarSpeech,08-pista-08,RudraPanchakamKeshavBhattJyotishi_201904,MaulanaJalauddinRumi,jaishankar-prasad-titli,Gulamgiri-Hindi-JyotibaPhule,franzkafkashorts0000pasl,pigthatwantstobe0000bagg_x9i1,juliuscaesar1908shak,romancing-with-revolution-life-works-of-faiz-ahmad-faiz,NuskhaHayeWafaByFaizAhmedFaizUrduinpage.com,shikariauratein,critique-of-pure-reason,shakespearehamlethindi,naughty-neighbors-vol.-28-no.-5-2023,1q840000mura_v3d3,ThirdLetterToUncleSam-SaadatHasanManto,01TintinInTheLandOfTheSoviets,RTFM-Harp-940524,pathological_lying_accusation_swindling_1010_librivox,Psychotronic_Video_19,AmarBailByUmeraAhmadUrduinpage.com,VishwaParichay-Hindi,hindishabdsagarp005058mbp,the-shadow-lines,elon-musk-walter-isaacson,in.ernet.dli.2015.444380,priyanshi-jain_20230926_1537,time_machine_0805_librivox,chandoba-marathi-all,MohanRakeshKiDiary,brotherlawrencep00lawr,warrenbuffetts3f0000pysh,001santo33a,MahadeviVermaKahaniGillu,my-seditious-heart,ShockCinema81996,notesfromunderg00dost,casey-kasems-american-top-40-the-70s_202205,MIT9.00F04,agad12,clashofkingsbook00mart_0,p04ylyyj,shayari_201705,h9wdqkfusglai3skmzilthrg2wtdrkrjciovygr2,disney-adventures-v13i4,andrew.chumbleyazoetia,KavitaSachinTumneKarDiyaKamaal,buttman-volume-09-02-original,revistasexybrasilfebrero2017,KabirDohe-Hindi-SantKabir,mwlxcdp8qywhafdbghc8my96tfq53uyldeduh6ws,ramkumarjourneyw0000sham,sexwithstrangers0000unse,SadUrduPoetry,neversplitdiffer0000voss,manga_Berserk-v13,vigyan-bhairav-tantra-hindi-book-osho,bagh-o-bahar,a_20210615_202106,SUT760_Tantra_01_Buddhism_Kirti_Tsenshab_Grounds,NUTS_Magazine_May_17-23_2013,YukioMishimaCollection,lolita-by-nobokov,the-ethics-of-liberty-20191108,prideandprejudi02austgoog,ideas-drawing-techniques-to-create-attractive-fantasy-characters,notesfromundergr0000dost_e5y3,dont-believe-everything-you-think-by-joseph-nguyen,ito-junji-stuff-3,tofu_photos_redd,windupbirdchroni0000mura,sansar-ke-mahan-upanyas-rangey-raghav-1,3HOURSRomanticRelaxingSaxophoneMusic.HealingBackgroundForStressReliefStudyLoveCafe_201705,128kb-----SudaisAndShuraym----mixed---translation---mp3----quran---_866,three_musketeers_0712_librivox,betotherstories00chekiala,wasteland01elio,a-collection-of-low-headed-illustration-poses-for-girls,boodhikaki_201908,dostoyevskynotes00newy,malhaar-sangram,indiaaftergandhi00guha,mika-akitaka-mobile-suit-girl-art-works-mobile-suit-girl-ms_202101,tafseer-mariful-quran-sura-18-al-kahf-english-translation-pdf,shortpoetry_002_librivox,antifragilething0000tale,the-dream-of-a-ridiculous-man-by-fyodor-dostovesky-read-by-scott-dewey,Hairy_Wives_from_the_90s_Adult_Photomagazine_Issue_3_2018,PatanjaliYogaSutraBySwamiVivekananda,makeyourbedlittl0000mcra,takahashi-images,david-bohm-the-limits-of-thought-with-jiddu-krishnamurti,Fsi-MetropolitanFrenchFast-StudentText,duneherb00herb,CapitalismAGhostStory,HustlerUSASeptember2014,gang-bang-1985,la-metamorfosis,la-84-t-2-public-talk-02,halim_20200202,kino-nr-10-2006-pazdziernik-october,pornart2chloedes0000dahm,bharatiya-darsana-ki-ruparekah-harendra-prasad-sinha,artbook-Iron_Man,sophies-world-hindi,weirdtalesbbcr4,playboy-club-abella-danger-ahead-of-the-curve-39x,begum-akhtar-ghazals,chrismorris_bluejam,Pleasure-mag-009,NoamChomskyOnGovernmentsInTheFuture,jaishankar-prasad-kahani-sangrah,premchand11varshkasamayhindihindiedition,catcherinrye0000unse_i5b4,Psychotronic_Video_01,bookofdisquiet0000pess,sunderkand-gitapress-gorakhpur,art-models-life-nudes-for-drawing-painting-and-sculpting-by-johnson-maureen-john,in.ernet.dli.2015.377456,KaushalByPremchand,the_social_contract_1004_librivox,bookofkuzaritran0000juda,metamorphosis0000kafk_y8c1,WhoMovedMyCheese_201606,trial0000kafk_x7g8,gateway-experience-wave-1-track-1-orientation-the-gateway-tapes-no-ads,DinhLuyenThanMaTH,the_american_claimant_1205_librivox,mistbornfinalemp0000sand_a4i8,15August,SabitaBhabhiBengaliEpisode4,the-festival-of-gudi-padwa,SharhEDivanEGhalib-ProfessorYusufSaleemChishti,vishuddha-manusmriti-dr.-surendra-kumar,JhankiByMunshiPremchand,awfulgerman_librivox,manga_Kantai_Collection_-KanColle-_Wo-Class-chan_Is_Looking_Here_As_If_She_Wants_to_Be,captain-america-vol-1-scans,apology_of_socrates_plato_0908_librivox1,Sacrifice,DilKaRishtaSongsDL.com,in.ernet.dli.2015.545183,BBC_Radio_4_Extra_20200114_140000,the-satanic-verses-Audiobook,valmiki-ramayan-part-1-gita-press,schlaf-haruki-murakami-2002,msmarvelvol1nono0000wils,MahabharataEp10,how-to-read-a-person-like-a-book-from-ebooks-wide,instapdf.in-it-ends-with-us-879,street-fighter-friends-swimsuit-special-2017,HowMoneyWorksTheFactsVisuallyExplained,warhammer-path-to-victory-2-beneath-the-city-of-the-white-wolf,CollectedWorksOfRamanaMaharishi,daodejing_deutsch_0906_librivox,countofmontecris01duma,adventuresoftoms00twaiiala,1001_questions_grammar_2009_librivox,chronicleofdeath00garc_0,John_Raynes_Complete_Anatomy_and_Figure_Drawing_Chinese,manga_Ojousama_wa_Nigedashita,czechia-1995-12,fortyrules,in.ernet.dli.2015.466624,audio_poetry_195_2007,20230211_20230211_1637,letters-from-a-stoic-1,harrypotterhalfb0000rowl_f5b2,22-immutable-laws-of-marketing,Gitanjali-Marathi,priyanshi-jain_20230926_1457,isbn_9789460781094,in.ernet.dli.2015.300709,vat401959-08030810,sex-orgies-05,sacredgames0000chan,brant-pitre-the-case-for-jesus-the-biblical-and-historical-evidence-for-christ,in.ernet.dli.2015.319504,ChanakyaNeetiDarpanArthatRajNitiSamuccayaNavalKishorePress,briefe1906gogh,in.ernet.dli.2015.308233,JohnWyndhamBBCr4,FrontMagazine,creative_unity_1209_librivox,GitabitanAkhanda,AContractWithGodByWillEisner,Mehfil-e-ghazal07,the-kama-sutra-erotic-figures-in-indian-art-marc-de-smedt_202011,joibcstgxpxsiigvldmkjehbm03rdp48bprxyzox,godfather00puzo,ielts-academic-book-18,varios-interpretes-cumbia-surena-vol.-5-46,dli.sangeet.thumri.9,bhai-anantvir-singh-vancouver-may-2018-sunday-morning,priyanshi-jain_20230926_1547,vartmptmpgeneratedsocialpsychology7theditionbyelliotaronsontimothyd.wilsonrm.ake,leave-it-to-psmith,combi009,shecomesfirstthi0000kern,Sleazoid_Express_007_Joel_M_Reed_2005_OCR,20210515_202105,deadpoolwolverin0000unse,intuitionknowing0000osho,earth-science-geology-the-environment-and-the-universe-2008,NietzscheAndTheCrisisInPhilosophy,poshida-raaz-urdu-mufti-amrohvi,franzkafka0000unse,podcast_out-shadows_murder-by-dixie-mafia-par_401266835,peer-e-kamil-umera-ahmad,plague00camu,attitudeiseveryt0000jeff,poorfolk_1702_librivox,BBC_Bradbury,thakur125ganitpaheliyanhindi,Tabaqat_Hanabila,5-am-club,smart-phone-dumb-phone,wg871,buttman-magazine-volume-12-01-original,TheHindusAnAlternativeHistoryWendyDoniger_201402,AgathaChristieTimesSix,FIGURENUDEPHOTOGRAPHYANNUALVOL.71958ARTPHOTOGRAPHYMAGAZINE32,AntonioGramsciSelectionsFromThePrisonNotebooks,Psychotronic_Video_20,patchy-sensei,shatterme0000mafi,05-amhi-dharmantar-ka-karu-ichhito,MansarovarPart4-Hindi-MunshiPremchand,in.ernet.dli.2015.509603,bade-ghar-ki-beti-habeeb-ziya,lookingforalaska0000gree,Psychotronic_Video_40,gharjamaiaurdhikkarpremchand,black-book-of-english-vocabulary,CrimeAndPunishment,the-feeling-is-mutual-64,CLEOPATRAH,interpretationof1913freu,marvel-encyclopedia,gainax-datsui-hokan-keikaku-shinji-to-yukai-na-nakama-tachi-complete-genga-shuu-,thekiterunnerpdf_201906,isbn_9781420934212,dieverwandlung22367gut,how-prime-ministers-decide-book-pdf,homecoming0000earl_e6n9,king-of-greed-3-ana-huang,thedesignofeverydaythingsbydonnorman,disgrace00coet,maker_of_moons_1607_librivox,Young_Jump_2017-39,48LawsOfPower_201610,malayalamebooks,BBC_Radio_6_Music_20170118_210000_Gideon_Coe,RAZI11,m2r38ztkaznhxmlxphfmvijev1vkdzkjobjp3aad,in.ernet.dli.2015.522768,mansfield_park_librivox,agatha-christie-and-then-there-were-none,tale_two_cities_librivox,talesfromhitopad0000anan,songoficefirecom0000geor,OdysseyRenderedIntoEnglishPotReadTheOriginalTheHomer,psychologyofhumo00martrich,lettertofather0000kafk,Anal_sex-mag-46,LordPeterWimseyCollection3,dli.sangeet.thumri.2,OTRR_Dark_Fantasy_Singles,companyofwomen0000khus,aetrafnidafazlinumber,115.autobiographyofayogihindi,rich-dad-poor-dad-hindi-robert-kiyosaki,KnkH_dictionary-of-medicine-english-to-hindi-edited-by-s.-c.-sen-gupta-and-s.-c.-kapo,acmj-h1,sun-and-steel,round-the-horne,symposium_0909_librivox,TheGulagArchipelago-Threevolumes,fahrenheit4510000brad,ibne-insha-marathi,SayyadinaAbubakarSidiqueR.aKiZindagiKSunehreWaqiat,alan-watt-cttm-1641-blurb-mind-tinkerers-professional-with-media-bind-using-prov,jesusandthejewishrootsofmary,muraqqa-e-akbarabad-yani-tareekh-e-agra-saeed-ahmad-marahravi,AbrahamEralyTheMughalWorldLifeInIndiasBookZZ.org,udaanhindiedition,faultinourstars0000gree_s5l5,NorwegianWood_875,malena-2,Sex_Dictionary,oceanof-pdf.com-god-of-wrath-rina-kent,negeriparabedebahtereliye,2750_20190715,OTRR_Cruise_Of_The_Poll_Parrot_Singles,OscarWildeBBCRadioCollection,TheaVonHarbou19271963Mertopolis,harperleestokill00burn,gyorgy-e.-szonyi-john-dees-occultism-magical-exaltation-through-powerful-signs,osho-hindi-discourses-part-1-osho-rajneesh-free-download-borrow-and-streaming-internet-archive,best-of-mayfair-issue-49,dantesinferno00dantuoft,74611889-arabic-grammar-in-urdu-easy-way-to-learn-arabic-grammar-part-1-2,in.ernet.dli.2015.478892,Psychotronic_Video_30,TheBlackCat_339,Penthouse_v10n02_1978-10,icusld6fysqxcpb3hr3wiohrto18jszxyd6fi1zd,fazbear-frights-collection,Swamini,shining00step,krishna-1967-original,metamorphosis0000fran,the-drama-of-the-gifted-child,deewan-e-ghalib-by-vishav-nath,wg427,lost-islamic-history-part-6,TrappedBBCR4,heelshosevol.7no.41970d.d.teolijr.a.c.3,huck_finn_librivox,SuperHitGhazalsInHindiMp3,stranger0000camu_a0e0,in.ernet.dli.2015.342900,eksadaksattavangaliyan,12rulesforlifeanantidotetochaosbyjordanb.peterson_201911,how-to-draw-moe-underwear,HistoryOfAncientIndia,dli.ministry.29346,tantrakedivyaprayogrkrishna,avatarlastairben00teit,colossusotherpoe00plat,AshtavakraGitaSanskritHindi_201809,sleazoid-express,McGillLibrary-rbsc_isl_ijaz-i_bp80s357ca51891800z-16280,BestUrduBooks12,doctorwhoaudiovisuals,TimnahDrLacyCouch,in.ernet.dli.2015.481633,GameOfThrones_201607,myreminiscences_1410_librivox,gov.gpo.fdsys.CHRG-111shrg61600,queen_greatest-hits,Godan,bharatiyadarsanakiruparekahharendraprasadsinhamlbd_202003_913_h,romantic_poetry_001.poem,avatar-the-last-airbender-the-f.-c.-yee,BHAGATSINGHCOMIC,mayfair-volume-28-issue-5,1984_20220207,trattato-di-anatomia-umana-anastasi-vol.-2-versione-blu,runwithhuntedcha0000buko,anaarkali,in.ernet.dli.2015.269117,BusinessRingtones,kinginyellow00chamrich,OldRareHindiFilmSongs,gulon-mein-rang-bhare-mehdi-hasan,dictionaryoflati00robeuoft,osho-geeta-darshan-vol-1-osho-free-download-borrow-and-streaming-internet-archive,NUTS_Magazine_June_14-20_213,trialandmetamorp0000berk,artofwaroldestmi00suntuoft,AbrahamLincoln-Hindi,boys_book_famous_soldiers_1105_librivox,in.ernet.dli.2015.464177,premchand-kayakalp,november9novel0000hoov,kapil-gupta-gupta-kapil-atmamun-the-path-to-achieving-the-bliss-of-the-himalayan,RaggedTrouseredPhilanthropists,call-of-cthulhu-lovecraftian-horrors-game-art,history-of-ancient-and-early-medeival-india-from-the-stone-age-to-the-12th-century-pdfdrive,the-batman-who-laughs-the-deluxe-edition-2023-digital-son-of-ultron-empire,theconspiracyagainstthehumanraceacontrivanceofhorrorthomasligotti,e-book-vatsyayana-the-kama-sutra-1,mere-jawab-romantic-love-story-hindi-audiobook,studyinscarlet_bn_librivox,DeewanEMeerByMeerTaqiMeerUrduinpage.com,AlbertCamus_201405,OTRR_Philip_Marlowe_Singles,letterstoyoungth00piph,ambinterior3,NUTS_Magazine_The_Girls_of_NUTS_Summer_SPECIAL_2013,menwithoutwomens0000mura_b1t0,walkingdead01gut0000robe,mahabharata_condensed_om_librivox,ItsNotWhatYouKnow_201701,JK_E1,imgtopdf_1901231248004.pdf,clashofkingsbook00mart,MegastoreFebruary2018,lp_portrait-of-a-genius_mirza-ghalib-begum-akhtar-mohammed-rafi,20231202_20231202_1045,ghostsofelectricitydocumentary,isbn_9780552773317,sapiens-de-animales-a-dioses-audiolibro,returnsherlockholmes_v3_1507_librivox,kino-nr-10-2007-pazdziernik-october,peter_pan_0707_librivox,Future.Sex.Issue.06,www.VintageSense.com-Vintage-Indian-Music-37,rt-black-box-down,noelcowardbbcr4,howtoreadfilmmov0000mona,HP2-Windows-Prototype,the-secret-mirror-essays-on-urdu-poetry-shamsur-rahman-faruqi-ebooks,kino-nr-5-2007-maj-may,ShabEKhoonByAhmedFarazUrduinpage.com,andmountainechoe0000khal,modernhindishort0000unse,letrangerdecamus0000albe,Swaraj-Gandhi-1947-10-29,Sex_Master,crimepunishmentn00dost,keyaccountmanage0000chev_f1c0,RayBradbury_Fahrenheit451,wayofkings0000sand_h0x5,bestwomenserotic00marc_0,IntroductionToPsychologyLectures,ravindranathtagorekilokpriyakahaniyanhindiedition,BardcastCymbeline,trilogia-de-la-fundacion-by-isaac-asimov,watchmen00moor_0,the-fault-in-our-....,jane_eyre_librivox,thestrangecaseof00043gut,rigvedacomplete,candlestick-trading,in.ernet.dli.2015.545500,thegrass_1908.poem_librivox,darkpsychology200000mich,mind_and_its_education_1910_librivox,rajyog-hindi-audiobook-part-1-swami-vivekananda,in.ernet.dli.2015.464139,artofseduction0000craz,cd_the-perks-of-being-a-wallflower_various-artists-cocteau-twins-cracker-davi,i-am-malala,JosephConradBBCRadio,codeofkrillitane0000rich,malvikagni-mitra-urdu-translation-irfan-siddiqui-up-urdu-academy-lucknow,NovenoPodcast,TheWillToPower-Nietzsche,TheDaVinciCode_201308,AliensOmnibusVolume1,shiv-sutra,in.ernet.dli.2015.154654,upkar,aaobymanto,chand-ka-muh-teda-hai-by-gajanan-madhav-mukti-bodh-bhartiya-gyan-peeth-prakashan,tantricvisionsof0000kins,americanpsycho0000elli_j9t1,morningritualttrump,terminator-the_burning_earth_comics-1990,1AGameOfThrones_201507,dli.calcutta.10819,manga_Sabishisugite_Lesbian_Fuzoku_Ni_Ikimashita_Report,Bokharee_up_by_ayoub-islam,sexno111926,flash-gordon-and-the-fiery-desert-of-mongo-sunday-comics-strips-1942-43,thelastmughalthefallofadynastydelhi18572008vintagebooks_201910,winningchesstrap0000irvi,AmritaPritamKavita1,in.ernet.dli.2015.302590,eragon00paol_1,20210703_20210703_1153,EdgarWallaceBBCr4,ShayadHD,inspectorwestbbcr4,extremesexnewwor0000unse,0_sense_and_sensibility_librivox,GalbraithBBCr4,TantraSexSlaveBookComplete,datpiff-mixtape-m9dc758c,petite-vicieuse,TigaGodaanIblisKepadaYesusDiPadangGurunMatius41-11ByPdp.Johannes,podcast_drawings-prints-special_vincent-van-gogh-the-letters_1000092829259,in.ernet.dli.2015.509111,Metamorphosisin00Meri,shreemed-bhagwat-gita-20220406_20220406_0356,manga_ill-never-moan-for-you,Faisla-Hindi,dli.ministry.26697,ShahabNamaByQudratUllahShahabComplete,modern-indian-history-2-british-period-s.-c.-sarkar-k.-k.-datta,nasir-kazmi-shakhsiat-aur-fun,adhyatma-ramayan-part-18-swami-shri-akhandanand-saraswati-ji,nida-fazli-kavita,godofsmallthings0000roya_t1i9,123_20200211,encyclopediaofunusualsexpractices_201909,HindiBook--gitanjali-by-shriRabindranath-tagore.pdf,weliving00rand_0,PakistanBetweenMosqueAndMilitaryByHussainHaqqani,jujutsu-kaisen-manga,in.ernet.dli.2015.472282,TheHistoryOfO,0053OutOfThisWorldAdventures02195012.AvonC2c.Cimmerian32,premchandsevasadanhindi,bookoflifedailym00kris,SheehyToKillaMockingbirdChapter1Thinking,Ansgstrom,013TheBookOfWisdom,cormac-mccarthy-the-blood-meridian,sankshipt-mahabharat-vol-1-gita-press-gorakhpur,in.ernet.dli.2015.409742,TwilightOfTheIdolsOrHowToPhilosophizeWithAHammer,a-caribbean-mystery_202201,onehundredyearso0000garc_l6x7,Aatmaanubhuti.Tatha.Usake.Marga.by.Swami.Vivekananda,in.ernet.dli.2015.307395,a-midsummer-nights-dream-1999,tales_shakespeare_librivox,papa-ki-bitiya-baap-beti-ki-chudai,tvtunes_20712,batmanvolume1cou0000snyd,keralapadavali1981std1kerala,call_cthulhu_2401_librivox,InterracialAdultPhotoIssue12017,general-knowledge-ebook-for-ssc-cgl,tansenamarchitra0000anan,BrihadaranyakUpanishadGitaPressGorakhpur_201905,paradoxofchoice00barr,cheri-2013,TeslaProblemEnergy,vindicationofright00woll,bitterfruitveryb0000mano,letterstoyoungpo0000rain,rajeshpatimaamaincollectorbangayahindi,HELENKELLERKITEACHERANNIESULLIVANHINDI,calatog-hot-sexy-girls-models-instagram-2021,kino-nr-7-8-2007,in.ernet.dli.2015.398426,d876b46f-0086-4081-8618-6dc9f1ab8cff,ReturnToLittleRussiaREV3COVER2_201801,wisdomofpsychopa0000dutt,ChhayaGeetOnNidaFazli,Cavalcade_v07n10_1968-10,manga_ASexTherapist-c01to07,letters-on-ethics-to-lucilius-pdf-room,gc-leong-geography,best-of-mayfair-issue-30,2StatesChetanBhagatmarked,meditationsofemp00marcuoft,shakespearejuliuscaesarhindiedition,50_Magazine_Vol._8_2016,KateChopin_SelectShortStories,RelaxingSleepMusic.DeltaWavesBinauralBeatsHealingForDeepSleepStressReliefMeditation,TriplePleasureVol1No1,richdadpoordadwh00kiyo,umroaurshahenshaafrasiab,3fqjvd2gl0vlngxafzzkvjhde6l2oyrejuyfa27u,ASmallTownMurder,lovefreedomandalonenessanewvisionofrelatin,swamplandsofsoul0000holl,mitchalbomstuesd0000hatc,8Beats-Kaharwa-Taal,fyodordostoyevsk037685mbp,notes_underground_russian,in.ernet.dli.2015.347136,in.ernet.dli.2015.379218,CurlewinAutumnBBCr4,colorpurplenovel00walkrich,TheStoryOfASoulTheAutobLisieuxThrseDeSt.6502,encyclopediaofplantsandflowers,albertcamussstra00bloo,roalddahl_moretalesunexpected,hindivadioct22019final,ekleipsi59,mens-world-volume-09-number-02-1997,DWK119,jai.-bhim.-2021.720p.-hindi.-dubbed.-720p.-webrip.x-264-uwatch-free.net,KhalilGibranAnandPeedaUC,MansarovarPart5-Hindi-MunshiPremchand,AlQasimTibyaan1432,the-radio-amateurs-handbook-1942,brant-pitre-jesus-and-the-jewish-roots-of-the-eucharist-unlocking-the-secrets-of-the-last-supper,book_of_art_0807,NoamChomsky-1995-04-12-LinguisticsPhilosophy,dragrows-zex,isbn_9780805231366,IshaKenaKathaPrashnaMundakMandukya,hustler-taboo-0910-2023,Manto-Aankhen,deadpoolkillsmar0000bunn,nikola-tesla-on-light,showbusinessnove00thar,bhavishya-puran-gita-press-gorakhpur,DEKHBHAI_201605,no-excuses-the-power-of-self-discipline-pdfdrive,DanBrownTheDaVinciCode,HPMoRpodcast-Audiobook,twisted.games.elite,psychotronic_video_19_201809,OTRR_Escape_Singles,sheela-shadi-me-chudi-anjan-ladke-se,bd-chaurasias-human-anatomy-volume-3-head-neck-and-brain-6th-edition_20201225,abbu-aur-bhai-se-chudi,teFC_vipatra-by-gajanan-madhav-muktibodh-bharatiya-gnanapith-kashi,Psychotronic_Video_28,artofpersuasionw0000burg,04-21,HindiBook-santKabirBhajanDoha,pdfy-4isR04Rjy6azQi7p,the-restaurant-at-the-end-of-the-universe,ageneralintrodu00freugoog,howtoreadpersonl00nier,atomic-habits_20210723,mistbornfinalemp0000sand,dramaofgiftedch000mill,success-is-his-best-revenge,beautifulbritonsvol.9no.104d.d.teolijr.a.c.2,in.ernet.dli.2015.20749,vagabondinlitera00compuoft,TheAncientGeographyOfIndia,in.ernet.dli.2015.209262,fyodor-dostoevsky-the-idiot-in-hindi,darkforest0000liuc_z6r7,in-the-presence-of-absence-and-a-river-dies-of-thirst-darwish-mahmoud,sole-spokesman-jinnah-muslim-league-the-demand-for-pakistan-ayesha-jalal-cup,DaphneduMaurierBBCr4,001-aankhon-dekhi-sanch,love-sonnets-of-ghalib-dr.-sarfaraz-k.-niazi,SabitaBhabhiBengaliEpisode6,welcome-to-wskel,forever-is-a-lie-by-novoneel-chakraborty-vivians-e-library,cu31924027444284,analyze_people_on_sight_1105_librivox,islamic-books-hindi-pdf,eroticbookerotic0000filg,sophiesworldnove1994gaar,Sight_and_Sound_1961_01_BFI_GB,the120daysofsodom,burqay-by-sadat-hasan-manto_202010,hustler-usa-april-2024,in.ernet.dli.2015.269145,makeyourbedlittl0000mcra_l5p6,dli.language.1221,McGillLibrary-129783-5044,street-and-lane,sixofcrows0000bard_i3c5,SextonBlakeBBCr4,SrimadBhagavadGitaSanskritHindiEnglish,baccho-ki-kachahri-opt,ethicsgreekphil00hysluoft,simple-trading-book-1-1,python-crash-course-a-hands-on-project-based-introduction-to-programming_202204,ShreeKrishna_ravindraJain,thedoctorandthesaintcasteraceandannihilationofcastethedebatebetweenb.r.ambedkara,the-kite-runner-pdf,Alfie-webcomic-online,murderofrogerack0000agat_g7y3,a-murder-is-announced_202112,in.ernet.dli.2015.478775,womenandeconomi01gilmgoog,WhatTheBuddhaTaught_201606,diaryofvirginiaw0001wool,wo-piya-se-chudne-wali-thi,BBC_Radio_6_Music_20161005_200000_Gideon_Coe,in.ernet.dli.2015.472597,fundamentalchessopenings,chroniclesofbarchester,CharlesDuhiggThePowerOfHabit_201801,podcast_motivation-mondays_david-goggins-the-cure-to-la_1000426469242,NMRArch-01-17-054-letter-from-zia-mohyeddin,pornartchloedesl0000dahm,18plus-vol-13-2017,old-harrys-game,in.ernet.dli.2015.484112,ozymandias_librivox,Mehfil-e-ghazal004,extraordinary_lupin,ofmicemenpenguin00john,personalmbamaste0000kauf,byomkeshbakshi0000band,the-book-of-nothing-by-hsin-hsin-ming-talk-on-the-faith-mind-of-sosan-osho,falloficarus0000ovid,WolfmanJack-XerbRosaritoBeachMexico-1968,tomorrowibecomew0000odaf,worksofjohnlocke01lock,kathamrita1,kurt-vonnegut,sayings_of_lao_tzu_1809_librivox,mlbd.introductiontoin0000sati_t0v5,lastairbender00roma,hsnak00eyhguoft,valleyoffear_1511_librivox,RockNLearn-Dinosaur-Rap,LarryKingHowToTalkToAnyoneAnytimeAnywhere1of2,20201012_20201012_1148,OSHO_Jagat_Taraiya_Bhor_Ki,andhere-band-kamre-part-1-upnyas,georgewashington_bb_librivox,get-stufd-volume-19-issue-08-august-2007,z0avd001,gita-nochur,TheMartian_201808,osholivingdanger0000osho,les_mis_vol01_0810_librivox,shamenovel00rush,KavitaLoheKePedHareHongeRamdhariSinghDinkar,y1pl1r0wtiybzzyrzs4r4iikzujzbypmqgyze8ab,castle00kafk,KahaniKhudaKiKasamManto,CancansDeParis-mag-22-1967,lettresmilena0000fran,2007oneirabbcr4,dli.bengal.10689.19608,voltairecollection,18-babes-2009-01,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Volume_7,cg-images,31.friedricha.hayekcaminodeservidumbre,ost-english-2ws2610,pix-15,manaralibrary0000mana,annakarenina_dutch_1011_librivox,AlbertCamusVeJeanPaulSartreDaSamaninKarilatirilmasiComparisonOfAbsurdInAlbertCamusAndJenPaulSartre,kybalionstudyofh00thre,thinkbigunleashi00cars_1,storytelling-sounds-2021,cu31924103377051,el-principito_202206,how-to-draw-drawing-and-sketching-objects-and-environments-from-your-imagination-pdfdrive.com,Salty_v01n06_1969-04,the-art-of-manipulation_202106,leaves_of_grass_librivox,cd_the-kite-runner-original-motion-picture-so_alberto-iglesias-ahmad-zahir-bara-kherigi,18-eighteen-magazine-june-2010,AndriehVitimusHandsOnChaosMagicRealityMabOk.org,ACourtOfFrostAndStarlightACourtOfThornsAndRoses,sitara-the-book-of-passion,the.lord.of.the.rings.the.fellowship.of.the.ring_201910,i-was-never-yours,galilioh,FBIKnewHitlerWasAlive,how-to-draw-dresses_202111,candide_librivox,Cats-199709,completeroundthehorne,incest-magazine-1,greene-robert-48-laws-of-power,Magic_Island_201505,BizarreSex05,marvel-super-heroes-secret-wars-issue-2,manga-bleach-digital-colored-comics,ThinkingFastAndSlowDanielKahneman,kuchtokahye,jodorowsky-dune,SylviaPlathLadyLazarus,michael-parenti-blackshirts-and-reds,IrodovProblemsInGeneralPhysics,PrafullaKolkhyanKATHKTHANTARKASHIKAASSI,Ananda-Marga-Elementary-Philosophy-Hindi-1st-Edition,in.ernet.dli.2015.458629,wise-guy-socrates-hindi-audiobook,landarzt_0807_librivox,bakuboy01_gmail_R2ps,kupdf.net_riddles-in-hinduism-dr-br-ambedkar,forty_rules_of_love_by_elif_shafak,RupiKaurMilkAndHoneyAndrewsMcMeelPublishing2015,PenthouseLettersJanuary2018,one-thousand-roads-to-mecca-ten-centuries-of-travelers-writing-about-the-muslim-,KathaOKahini,inventionsresear00martiala,OnePiece1Fish,fuse-magazine-volume-64-2021,khushwantsinghon0000khus,meditations00marcuoft,Kp0164-theseGirlsAreSoFine,streetfightercomicbookcollection_202003,zero-to-one-hindi-pdf-download,MidnightsChildren,ciHQ_kaam-vigyan-hindi-text-on-erotics-sex-manual-calcutta-chandra-shekhar-pathak,250_20200817,manic_doujin_00031,s02e02dotpsychology,isbn_9780761178972,06-jatibhed-nirmulan-dr.-babasaheb-ambedkar,in.ernet.dli.2015.268970,maalavun-taak-deep,sapiens-yuval-noah-harari,AFHerold-The-Life-of-Buddha,UrduAudioNasheeds,journalsofsylvia00sylv,BullehShahKehendeNain_pdfbooksfree.pk,wazayefenadeali,solo-leveling_202307,e-book-room.-the-housemaid,staringatsunover00yalo,B-001-002-046,multilingual_short_works_017_1705_librivox,Cats-199710,ERIC_EJ1128161,powerofyoursubco00jose,chanakya-niti-in-nepali_hinduism,alexander-pushkin-collected-works-vol-1-poetry-hindi-progress-1982,3-bd-5705-ec-76666122-e-5-bcbc-89-f-591-b-2-c-620-aaefe,sZzk_rashmi-rathi-by-ramdhari-singh-dinkar-1954-shri-anjana-press-limited,colorpurple00walk_0,vincentvangogh00rabo,completepoemsofe00dick_1,the.lord.of.the.rings.the.fellowship.of.the.ring,gunahon-ka-devta-by-dharmaveer-bharti_20240707,gora_20200202,lettersoffyodorm00dostuoft,ncert-history-hindi,ArtOfWarBySunTzu,101-essays-that-will-change-the-way-you-think_202405,monstervolume10000uras,9781784707422,mysterious_stranger_1206_librivox,thebrotherskaram28054gut,wow-2021-broadcast,cheri-june-2011,kybalionstudyofh00init,kamsutra-book-in-hindi_202308,Dunya-Goal-Hai-By-Ibn-e-Insha,LFA_Lustig_0063,how-to-read-a-book-the-classic-guide-to-intelligent-reading-by-mortimer-j.-adley,uniform-girls-54,RichardDawkins_237,KalamMuhammadBakhshpunjabi,ShowSelector2,sociedad-de-acomar-08-cuando-me-amara-s,hustler-january-1980_202205,furtherstoriesfr0000anan,griefisthingwith0000port,KamliWaleMuhammadToonSadqeMp3UstadNusratFatehAliKhan,wuthering_heights_0801_librivox,the-once-and-future-king,PornScandinavia,all-my-sons-arthur-miller,Sight_And_Sound_2011.05_Wim_Wenders,FlashGordonFirstNewspaperComicStripJan71934ThruApril81934,bub_gb_NL4sAAAAYAAJ,hustler-18-plus-nl-2010-04,bheden-aur-bhediye-harishankar-parsai,looking-glass_librivox,ghost_stories_006_0809_librivox,in.ernet.dli.2015.444423,dni.ncaa.SAK-708_1-AC,shivastotravalibyutpaladevaenglishswamilakshmanjoo_202001,ImagineByJohnLennon,PsychedeliaRawArchivesOfTerenceMckennaTalks,LalithaSahasranamam_201603,InspResnickBBCr4,CONFUCIUSH,AsliKokaShastra,rubberlife1974d.d.teolijr.a.c.4,ShowSelector,HindiShivPuranAudio,InkarByParveenShakirUrduShairi.com,HindiHasya-vyangSankalan-Hindi,JaneEyre-CharlotteBronte,VolgaSeGanga-Hindi,AsliPrachinLalKitabGirdhariLalSharma,LaHasilByUmairaAhmedUrduinpage.com,lucent-gk-hindi-53-mb,goodomens,shrimad-bhagwad-geeta_202307,manga_Death_Note_L_Change_the_World,BBC_Radio_6_Music_20170919_200000_Gideon_Coe,the-way-of-the-superior-man-en,ThePhysicsOfGodAndTheQuantumGravityTheoryOfEverything,1SRIMADBHAGAVADGITAJOTHAJOTHOChapter16.pdf,audio_poetry_74_2006,ShreemadBhagwatGeeta,maalgudi-ka-mehmaan-hindi-novels-and-comics-r.-k.-narayan_202012,marketwizardsint00schw,zsyolpz3iuzc1itxmgduapdo5gjf1om05nlsyb56,martin_chuzzlewit_librivox,pdfy-LiYODFKQVdq850ry,BBC_Radio_6_Music_20170829_200000_Gideon_Coe,mobydickorwhale01melvuoft,OnenightAtCallCenter,lp_when-melody-was-queen_various-chorus-lata-lata-mangeshkar-mohd-r,BBCAVPM,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Volume_16,the-three-investigators,in.ernet.dli.2015.415637,combinepdf_202102,the-Power-of-your-Subconscious-Mind-Hindi-2,KavitaMadhuShala1HarivanshRaiBachchan,MahabharatInUrduGargAndCo,greaterkeyofsolo00solo,RobertFrostCompletePoemsOfRobertFrost,lfpazxj65wmy2ggonikyuiwezhtuwhrqsrepwio2,12RulesForLifeAnAntidoteToChaosByJordanB.Peterson_201812,twelfth_night_0906_librivox,in.ernet.dli.2015.532198,ALifeInLetters-AntonChekov,pirate-erotic-mens-magazines,housewithoutwind0000hash_y5l1,the-art-of-focus-Not-Dan-Koe,byblosthroughage0000jide,kafka-ki-lokpriya-kahaniyan-hindi-edition,lp_experiment-and-ecstasy-his-great-songs-fro_salil-chowdhury-asha-bhosle-chorus-lata-ma,freddy-vs-jason-vs-ash-01,tragedyofothello00shakuoft,cotelnv,Swaraj-Gandhi-1947-11-25,TheStoryOfTheCommitteeOf300,y-2mate.com-it-starts-with-us-audiobook-colleen-hoover-chapter-1-real-voice,thecaskofamontil01063gut,185512201GuidoCrepaxValentina,dictionaryoffren00belluoft,20201022_20201022_1121,Snowfield,amaliyaat-by-allama-abdul-mustafa-azmi,IndianClassicalMusic,understanding-comics,Manga2017digitaldanke-empire,kaise-maine-apne-sasur-ji-se-car-me-chudwaya,ew-images,escape0000much,TheFathersHistorians,john-green-the-fault-in-our-stars-full-audiobook.f-251,rogue-ascension-book-1,cu31924026700827,mancalledovenove0000back_o5p4,HindiBhajansMp3-pradeepJi,copywriting-secrets-by-jim-edwards-z-lib.org,begegnungen_a1_2,aristotledeanima005947mbp,bg8commentaries,RudyardKipling-TheJungleBook,CIAUFO,CoreyWayneHowToBeA3Man,asmanthinketh00alleiala,FranzKafkaBBCr4,AmericanStories,lifeofshivajimah00keluiala,essentialrumi00jala,the-mountain-is-you-transforming-self-sabotage-into-self-mastery-by-brianna-wiest-z-lib.org,rosieproject0000sims_p1n4,alphabetsoldnewf00dayl,RAE82NewYears,encyclopediaofworldhistory_201912,tolstoy_ls_1412_librivox,office-of-film-and-literature-classification_0900587.000,saadathasanmanto0000edtd,hardthingaboutha0000horo,flowersforalgern2004keye,quran-hindi-translation-tafsir-anuvad-king-fahad-high-res,JoseSilvaTheSilvaMindControlMethod,ShriKrishnaBhaktirAmritaBindu,Rapture_v01n03_1959.Beacon_Darwin-McCoy,Gulzar-e-MadinaShaoib-Raza-Qadri,HindiBookSurdasAurBhramargeet,huang-ana-1.-twisted-love.-lumina-din-intunericul-lui-scan,mertvyedushi11,tchxnpp0fqrkk589f84q344kltj7i4fj7nebopfm,anatomy_humanbody_1_0901_librivox,tantraspirituali0000osho,04TheSearchForTheStolenIdol,HowTheSecretChangedMyLifeByRhondaByrne,MadhyaRatreli,batman.-1989.-main.-theme,theilluminatiformulausedtocreateanundetectabletotalmindcontrolledslavebyfritrzsp,collectedshortst0000fran,the-spider-v-02n-03-1934-04-sas-exciter,openDemocracy_pamuk_atwood_rushdie_2,kama-sutra-a-position-a-day-365-days-a-year.,endingoftime00kris,meinkampf_minha_luta,das-wehrschach,mastermargarita00bulgrich,homeriliad0000evri,yugandhar-shri-krishna,bhagvadgeeta_201607,PuraskarByPrasad,KhilafatOMalookeyatSyedAbulAlaMaududiUrdu,queen_elizabeth_0901_librivox,MeAndRumi,TalesOfGnosisCollege05,khattarkaka,tolkien-j.-the-lord-of-the-rings-harper-collins-ebooks-2010,depthsofmadness0000debi,GarbhGitaHindiAudioBook,dailystoicjourna0000holi,Psychotronic_Video_09,manners_202002,in.ernet.dli.2015.349362,LaghuUpanyasAurKahaniyan-Hindi,manga_Queens_Blade_Bitoshi_Gaiden_Tome_of_the_Ancient_Princess,WolverineOldManLogan,BargENeyByNasirHussainKazmi_201507,letterstomilena0000will,darkromancecolle0000unse,All_Souls_Unitarian_Church__Tulsa_OK-12_11_Podcast,hatinggame0000thor_i6j8,intoheartoftruth00mcaf,modelling-ke-liye-casting-couch-sex,wings-of-fire-by-abdul-kalam-printers1,ost-english-apassagetoindia,swatantrata-sangram-hindi-bipin-chandra,diariesoffranzka0000kafk,IkshvakuKeVanshaj,neverletmego0000ishi_z8y5,DWK107,hemi-sync-journal-1990-2-spring,AyeBhagatSinghTuZindaHai,in.ernet.dli.2015.484148,pythonfordummies0000maru,zero-to-one-book,Psychotronic_Video_41,adadon-ki-hukumat-by-kash-al-barni,thebreakdownepisode315,public-places,a-short-history-of-nearly-eve-terje-g.-simonsen_202203,aristotlesmetaph0001aris,jeune-fille-au-pair,ibnuukinpjvtrob1dokwenlpfba4nkwvnd0g7ye2,BBC_Radio_4_Extra_20170618_133000_Arundhati_Roy__The_Ministry_of_Utmost_Happiness_Omnibus,iamdynamitealter0000rapp,ZindagiGulzaarHe,Shankhnad,zGAb_yug-purush-ganesh-shankar-vidyarthi-vyaktitva-aur-krititva-vol-2-ed-by-shri-tila,the-bhagat-singh-reader-bhagat-singh-chaman-lal-z-lib.org,completeworksed03poegoog,1q84books120000mura,SuryakantTripathiNiralaRamKiShaktiPooja,MahabharataEp5,bhagwat-geeta-gujrati,think-and-grow-rich_202408,republicplat02plat,sufism_tasawwuf_outlook_P1,premchandaahutihindi,manga_library_Hentai_Elf_to_Majime_Orc,greatexpectatio00dick,RigVedaInHindi,nusratcollection_20170416_0341,powerofyoursubco0000murp_y1b6,beyond-psychology-osho_202101,the-milf-chronicles-dirty-family-stories,RamakrishnaMissionGuidedMeditation,hc011MastaBruce-SonicXxxProject,MansarovarPart7-Hindi-MunshiPremchand,smart-girls-guide-to-privacy-2015,TheArtOfWatchingFilms,soundcloud-652647479,PrafullaKolkhyanBigarKaDarAurImanKiBat_201302,KavitaAMaaTaresaJavedAkhtar,eroticafrompenth0000unse,UnchasDinByAmritaPritam,karlmarxanessay_1409_librivox,in.ernet.dli.2015.424658,hitchhikersguide00doug_1,StateStrategiesToCreatePositiveImagesOfWar,AnimeRGHunterXHunter2011COMPLETEBD720pHEVCx265KaMi,meri-wife-heart-touching-love-shayari-husband-to-wife-shayarix,mach-hommy-and-tha-god-fahim-notorious-dump-legends-volume-2,pl-france-f-vrier-avril-2021,edinburghdetective1to12,Bestiario_201410,raj3elsada-Sa7e7Trgheb1,great_composers_1102_librivox,2.09_20231008,dni.ncaa.SAK-708_2-AC,meditaciones_2210_librivox,MohsinNaqviKaMuntakhibKalam,BookOfNature-English-RuskinBond,a604578400platuoft,s01e01theclothestheystoodupin,how-to-draw-a-little-h-costume-h_202111,bible_kjv_complete_2001_librivox,Gandhi-NamakYatra-Hindi-AliceM,MoreBubbles,jiz-comics-restored,black-sun-aryan-cults-esoteric-nazism-and-the-politics-of-identity-pdfdrive,AdvanceVaastuAndRemedies,americanpsycho0000elli_u2i7,adVN_introduction-to-indian-philosophy-of-satish-chandra-chattopadhay-and-dr.-dherend,fortyrulesoflove00shaf,salems-lot_202205,Kanupriya-Hindi,miss-peregrines-home-for-peculiar-children-pdf,the-naughty-professor,works_poe_raven_edition_vol2_0912,sushant-rajput-camus-and-the-myth-of-sisyphus,SecretsOfMentalMath,Frivol-mag-112,carnalcomicstabithastevens_201908,BBCR4Ghosts,KenWhitmoreBBCr4,26dadsarmy19740617presentarms,capital_vol1_0810_librivox,origin_species_librivox,the-millionaire-fastlane-mj-de-marco,Karmbhumi-Hindi-Premchand,pdfcoffee.com_loona-pdf-pdf-free,NishaNimantran-HarivanshRaiBachchan,the-law-of-attraction-in-hindi-pdf-1,junji-ito-collection,quranarabichindimp3,mopla-book_202110,ijm92hpazijw315v6praxix3w3nrabsr9f3wscwv,EustaceMullinsSigmundFreudAntichristDevil1997,manga-vagabond-vizbig-edition-vol.-2,kabiramarchitrak0000anan,how-to-draw-manga-girl-with-swimsuit,ssc-mathematics-by-pinnacle,lp_wish-me-luck_ofra-haza,hobbitortherebac0000tolk_b5p9,the-dhammapada-by-osho-compiled,UnknownSquaredCircleMoreThanMeets...P7BruceLyonsUnexpectedJourney,in.ernet.dli.2015.348751,parveen-shakir-letters,elmundodelmanana0000eesu,crimepunishment1917dost,CompleteSahihMuslimHadithInURDU,1_20200207_20200207_0812,dni.ncaa.SAK-293-AC,A.EWaiteTheSecretTraditionInFreemasonry_20170511_0211,pascha-15,isbn_0805202005,audio_poetry_211_2007,daridra-narayan-rajat-raten-dosteovsky-hindi,a-room-of-ones-own-and-three-guineas,manga_Onikirimaru,the_decameron_0903_librivox1,Psychotronic_Video_29,KafkaDasUrteil,angels-demons-dan-brown,EidGah-2013_201310,Frivol-mag-258,darkmatternovel0000crou_n9e8,Visual-pose-book,MolecularBiologyOfTheCell5th,39_20211119,MenAreFromMarsWomenAreFromVenus_201803,psychologyreinca00kidd,KavitaSurdasKePad,StartWithWhy-SimonSinek,smut-honey-podcast-ep-8,cosmos_de_carl_sagan,vishnu-puran-illustrated-with-hindi-translations-gita-press-gorakhpur,HazratUmarFarooqr.akay100Qissay,breakinghabitofb0000drjo,isbn_9788175082328,Club_MILF_-_Volume_385_2019,SciFiAudiobooks,science-of-steam-cooking-krishnacharya-g.-v.-1911,wolfman-jack-and-the-border-blasters,yume-ost-we-are,rj-01038110-images,velamma-hindi-episode-119,fundamentosdelta00octa,carlton-h.-d.-satans-affair,trial0000fran_m0c9,z1jvtbu2gv9sw0lqgd0imxvafkipoczozaeeifpb,drawingforbeginn00furn,lp_the-hitch-hikers-guide-to-the-galaxy-part_douglas-adams,01-atomic-habits-by-james-clear-full-audiobook,stefan-zweig-amok-kosucusu-sesli-kitap-arsivi,pretenders-landgraaf-pink-pop-festival-1984,in.ernet.dli.2015.268297,Chacha_Chaudhary_Comics_Collection_in_Bengali,divinecomedy2dramatic_1509_librivox,Frivol-mag-097cbz,YogaVasistha-HindiAudiobook-Prakaran3-Utpatti,FaizAhmadFaizPoetryByArshHassan,GCLeongGeography,astrophysicsforpeopleinahurrybyneildegrassetysonpdfdrive.com,FourVedas-SanskritTextWithHindiCommentaryByPanditJaydevSharma,TablaLoopsForComposingMusic,LauteHueMusafir-Hindi,taboo00viol,20201201_20201201_0844,Mature_Ladies_Adult_Photo_Magazine_Volume_14,AXSM_mahabharata-part-1-gita-press-gorakhpur,loona_202209,crimeandpunishme02554gut,tihpodcastMonMar042019,sophiesworld0000jost,labyrinthofevils00jame,batman-the-long-halloween,aliens-colonial-marines-technical-manual,PDJamesBBCRadioDramas,dojing16-ff1,ABriefHistoryOfPakistan,ladywiththedog_1301_librivox,60-no-longer-human,hhgttg-ab,cd_to-kill-a-mockingbird_malchicks,Tolstoy-Anna-Karenina-Parts-1-4-hindi,TheBookOfMirdad,marvel-encyclopedia-new-edition_202312,ENGLISHGRAMMARINUSEINTERMEDIATE,talkingamericanc00carb,oceanof-pdf.com-trading-in-the-zone-master-the-market-wit-mark-douglas,khaldia-library9,artinneedleworkb00dayl,my-friend-dahmer,doujin_Mom_Please_Punish_Me_Again,foundation00asim_0,passionate_pilgrim_cal_librivox,carnalcomicsgingerlynn_201908,adventuressherlockholmes_v4_1501_librivox,AtTheMountainsOfMadnessAGraphicNovel,h-gal_images,manssearchformea0000fran_p2h1,BBC_Radio_6_Music_20161003_200000_Gideon_Coe,NeilDeGrasseTysonAstrophysicsForPeopleInAHurry_201904,06Feb2018145634,Garuda-Comic,kiterunnerkhaled0000unse_d0h2,the-illusions-of-postmodernism-terry-Eagleton-z-library,paraspattharh,auaben0010,in.ernet.dli.2015.283232,Barely_Legal_2014_06,ruemorgue_rtx_librivox,teachingsofthetaoevawong,327417477WilliamGoldingLordOfTheFliesPdf,MystAffStyles,HotPoppinPregnancyFetishD.D.TeoliJr.A.C.1,osho-love-freedom-and-aloneness-the-koan-of-relationships-2002,MadameBovary,BaitEng,in.ernet.dli.2015.403747,fouragreementsp00ruiz_0,20211213_20211213_0513,ProblemsOfPhilosophyTheBertrandRussell,jaishankarmamtahindi,onehundredyearso0000garc_y5v5,nightflightsaintexuperyantoinede1900,04-prakaran-16-mazi-atmakatha-dr.-babasaheb-ambedkar,Underworld-ChilledMix,JoeOrtonsLoot,WATTBBCR4,bbc-sci-fi-radio-plays-part-eight,EP6LessonsLearntStealLikeAnArtist2204201822.49,withoutfearlifet0000naya,MahavidyaMahakaliMantraTantraSadhnaEvamSiddhiByShriSumitGirdharwalJi,MastermindHowToThinkLikeSherlockHolmes,lp_the-hobbit_jrr-tolkien-nicol-williamson,kiterunner0794hoss,politicalthought00bark,nude-exploeation-1,legrandromanindi0000shas,KishorKumarHits,in.ernet.dli.2015.539221,marcus-aurelius-emperor-of-rome-martin-hammond-diskin-clay-meditations,hookedhowtobuild0000eyal,psychoanalysis_1710_librivox,SachitraSamudrikRahasyaBhashaTikaJyotishPrakashan,learn-korean-language,DownloadFile_201704,discourse_inequality_ej_librivox,ROoI_gyata-se-mukti-of-j.-krishnamurti-by-harish-krishnamurti-foundation-varanasi,ageofinnocence_2007_librivox,littlelameprince0000miss_i1b6,MoreHowToDrawMangaVol.1TheBasicsOfCharacterDrawing,billie-eilish_202109,pirekamilperfect0000ahma,killerinstinct0000barn,premchandvardanhindi,The_Silmarillion,tuesdayswithmorriefulltext,hustler-39-s-taboo-2014-11-12,hungrytide0000ghos,Fugmans-stories,tihpodcastTueMay052020,RAE83BeatlesWhite,intimacy-trusting-oneself-and-the-other-by-osho,jahangiramarchit0000anan,Jadu-Ki-Duniya-The-Evil-Eye-Black-Magic-Jinn-Urdu-audio-lecture,pyar_ki_niv_hindi_kahani_stories_in_hindi_hindi_moral_story_hindi_kahaniya_-176063475647294771,petits-contes-pour-grandes-personnes-hd,lp_movie-melodies-of-madan-mohan_madan-mohan-lata-mangeshkar-manna-dey-mohd,haunting-adeline_202405,taormino-t.-the-anal-sex-position-guide-2009,faizan-e-namaz,PrafullaKolkhyanKITANEPAKISTAN,dogmeetrituelde01lvgoog,ThePremonitionsBureauBBCr4,HamOnRyeByCharlesBukowski,TheManInTheBlackSuitStephenKing,BigBusinessLark,beppe-cunico-passion-love-heart-soul-2020,AgathaRaisinBBCr4,SteveGardinerBBCr4,miracleoflovesto00ramd,20seikishonentwe0000uras_k5w1,caligula0000albe,VirginiaWoolfARoomOfOnesOwn2015,americandictiona01websrich,decline_fall_1_0707_librivox,revoltofangels00fran,flash-gordon-sunday-newspaper-strips-1934-1935-76-weeks,warren-vampirella-099,marvel-skin-pack,unfuck-yourself-audiobook-by-vaibhav-khade.-7z,1960sOHSii,sophies-world,FigureDrawingForAllItSWorth_20180306,BBC_Radio_6_Music_20170417_200000_Gideon_Coe,xxz97ziotea725beze84kjzngoqlnw8oxlconfis,animalfarmtamsingreigatobyj,indistractable_202405,darkmatternovel0000crou,castle00kafk_2,whattodrawhowtod00lutz,20230717_20230717_1439,DashtESabaByFaizAhmedFaizUrduinpage.com,encyclopediaofvedicastrologyyourprofessionupsanddownsshankeradawal_202003_732_w,haunting-adeline-cat-and-mouse-duet,teenyakkeurdugulshannanda,allfnafbooks,AHistoryOfSufismInIndiaVol.OneSaiyidAtharAbbasRizvi,TheSufferingOfBeingKafka,summary-jannat-ke-pattey,belovedprophetlo00gibr,HamaraMulk,EdwardBernaysWomenSmokingAdCampaignPropaganda,in.ernet.dli.2015.464271,OTRR_Suspense_Singles,40_Something_SP254,MiratUlUroosByDeputyNazeerAhmad,shakespeareworks01claruoft,Zakoula-Greek-Translated-Adult-Comics,MarkFisherCapitalistRealismIsThereNoAltbOk.org,pehli-barish-nasir-kazmi,immortals-of-meluha-marathi,wahrheitpfad_buddha_librivox_1007,WhatToSayAfterYouSaidhello,podcast_life-with-books_forty-rules-of-love_371912994,dni.ncaa.SAK-795_1-AC,LESTINIRMALA,VivaldiWinter,TheProphetGibran,rknarayan-guide-hindi,Revolution2020ChetanBhagatdldqps.tk,DoctorWhoMagazines,mashiandotherst00tagogoog,cu31924079747485,in.ernet.dli.2015.348749,notesofdirtyoldm00buko,Pon-Pon1,palaceofillusion00diva,haebyonuikapukak0000mura,arabiannights10_1907_librivox,36-mansur-yaman-kalyan-1-pata-tore-karan-bengeri,king-of-pride,SteelyDan-KMETBroadcast1974,in.ernet.dli.2015.303002,Gmail_201611,anton-chekov-plays-in-hindi-raduga-1985_202408,lajjatasleemanas020901mbp,finally-legal-2008-12,EvergreenHitsOfDevAnandsungByKishoreKumar,AAJKEURDUSHAYARHINDI,sapiens-a-brief-history-of-humankind_202311,manga_BoingBoingTeacher-c01,allencarrsquitsm0000alle,KhudaKiBastiUrduNovelByShoukatSiddiquiZemtime.com,TeriYaadPoetryCollectionByMohsinAftabKelapuri,in.ernet.dli.2015.444382,podcast_audiofile-magazine_metamorphosis-by-franz-kafka_408834576,MeraGhumHiAakhirMereKaamAaya,blackhole0000burn,Taboo_Old_and_Young_Issue_02_2017,nativeamericanme0000moer,biography_of_APJ_Abdul_Kalam,in.ernet.dli.2015.446933,lp_the-four-seasons_antonio-vivaldi-leonard-bernstein-the-new,beyond-duality-the-art-of-transcendence,whitetiger00arav,7th_anniversary_collection_1208_librivox,redrising0000pier,s01e01thetestamentsomnibus,JulusPhanishwarNathRenu,Decagonal_Frequencies,beyondgoodandevi04363gut,GabrielGarciaMarquezCienAnosDeSoledad,XAHH_kaal-chetana-amrita-pritam,secret-window-secret-garden,in.ernet.dli.2015.379675,Barely_Legal_2016_09_Original,sriramakrishnaam0000anan,illustration-deconstructs-new-book,jungle-taitei-complete-manga,copy-of-metasex.-issue-1,inspector-thorn-the-lucas-testament-michael-robson,TheCollectiveUnconsciousAndItsArchetypes_100,lifeofantony_1308_librivox,LaMetamorfosi,disciplinedtrade00doug_0,gravitysrainbow00pync_0,PlayboyUSAOctober2013TheCollegeIssue,ENGLISHQuestions_201801,alex-hirsch-gravity-falls-lost-legends-2018-1368021425-9781368021425-libgen.lc,controversy_1011_librivox,zinesvolumetwozi00vval,harem-pylate,Arthashastra_Of_Chanakya__Other_Books,GulzaarKiKavitaJabMaiChhotaTha,17-the-alchemist-bonus-1,ChauthiKaJoda,it-starts-with-us-life-feeling,MapsofMeaning2017,AdharByPremchand,isbn_9780470108543,arina-tanemura-illustration-making-book,SEX_1926-11_Darwination-McCoy,allen-carr-the-illustrated-easyway,knowledgeexternalworld_1508_librivox,Psychotronic_Video_04,ParizadCompletSigned,mundan-harishankar-parsai,jane-austen-pride-and-prejudice-stevenson,MachiavelliNiccoloThePrinceEN1513239P.,ZAhmedUrduPoetryPodcast_1,scanned-document-49_20200910,poesia-completa-jorge-luis-borges-z-lib.org,lp_laila-majnu_madan-mohan-jaidev-ambar-kumar-anuradha-az,ac_goetia,ltxR_kirpal-kaur-novel-punjabi-by-bhai-pratap-singh-punjabi-novel-company-aamritsar,YatharthGeetaBengaliAudio,rani-tatt,hinduism_and_buddhism_vol2_2011_librivox,goddelusion0000dawk_k1d9,BoodhiKakiPremchand,1234_20190925,clashofkings0000mart,audio_poetry_62_2006,berman-l.-loving-sex.-the-book-of-joy-and-passion-2011,caligula-albert-camus-1992,5678_20190907_20190907,r7l1h7xxfzedh44pgrcpodcpqe9ycrauqdmlvbzs,BOYSCompressed,artoffencing01sena,indianconstituti0000aust,SalokBhagatKabirJioKe,newtonphilosophy00pembuoft,Metasex,MarathiNovelAudioBookMohaAttractionGenreRomance,BBCr4ShardlakePlays,in.ernet.dli.2015.342907,play-den-january-2021,the-emerald-tablet-of-hermes,cd_lost-kingz_thagodfahim-architect-13-c-lance-dj-muggs,milmanual-us-marine-corps---mwtc-winter-survival-course-handbook,HistoryAgricultureIndia1,flash-gordon-1934-1947,idle_thoughts_librivox,incest-magazine-special-daddys-girl-2,cheeks-volume-298-2021,mysticism00russuoft,newsextherapyact00kapl,SamuelBeckettEndgame_20190206,Playboy_December_2014_ZA,rolfe-dewolfe-mech-folder-incomplete,cd_best-of-saint-saens_camille-saintsaens-eugene-goosens-philharm,images_20230810,cu31924052393315,gentlemaninmosco0000towl,short_scifi_32_1001_librivox,theleopardinautumnseries1,KavitaHarishankarParsaiAakhirPayaToKyaPaya,AstroPalmistryBYMIHIRACHARYA,TheWonderThatWasIndiaByALBasham,in.gov.ignca.44048,Abdullah-by-Hasim-Nadeem,in.ernet.dli.2015.345839,dracula_v4_1903_librivox,Episode1-LailaMajnu-Part-kathbhitrakaGeetharutimesFm90.6Mhz,oshofirstbuddhai0000deva,MardaneArabHindiVolumeNo.2,Bhimsen-Joshi,b9cbgwtavhcxzngis0r0caktawp6wssbkqefsycs,in.ernet.dli.2015.458322,al-aqidah_al-thahawiyyah_202002,ERO-13,very-special-prison,thebirthoftraged00nietuoft,larken-rose-the-most-dangerous-superstition-iron-web-publications-2011,cd_gangs-of-wasseypur_sneha-khanwalkar-piyush-mishra,MusnadAhmadIbnHambalTarjamahByShaykhMuhammadZafarIqbal,poisonedbreadtra0000unse,lp_saraswatichandra_kalyanji-anandji-chorus-lata-mangeshkar-ma,the-stranger_202404,stovegodcooksrocmarcianoifthesekitchenwallscouldtalk,Gauranpuransaroddhar,ResidentEvilComicBookCollection,elalquimista0000coel_x4e8,naked-in-nature-004,indias-struggle-for-independence_202106,isbn_055322638,SlammedAudioBook_ESHAYAT,YamadaShojiTheMythOfZenInTheArtOfArchery,indias_love_lyrics_1905_librivox,in.ernet.dli.2015.435939,ezra-pound_202209,A.EWaiteTheDoctrineAndLiteratureOfTheKabalah,oshonotesofmadma0000bhag,barely-legal-january-2022,Sight_And_Sound_2014.05_Jean_Harlow_Hollywood_before_the_censors,rich-dad-and-poor-dad,system-change-a-lit-rpg-adventure-system-universe-book-1,TheArtOfLoving,RangeelaRasulpdf,us_history_vol1_librivox,baldursgate-dia-5e,beginnersenglish00noli_1,timburtonsnightm00timb,meeraji-ki-nazmein,javed-akhtar-interview-air-april-11th-2020-on-dil-ki-awaaz,manga_Domestic_na_Kanojo,podcast_better-living-through-books_episode-1-thinking-fast-s_381165011,notesonindianhis00marxuoft,datpiff-mixtape-m3bc3a91,krishnakey0000sang,siddhartha02500gut,TheMagicOfThinkingBig,passage_to_india_2207_librivox,BBC_Radio_2_20160913_053000_The_Chris_Evans_Breakfast_Show,indiaancientpastbyrssharma,AbeLymanCollection1925-1934,priyanshi-jain_20230926_1551,pdfy-RtCf3CYEbjKrXgFe,manga_Berserk-v10,draculabr00stokuoft,1681939-images,jungle-fantasy-annual-20172017digi,dream_within_dream_librivox,andmountainsecho00khal,we-the-people-nani-a-palkhivala,01Scofield1917MatthewNT,raj-comics-anthony-collection,NafsanayByQudratUllahShahabUrduShairi.com,Teen_Spirit_001,milf-part-3-fall-semester,incest-magazine-special-oedipussy-2,wg847,premchandsajjanatakadandhindi,rainermariarilke_poems_1509_librivox,Dean_Yeagle_Scribblings_vol._3_sketchbook,historyofmagicin00lv,UttarakhandKaSona-Baanjh-Hindi,OTRR_Tarzan_Singles_TLotJ,Panty_MILFs_Adult_Photo_Magazine_Volume_2,the-rise-of-the-dragon-george-r.-r.-martin-au,watchmen,HeerWarisShahPt1AbidaParveen,dli.ernet.438834,milkhoney0000kaur_k2f2,firstman00camu,the-complete-daredevil-collection,psychopathologyo00freuuoft,in.ernet.dli.2015.478799,meenakshijainmedievalindia2002ncert,HindiBook-meera-Sudha-sindhu,greta-thunberg-turn-off-lights-nano-d.-d.-teoli-jr.-a.-c.,thephilosophyofi47880gut,empireofbusiness_2010_librivox,power-les-48-lois-de-pouvoir-robert-greene_202109,ZBNFHINDI,the-history-of-art-janson,andrewloomiscreative.illustration,Psychotronic_Video_33,Brazil_Sexotics_Adult_Photo_Magazine_November_2017,BhagvadGitaNotesComplete-GaurangaPriyaDasa,ElPrincipitoAntoineDeSaintExupery,3rdBrother-GraphicNovel,divinemercyinmys00faus,CrimeAndPunishment1866Dostoyevsky,volume-5,baburnamainengli01babuuoft,KhutbaMyanmarMusolmanderNirjatonByProf.Dr.M.AsadullahAlGhalib18.11.2016,058_20220806_20220806,lighthouse_contemporary_reviews_2310_librivox,leonardcohen-thanksforthedance2019_201911,timefortomorrow00ross,andthentherewerechri00chri,HyMm_psychology-of-music-report-of-seminar-january-1975-by-various-authors-sangeet-na,michael-jackson-discography-1972-2009,KhazaneValaTapu-Comic-Hindi,little_wars_librivox,TheMonkWhoSoldHisFerrariAudiobook,NQQz_swami-vivekanand-ki-vani-by-swami-brahmasthanand-ramakrishna-math-nagpur,fritjof-capra-tao-of-physics-ocr,naqshifaryadi00faizuoft,everything-i-know-about-love-dolly-alderton,ethicalbrain00gazz,ShockCinema192001,Vulture-NoLongerHuman,ImcOnairPresents...RabindraSangeet-AVoiceForAll2009Part13,HindiBookNityaKarmPoojaPrakashCompletebyGitaPress,autobiographyofa07452gut,04TheHouseOfHades,XXXApartmentsEpisode3,wihq_schoolom-ko-patra-part-2-by-j-krishnamurthy-2001-india-krishnamurthy-foundation-trust,pdfcoffee.com-the-lost-book-of-herbal-remedies-by-nicole-apelian-claude-davis-z-liborg,in.ernet.dli.2015.307292,comoleerelcuerpo0000ohas,isbn_9780671701185,parmanu,Paksindh,flowersforalgern00keye,gundam-mobile-suit-bible-01,story_keller_librivox,how_we_think_la_1512_librivox,nm_20240312,HealthPsychology2ndEdgnv64,SecretsOfTheSelfAsrarEKhudi,eminem-the-death-of-slim-shady-coup-de-grace-eminem-the-death-of-slim-shady-coup,the-book-of-women-osho_202309,in.ernet.dli.2015.304978,the-secret-science-of-numerology-the-hidden-meaning-of-numbers-and-letters-pdfdrive,artofthinkingcle0000dobe_b3z7,in.ernet.dli.2015.484032,missionaries-in-india-continuities-changes-deilemmas-arun-shourie,my-gita-explained-2,bookofusefulplan00rogerich,hustler-39-s-taboo-2014-09-10,thegrandinquisit08578gut,lp_purab-aur-pachhim_kalyanji-anandji-asha-bhosle-brij-bhushan,consolationsofph0000debo,IshqKaAinAleemulHaqHaqqi,lettertofriend00sain,greatindiannovel00thar,The_Urban_Sketcher_Techniques_for_Seeing_and_Drawing_on_Location_by_Marc_Taro_Ho,hpot_librivox,SarveshwarDayalSaxenaKiKuchKavitayen-Hindi,bharat-ka-samvidhan-hindi-salil-anil-kumar-z-library,Complete_Works_of_Jibananda_Vidyasagara,grimm_fairy_tales_1202_librivox,Gulzar_201705,omen_of_the_stars_05_-_the_forgotten_warrior-2,MohenjodaroKiMaya-Hindi,MADILOG,english-idioms-in-use-intermediate-book-with-answers-2017,historyoflatinam005150mbp,TheCycleOfSpring,islam-said-havva__1304255878060831,attitudeiseveryt0000kell_l2d9,influencescience00cial_1,venice-ka-saudagar-rangey-raghav-1,TheMadman-English-KhalilGibran,in.ernet.dli.2015.361009,pdfy-45Yz653E8l86bAEM,BardcastTwelfthNight,gabrielgarcamrqu0000unse_w4u6,the-indian-war-of-independence-of-1857-veer-savarkar-1.30.38-pm,completeprophecinost,attitudeiseveryt0000kell,CHINAH,yashpalmeriteriuskibaathindi,HHBD_201911,norwegianwood0000mura,Bat_Man_by_Lew_Merrill_1936_2002_Reprint,Bukowskicollection,vedant-darshan-brahma-sutra-gita-press-gorakhpur,HustlersTabooUsa20150910,the-will-to-change-men-masculinity-and-love-by-bell-hooks-z-lib.org.epub,tagorereader0000unse,beautifulbastard0000laur,kino-nr-9-2007-wrzesien-september,in.ernet.dli.2015.443822,t9-t9,goldfinch0000tart,rina-kent-god-of-malice-z-lib.io,blackbeauty_librivox,thusspakezara00nietiala,AlQuranWithBengaliBanglaTranslation-ReciterMisharyRashidAl-Afasy,alchemistfableab00coel,18-eighteen-magazine-october-2017,vo-sala-khaddarwala-ved-prakash-sharma-merath,bulfinch_myth_age_fable_0810_librivox3,in.ernet.dli.2015.396984,an-introduction-to-indian-philosophy-satischandra-chatterjee-dhirendramohan-datta,IntroductionToNutritionBook,tokyoghoulmangacomplete,childrenshomerad00colu,AakhrEShabKeHumsafar,Horny-Aunty-By-Desigandikahani.blogspot.com,jyotishlalkitabb.m.gosvami,wg789,rock-melodic-radio-aor-melodic-rock-hard-rock-recorded-radio-2023-03-19-14-21-16,songofachilles0000mill,Psychotronic_Video_06,OSHO_Udio_Pankh_Pasar,GoneGirl2014_201501,TheAltarOfVenus,UnderstandingPatriarchy,HindiBookSankshiptYogaVasisthaByGitaPress,charles-dickens_david-copperfield,Rigvedcollection,phish2024-08-16.Munda.mk4v.PSP2.flac24,TheSecretbook,50Plus_MILFs_No224_-_Original,confession_1505_librivox,judge-dredd-the-day-the-law-died-2-2,gujarat-no-nath-merged-kanaiyala-munshi-gujrati,lawofsuccess0000hill,the-monk-who-sold-his-ferrari-a-fable-about-fulfilling-your-dreams-reaching-your,adult_201701,dli.calcutta.10944,BraveNewWorldByAldousHuxleyAudioBook4Of7,BasicEnglishGrammarERWINHARIKURNIAWAN,kamsutra-book-in-hindi,isbn_0671752847,stealingfirehows0000unse,ZarLataShumZarZal,AakhiriPadaav-HindiStoryBook-KahaniSangrahaByShubhashNeerav,spree-v-1-n-9-1959-0040a,thoughtsonpakist035271mbp,douglas-adams-the-hitch-hikers-guide-to-the-galaxy-vinyl,paul-temple-and-steve,goddelusion0000dawk_o9r0,lord-of-the-mysteries,cdromxn26diciembre1997,vocabularyofengl00barnrich,dni.ncaa.SAK-575-AC,adolfhitler-meinkampfband1-horbuchdeutsch,story_mankind_0906,TFR1098-VaginalCadaver-PornTunes,dni.ncaa.SAK-924-AC,confessions_augustine_0911_librivox,the-invisible-life-of-addie-la-rue-by-v-e-schwab,richdadpoordadwh0000kiyo_t8n6,in.ernet.dli.2015.218475,sandmanvol4seaso0000gaim,ALifeOfBlissBbc,sexmanualforpeop0000ivor,GhazaliyaatEMeerTaqiMeer,Barely_Legal_2014_09,the_invisible_man_2102_librivox,HistoryOfMuslimPhilosophy,biopsychology,Bhagawat-Gadya-Marathi-Skandha01,historymodernphilosophy_2101_librivox,yDZK_nave-kiran-by-v-s-khandekar-marathi-1947-r-j-deshmukh,taraqqipasandadab,briefhistoryofti0000hawk_n1e8,sadhguruji01,pluto_20231110,harrypotterdeath0000rowl_z5e5,h97h85axqlqjf60ss1r9ubi7tktubonj7c0tcmxc,sex-a-manual,Score_Big_Boobs_Winter_Catalog_2015,mangalsutrapremchand,nicomachean_ethics_ge_librivox,mrutyunjay,DeathOfTheFamily_201804,KamakhyaMantraSadhanaEvamSiddhiInHindiByGurudevShriYogeshwaranandJi,BBC_Radio_6_Music_20160914_200000_Gideon_Coe,onliberty00inmill,idiotfyoddoordos0000cons,mayfair-volume-38-issue-10,the-prophet-by-kahlil,oedipusplays00soph,ThinkOnTheseThingsByKrishnamurti1.pdf,python-data-science-handbook.pdf,maskoflove0000barb,arvopartfratres_202103,indianrenaissanceindiasriseafterathousandyearsofdeclinesanjeevsanyal_897_P,podcast_book-club-shmook-club-talkb_bcsc-65-the-devil-whit_364184443,jojosbizarremarriedlifeclamp,war-of-lanka-ram-chandra-series-book-4-by-tripathi-amish-pdfread.net,umbrearlypoemsof00pounrich,startrekencyclop00unse,StarTrek-Contact-3,tintin-breaking-free,aperfectspybbcr4,IMPROVISEDWEAPONSKURTSAXONTHECOMPLETECOLLECTIONGRANNDADSPMJBSURVIVORGREATSTHERUSSIANS,GarudaPuranamSimpleTelugu,akira-toriyama-the-world-anime-special,three_little_pigs_librivox,Realmbreaker,meishaonuirasutonoriarunajibyinhe,2018Fundamentals.ofPython,1133_20191022,FreemasonryAndJudaismSecretPowersBehindRevolutionVicomteDePoncins_201609,TerrenceRattiganBBCr4,scanned-document-25,rigormortisbbcr4,m6xp0ege2fxgokoxfvpntzxeeyznvoppkucaobzw,faithfamilydutch00robe,windsandstars00sain,priyanshi-jain_20230926_1606,globalizationofw0000unse_g5k1,ArunaLama-UdiJaunBhane,homo_sapiens_romantrilogie_1508_librivox,the-creative-act-a-way-of-being-by-rick-rubin,auguste_comte_positivism_bb_librivox,HolyQuranEnglishTranslation,it0000king,the-world-of-fatwas,AnarchismRadicalFeminism5,chapter-1_202106,the-art-of-h.-p.-lovecraft-s-cthulhu-mythos,TheKeyToTheMysteries,osamu-tezuka-complete-manga-works_202307,genkosha2019,Sexy_Pussy_No_2_Special_Extreme,dni.ncaa.SAK-739_2-AC,in.ernet.dli.2015.184765,theuseofknowledgeinsociety_2406_librivox,NidaFazliAndShailshJi,manaralibrary0004mana,dasschlossfranzkafka1953,KavitaGopaldasNeeraj,santa-lilio-sangre-ayami-kojima-artworks,cd_solar-system_rockn-learn,ego-is-the-enemy-by-ryan-holiday,Psychotronic_Video_15,pdfy-kxJuN00KtPU1iooO,ov57cgids7eyfofixzr7t9f6d7rztcirxusurf,ack-bhagawat-the-krishna-avatar,in.ernet.dli.2015.307309,Book1969LiewellynAToZHoroscopeMakerAndDelineatorKPRedIt,G.BachelardThePoeticsOfSpace,terminator-now-005-the-burning-earth,rosswilsonanatom0000waug_y8r9,in.ernet.dli.2015.304730,podcast_audiolibros-online_-audiolibro-la-metamorfos_1000419448496,glasscastlememoi0000wall_d1r4,YatharthGeetaKannadaAudio,hard-times-create-strong-men-stefan-aarnio,principlesofphys00pjep,NayyaraNoor--AeJazbaEDil,14.MuhammadBinQasim1Pdfbooksfree.pk,comedyoferrors_1011_librivox,in.ernet.dli.2015.404047,shibram-chakraborty-hindi-story-audiobooks,beholdapalehorsebymiltonwilliamcooper1991_202003,collected-stories-franz-kafka,Episode50KrishnaAndKarna,ChiefKiDaavatBheeshmSahni,raj3elsad-Sa7e7Trgheb2,champak-august-first-2006,OTRR_Jerry_of_the_Circus_Singles,Jitendra-Abhisheki-marathi-song,familiesoffrench00swan,ChapelPerilousSerial-NewUploads,GovernmentGazetteOfUttarPradesh,b24926747,01.-kamyu-alber-padenie,erotica_of_osamu_tezuka,hound_baskervilles_librivox,AnnihilationOfCaste-Munnurai1,breast-stories-by-mahasweta-devi-mahasveta-debi-gayatri-chakravorty-spivak,AutobiographyOfAYogiHindi_201703,Unitarian_Universalist_Church_of_Lexington_s_Podcast-11557590_10_23_the_courage_,the-power-of-your-subconscious-mind-joseph-murphy-complete-hindi-audiobo-128k,marryhimcasefors00gott,RaversUniformSpecialIssueNo1Superuk,beyond-enlightenment-osho_202101,HindSwaraj-tag-2-08-,YaramBySumairaHameed,Total_Film_and_SFX_Present_80s_Movies_2015_UK,ozx01h029gi6xmbrgkzs8njhyo0u9bmzcpajo7tp,deadpool-samurai,OmChanting,BeyondOurKenCompleteSeries4,hindswarajorindi00ganduoft,AlanMooreEssentials,BodyLanguageAllanPease,behaviorinorgani0000gree_l2i4,sim_playboy_january-1969-december-1973_16-20_cumulative-index,tendingheartofvi00guro,a-biography-of-the-prophet-of-islam-in-the-light-of-the-original-sources,horror_003_librivox,wutheringheights_1306_librivox,best-of-pamela-anderson,kamasutraidiotsguide,mrspaceship_pc_librivox,the_house_with_the_mezzanine_and_other_stories_1309_librivox,prernanuzharnutw0000drji,JoeOrtonsEntertainingMr.Sloane,LucentsGeneralKnowledgeWww.qmaths,bible_kjv_01_02_03_0908_librivox,belampuntoyourse00osho,famous_men_rome_0803,MantoKutteKIDuvaMadhavi,StrayBirds,vinland-saga-01-107,mansoor_p.l.deshpande,ost-business-core-concepts-of-marketing,kriya-yoga-the-science-of-life-force-pdfdrive,ost-english-timemachineinven00welluoft,PanoramaOfIndianPainting,10-hours-hot-tub-white-noise-river-320,su-that-colleen-hoover-iusach-dich,takberat_______al3eed-------mp3,ost-english-the_idiot,i-want-to-eat-your-pancreas-2014,sexyouthsexeduca0000camp,Tagore-Instrumentals,python-crash-course.pdf-pdfdrive,consolationofphi029292mbp,phantomlover_1110_librivox,MTpa_godan-of-munshi-premchandra-bharatiya-granth-niketan-delhi,babarao-savarkar-v003,HitlerTableTalk,ovocny_strom_a_jeho_pesteni,fundamentalsoftr0000yinh,lp_plath_sylvia-plath,folkloreofcotswo0000brig,fallandoutsider00camu,sylvia-plath-street-song-www.-etoile.-app,in.ernet.dli.2015.342406,ashram_202102,vangoghselfportr00gogh,doctorwhothestonerosereadbydavidtennantaudiobook,cd_the-sea-hawk-previn-conducts-korngold_erich-wolfgang-korngold,enchanted_castle_pe_librivox,tibetan-book-of-the-dead,JOHNTODDTapeB,BegumAkhtarHindYugm,ThinkingInC,american_history_librivox,kupdf.net_232472817-robert-greene-masterypdf,autechre12hrmix,TheTryalOfMaryBlandySpinsterForTheMurderOfHerFatherFrancis,VOK499FireAndBloodWithGeorgeR.R.MartinARecap_20181209,youanovelofdarko0000kepn,dli.language.2486,super-gene-twelve-winged-dark-burning-ange,joyofgaysexi00silv,visualartshistor00hono,porn-links-updated-10-17-2022,hindi-urdu,mammothbookofero0000unse_g7g4,newfirstspanish00wormgoog,the-book-of-ram,wo-piya-se-chudne-wali-th-song-antarvasna-audio-sex-story,kino-nr-2-2006-luty-february,jamendo-097169,nusratcollection_20170412,kamasutra-ilustrado,feartrembling0000kier,gardenofkama_2104_librivox,QuranTafseerInUrduFULLDr.IsrarAhmedIntroduction,the-creative-act-by-rick-rubin,thinkbigunleashi0000cars,the-grand-bible-3rd-edition-2021,akira-book-05,herbertwest_reanimator_pc_librivox,IanHolmBBCr4,zen-and-the-art-of-motorcycle-maintenance_202105,kantproblemofmet00heid,moomin-yasuhiro-nakura-art-works_202012,dli.language.0123,manic_doujin_00014,rhetoric_ge_librivox,einsteinstheoryo00born,dramaofgiftedchi00mill_1,gayscience0000niet,hindi-shayari,Level4Emma,hindutva1923,mayfair-volume-29-issue-13-1994,elprincipito00sain,oedipuskingtext00sophgoog,doujin_Selfish_Top_and_Airheaded_Bottoms_Yuri_Smut,Mature_Ladies_Adult_Photo_Magazine_Issue_16,adrarp6zxqtvupyqtmld3g8vgdo4forq7ixdbwvx,raidas-pad-final-2,BBC_Radio_4_Extra_20170611_133000_Arundhati_Roy__The_Ministry_of_Utmost_Happiness_Omnibus,mysticismlogicot00russ,thebreakdownepisode317,KabirSahibKaSaakhiSangrah-Hindi,theprinciplesofp01jameuoft,criminalinvestigation2_1607_librivox,tintin-the-complete-companion-pdfdrive,dramaofgiftedchi00mill_0,husnuak00eyhg,razzle-vol-14-no-06,mayfair-volume-48-issue-08,kitab-ka-kafan-krishan-chander,thisexplainsever0000unse,cheri-2014,twentiethcentury00bhanrich,priyanshi-jain_20230926_1557,tafseer-mariful-quran-sura-19-maryam-english-translation-pdf,odyssey01_1711_librivox,slut-sounds-podcast-ep-20,cd_blood-meridian_numb,turns_thought_modern_philosophy_librivox,conspiracyagains0000thom' + const ids = itemIds.split(','); + + let batch = db.batch(); + let batchCount = 0; + const MAX_BATCH_SIZE = 500; // Firestore limit + + + const chunkSize = 200; + const itemIdChunks = []; + for (let i = 0; i < ids.length; i += chunkSize) { + itemIdChunks.push(ids.slice(i, i + chunkSize)); + } + + console.log(`Split item IDs into ${itemIdChunks.length} chunks`); + + // Process each chunk + for (let i = 0; i < itemIdChunks.length; i++) { + const chunk = itemIdChunks[i]; + console.log(`Processing chunk ${i + 1} of ${itemIdChunks.length}`); + + const chunkQuery = `identifier:(${chunk.join(' OR ')})`; + const chunkUrl = `https://archive.org/advancedsearch.php?q=${encodeURIComponent(chunkQuery)}&rows=200&page=1&output=json&sort=-downloads`; + + console.log(`Fetching metadata for chunk ${i + 1} from URL:`, chunkUrl); + + try { + const chunkResponse = await axios.get(chunkUrl); + const chunkDocs = chunkResponse.data.response.docs; + + console.log(`Fetched metadata for ${chunkDocs.length} items in chunk ${i + 1}`); + + // Process the chunk docs + for (const doc of chunkDocs) { + console.log(`Processing metadata for item: ${doc.identifier}`); + const docRef = db.collection('content_metadata').doc(doc.identifier); + + // Pick specific fields you want to save and remove undefined values + const fieldsToSave = removeUndefined({ + identifier: doc.identifier, + title: doc.title, + creator: doc.creator, + description: doc.description, + downloads: doc.downloads, + mediatype: doc.mediatype, + subject: doc.subject, + collection: doc.collection, + language: doc.language + // Add any other fields you want to save + }); + + batch.set(docRef, fieldsToSave); + batchCount++; + + // If batch size reaches limit, commit and reset + if (batchCount === MAX_BATCH_SIZE) { + await batch.commit(); + console.log(`Committed batch with ${batchCount} operations`); + batch = db.batch(); + batchCount = 0; + } + } + + } catch (error) { + console.error(`Error processing chunk ${i + 1}:`, error); + } + } + + // Commit any remaining operations in the final batch + if (batchCount > 0) { + try { + await batch.commit(); + console.log(`Committed final batch with ${batchCount} operations`); + } catch (error) { + console.error('Error committing final batch:', error); + } + } + + console.log('Finished processing all chunks'); +}); + +// Export the fetchAndSaveMetadata function +module.exports = { + fetchAndSaveMetadata: exports.fetchAndSaveMetadata +}; + + + diff --git a/functions/package-lock.json b/functions/package-lock.json index ad3598cad..2ef867f25 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -8,8 +8,10 @@ "dependencies": { "@google-cloud/bigquery": "^7.9.0", "@google-cloud/storage": "^7.12.1", + "axios": "^1.7.7", "firebase-admin": "^12.1.0", - "firebase-functions": "^5.1.1" + "firebase-functions": "^5.1.1", + "natural": "^8.0.1" }, "devDependencies": { "eslint": "^8.15.0", @@ -1552,6 +1554,15 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1654,6 +1665,71 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1943,6 +2019,21 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "license": "MIT" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -2017,6 +2108,26 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/afinn-165": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/afinn-165/-/afinn-165-1.0.4.tgz", + "integrity": "sha512-7+Wlx3BImrK0HiG6y3lU4xX7SpBPSSu8T9iguPMlaueRFxjbYwAQrp9lqZUuFikqKbd/en8lVREILvP2J80uJA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/afinn-165-financialmarketnews": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/afinn-165-financialmarketnews/-/afinn-165-financialmarketnews-3.0.0.tgz", + "integrity": "sha512-0g9A1S3ZomFIGDTzZ0t6xmv4AuokBvBmpes8htiyHpH7N4xDmvSQL6UxL/Zcs2ypRb3VwgCscaD8Q3zEawKYhw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -2091,7 +2202,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2118,6 +2228,18 @@ "node": ">= 8" } }, + "node_modules/apparatus": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.10.tgz", + "integrity": "sha512-KLy/ugo33KZA7nugtQ7O0E1c8kQ52N3IvD/XgIh4w/Nr28ypfkwDfA67F1ev4N1m5D+BOk1+b2dEJDfpj/VvZg==", + "license": "MIT", + "dependencies": { + "sylvester": ">= 0.0.8" + }, + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2140,6 +2262,15 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -2155,6 +2286,31 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2304,6 +2460,24 @@ ], "license": "MIT" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/big.js": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", @@ -2435,6 +2609,15 @@ "node-int64": "^0.4.0" } }, + "node_modules/bson": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -2524,7 +2707,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2588,6 +2770,15 @@ "node": ">=12" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2612,7 +2803,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2625,7 +2815,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/combined-stream": { @@ -2704,6 +2893,15 @@ "node": ">= 0.10" } }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -2873,6 +3071,18 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/duplexify": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", @@ -3204,6 +3414,12 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3570,6 +3786,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz", + "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -3683,6 +3919,15 @@ "node": ">=14" } }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3898,7 +4143,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3952,6 +4196,27 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -3998,6 +4263,20 @@ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "license": "MIT" }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -4024,6 +4303,45 @@ "node": ">= 6.0.0" } }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -5179,6 +5497,15 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5258,7 +5585,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -5419,6 +5745,21 @@ "node": ">= 0.6" } }, + "node_modules/memjs": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/memjs/-/memjs-1.3.2.tgz", + "integrity": "sha512-qUEg2g8vxPe+zPn09KidjIStHPtoBO8Cttm8bgJFWWabbsjQ9Av9Ky+6UcvKx6ue0LLb/LEhtcyQpRyKfzeXcg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -5514,46 +5855,306 @@ "node": "*" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=14" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=16" + } + }, + "node_modules/mongoose": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.6.1.tgz", + "integrity": "sha512-dppGcYqvsdg+VcnqXR5b467V4a+iNhmvkfYNpEPi6AjaUxnz6ioEDmrMLOi+sOWjvoHapuwPOigV4f2l7HC6ag==", + "license": "MIT", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "6.8.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mongoose/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz", + "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/natural": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/natural/-/natural-8.0.1.tgz", + "integrity": "sha512-VVw8O5KrfvwqAFeNZEgBbdgA+AQaBlHcXEootWU7TWDaFWFI0VLfzyKMsRjnfdS3cVCpWmI04xLJonCvEv11VQ==", + "license": "MIT", + "dependencies": { + "afinn-165": "^1.0.2", + "afinn-165-financialmarketnews": "^3.0.0", + "apparatus": "^0.0.10", + "dotenv": "^16.4.5", + "http-server": "^14.1.1", + "memjs": "^1.3.2", + "mongoose": "^8.2.0", + "pg": "^8.11.3", + "redis": "^4.6.13", + "safe-stable-stringify": "^2.2.0", + "stopwords-iso": "^1.1.0", + "sylvester": "^0.0.12", + "underscore": "^1.9.1", + "uuid": "^9.0.1", + "wordnet-db": "^3.1.11" + }, + "engines": { + "node": ">=0.4.10" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-forge": { @@ -5675,6 +6276,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5821,6 +6431,95 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "license": "MIT" }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -5928,6 +6627,68 @@ "node": ">=8" } }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6033,11 +6794,16 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6143,6 +6909,23 @@ "node": ">= 6" } }, + "node_modules/redis": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "license": "MIT", + "workspaces": [ + "./packages/*" + ], + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.0", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6153,6 +6936,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -6313,12 +7102,27 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "license": "MIT" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -6466,6 +7270,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -6516,6 +7326,24 @@ "source-map": "^0.6.0" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6558,6 +7386,15 @@ "node": ">= 0.8" } }, + "node_modules/stopwords-iso": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stopwords-iso/-/stopwords-iso-1.1.0.tgz", + "integrity": "sha512-I6GPS/E0zyieHehMRPQcqkiBMJKGgLta+1hREixhoLPqEA0AlVFiC43dl8uPpmkkeRdDMzYRWFWk5/l9x7nmNg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -6676,7 +7513,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6699,6 +7535,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sylvester": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.12.tgz", + "integrity": "sha512-SzRP5LQ6Ts2G5NyAa/jg16s8e3R7rfdFjizy1zeoecYWw+nGL+YA1xZvW/+iJmidBGSdLkuvdwTYEyJEb+EiUw==", + "engines": { + "node": ">=0.2.6" + } + }, "node_modules/teeny-request": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", @@ -6887,12 +7731,29 @@ "node": ">= 0.6" } }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -6944,6 +7805,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7037,6 +7904,30 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -7073,6 +7964,15 @@ "node": ">=0.10.0" } }, + "node_modules/wordnet-db": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/wordnet-db/-/wordnet-db-3.1.14.tgz", + "integrity": "sha512-zVyFsvE+mq9MCmwXUWHIcpfbrHHClZWZiVOzKSxNJruIcFn2RbY55zkhiAMMxM8zCVSmtNiViq8FsAZSFpMYag==", + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7112,6 +8012,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/functions/package.json b/functions/package.json index 5507b83c3..746720349 100644 --- a/functions/package.json +++ b/functions/package.json @@ -16,8 +16,10 @@ "dependencies": { "@google-cloud/bigquery": "^7.9.0", "@google-cloud/storage": "^7.12.1", + "axios": "^1.7.7", "firebase-admin": "^12.1.0", - "firebase-functions": "^5.1.1" + "firebase-functions": "^5.1.1", + "natural": "^8.0.1" }, "devDependencies": { "eslint": "^8.15.0", diff --git a/functions/recommendation/collaborative.js b/functions/recommendation/collaborative.js new file mode 100644 index 000000000..04eed0d5f --- /dev/null +++ b/functions/recommendation/collaborative.js @@ -0,0 +1,245 @@ +/** + * + * write an algorithm to calculate the similarity between users based on their interaction history. + * collaborative filtering + * + * The user interactions are in bigquery, as fetched by the trending algorithm. The events we are interested in are read_item, play_item, add_favorite. + * + * The item metadata is in firestore under item_metadata/{item_id}. + * the important fields are: item_id, title, creator, subjects, language, collection, format and description (natural langauge). + * + * Save the results in firestore under user_recommendations/{user_id}/{recommendation_id}. + * + * We want to run this algorithm once a week only for the users that have been active in 30 days. + * Make it efficient in terms of bigquery usage and billing. we can query common things once and store them in firestore. + * + */ + +const { BigQuery } = require('@google-cloud/bigquery'); +const { getFirestore } = require('firebase-admin/firestore'); +const { logger } = require('firebase-functions'); + +const bigquery = new BigQuery(); +const db = getFirestore(); + +const EVENTS_OF_INTEREST = ['read_item', 'play_item', 'add_favorite']; +const ACTIVE_USER_THRESHOLD_DAYS = 60; +const SIMILARITY_THRESHOLD = 0.3; + +async function calculateCollaborativeRecommendations() { + try { + // Step 1: Get active users from the last 30 days + const activeUsers = await getActiveUsers(); + + if (activeUsers.length === 0) { + logger.info('No active users found'); + return; + } + + // Step 1.5: Log active users + // logger.info('Active users retrieved:', JSON.stringify(activeUsers, null, 2)); + + // Step 2: Get user interactions for active users + const userInteractions = await getUserInteractions(activeUsers); + + // Step 2.5: Log user interactions + logger.info('User interactions retrieved:', JSON.stringify(userInteractions, null, 2)); + + // Step 3: Calculate user similarity + const userSimilarities = calculateUserSimilarity(userInteractions); + + // Step 3.5: Log user similarities + logger.info('User similarities calculated:', JSON.stringify(userSimilarities, null, 2)); + + // Step 4: Generate recommendations for each user + for (const userId of activeUsers) { + if (userId && typeof userId === 'string' && userId.trim() !== '') { + // logger.info(`Generating recommendations for user: ${userId}`); + const recommendations = await generateRecommendations(userId, userSimilarities, userInteractions); + if (recommendations.length > 5) { + logger.info(`Generated ${recommendations.length} recommendations for user: ${userId}`); + await saveRecommendations(userId, recommendations); + } + + } else { + logger.warn(`Skipping invalid userId: ${userId}`); + } + } + + logger.info('Collaborative filtering recommendations completed successfully'); + } catch (error) { + logger.error('Error in collaborative filtering:', error); + } + } + +async function getActiveUsers() { + const query = ` + SELECT + user_pseudo_id AS user_id + FROM ( + SELECT + user_pseudo_id, + COUNT(*) AS open_item_detail_count + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY)) + AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) + AND event_name = 'open_item_detail' + GROUP BY + user_pseudo_id + HAVING + open_item_detail_count > 5 + ) AS active_users + WHERE + user_pseudo_id IN ( + SELECT DISTINCT + user_pseudo_id + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY)) + AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) + AND event_name IN (${EVENTS_OF_INTEREST.map(event => `'${event}'`).join(',')}) + ) + LIMIT 50 + `; + + // Log the query before execution + logger.info('Executing BigQuery query for getActiveUsers:', query); + + const [rows] = await bigquery.query({ query }); + return rows.map(row => row.user_id); + } + + async function getUserInteractions(activeUsers) { + const query = ` + SELECT + user_pseudo_id AS user_id, + event_name, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'item_id') AS item_id, + COUNT(*) AS interaction_count + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY) AND CURRENT_DATE() + AND event_name IN (${EVENTS_OF_INTEREST.map(event => `'${event}'`).join(',')}) + AND user_pseudo_id IN (${activeUsers.map(user => `'${user}'`).join(',')}) + AND user_pseudo_id IS NOT NULL + GROUP BY + user_id, event_name, item_id + HAVING + item_id IS NOT NULL + `; + + // Log the query for debugging + logger.info('getUserInteractions query:', query); + + const [rows] = await bigquery.query({ query }); + + // Log the raw results + logger.info('Raw getUserInteractions results:', JSON.stringify(rows)); + + return rows.reduce((acc, row) => { + if (!acc[row.user_id]) acc[row.user_id] = {}; + if (!acc[row.user_id][row.item_id]) acc[row.user_id][row.item_id] = 0; + acc[row.user_id][row.item_id] += row.interaction_count; + return acc; + }, {}); + } + +function calculateUserSimilarity(userInteractions) { + const similarities = {}; + const users = Object.keys(userInteractions); + + for (let i = 0; i < users.length; i++) { + for (let j = i + 1; j < users.length; j++) { + const user1 = users[i]; + const user2 = users[j]; + const similarity = calculateCosineSimilarity(userInteractions[user1], userInteractions[user2]); + + if (similarity > SIMILARITY_THRESHOLD) { + if (!similarities[user1]) similarities[user1] = []; + if (!similarities[user2]) similarities[user2] = []; + similarities[user1].push({ user: user2, score: similarity }); + similarities[user2].push({ user: user1, score: similarity }); + } + } + } + + return similarities; +} + +function calculateCosineSimilarity(user1Interactions, user2Interactions) { + let dotProduct = 0; + let magnitude1 = 0; + let magnitude2 = 0; + + for (const itemId in user1Interactions) { + const user1Count = user1Interactions[itemId]; + const user2Count = user2Interactions[itemId] || 0; + dotProduct += user1Count * user2Count; + magnitude1 += user1Count * user1Count; + } + + for (const itemId in user2Interactions) { + const count = user2Interactions[itemId]; + magnitude2 += count * count; + } + + magnitude1 = Math.sqrt(magnitude1); + magnitude2 = Math.sqrt(magnitude2); + + return dotProduct / (magnitude1 * magnitude2); +} + +async function generateRecommendations(userId, userSimilarities, userInteractions) { + const similarUsers = userSimilarities[userId] || []; + const recommendations = {}; + + for (const { user: similarUser, score } of similarUsers) { + for (const itemId in userInteractions[similarUser]) { + if (!userInteractions[userId][itemId]) { + if (!recommendations[itemId]) recommendations[itemId] = 0; + recommendations[itemId] += score * userInteractions[similarUser][itemId]; + } + } + } + + const sortedRecommendations = Object.entries(recommendations) + .sort((a, b) => b[1] - a[1]) + .slice(0, 50) + .map(([itemId, score]) => ({ itemId, score })); + + return sortedRecommendations; +} + +async function saveRecommendations(userId, recommendations) { + if (!userId || typeof userId !== 'string' || userId.trim() === '') { + logger.error(`Invalid userId: ${userId}`); + return; + } + + const userRecommendationsRef = db.collection('recommendations').doc(userId).collection('collaborative'); + + try { + const batch = db.batch(); + + for (const rec of recommendations) { + const docRef = userRecommendationsRef.doc(rec.itemId); + batch.set(docRef, { + score: rec.score + }); + } + + await batch.commit(); + + logger.info(`Saved ${recommendations.length} recommendations for user ${userId}`); + } catch (error) { + logger.error(`Error saving recommendations for user ${userId}:`, error); + } + } + +module.exports = { + calculateCollaborativeRecommendations, +}; diff --git a/functions/recommendation/content_filtering.js b/functions/recommendation/content_filtering.js new file mode 100644 index 000000000..d9bff41dc --- /dev/null +++ b/functions/recommendation/content_filtering.js @@ -0,0 +1,264 @@ +/** + * Content-based filtering recommendation system + * + * This algorithm recommends items to users based on the similarity between item features + * and user preferences. It analyzes the metadata of items that a user has interacted with + * and suggests new items with similar characteristics. + * + * Key steps: + * 1. Build user profiles based on their interaction history + * 2. Extract and process item features from metadata + * 3. Calculate similarity between user profiles and item features + * 4. Generate recommendations based on similarity scores + * 5. Store recommendations in Firestore for quick access + * + * The algorithm should consider various item attributes such as: + * - Subjects + * - Creator + * - Language + * - Collection + * - Format + * - Description (using natural language processing techniques) + * + * metadata is stored in firestore under metdata/{item_id}/ + * + * To optimize performance and reduce costs: + * - Run the algorithm periodically (e.g., weekly) for active users + * - Use efficient similarity calculation methods + * - Leverage caching mechanisms to store intermediate results + * - keep biquery and firestore + * - store user profiles in firestore if that's more efficient + * + * make it a firebase cloud function called onrequest + * + * TODO: Implement the content-based filtering algorithm + */ +const functions = require('firebase-functions'); +const admin = require('firebase-admin'); +const natural = require('natural'); +const { BigQuery } = require('@google-cloud/bigquery'); + +const db = admin.firestore(); +const bigquery = new BigQuery(); + +const EVENTS_OF_INTEREST = ['read_item', 'play_item', 'add_favorite']; +const ACTIVE_USER_THRESHOLD_DAYS = 30; +const SIMILARITY_THRESHOLD = 0.3; +const MAX_RECOMMENDATIONS = 50; + +async function generateContentBasedRecommendations() { + const activeUsers = await getActiveUsers(); + console.log(`Found ${activeUsers.length} active users for content-based recommendations`); + + for (const userId of activeUsers) { + const userProfile = await buildUserProfile(userId); + console.log(`Built user profile for user ${userId}:`, JSON.stringify(userProfile, null, 2)); + const recommendations = await generateUserRecommendations(userId, userProfile); + console.log(`Generated ${recommendations.length} recommendations for user ${userId}`); + await saveRecommendations(userId, recommendations); + console.log(`Completed content-based recommendations for user ${userId}`); + } +} + +async function getActiveUsers() { + const query = ` + SELECT + user_pseudo_id AS user_id + FROM ( + SELECT + user_pseudo_id, + COUNT(*) AS open_item_detail_count + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY)) + AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) + AND event_name = 'open_item_detail' + GROUP BY + user_pseudo_id + HAVING + open_item_detail_count > 5 + ) AS active_users + WHERE + user_pseudo_id IN ( + SELECT DISTINCT + user_pseudo_id + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY)) + AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) + AND event_name IN (${EVENTS_OF_INTEREST.map(event => `'${event}'`).join(',')}) + ) + LIMIT 5 + `; + + const [rows] = await bigquery.query({ query }); + return rows.map(row => row.user_id); +} + +async function buildUserProfile(userId) { + const userInteractions = await getUserInteractions(userId); + const profile = { + subjects: {}, + creators: {}, + languages: {}, + collections: {}, + formats: {}, + keywords: {} + }; + + for (const interaction of userInteractions) { + const itemMetadata = await getItemMetadata(interaction.item_id); + if (itemMetadata) { + updateProfileCounts(profile.subjects, itemMetadata.subjects); + updateProfileCounts(profile.creators, itemMetadata.creators); + updateProfileCounts(profile.languages, itemMetadata.languages); + updateProfileCounts(profile.collections, itemMetadata.collections); + updateProfileCounts(profile.formats, itemMetadata.formats); + + const keywords = itemMetadata.description.flatMap(extractKeywords); + updateProfileCounts(profile.keywords, keywords); + } + } + + normalizeProfile(profile); + return profile; +} + +async function getUserInteractions(userId) { + const query = ` + SELECT + user_pseudo_id AS user_id, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'item_id') AS item_id, + COUNT(*) AS interaction_count + FROM + \`kafka-books.analytics_195726967.events_*\` + WHERE + _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL ${ACTIVE_USER_THRESHOLD_DAYS} DAY)) + AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) + AND event_name IN (${EVENTS_OF_INTEREST.map(event => `'${event}'`).join(',')}) + AND user_pseudo_id = @userId + GROUP BY + user_id, item_id + HAVING + item_id IS NOT NULL + `; + + const options = { + query: query, + params: { userId: userId } + }; + + const [rows] = await bigquery.query(options); + return rows.map(row => ({ item_id: row.item_id })); +} + +async function getItemMetadata(itemId) { + const docRef = db.collection('metadata').doc(itemId); + const doc = await docRef.get(); + return doc.exists ? doc.data() : null; +} + +function updateProfileCounts(profileSection, values) { + for (const value of values) { + if (value) { + profileSection[value] = (profileSection[value] || 0) + 1; + } + } +} + +function extractKeywords(text) { + const tokenizer = new natural.WordTokenizer(); + const tokens = tokenizer.tokenize(text); + return tokens.filter(token => token.length > 3); +} + +function normalizeProfile(profile) { + for (const section in profile) { + const total = Object.values(profile[section]).reduce((sum, count) => sum + count, 0); + for (const key in profile[section]) { + profile[section][key] /= total; + } + } +} + +async function generateUserRecommendations(userId, userProfile) { + const allItems = await getAllItems(); + const scoredItems = []; + + for (const item of allItems) { + if (!(await hasUserInteracted(userId, item.id))) { + const similarity = calculateSimilarity(userProfile, item); + if (similarity >= SIMILARITY_THRESHOLD) { + scoredItems.push({ itemId: item.id, score: similarity }); + } + } + } + + scoredItems.sort((a, b) => b.score - a.score); + return scoredItems.slice(0, MAX_RECOMMENDATIONS); +} + +async function getAllItems() { + const snapshot = await db.collection('metadata').get(); + return snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); +} + +async function hasUserInteracted(userId, itemId) { + const query = ` + SELECT COUNT(*) as count + FROM \`kafka-books.analytics_195726967.events_*\` + WHERE user_id = @userId + AND item_id = @itemId + AND event_name IN ('read_item', 'play_item', 'add_favorite') + LIMIT 1 + `; + + const options = { + query: query, + params: { userId: userId, itemId: itemId } + }; + + const [rows] = await bigquery.query(options); + return rows[0].count > 0; +} + +function calculateSimilarity(userProfile, item) { + let similarity = 0; + const weights = { + subjects: 0.3, + creators: 0.2, + languages: 0.1, + collections: 0.1, + formats: 0.1, + keywords: 0.2 + }; + + for (const feature in weights) { + similarity += weights[feature] * calculateFeatureSimilarity(userProfile[feature], item[feature]); + } + + return similarity; +} + +function calculateFeatureSimilarity(userFeatures, itemFeature) { + if (Array.isArray(itemFeature)) { + return itemFeature.reduce((sum, value) => sum + (userFeatures[value] || 0), 0) / itemFeature.length; + } else if (typeof itemFeature === 'string') { + return userFeatures[itemFeature] || 0; + } + return 0; +} + +async function saveRecommendations(userId, recommendations) { + const userRecommendationsRef = db.collection('user_recommendations').doc(userId); + await userRecommendationsRef.set({ + contentBased: recommendations, + updatedAt: admin.firestore.FieldValue.serverTimestamp() + }, { merge: true }); +} + +module.exports = { + generateContentBasedRecommendations, +}; \ No newline at end of file From b92820e633c6efe9cbfa79e4da1e5eea044aa19c Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 5 Sep 2024 22:00:11 +0530 Subject: [PATCH 31/33] Cloud function to fetch archive metadata and save in firestore --- functions/.eslintrc.js | 1 + functions/metadata.js | 7 +- functions/recommendation/collaborative.js | 4 +- functions/recommendation/content_filtering.js | 81 +++++++++++++------ 4 files changed, 66 insertions(+), 27 deletions(-) diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js index 0f4ce80cf..f8c9767de 100644 --- a/functions/.eslintrc.js +++ b/functions/.eslintrc.js @@ -29,6 +29,7 @@ module.exports = { "guard-for-in": "off", "no-unused-vars": "off", "no-dupe-keys": "off", + "prefer-const": "off", }, overrides: [ { diff --git a/functions/metadata.js b/functions/metadata.js index 69ef9c083..22e79ecdd 100644 --- a/functions/metadata.js +++ b/functions/metadata.js @@ -27,9 +27,12 @@ const removeUndefined = (obj) => { }; -exports.fetchAndSaveMetadata = functions.https.onRequest(async (req, res) => { +exports.fetchAndSaveMetadata = functions.runWith({ + timeoutSeconds: 540, // 9 minutes, maximum for Blaze plan + memory: '1GB' +}).https.onRequest(async (req, res) => { // Define a constant set of item IDs - const itemIds = 'munshi-premchand_202404,gumaan-ghazals,shayad-jaun-eliya,LekinByJaunElia,manto_202310,harishankar-parsai,gunahon-ka-devta-by-dharmaveer-bharti,the-stranger-camus,metamorphosis_librivox,invincible-compendiums,BadeGharKiBeti,brothers_karamazov_1002_librivox,the-myth-of-sisyphus_202407,ShaidByJaunElia,franz-kafka-the-trial,ghazals_ghalib_0809_librivox,khushboo-parveen-shakir,madame-bovary-gustave-flaubert_202407,the-handmaid-s-tale-graphic-novel-by-margaret-atwood,MahaGeetaByOshoInHindiPart1,gulaab-ke-phool,rabindranath-thakur-short-stories,ashadkaekdinhindi,crime_and_punishment_0902_librivox,yaani-ghazals,Godan-Hindi,HindiBhajansOfKabirByJagjitSinghOtherMp3,kafka-short-stories,AlbertCamusTheMythOfSisyphus,NamakKaDaroga,letterstoayoungpoetpdfdrive.com,TheKillingJoke_201804,nirmalvermameripriyakahaniyaanhindi,Manto-Kahaniyan-Hindi,beyond_good_and_evil_librivox,whitenights0000dost,gambler_1011_librivox,notes_from_the_underground,dli.sangeet.thumri.7,mushayre-jaun,farnood-adbi-duniya,dc-comics-batman-the-killing-joke_202103,07UskoManzilMilGayiUskoKinaraMohdRafiSonOfHatimtai,andhere-mein-radio-play,The_Comedy_Of_Errors_TOS,gunahon-ka-devta,letters_post_impr_1306_librivox,crimepunishment00dostuoft,tolstoy-by-premchand,romeo_and_juliet_librivox,FarnoodByJaunElia,sociedad-de-acomar-juguetona-1999-38,salems-lot-BBC,sbrief,GodanByPremchand,diiwan-e-ghalib,alloshobooks39883p,WaitingforGodotCBC1997_201902,KholDoThandaGosht-Hindi,naqsh-e-faryadi_202310,sherlock-holmes_202112,KafanPremchand,TheStranger,janan-janan-audio-book,MirzaGhalib-AHundredMoods,richdadpoordadwh0000kiyo_c5p7,mansarovar-premchand,short-stories-001,mahabharat_202408,in.ernet.dli.2015.551270,vaishnav-ki-fisalan,premchand-godan,parmatma-ka-kutta,the-yellow-wallpaper_202407,ost-english-metamorphosis-by-franz-kafka,in.ernet.dli.2015.446885,crime_punishment_1511_librivox,whitenightsother00dostiala,jadeed-urdu-poetry,GoodOmensBBCr4,lettertomyfather0000kafk,in.ernet.dli.2015.499492,problemsofphilo00russuoft,premchandshatranjkekhiladiauranyakahaniyaanhindi,short-stories_202408,mushayra-ahmed-faraz,lotrdragashtracked,PooskiRaatByPremchand,the-psychology-of-money-morgan-housel,krishan_chander,OSHOSambhogSeSamadhiKiAur,diiwan-e-ghalib-adbi-duniya,in.gov.ignca.279,meditationsofmar00marc_0,the48lawsofpowerpdfdrive.com,gitanjali_1002_librivox,classical-urdu-poetry_202408,anatomyofhumanbo1918gray,languageofflower00lond,dilli-ki-aakhri-shama,in.ernet.dli.2015.540781,prideprejudice00aust,ghulam-abbas_202311,YaniByJaunElia,animal-farm.sna,ThakurKaKuan,satya-ke-sath-mere-prayog,NineteenEightyFour_1953,an-era-of-darkness,suraj-ka-saatva-ghoda,AhmadFaraz,DhapolshankhMaster,savitabhabi,AnkhenByManto,AksEKhushboo,canvas-irfan,BoodhiKaki,idiot_mg_librivox,MadhushalaMannaDey,the-fall-camus,maut-ki-kitaab,evergreen-songs-of-gulzar-sahab-saintees-gaane-2020,lucknow-ki-paanch-raaten,sadhana_realisation_librivox,lettersofjohnkeats_1909_librivox,ikigai-the-japanese-secret-to-a-long-and-happy-life-by-hector-garcia-and-francesc-miralles-2016-2003,AnimalFarmByGeorgeOrwell,UsneKahaThaChandradharSharmaGuleri,GumanByJaunElia,nagraj-comic-book-collection,theimmortalsofmeluhashivatrilogy1,marvel-super-heroes-secret-wars-issue-1,richdadpoordadhindi,suitableboy0000seth,StoriesByPremchand,frankenstein_shelley,BecharaBhalaAdami,mehdi-hassan,atomic-habits,dream_psychology_librivox,neemkapedhindiedition,IllustratedClassicsMacbeth,pride_and_prejudice_librivox,udaas-chabutra,zikr-e-meer-adbi-duniya,kulliyaat-e-mir-adbi-duniya,anandmath_202408,Dhammapad,0D4784E34567V847,insha-karachi-may-1960,MaaByPremchand,antim-aranya-hindi-edition,PCShikariRajkumarMG,rashmirathi_202404,crime-and-punishment-fyodor-dostoyevsky-pdf,ramayan-urdu-children,019-ack-hanuman-english,sociedad-de-acomar-lo-mejor-de...-1997-873,savita-bhabi-english-hindi,daredevil-born-again,audio_poetry_39_2006,letterstomilena0000fran,dostoevsky_short_stories_2001_librivox,manchanda-bani-ghazals-adbi-duniya,mantokiutkrishtkahaniyan,APNIAPNIBEEMARIHINDIPARSAI,antonchekhovBBCr4,george-orwell-audio,tothelighthouse_2303_librivox,metamorphosis_1401_librivox,whatibelieve_1101_librivox,AntonChekhov-SelectedShortStories,behan-ne-chhote-bhai-se-choot-chudwa-kar-maja,UVVl_ashadh-ka-ek-din-mohan-rakesh,the-art-of-seduction-robert-greene,RamdhariSinghDinkerKurukshetra,three_men_boat_librivox,shayad-by-jaun-elia_202010,the_consolation_of_philosophy_librivox,lp_the-diary-of-a-young-girl_anne-frank-elinor-basescu,white_nights_1012_librivox,ThandaGoshtBySaadatHassanManto,sociedad-de-acomar-amor-mio-1999-236,ada-y-los-apasionados-vete-al-diablo-2000-273,HindiAudio-OshoPravashanOdioMp3,nirala_202408,tirichh,mohanrakeshmeripriyakahaniyaanhindi,agatha-christie-death-in-the-clouds,MandirAurMasjid,dostoyevskyshortstories_1310_librivox,godaan-by-munshi-premchand-ebook_202310,greatgatsby_2101_librivox,the-constitution-of-india-original-1950,DeewanEGhalib_201212,astronomyforamat00flam,atomic-habits-pdfdrive,bhagat-singhs-writings-in-hindi-pdfdrive.com,sylviaplathssele0000plat,in.ernet.dli.2015.380988,PehliBarishNasirKazmi,haunting-adeline,UsneKahaThaByChandradharSharmaGuleri,TobaTekSingh-Hindi,janeaustenbbcr42024feb,murder-on-the-orient-express_202202,MPDo.bailo.ki.kathaAC,basti-intizar-hussain,my-gita,jaise-unke-din-phire,the-fault-in-our-stars-john-green,mantothandaghoshtauranyakahaniyaanhindiedition_202002,storyofrobinhood00chic,BBC-presents-AlfredHitchcock,maila-aanchal-hindi_202408,Madhushala,history_christian_church_0906_librivox,shab-e-darmiyaan,PavitrQuranHindi,slavoj-zizek-less-than-nothing-hegel-and-the-shadow-of-dialectical-materialism-theoryreader,s01e00hhgttgdouglasadamsbbcboo,macbeth-2022,PeerEKamil,Bhagavadgeeta,brief_history_engliterature_0903_librivox,CasefilePodcast,marvel-comics-encyclopedia-new-edition,brotherskaramaz00dost,HarukiMurakamiNorwegianWood,harivanshmerishreshthakavitayenhindi,rahim-ke-dohe,ekpremkahanisaadathasanmanto_201907,harf-e-mautabar,Badli,cd_echoes_jagjit-singh--chitra-singh,dli.sangeet.thumri.1,DoBailonKiKatha-Hindi-Premchand,love_letter_collection_2008_0802_librivox,divaneghalib-v3,samuel-beckett-waiting-for-godot,dni.ncaa.SAK-381-AC,shakespeare_sonnets_ch,macbeth_0810_librivox,GulzarInPdfByMohsinAftabKelapuri,raat-bahut-hava-chali,MantoKayAfsaney,art_of_war_librivox,the-republic-of-plato-book-10,harariyuvalnoahsapiensabriefhistoryofh_201909,WatchmenCompleteCorrected,the-hidden-hindu,Nirmala-Hindi,CvBt_atma-katha-mohan-das-gandhi,malvikagnimitram-01,manga_Berserk,wonderfulwizardo00baumiala,kafkaonshore00mura_0,crimepunishment00dostiala,IdgaahByMunshiPremchand,iqbal-bano-ghazals,shell_osho,crimeandpunishment_1911_librivox,PremchandStreeAurPurush,adabi-interviews,unmasking-a-confident-trickster,Mundan,OshoTheBookOfSecrets,philosophy-nineteenth-century,modern_ghost_stories_0801_librivox,bhai-bahan-choda-chodi,kafan-premchand,radio-plays-hindi,odyssey_butler_librivox,Gaban-Hindi-Premchand,shelleypoems_lw_librivox,true_stories_celebrated_crimes_2301_librivox,WatchmenByAlanMooreAndDaveGibbons,last-performance-in-holland-1996,the-psychology-of-money-morgan-housel-z-library-1,savita,oxford-english-grammar-course-advanced-2011,hindi-audio-sex-story-kirayedar-ladkon-chut-gand,byomkesh-bakshi-ki-rahasyamayi-kahaniyan-hindi-edition-by-bandyopadhyay-saradindu-z-lib.org,ikigai-the-japanese-secret-to-a-long-and-happy-life-pdfdrive.com,udaas-naslein-adbi-duniya,in.ernet.dli.2015.346183,godaanmasterpiec0000muns,laila-majnu-radio-play,indianconstituti00aiyauoft,in.ernet.dli.2015.262150,RamayanAurMahabharat-Hindi-IbneInsha,MahaGeetaByOshopart2,bashirbadrmusafirhindi,DogaKaCurfewWww.nagrajcomicscollection.blogspot.com,savita-bhabhi-episode-71-pussy-on-the-catwalk,prince_pa_librivox,ChoohaAurMain-Hindi-HarishankarParsai,06-full-ramayan-sundara-kanda-by-mukesh,godan_202005,historyofenglish00comp,journalsofsylvia00plat_0,in.ernet.dli.2015.185152,12_creepytales_1206_librivox,castle01kafk,skvS_tin-ekant-by-nirmal-verma-1979-radha-krishna-publication-new-delhi,ada-y-los-apasionados-yo-te-queria-2018-757,osho-literature-in-hindi,PoemsByFaiz-Trans_VictorGKiernan-1971,madame_bovary_0809_librivox,sEAf_kamasutra-of-vatsyayan-with-hindi-trans.-by-ramanand-sharma-series-no.-4-bitthal-das-sanskrit-s,Kafan-Hindi-Premchand,gameofthronesill0000mart,kafka_galerie_librivox,to-kill-a-mockingbird_202107,problems_of_philosophy_librivox,3978-chanda-se-honga-wo-pyara-main-bhi-ladki-hoo,NuskhaERazaDiwanEGhalibKamil,osho-the-book-of-secrets-112-meditations-to-discover-the-mystery-within-st.-martins-griffin-2010,metamorphosis_1203_librivox,GeorgeOrwell-1984romanDeutsch,MansarovarPart1-Hindi-MunshiPremchand,alexander_great_ld_librivox,elephants-can-remember,it-ends-with-us-colleen-hoover-z-lib.org_202304,priyanshi-jain,AshtavakraGitaHindiAudiobook,MEENABAZARHINDI,anandi-ghulam-abbas,TheKiteRunnerPDF_201905,topishukla0000rahi,dhan-sampatti-ka-manovigyan-the-psychology-of-money-hindi-edition,RichDadPoorDadRobertKiyosakiAudiobookUnabridged,dojing12-d1,Episode11Final_201711,war_and_peace_01_librivox,verity-by-colleen-hoover_202401,Triveniyan-Hindi-Gulzar,harrypotterphilo0000rowl_j1k7,historyindiahin00cowegoog_202107,psychopathology_everyday_life_ms_librivox,GundaJaishankarPrasad,abhigyanshakuntalamdr.rajdevmishra,bhagwat-geeta_202112,11TheQuidditchMatch,deadpool-kills-the-marvel-universe-001-2012,sociedad-de-acomar-sociedad-de-acomar-2010-660,NzuV_rashmi-rathi-by-ramdhari-simha-dinkar-udayachal-rashtra-kavi-dinkar-path-patna,raagdarbarinovel00sukl,Qpbd_gunaho-ka-devta-by-dharmavir-bharati-bharatiya-gyanpith-new-delhi,Level41984_201407,yahudi-ki-ladki,patterndesignboo00dayl,french_revolution_1001_librivox,white_nights_librivox,richdadpoordadwh00kiyo_0,heer-ranjha-raadio-play,EPI63,jeth-se-chut-chudai-ka-maja-audio-sex-story,art_public_speaking_1101_librivox,adventures_holmes,puramanto-v1,Best_of_Rekha_Bhardwaj,raushni-ae-raushni,K.K.AzizTheMurderOfHistory,ChandradharSharmaGuleriJiKiKahaniUsneKahaTha,CharBete,oshosearch.net___tofind_more,premchand-manasarovar-1,hindustanigazlenkamleshwar,the-walking-dead-compendium-1-4,apology_plato_bn_librivox,PoosKiRaatPremchand,godofsmallthings00roya_0,romeoandjuliet_ss_0901_librivox,jaise-unke-din-fire-parsai-H,notesfromundergr0000dost_c7o5,afsana-hajra-masroor,existentialism_202302,meditations_0708_librivox,kiterunner00hoss_0,metamorphosis00kafk_0,idiot00whisgoog,PARKPLAYManavKaul,invisibleman_1209_librivox_cb,figuredrawingcom00hatt,narazhindi,OceanofPDF.comTheAlchemist,12RulesForLifeJordanB.PetersonAnAntidoteToChaos,gair-mard-chut-chudai-antarvasna-hindi-audio-sex-stories,in.ernet.dli.2015.307307,notesfromtheunde00600gut,usne-kaha-tha-chandradhar-sharma-guleri,Azubi-Teenies_01,metaphysics_1108_librivox,dni.ncaa.SAK-662_1-AC,in.ernet.dli.2015.397992,gCov_rashmirathi-by-ramdhari-simha-dinakar-patna-1967-udayachala,lajwanti-l-l-l-rajinder-singh-bedi,divine_comedy_librivox,kirtu-siterip-eng-savita-bhabhi-episode_202105,AhmadFaraz2,20210523_20210523_0901,TheLegendOfZeldaEncyclopedia,PremchandKiKahaniyan-Hindi-MunshiPremchand,beyond-good-and-evil_202105,krishna-the-man-and-his-philosophy-osho_202101,Tarkash,RaviShankarNYC1,OneHundredYearsOfSolitude_201710,new_20240626,sitara-e-safar,5_20210606_20210606,the-sherlock-holmes-society-of-london-presents,TheFall_421,abida-parveen,SavitaBhabhiEpisode2_201901,OSHOSambhogSeSamadhiKiAur_201603,comicxxxcarnalcomicsrebeccalord,manga_Girls_Saurus_DX,the-hidden-hindu-by-akshat-gupta-translation-in-hindi-volume-1,PutraPremByPremchand,ankhondekhapakistanhindi,kafkaonshore0000mura,velamma-ep-97-hindi-anyverselinks,roast-moose,ibne-insha-OK_compressed,1984_20220119,lp_a-selection-of-hindi-film-songs_kalyanji-anandji-mukesh,CamusAlbertTheStranger,mom-sex-story-mom-ki-chudai-bete-ne,oshomainkaunhun,in.ernet.dli.2015.442240,guleri-usne-kaha-tha,SambhogSeSamadhiKiOre-Hindi,batmanthelonghalloween1998digitalzoneempire,gandhisatyakesathmereprayoghindi,belljarbysylviap0000unse,Kurukshetra-HindiPoem-RamdhariSinghDinkar,mysticism-in-arabic-and-islamic-philosophy,lkdr-1-bade-ghulam-alimkhan-bhoopali-kamod,crime_punishment_3_1708_librivox,Sex_over_Sex_16,pili-chhatri-wali-ladki,a-little-life-hanya-yanagihara,MantoKe100BehtreenAfsane,COLLECTIONOFBESTSTORIESPREMCHAND,SufferingOfBeingKafkahebrew-Excerpt,suryakaa,kalishalwar,gandharva,the-stranger-albert-camus,TanhaTanhaBookspk.net,hunting-adeline_202307,le_mythe_de_sisyphe,ByShriRajendraDasJi,in.ernet.dli.2015.348947,sapiens-hindi-edition-audiobook_202407,BaapBetiKiChudaiAudioSexStory,AhmedFaraz,Badchalan,Kulyat-e-Iqbal,gOjJ_khattar-kaka-by-prof.-hari-mohan-jha-patna-1971-rajkamal-prakashan,hound_baskervilles_bn_librivox,ShivKumarBatalviHindYugm,how-to-paint-realistic-skin,iduh_rashmirathi-of-dinkar-by-kedarnath-singh-udayan-press,EkGadheKiVapasi,stephen-king_202206,savita-bhabhi-episode-30,Pleasure-mag-116,VardaanByPremchand,azadi-by-arundhati-roy,osho-hindi-books-scan,i-have-no-mouth-and-i-must-scream_202202,richdadpoordadwi0000kiyo,in.ernet.dli.2015.398567,oshoYoga,mushtaq-ahmad-yusufi,gulliverstravels1918swif,novelsoffyodordo12dost,WorldHistoryPatternsOfInteraction,metamorphosis00kupe,no-longer-human-dazai-osamu_202311,sex-matters-from-sex-to-superconsciousness-by-osho,YatharthGeetaHindiAudio,narishareerkerahashyahindi,AmritByMunshiPremchand,thousandsplendid00ho,23-kitne-pakistan-kamleshwar,nolongerhuman0000daza_m5l2,AppealKaJadoo,brotherskaramazo00dost,illustratedlondo00burn_0,ashadh-ka-ek-din-mohan-rakesh,SahajPath-Part1-Bangla,KholDo,thandagoshtmuqaddamamanto,power-les-48-lois-de-pouvoir-robert-greene,premchandboodhikakihindi,in.ernet.dli.2015.347952,letterstomilena0000kafk,HindiBhajansMp3-meeraKrishnaBhajan,thelawsofhumannaturebyrobertgreene2018,couldnotstop_1305_librivox,nayi-nazm-ka-safar,it-starts-with-us,mythsreimaginedbbcr4,cleopatra_0810_librivox,metamorphosis05200gut,the-hidden-part-1-book-in-hindi,poe-short-stories,indiainslowmotio0000tull,lp_classical-music-of-india_various,premchandrangbhoomihindi,GeorgeOrwells1984,AtmaKatha-Hindi-AmritaPritam,badegharkibetiauranyakahaniyaanhindi,kamasutra00vats,loomis_FIGURE_draw,the-lord-of-the-rings-bbc-radio-drama,threemeninboatto00jeroiala,lettertohisfathe0000fran,rich-dad-poor-dad-by-robert-t.-kiyosaki,MantosPrayer-English-SaadatHasanManto,ShayadByJaunEliaZemtime.com,37_20220328_202203,howtoreadabook1972edition,shakespeare_monologues_vol_1_librivox,hamlet_0911_librivox,fyodor-dostoyevskyfyodor-dostoyevsky,alf-laila-o-laila-ek-hazaar-ek-raatein,godofsmallthings0000roya_u4r6,the-book-of-women-osho,the-trial,songs_kabir_1006_librivox,Idgah-English-Premchand,GulliDanda,ek-aur-zindgi-mohan-rakesh,Hut33BBCr4,renu_compressed,dynasour,savita-bhabhi-episode-113,srinkhalakikadiyanhindi,JhamkatNadiyaBahiniLage,khatootighalib-v2_202008,aleeebrkt_gmail_20180622,easy_lessons_einstein_1103_librivox,aajkeprasidhshayarbashirbadrahindi,premchandkisarvashreshtakahaniyanhindi,TobaTekSingh,dickinson_poems_bm_librivox,trial00kafk_0,isbn_9780099590088,OrsonWelles_MercurySummer,dostoevskykierke00hubb,spider-man-batman-marvel-dc,unabridged-mahabharata-6-volumes-set-in-hindi-by-veda-vyasa-compressed,YogiKathamrita,velamma-hindi-episode-1,memoir_jane_austen_0805_librivox,thetrial07849gut,GunahonKaDevta,MunshiPremchandAfsane,Rafi-Lata-Collection,berserk-volume-1,isbn_9780679423157,sewasadan0000muns,RasidiTicket-Hindi-AutobiographyOfAmritaPritam,maavaraa-adbi-duniya,the-hidden_202310,na-ane-wala-kal-by-mohan-rakesh-1,collected_lovecraft_0810_librivox,mahatmabuddhakikahaniyanhindiedition,HINDISHAYARIBOOK,orgies-barbares-t-3-erich-hartmann,brushworkelement00huds,Mantra_357,osho-rajneesh-sambhog-se-samadhi-ki-or,NineteenEightyFour-Novel-GeorgeOrwell,MainNastikKyoonHoon-Hindi-BhagatSingh,the-book-of-gold-leaves-by-mirza-waheed,GraphicHorror,twisted-1.-twisted-love-ana-huang,mana-one-piece-digital-colored-comics,in.ernet.dli.2015.269141,albertcamusoutsi0000unse,itendswithus0000hoov,atomic-habits-james-clear-full-audiobook-bookclub-e-01,merchant_of_venice_1005_librivox,divaneghalib-v4,MirzaGhalib-Hindi,atomic-habits-perubahan-kecil-yang-memberikan-hasil-luar-biasa-james,ZeroToOneByPeterThiel,batman150,in.ernet.dli.2015.489953,Kulliyat-e-iqbalUrduOrCompleteCollectionOfIqbalsPoetryByAllamaIqbal,aimsee-metamorphosis_202110,Idgah-Hindi-Premchand,AhmadFaraz3,history_julius_caesar_1102_librivox,adventures_sherlockholmes_1007_librivox,Do-ladko-se-chut-aur-gand-chatwayi-antarvasna-hindi-audio-sex-stories,savita-bhabhi-qf069,savita-bhabhi-ep-04-visiting-cousin,invincible-collection,annakarenina1_1011_librivox,in.ernet.dli.2015.287638,frank-herberts-dune-saga-collection-books-1-6-by-frank-herbert,SawaSerGehun,ROMEOANDJULIETHINDI,megaclimax90,HOUSEOFHAMMER,invincibleultima0003robe,kirtu-indian-porn-comics-siterip-fsicomics,lp_his-songs-of-love-from-hindi-films_gulzar-bhupinder-kishore-kumar-lata-manges,buttman-volume-0401,TheFountainheadUnabridged,maus-a-survivors-tale-my-father-bleeds-history-by-art-spiegelman,hindi-meal,poe_poems_stl_librivox,before-the-coffee-gets-cold-9781529029598,EkMadhyamvargeeyKutta,velamma-episode-61-naked-cleaning,leo-third-grader,in.ernet.dli.2015.349882,communistmanifesto_librivox,why-i-am-a-hindu,36SasurAurMeriMummiKiChudaiAntarvasnaHindiAudioSexStories,KhushbooParveenShakirUrduShairi.com,steallikeartist10000kleo_z5o7,SavitaBhabhiPDFDrive.com1,rilke-rainer-maria-letters-to-a-young-poet,dli.sangeet.music.Rabindra,in.ernet.dli.2015.307296,albertcamusstran0000mcca,an-assorted-collection-of-jay-naylor-comics,brotherskaramazov2_1606_librivox,dni.ncaa.SAK-308-AC,ShadiKiVajahByPremchand,TTUBBCR4,sasukeretsuden,Ashleel,BukowskiPoems,cd_the-latest-ghazals-nazms_jagjit-singh-chitra-singh-chitra-singh-ja,lametamorfosis_2101_librivox,letterstoyoungpo00rilk,AnaathLadkiByMunshiPremchand,ernest-hemingway-the-old-man-and-the-sea,raven,dualism_202302,audiobook-thinkandgrowrich,rand-ayn-the-fountainhead,Watchmen1987,gulerikahaniyan,wg826,twisted_games,Kumarsambhav,dc-marvel-comics-batman-vs-punisher_202103,as_a_man_thinketh_mc_librivox,wandered_lonely_as_a_cloud_librivox,mohan-rakesh-shreshth-kahaniyan-by-rajendra-yadav,TheCompleteThinMan,midnights-children,artofalicemadnessreturnsPDF,dracula-2021,devar-ne-bhabhi-ko-maa-banaya-audio,frankenstein0000mary_d5f7,AutobiographyOfAYogiHindi,Mini_Sex-mag-05,gard-e-mehtaab-ahmed-mushtaq,YuvalNoahHarariSapiens1,rss_dune,westernphilosoph035502mbp,el-extranjero-albert-camus,terror_mystery_0707_librivox,MLKDream,short_history_2005_librivox,phaedo_1105_librivox,sex_life_gods_1208_librivox,the-48-laws-of-power_202301,ACountryDoctor,RaagDarbari_201707,art_war_ps_librivox,san_0788,dostoevskyletter00dostuoft,AllamaIqbalBooks,powerofyoursubco0000murp_c5j2,notesfromunderground_bn_librivox,DeputyCollector,juliuscaesar_1002_librivox,short_story_047_1102_librivox,elvis-presley_elvis-presley,CRIMEANDPUNISHMENTByFyodorDostoyevskyFULLAudioBookP.13GreatestAudioBooksV3,OSHOSadhanaSutra,Susheela,MahabharataEp01Beginnings,bhagwat-geeta_20200718,wet-and-wild-1998,hegels-aesthetics,gunaho-ka-devta,SADAKKEKINAREHINDI,audio_poetry_27_2006,Taboo_Old_and_Young_Adult_Photo_Magazine_July_2019,duniyamereaagenidafazli,biblecurious,the-book-of-man-osho,darkhorseekankahidastanhnilotpalmrinal,DanielKahnemanThinkingFastAndSlow,prince_librivox,527320845-the-wheel-of-time-books-1-10,vintage-hardcore-magazines-t-collection,rahimasumrazaautobioh,meditationsofmar00marc,ghost_stories_004_librivox,poems-by-pb-shelly,HindiBook-kabir-ke-dohe,proses_202010,10.-morenadas-enganchadas,AutobiographyOfAYogiByParamahansaYogananda_201903,horror_001_librivox,isbn_9780679420293,history-of-today-yuval-noah-harari-21-lessons-for-the-21st-century-vintage-2019,21.-a-wifes-confession-savita-bhabhi,OSHOEkOmkarSatnam,in.ernet.dli.2015.68346,FSFitzBBCr4,TheArtOfDying,TheArtOfWarBySunTzu,mohanrakeshpertalekizameenhindiedition,in.ernet.dli.2015.481205,TheProphetByKhalilGibran,indianindependenceactof1947susanmuaddidarraj_387_h,the-hidden-hindu-part-2,wealth_nations01_se,fahrenheit-451-by-ray-bradbury,atomichabitseasy0000clea,MahaGeetaInHindiByOshopart33,MasnaviRumiWithUrduTranslationByQaziSajjad,bhanje-ki-kartut-antarvasna-audio-sex-stories,TAOUPANISHADHINDIPDFOSHOBHAAG1,Pussy_Galore,mcamx238yimjggwf8dbc7voc9s9nf03gkai92jyx,SDBhi1407GitaPravachanBhagwatGeetaHindiGitaPravachanBhagwatGeetaHindiBhagavad,count_montecristo_1308_librivox,in.ernet.dli.2015.342327,hunchback_notre_dame_mn_libriox,autobiography_charles_darwin_am_librivox,Manhaj.Kalamullah,hindimahabharat1005055mbp,savita-bhabhi-ep-02-cricket,in.ernet.dli.2015.541036,shortstories00dost,duniyajisekahtehainhindiedition,the-psychology-of-money-by-morgan-housel-complete-book-in-hindi-audio,tome-02-tournage-amateur,dune-by-frank-herbert,heraldryfloralfo00colerich,ldpd_7138216_000,shakespeare-hamlet-john-gielgud-1948,hitchhikers-guide-to-the-galaxy-bbcr4,pack_20220328_202203,marvel-secret-wars-by-jonathan-hickman,in.ernet.dli.2015.347248,beauty_202302,plague00camu_khb,war_and_peace_vol1_dole_mas_librivox,a-hunger-artist,Holy-Quran-Urdu-Translation,TobaTekSingh-Hindi-Manto,IntroductionToIndianPhilosophy,kiterunner00hoss,CrimeAndPunishment-GraphicComic,midsummer_nights_dream_0806_librivox,it-ends-with-us-colleen-hoover-z-lib.org-1,sociedad-de-acomar-juguetona-flac,unabridgedjourna0000plat,cd_letters-to-a-young-poet_mark-zanter,BatmanTheKillingJokeDeluxeHCEdition2008MinutemenY2K,in.ernet.dli.2015.307256,ChaubeJi,metamorphosisv5_2005_librivox,apni-apni-beemari-hari-shankar-parsai-1,albert-camus-the-myth-of-sisyphus-vintage-2018,HindioldSongs_20170409,PanchParmeshwar-Hindi,OTRR_Sound_of_War_Singles,jungletaiteiCh8,antichrist_librivox_,in.ernet.dli.2015.552016,LaghukathaByManto,the-shadow-1941-hitlers-astrologer-1988-marvel-graphic-novel,in.ernet.dli.2015.261618,strangeralbertca0000unse,a_day_with_great_poets_1308_librivox,in.ernet.dli.2015.415754,TheStoryOfPhilosophyWillDurant,heartOfABrokenSoul,los-ronisch-traicionera-1996-642,1_20191103_20191103_1326,in.ernet.dli.2015.482229,7swoddvgji65fifc7r7fgotu5whhm67kgbttgslk,metamorphosis0000kafk_p0w0,YogaVasistha-VairagyaPrakaran-HindiAudioBook,JannatKPattayNovelByNimraAhmedComplete,the-hobbit-bbc-radio-drama,rahat-indori-poem-hindi,thinkgrowrichthe00hill,the-art-of-being-alone-solitude-is-my-home-loneliness-was-my-cage,priyanshi-jain_20230926_1609,Birthday-Sex,in.ernet.dli.2015.539069,Inner.Engineering.Hindi.Pdf,animalfarm00orwe_0,romeo-y-julieta-texto-completo,DostoevskyBBCr4,manga_AkiSora-v01,harrypotterdeath0000rowl_c0f9,chalu-ladki-se-phone-sex-chat,HPYes.sir,PoosKiRaat-Hindi-Premchand,OSHO-BhaktiSutra-Hindi-Audio,bhagatsinghwhyiamanatheist,steallikeartistj0000kleo,in.ernet.dli.2015.551015,PauloCoelhoTheAlchemist,dni.ncaa.SAK-1045_1-AC,ShaidJaunEliyaUrduShairi.com,Ulysses-Audiobook,KUPRINKIKAHANIYANHINDI,FriedrichNietzscheTheWillToPower,enlightenment_202302,bhai-ne-bahan-ki-gand-me-lund-diya,godaan-by-munshi-premchand-ebook,urdu_20190820,adventuresofsher00doylrich,TheStoryOfMyExperimentsWithTruth-MahatmaGandhi,sylviaplathbellj0000reif,Pleasure-mag-101,HindiIslamicBooks_MAE,TheGovernmentOfIndiaAct1935,SHIVPURANHINDI,in.ernet.dli.2015.539223,1984-george-orwell,AudioOrgasm,in.ernet.dli.2015.88942,in.ernet.dli.2015.402936,vagabond_201909,mythofsisyphus0000unse,thus-spoke-zarathustra,savita-bhabhi-ep-01-bra-salesman,bestwomenserotic00viol,kafka-on-the-shore-by-haruki-murakami,RABINDRARACHANABALI,the-forty-rules-of-love-elif-shafak,sadhana_0907_librivox,Gorwellbeutew1,OTRR_Crime_Classics_Singles,ost-english-crimepunishment00dostuoft,truestoriesofcrime_1808_librivox,letterstomilena0000kafk_u9s0,GoldenAgeOfMarvelComics,the-girl-in-room-105-chetan-bhagat,psychologyunders033255mbp,fountainhead00aynr_1,themeditationsofmarcusaurelius_1801_librivox,brothers_karamazov_v3_2002_librivox,sapiens_202112,kafka-on-the-shore-pt-i,the_911_report_librivox,TheCompleteWorksOfHPLovecraft_201412,4-bholaram-ka-jeev-parsai,collectedpoems0000plat,sharq-mere-shimaal-mein-part-3,twisted-hate-ana-huang,dark-psychology_202111,platos_republic_0902_librivox1,in.ernet.dli.2015.379036,notesfromundergr0000fyod,WaitingForGodot_886,selected_stories_fitzgerald_0902_librivox,TheArtOfSeduction1,Episode9WeAreBackTake2,franz-kafka-the-complete-stories,diariesofleotols00tols,and-the-mountains-echoed,sfdsj,The_New_Nude_Photo_Magazine_Premiere_Issue,wi8xbcrumjoa1z2smj96s2xq6wcowypg9omw322z,athousandsplendidsun,Anal_sex-mag-44,RichDadPoorDadListenTheCompleteAudioBookRobertKiyosaki,isbn_9780439064866,32_20200516,walkingdead00kirk_1,manga-demon-slayer-kimetsu-no-yaiba,colorclimaxmegaclimax77_201908,in.ernet.dli.2015.539020,cu31924013141985,in.ernet.dli.2015.351175,kama_sutra_1008_librivox,anthem_librivox,ibook_201705,B-001-014-606,WingsOfFireAnAutobiographAPJAbdulKalam3873,HornyStoriesComix04,detectivecrimebbcr4,straybirds015459mbp,lettertofather0000kafk_y6m9,novelsoffyodordo04dost,KabirKeDOHEByJAGJITANDKABIR,the48lawsofpower_201912,sophies-world-jostein-gaarder-z-library,themetamorphosis_version_4_1706_librivox,kamasutra-clara-morgane-le-livre,collector-sahiba-104,jane_eyre_ver03_0809_librivox,franco-rojas-y-su-grupo-sinceridad-tu-llamada-2000-293,MakingOfTheAtomicBomb,briefego00goghuoft,rag-darbari,it-starts-with-us-colleen-hoover-z-lib.org_20221128,eroticmanga0000unse,onehundredpoemso00kabiuoft,the-midnight-library-by-matt-haig_202406,Party_Girls_Vol._98_2016,ManuSmritHindi-GpDwivedi,the-trial-by-franz-kafka,MukhtasarSahiBukhariInHindiLanguageVolume-1To3Pdf,gitanjalisongoff00tagouoft,Gharjamai,sahihbukharisharifhindivol1.00010813_202004,peerekaamal.byumeraahmed,871-amazing-spiderman,FreedomFromTheKnownJ.Krishnamurti,confessions1_2_mg_librivox,StephenHawkingTheUniverseInANutshellBookFi,dni.ncaa.ICCR-27-AC,twisted-love-1,albertcamus-letranger-1942_20190820,hist_greece_bury2_0903_librivox3,ZindagiGulzarHaiPdfbooksfree.pk,the-orange-book-the-meditation-techniques-of-bhagwan-shree-rajneesh-by-bhagwan-s,cd_the-rough-guide-to-bollywood-legends-mohd._mohd.-rafi-asha-bhosle-mohd.-rafi-chorus,YeMeriNazmeNAhmedFaraz,no-longer-human-dazai-osamu,in.ernet.dli.2015.480857,bookoflife_1212_librivox,sonnets_librivox,HindSwaraj-Speech-03-1,AndThenThereWereNoneByAgathaChristie_201810,virginia-woolf-mrs-dalloway,deadpool-family,apni-apni-bimari-harishankar-prasad,lp_twelve-great-love-songs-by-chatma_ch-atma,Shayad-urdu-poetry-book,intelligentinves0000pysh,kulliyat-e-faiz-faiz-ahmad-faiz,Suno.Kahani,in.ernet.dli.2015.381795,cinderallagraphicnovel,TombRaiderAdult,CompleteAUDIOBOOKAnimalFarmBYGeorgeOrwell,Playboy_March_2015_ZA,the-psychology-of-money-audiobook-in-english-morgan-housel-ebook-on-description,lord-of-the-rings-10_202401,manga_Household_Affairs,sylviaplathsbell0000unse,OSHOAntarKiKhoj,LoveInTheTimeOfCholera,AmishTheOathOfTheVayuputras,lp_hindi-classical-songs-from-films_various-asha-bhosle-kamal-barot-khan-sahib,howtotalktoanyon0000lown_w4w8,invisible_man_librivox,diariesoffranzka00kafkrich,HindiBook-shrimadBhagwatGitaWithTika.pdf,princemac00machuoft,AutobiographyOfYogi,pyasi-punjaban-desi-bhabhi-ki-chudai-devar-se,oshotaotzu,sudama-ke-chaval-parsai-H,abhigyanshakuntalsanskrit,BoreByParsai,thousandsplendid00khal,TheSettingSunOsamuDazai,PanditHariprasadChaurasiaAtRamakrishnaMissionDelhi20140119,DehliKiAakhriShama,a-course-in-meditation-a-21-day-workout-for-your-consciousness-by-osho-z-lib.org,isbn_9780140455120,mlxde5yihgt41,in.ernet.dli.2015.307260,IndiaAfterGandhiByRamchandraGuha,completefrenchgr00fras,ashlil-film-se-nahin-chitt-se-mukti-hindi-talks-by-osho,NoamChomskyAudioLibrary,ASongOfIceAndFire5ADanceWithDragons,nayafat-ahmad-faraz,2017_20200226,powerofyoursubc00murp,cd_kamasutra_adassa,priyanshi-jain_20230926_1554,emma_solo_librivox,ultimate-spider-man-v-01-power-responsibility-2009-digital-f-kileko-empire,letterstoyoungpo0000rilk_g0m4,pritosho_1,ShikariAurateinBySaadatHasanMantoUrduShairi.com,RaviAliAkhbarRagas4,OshoVijnanaBhairavaTantra,the-palace-of-illusion,lettersoffyodorm00dostiala,dni.ncaa.SAK-158-AC,in.ernet.dli.2015.444467,diaryofawimpykidbookseriesbyjeffkinney_202004,baburnama017152mbp,punjahang,kupdf.net_the-subtle-art-of-not-giving-a-fuck_text,letterstoyoungpo00rilkrich,byomkeshbakshih,kulliyatghalib-v3,in.ernet.dli.2015.482124,pakistanthepartitionofindiabrambedkar1946_425_i,unset0000unse_n2l1,howtowinfriendsi00carn,ganjayfarishtay,crocodile_1607_librivox,41-anmol-kahaniya-41-priceless-stories-b-09-hw-3-klz-1-33_202112,OADTM001ADHYATMUPNISHAD01HgKvalitet,the-fellowship-of-the-ring_soundscape-by-phil-dragash,women00buko_1,hentai-no-15,UkhadeKhambhe,franzkafkabiogra00brod,UrduPoetryShayariIndianPakistaniPoet24,KhaufHorrorStoriesHindiUrdu,yani-by-jaun-elia,ThithurtaGantantr,HindiBook-the-secretInHindi,isbn_9780453677455,GunahonKaDevta-Hindi-DharamveerBharti,NayaSaal,in.ernet.dli.2015.442421,pharmacienne-la-hd,chesterfield_letters_1102_librivox,the-stranger-albert-camus_202407,dni.ncaa.ICCR-1473-AC,HindiSongsfamous-instrumental,romeo_juliet_1001_librivox,AshuddhBevaqoof,KulliyatEIqbalFarsiWithUrduTranslation,TheBookOfForbiddenKnowledge,deep-work-rules-for-focused-success-in-a-distracted-world-pdfdrive,srimad-bhagavat-mahapuran-2-volume-set-sanskrit-hindi,lccn_078073006991,politics_0802_librivox,simbaby_202102,possessed_1404_librivox,AshadKaEkDinMohanRakesh_201809,MUMMYHINDI,godan-by-munshi-premchand-gyannidhi.com,letterstomilena0000kafk_t2y2,illiad_0801_librivox3,KABULIWALA_201501,shakespeareworks09claruoft,Albert-Camus_Les-Justes,KamaSutraFor21stCenturyLovers100SexualPositionsEBook,HarishankarParsai,lucknow-ki-panch-ratain-ali-sardar-jafri,20210515_20210515,sex-god-method-2nd-edition.com,20230923_20230923_1528,KatraBiArzoo-Hindi,love_freindship_cs_librivox,beyondgoodandevil_1910_librivox,HowToTalkAnyone,MathnaviVol1-2UrduOrCoupletsOfDeepSpiritualMeaningsByJalaluddinRumi,PasEAndaazMausamByAhmadFarazUrduinpage.com,tab-kii-bat-aur-thi-parsai,yayatihindi,premchandgabanhindi,nagayan-sampoorna-collector-edition-full-hd,artofwar_1402_librivox,Geethmala,dr.ambedkaratmakathaevamjansamvadhindi,othello_1005_librivox,Adhyay6GeetaManovigyanOsho,King-children-of-the-corn,BooksSea.com1984,devar-ke-sath-sex,the-hidden-hindu-part-3,great_expectations_mfs_0812_librivox,in.ernet.dli.2015.349356,short_ghohor_001_librivox,los-ronisch-de-cbba-vol-01-1989,KongOfSkullIsland,kafkasmetamorphosis_20201130,complete_works_of_friedrich_nietzsche_vol3_2011_librivox,lawspower,the-daily-stoic-366-meditations-on-wisdom-perseverance-and-the-art-of-living-pdfdrive.com,HindiBookAstangaHrdayam,fiftyshadesofgre0001jame,fortyrulesoflove0000shaf_f2u6,fahrenheit-451-by-ray-bradbury_202201,RasidiTicketByAmritaPritam,TumAisiHiTohAcchiHoByAmandeepSinghHindiPoetryYQSwipeWrite,jaishankar-prasad-kavya-sangrah,SitaWarriorOfMithila,shayad-by-jaun-elia,fansadox-brothel,HorrorComics,Mrs.HicksTheKiteRunner,why-i-am-an-atheist,SherlockHolmesStories-DramatisedInHindi,lp_the-diary-of-a-young-girl_anne-frank-elinor-basescu_0,RyanKiteRunner1,550670-the-fault-in-our-stars-by-john-green-extract,powerofyoursubco0000jose,ghost_stories_001_librivox,anti-imperialist_twain_1210_librivox,india-that-is-bharat-9789354350047_compress,Ocean_in_a_Drop,godofsmallthings0000roya,best-of-mayfair-issue-60,Songs.PKKingOfGhazalJagjitSingh03ChithiNaKoiSandesh,norwegianwood00mura,wg966,socratesh,john_keats_selected_poems_lw_librivox,frost_selections_librivox,gov.uscourts.arb.750313,MansarovarPart2-Hindi-MunshiPremchand,HindiBookGandhiVadhKyoNathuramGodse,ihsa104,ggbb123,unknown0000unse_j2t3,ApniKarniByPremchand,franzkafkasmetam00bloo,timemachine_sjm_librivox,BeAawazGaliKuchonMainByAhmedFaraz,the-courage-to-be-disliked-how-to-change-your-life-and-achieve-real-happiness,apology_rz_librivox,TheAlchemist_410,KyaVeUnhen,BarelyLegalMagazine,Rain_without_clouds,LKDy_sophi-ka-sansar-of-justin-garder-hindi-trans.-by-satyapal-gautam-rajkamal-publications-new-delh,HGWellsBBCr4,bbc-radio-4-james-bond-collection,whymarry_1112_librivox,ulti-ganga-bhai-behan-ki-chudai-ki-audio-sex-story,audio_poetry_54_2006,AadhaarbyPremchand,Mein-Kampf2,kamleshwarpriyah,the-palace-of-illusions-com-v4-0,the-complete-works-of-osho.org,premchandkarmabhoomihindi,01BolKeLabFinalMIx,think-and-grow-rich-audio-book-full-version-hindi-by-nepoleon-hill-the-fina,unicorndancinggi0000faiz,AnnihilationOfCasteDr.B.r.ambedkar,aleeebrkt_gmail_201806,maine-apne-student-se-choot-chudai,SAMUELBECKETTWaitingForGodot,manga_Akira-FullColor-v01,peer-e-kamil-novel-by-umera-ahmed,1DhruvRomanHatyara,in.ernet.dli.2015.184806,the-courage-to-be-disliked_202210,atomic-habits-by-james-clear-,Pxlq_bina-divaron-ke-ghar-by-mannu-bhandari-akshar-publication-private-limited,book-of-wisdom_pdf,JFSP56,001-nagraj,annakarenina_mas_1202_librivox,khayyam-ki-madhushala-1935-bachchan-1,xVpW_kesari-prabodh-by-kesari-mahotsav-mandal-1931-marathi-laxman-balvant-bhopatkar-p,metamorphosisnew0000kafk,HindiBook-sabaSayanaEakMatByShriOsho,apostate-imam-deen-of-deception-libgen.li,pride_prejudice_krs_librivox,JustBeforeMidnightBBC,epaperpdf.download-it-ends-with-us-168,tragedyofmacwest00shak,zarathustra_0809_librivox,18_20211120,letterstofelice00kafk,lincolnvol1_1305_librivox,DotCompleteBBCr4,ShrimadValmikiRamayan-SanskritTextWithHindiTranslation-DpSharma10,PeerEKamilEngPdfStuff.blogspot.com,letterstoanartis013844mbp,Swaraj-Gandhi-1947-05-11,SpiderManComics_201310,28.FireAndBlood,HindiBookHindutvaVinayakDamodarSavarkar.,Mature_Ladies_Adult_Photo_Magazine_April_2018,UrduPoetry1,berserk-manga,barely-legal-april-2022,RTFM-Harp-940210,badhyabhumirutsab,doujing11-d35,BadeBhaisahib-Hindi-Premchand,bhagavad_gita_0803_librivox,SeventeenMagazineSylviaPlath1950,hindutva-vinayak-damodar-savarkar-pdf,childhood_russian_librivox,EinsteinAndOppenheimer2010,tradinginzonemas00doug,dni.ncaa.SAK-732-AC,YuvalNoahHarariSapiensUneBrveHistoirezLib.org_201905,platsd,intro_philosophy_history_dew_librivox,thousandsplendid00hoss,collectionofletters_2209_librivox,darkpsychology,OTRR_This_Is_Your_FBI_Singles,book-of-five-rings,TheBrothersKaramazovFyodorDostoyevskyPart3,Future.Sex.Issue.01,picture_doriangray_1012_librivox,in.ernet.dli.2015.403047,fellowship-of-the-ring-2023-version,Interracial_Adult_Photo_Magazine_November_2017,HowToDrawSexyAnimeCharacters,selectedshortsto00fran,talkingfilmsconv0000akht,Devar-se-chud-kar-Karwachauth-manayi-audio-sex-story,vagabond0000inou,bwb_KS-365-216,the-book-thief_202101,thekingofpornjohnholmesswedisherotican.310,PatniSePati,1984_thegraphicnovel,JaunBhuiayanKhele,arthla-sangram-sindhu-gatha-p-vivek-kumar,AnneFrank_446,Porno_Play_1,ThinkAndGrowRichPDF_201706,TedhiLakeerByIsmatChughtai,OSHOPremDarshan,no-longer-human-complete-manga,manga_Billy_Bat,ikigai_202310,SAHIRLUDHIYANVIHINDI,TrainToPakistan_201805,bhagatsinghwhyiamanathiest,InspiringThoughts-MahatmaGandhi,short_poetry_001_librivox,in.ernet.dli.2015.467025,Rpbi2013-09-17.radioPlaybackIndia,Lottery-Hindi-Premchand,annefrank00anne,megaclimax92,the48lawsofpowerbyrobertgreene1998,sasur-bahu-antarvasna-audio-sex-story,AdolfHitlersMeinKampf-CompleteAudioBookMp3,idgah-h-comic,incest-magazine-special-oedipussy-1,in.ernet.dli.2015.552094,agatha-75cf8c083b674137b88baad8f49bca68,KanzUlUmmal,diary_uboat_commander_mfs_librivox,Pussycat_01,dni.ncaa.ICCR-548-AC,sophiesworld0000gaar,cd_the-legend-mehdi-hassan-ghazals-from-fil_mehdi-hassan,audio_poetry_30_2006,SexBookUrdu,thehobbitaudio,Kulliyat-e-Dagh,the-mountain-is-you-transforming-self-sabotage-into-self-mastery-ryo-dr-notes,shiv-kumar-bbatalvi,sex_0810_librivox,LolitaVladimirNabokov,howtotalktoanyon0000lown,dorian_gray_librivox,28LikeARollingStoneLiveVersion320LameCbrEx,SindoLA_METAMORPHOSIS-EMERGENCE-HENSHIN-177013_English,Ramleela-Hindi-Premchand,manga_Velvet_Kiss,KAMASUTRA_201806,1891_collection_bt_librivox,poems_wm_blake_ss_librivox,lettertoyoungpoe0000wool,Bohni,dunwich_horror_1511_librivox,Snatak-Hindi-BachelorOfArts,20170802194455,secrethistory0000tart,PowerOfSubconsciousMind,HindiBook-chanakya-neeti-darpan,wano_lo.-thilakanche-kesaritil-lekh-part-4-by-n-c-kelkar-1930-marathi-kesari-maratha-,AashadKaEkDinByMohanRakesh,Peer-e-Kamil-eng,the-power-of-your-subconscious-mind-joseph-murphy-complete-hindi-audiobo,RajaGidh_201311,andrew-loomis-drawing-the-head-hands,098-ack-pundalik-and-sakhu-eng,AkhiriTohfaPremchand,the-idiot_202104,dni.ncaa.SAK-82-AC,gunahon-ka-devta-by-dharmaveer-bharti_202407,Sabhyata,a-good-girls-guide-to-murder-holly-jackson,dni.ncaa.ICCR-184-AC,fire-blood-by-george-r-r-martin,OshoOnVipassanaMeditation01,ikigaijapanesese0000garc,erotic-desires-volume-1-500,MahabharataEpisode4,briefhistoryofti0000hawk,hindswaraj.ambedkar.hindi.15,SangeetNatakMuseum,BehaveTheBiologyOfHumansAtOurBestAndWorst,IsteefaByPremchand,pictureofdoriang00wildiala,queen-the-platinum-collection-disk-1,mystery_yellow_room_0901_librivox,kamasutraofvatsy0000vats_y8y8,vagabond_202111,giftedhands00cars,the-power-of-your-subconscious-mind,in.ernet.dli.2015.483936,sunny-leone-wet-and-wild-xxx-imageset,Urdu-Ki-Aakhri-Kitab-By-Ibn-e-Insha,MoujzatanHundPaigaam,loveisdogfromhel00buko,Sports_Illustrated_February_20_2015_USA,Sandman_201906,vincentscolors00gogh,OSHOSapnaYehSansar01,neuromancer-william-gibson,cd_the-very-best-of-mehdi-hassan_mehdi-hassan,seventeen-dutch-387,dni.ncaa.SAK-662_2-AC,nearly-all-the-men-in-lagos-are-mad-damilare-kuku-z-library,ignitedmindsabdulkalamapj_879_e,compositions_202001,chacha-chaudhary,quran-roman-urdu-hindi,bachchandochattaneinhindiedition,happy_days_a_play_by_samuel_beckett,dli.ernet.292551,koi-deewana-kehta-hai-by-.-kumar-vishwas-z-lib.org,UsneKahaTha-Urdu-NationalBookTrust,MemoriesDreamsReflectionsCarlJung_201608,yt-1s.com-sleepy-sex-bakugo-katsuki-x-fem-listener-asmr-18,BatmanTheDarkKnightReturns03of041986,the-apothecary-diaries-light-novel-series,los-ronisch-regresa,TheDelhiSultanateAPoliticalAndMilitaryHistoryCambridgeStudiesInIslamicCivilization,Kuliyat-e-Iqbalurdu,NazeerKiShayri,RajivDixitAudioLecturesConvertInHindiTextSoftCopy,UltimateHitchhikersGuideToTheGalaxyTheDouglasAdams,bbc-radio-4-the-adventures-of-tintin_202105,beti-ne-baap-se-chut-chudai-story,letterstomilena0000unse,palaceofillusion0000diva,blood-meridian-no-page-numbers,men-only-v-65-08,blood-meridian-or-the-evening-redness-in-the-west_202402,andheri-nagri-opt-1,chaos-charles-manson-the-cia-and-the-secret-history-of-the-sixties-audiobook_202212,in.ernet.dli.2015.404232,principles-of-power-system-by-v-k-mehta-rohit-mehta,ooperneechedarmiyanmanto,rework0000frie,jackpot-11,in.ernet.dli.2015.269142,powerpolitics00roya,interpretationofdreams_1401_librivox,ihavenomouthimus0000harl,waitingforgodott00beck_0,TheSilmarillionIllustratedJ.R.R.TolkienTedNasmith,how-to-talk-to-anyone-hindi,paradise_lost_08083_librivox,dainikprernahindiedition,in.ernet.dli.2015.380057,sheikh-yameen-100-best-selling-self-help-books_202107,warofworlds00well_3,HindiBhajans-collection,mastery-by-robert-greene,cd_best-of-jagjit-chitra-singh-aah-ko-chah_jagjit-singh-chitra-singh-kuldeep-singh-ba,KarlMarxDasKapitalpdf,in.ernet.dli.2015.402115,why-i-killed-gandhi,Playboy_Venezuela_February_2016,ciadocumentscollection,the-48-laws-of-power_202111,federalist_papers_librivox,warandpeace030164mbp,Chalte-Ho-To-Cheen-Ko-Chaliye-By-Ibn-E-Insha,SabitaBhabhiBengaliEpisode2,god-of-fury-a-dark-mm-college-romance-legacy-of-gods-book-5-rina-kent-english-z-lib.io,storyofaristotlesphilosophy_2102_librivox,ChiefInspDoverbbcR4,completeworksofw00shakrich,white_nights,wit_humor_america1_1102,adventures_sherlock_holmes_rg_librivox,the-subtle-art-of-not-giving-a-f-ck_202406,in.ernet.dli.2015.464311,33TheThreeBodyProblemChapter33,107._20200327_202003,nadi-final,WingsOfFire,meinkampf035176mbp,philosophicaless00russ,ego-is-the-enemy-by-ryan-holiday-z-lib-o,Ashar1,ApradhAurDand-Hindi-CrimeAndPunishment,agatha-christie-dumb-witness,manualofeasterno0000orth_w8t0,emma_mt_librivox,how-to-talk-to-anyone-audiobook-in-hindi-communication-skills-book-summa,sociedad-se-fue-de-mi_202304,RebusCompleteBBCr4,MailaAanchal-TanveerZehraBukhari,sapiens-a-brief-history-of-humankind-audiobook-yuval-noah-harari-hd-audio-books-16,AshtavakraGitaEnglishAudioBook,jagat-mein-jhoothi-dekhi-preet-part-1-mr-jatt.com-1_202011,thinkgrowrichbyn00hill,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Vol._2,in.ernet.dli.2015.442173,lp_yaadon-ki-baaraat_r-d-burman-asha-bhosle-chorus-kishore-kuma,The_Four_Seasons_Vivaldi-10361,happydays_202001,houseofdeadorpri00dostuoft,oceanof-pdf.com-the-art-of-laziness-library-mindset,how-to-win-friends-full-audio-book-nepali-dale-carnegie-online-audio-converter.com,walden_librivox,lughaterozmarrahshamsurrahmanfaruqi,book-1-the-hunger-games_202311,modernhindipoetr0000unse,hustler-july-1980,Tamingoftheshrew_Shakespeare_TOS,QatilByPremchand,InSearchOfLostTimeCompleteVolumes,heaven-officials-blessing-vol-3-vol-4-mo-xiang-tong-xiu,LevNikolayevichTolstoy-SelectedShortStories,suitableboynovel0000seth,Playboy062009Ru,NoExit,notesfromundergr0000unse,zbih_rashmi-rathi-by-ramdhari-singh-dinkar-1954-shri-anjana-press-limited,cu31924014422020,satishchandrahistoryofmedievalindia,jagjitsinghghazal,PEEREKAMILP.B.U.HUrduinpage.com,wa939506_gmail_201806,in.ernet.dli.2015.482516,wg816,heera-lal-ka-bhoot,PlatoTheRepublicCambridgeTomGriffith,power_concentration_0810_librivox,iron-flame,stealingfirehows0000kotl,ArtOfSeduction,manssearchformea0000vikt_x0q6,voyage-en-profondeurs-hd_202102,chanakya-Neeti,worlds_best_mystery_1_librivox,trialanddeathofs00platiala,kirtu,wazayefenadeali_202001,NightMeditation,unset0000unse_o3y0,48Laws48,MeinKampfAudio,15PoemsOfDushyantKumar-Hindi-DushyantKumar,126-nagraj-dahankand,MahabharataEp23AmbasPlight,in.ernet.dli.2015.415890,ffs104,introductiontoma00russuoft,game_of_life_0911_librivox,Voice012_201603,thebestofrodoxbestof40yearsdanishhardcorecolorclimax,BholaramKaJivByHarishankarParsai_266,who-framed-roger-rabbit_202212,hunkarhindi,stonernovel0000will,sixofcrows0000bard,standthe,MenAreFromMarsAndWomenAreFromVenus,miracle-of-love-stories-about-neem-karoli-baba,inglorious-empire,TheLittlePrince-English,Chandaurmain,thomas-erikson-surrounded-by-idiots,vagabond_202108,KuliyatEMeerTaqi,idiot_part_03_04_jm_1511_librivox,alchemist_1207_librivox,boysvolumeonenam0000enni_h6j2,in.ernet.dli.2015.551022,call-me-by-your-name-andre-aciman,Bi-Sex,fp_Silent_Spring-Rachel_Carson-1962,in.ernet.dli.2015.444482,powerofyoursubco0000murp_e9e1,lettersofsylviap0002plat,FranzKafkaMetamorphosisebookfromProjectGutenberg,goddelusi00dawk,Finger1980D.D.TeoliJr.A.C.1,2013.122014.01PbItaly,PornPassBrazzers,twisted-lies-4,VForVendettaComics,beyondgoodandevi00nietuoft,126-nagraj-dahankand_202103,UltaDarakth-Hindi-KrishanChander,IlmBadiDaulatHai-Hindi-IbneInsha,dni.ncaa.ICCR-1726-AC,peer-e-kamil-english,SahajPath-Part2-Bangla,the-almanack-of-naval-ravikant,PakshiAurDimak,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi_202307,caminhoparawoodb0000robe,life_poem_21_dickinson,raj-comics-thrill-horror-set-1-in-hindi,Episode10_20170926,02.-mahabharata-volume-2,trial00kafk_1,dni.ncaa.SAK-320-AC,hustler-magazine-1990-1999,the-silence-of-the-lambs_202101,in.ernet.dli.2015.272126,trial00kafkrich,DaagKiShayari,Level4MurderOnTheOrientExpress_20140730_1417,ost-english-pictureofdoriang00wildiala,separacinconscie0000thom,Tazkirat-ulAuliyaByAttarurduTranslation,manifest-while-you-sleep-law-of-attraction-affirmations,TheGandhiStoryInHisOwnWords-MahatmaGandhi,mythofsisyphusot00camu,faiz-ahmad-faiz-aur-unki-shayri-prakash-pandit_20230915,13QuestLettersToAYoungPoet,AtlasOfHumanAnatomySixthEditionFrankH.NetterM.D_201803,metamorphosis-by-shindo-l-manga,Madhushala-Hindi-HarvanshraiBachchan,20th-century-boys-21st-century-boys-naoki-urasawa,in.ernet.dli.2015.281236,audio_poetry_3_2005,in.ernet.dli.2015.549420,DavidHareBBCr4,barely-legal-2021,war_worlds_solo_librivox,dead-mans-folly,Kasauti,creedsandy_gmail,first_love_mg_librivox,takayuki-takeya-drawings-arrangement-and-design,themetamorphoses21765gut,albert-camus-el-mito-de-sisifo,fyodor-dostoyevsky-crime-and-punishment-01-02,mancalledove0000back,TanhaTanhaByAhmedFarazUrduinpage.com,crimepunishmentc00dost,30ghoststories_1909_librivox,lIgd_sanskriti-ke-char-adhyay-by-ramdhari-singh-dinakar-1962-patna-udayachal-publications,MasnaviByRumiEnglishTranslation,Cats-200405,hNuK_chanakya-niti-with-hindi-and-english-translation-by-satya-vrat-shastri-bharatiya,fountainhead0000aynr,thealchemist_201908,nagraj-comic-collection,TheBellJar_194,mohammadrubel550_gmail_20151204_1036,1_20200516_20200516_1356,sociedad-album-desconocido-488,harukimurakaminorwegianwood_201912,nonfiction026_librivox,FRRB3,NauseaByJeanPaulSartre,Ambedkar_CompleteWorks,GuptDhan-Hindi,pratigya-pledge-b-09-hl-261-rp-09,count_monte_cristo_0711_librivox,01MadSciBespoke,secretofnagasboo0000amis,GBShawBBCr4,131049155-162497575382869-5073886964141735161-n,usatrilogybbcr4,best-of-mayfair-issue-25,heavy-metal-the-illustrated-fantasy-magazine-summer-1988,guman-by-jaun-elia,cd_ghazals-forever_various-artists-ghulam-ali-malika-pukhraj,toaz.info-fansadox-collection-173-wolfcreekpdf-pr_daf49bfe97679eea19c0b9ecbd8a2b27,KafkaKanzlerUndDaKnacktNichts,kny_vol_17-23,steal-like-an-artist,HindiGita,manualzilla-id-6059251,kafka_laerm_librivox,Taboo_Old_and_Young_Adult_Photo_Magazine_January_2019,jaya_20220620,Manto9LettersToUncleSam,EkGadhaNefaMein,art_of_money_getting_librivox,Mera.Jivan.Tatha.Dhyeya.by.Swami.Vivekananda.djvu,JurmOSazaByDostoevsky,Vivaldi-TheFourSeasonscomplete,KurukshetraDinkar,pratibhajidraupadihindi,constitution,studyinscarletsi08doyl,48lawsofpowercd1,pdf-savita,as_you_like_it_0902_librivox,black_magic_1710_librivox,multilingual_poetry_collection_001_librivox,the-boy-with-a-broken-heart-durjoy-dutta,236404182VladimirNabokovLolita,disgrace100coet,the-love-hypothesis-by-ali-hazelwood-5,gudarati-hayinichche-adbhuta-rati-by-adi-guduru-lo-res,ravan-samhita-1,the-silver-eyes-five-nights-at-freddys-graphic-novel-1-scott-cawthon-kira-breed-wrisley-z-lib.org,pirate45,LearnUrduPoetryEasily,discoveryofindiabyjawaharlalnehru,068-ack-tukaram_202010,manga_Futari_Ecchi,journey-to-the-centre-of-the-earth-by-jules-verne,sir-arthur-conan-doyle-a-study-in-scarlet,rich-dad-poor-dad_202106,annakareninatols00tolsiala,los-ronish-destrozas-mi-corazon-2001-601,Pleasure-mag-022,TereKhushbuMeinBaseKhatUrduShayariRajendraNathRahbar,007-khooni-yatra,foulplaybbcr4,Sadgati-Hindi-Premchand,age_reason_0910_librivox,indiafrommidnigh00thar,king_lear_librivox,velamma-episode-velamma-siterip-eng,kingdom_of_god_1004_librivox,ShivajiKonHota-Marathi-GovindPansare,HowToDrawComicsTheMarvelWay,mythofsisyphusot0000camu_j4j5,20210330_20210330_1641,Deewan-e-hafizfarsiWithUrduTranslation,premchandmangalsutrahindi,simon-sinek-start-with-why_201709,cd_greatest-hits-of-iqbal-bano-vol-1_iqbal-bano,TheStoryOfCivilizationcomplete,ramashankar-yadav-vidrohi,gktM_tar-saptak-agyeya,NewsQuiz6173,in.ernet.dli.2015.377578,OSHOAUDIOLIBROLASEMOCIONES,dli.ernet.436900,diwan_2004_librivox,essentialkafka0000john,BaapBadal,OSHO_Suno_Bhai_Sadho_Hindi,elon-musk-by-walter-isaacson,AGNIDEEKHSANIKOLAIOSTROVISKY,mantomeenabazarhindiedition,my-hanuman-chalisa,private-sex-magazine-cleopatra-orgias-sexo-mamadas-anal-porno-lesbianas-desnudas,1001HindiJokesEBook,kamasutra-idiots-guide,Thus_Spake_Zarathustra_Audiobook,dsc-girl-reshma-sex-chat,Superstars_of_Porn_01,gul-e-rana,oshosamadhikesapatdwar,project-mary-hail,TomtctwsgYear1-HarryPotterAndTheSorcerersStonem4bAudiobook,PauloCoelhoTheAlchemist1Of4,being-in-love-osho,the-two-towers_soundscape-by-phil-dragash,stranger0000albe_o7m3,2_20210725,beyondentreprene0000coll,Quran_Hin,in.ernet.dli.2015.301091,MaAarifEMathnawi,Lolita_523,HouToDrawExpanded,in.ernet.dli.2015.483757,kingdomofhappiness_2305_librivox,shrimad-bhagwat-geeta-hindi-sanskrit-gorkhpur-press,osho-es-dhammo-sanantano-027,the-rudest-book-ever_202404,onehundredyears000garc,osho-ego-sesli-kitap,TrialsofWarBBCr4,reworkchangewayy0000frie,m-rag-darbari-1,RamayanInHindiMp3ByShriMukeshJi,thelettersofapos40393gut,shelley-1888-frankenstein,isbn_9781590171998,20230414_20230414_0912,siddhartha_ap_librivox,kabirkedoheinhindiwithmeaning,audio_poetry_1_2005,in.ernet.dli.2015.307267,AkhiriTohfaByPremchand,2.bhagavatagitagitapressgorakhpur_201910,worshipping-false-gods-ambedkar-and-the-facts-which-have-been-erased-arun-shourie,10TheAlchemist25thAnniversaryEditionPauloCoelho,deewar-mein-ek-khidki-rehti-thi-vinod-kumar-shukal,TheWheelOfTime,PrincipalUpanishads,it-ends-with-us-by-colleen-hoover-z-lib.org.epub_202212,kinsley-david-2008-1997.-tantric-visions-of-the-the-divine-feminine-the-ten-mahavidyas,20240530_20240530_1133_1998,satyajitraythecompleteadventuresoffeludavol1.1penguinbooks_202002,hermann-hesse_siddhartha_gunther-olesch_anke-dreher_amy-coulter_stefan-langer_semyon-chaichenets,14TheCouncilOfElrond256_201810,pubmed-PMC3936183,20220606_20220606_1150,Bijak.Kabir.Saheb.with.Hindi.Tika,MereMunhMeKhaak-Hindi-MushtaqAhmedYusufi,24_20211123,completenietasch10nietuoft,268803571-mrutyunjay-marathi-novel-by-shivaji-sawant,dracula_ks_1608_librivox,riddlesinhinduismofambedkarb.hinditranslationbysurendraagyat_973_x,DCIStone1to6,jaishankar-prasad-ki-shrestha-kahaniyaan-hindi,20shortsfstories_1908_librivox,UdasNaslainByAbdullahHussainPdfbooksfree.pk,OrsonWelles-MercuryTheater-1938Recordings,in.ernet.dli.2015.263821,GitaHindi,es-dhammo-sanantano,AldousHuxleyBBCr4,48LawsOfPowerTrickin1,waitingforgodot0000beck,alhaudalkiveergathahindiedition,cycle-year-3-1-220520,in.ernet.dli.2015.464223,thedouble_1401_librivox,HindiAudioBooks,whatisart00tolsuoft,SSepisode15_201803,darius-foroux-think-straight-change-your-thoughts-change-your-life-darius-foroux-2017,Arsch_und_Fotze_02,littlelifenovel0000yana_p3t9,kuldeepemergencykiinsidestoryhindiedition,Cards_747,realsexforrealwo0000berm,the-swastika-earliest-known-symbol-thomas-wilson-7x-10,Nirvasan,friedrich-nietzsche_beyond-good-and-evil_helen-zimmern,dni.ncaa.SAK-570_1-AC,naturistlifed.d.teolijr.a.c.2,uglylovenovel0000hoov,WEALTHAffirmationsWhileYouSLEEPProgramYourMindPowerForABUNDANCE,stephen-king-it-audiobook,hhugsesgp2hm6oipkl8zq751hrm0rpo2hbf1fh6j,AmarbailByUmairaAhmed,quran-shareef-hindi-translation-anuvad-download,IndianPhilosophyVol.1,cham-tay-hoa-vang.sna,song-of-achilles,mantoke18gumshudaafsane,poems_every_child_should_know_librivox,rat-pashmeene-ki-urdu-gulzar,cards-on-the-table,poetics_librivox,UnderstandingComicsTheInvisibleArtByScottMcCloud,diet-mountain-dew_202202,the-art-of-seduction_202401,outsider0000camu_i2b3,ThePsychologyOfPersuasion,Samasya,Pulh_life-ahead-by-k.-krishnamurti-krishnamurti-foundation-india,games-people-play-the-psycholo-eric-berne,mahadevipathkesathihindi,Barely_Legal_2016_10_Original,Erotic_Desire_11,RoaldDahl_ServedTwist,KatieHimsBBCr4,josettesonawomantowomen,dracula_librivox,FQORAAN,sharaticharitraheenhindiedition,PartI_20150910,republic_version_2_1310_librivox,mountain_2023-04,ChristieStyles,little_women_0711_librivox,Maximum_Perversum-mag-51,stories_from_tagore_1911_librivox,RajaGidhByBanoQudsia-pdfbooksfree.pk,tuesdayswithmorr0000albo,onehundredyearso00garcx,B-001-004-443-ALL,ramdharisinghdin0000soni,twenty-four_hours_a_day_librivox,the-art-of-seduction-robert-greene_202306,MoorkhonKaSwarg-Hindi,best-of-mayfair-issue-33,landlady_2205_librivox,girl_boat_1109_librivox,little-stranger-a-dark-taboo-romance-leigh-rivers-english-2023-z-library,in.ernet.dli.2015.187760,DASBODH,general_intro_psychoanalysis_1403_librivox,Psychotronic_Video_36,MantraByPremchand,menwithoutwomens0000mura,KamayaniJaiShankarPrasad_201904,manga_Kanokon,RoeT_auto-biography-of-a-yogi-by-paramahansa-yogananda-yogada-satsanga-society-of-india-kolkata,thinkingfastslow0000kahn_b1q8,office-of-film-and-literature-classification_1200900.015,completestories00fran,podfic-it-ends-with-us,twisted-lies_202403,in.ernet.dli.2015.464304,chANakya-hindI-audio,sexual-fantasy-15,crux_2304_librivox,gonewithwind01mitc,it-ends-with-us-colleen-hoover-hoover-colleen,TheIdiotByFyodorDOSTOYEVSKYFULLAudiobook,SatanicIlluminatiBloodlines,WhyNationsFailTheOriginsODaronAcemoglu,camus-albert-stranger-vintage-1989,Pleasure-mag-098,dni.ncaa.SAK-280-AC,in.ernet.dli.2015.125150,missedensletters00edenuoft,khali-hai-abi-jaam-main-kuch-soch-raha-hoon-by-shayari-or-kahani,jdSi_kularnav-tantra-with-kalyani-hindi-tika-of-chitaranjan-malaviya-by-sudhakar-mala,smut0000unse,robert-glover-no-more-mr-nice-guy-id-353324692-size-612,berserk-volume-41_20231228,sapiensbriefhist0000hara,one-arranged-murder-chetan-bhagat-z-lib.org,YatharthGeetaHindi,a-thousand-splendid-suns-by-khaled-hosseini,one-hundred-years-of-solitude-gabriel-garcia-marquez-gregory-rabassa_201906,illustratedhomeb00powerich,consolationofphilosophy_2008_librivox,mindsetthenewpsychologyofsuccesspdfdrive.com,theromanceoflust30254gut,music_0802_librivox,TheGeniusOfTheCrowd,CelebritySkinMagazine,HotelNightShift,in.ernet.dli.2015.444089,Vanka-Hindi-AntonChekov,manga_Berserk-v02,atomic-habits-audiobook-atomic-habits-audiobook-in-hindi-atomic-habits-f,lettertofather0000unse_r3s9,crime_and_pun,SpiderManComics,how-to-draw-a-moving-pose-sexy-character-edition,yaaram-novel,5-akal-aur-bhains-renu,GODANHINDIPOETRYBOOKSigned,rashmirathi_202408,5FooledByRandomnessNassimTaleb,lustforlifestory00ston,velamma-episode-103,demon-slayer-kimetsu-no-yaiba-vol.-1,bbcr4chen,bprdvolume1hollo0000mike,ShowGirlzLatina2January202011,homeandtheworld_0908_librivox,volo-magazine-the-1st-indian-issue-2017-worlds-no-1-nude-art-magazine,poemsbyjohnkeats00keat,XxxPack_201707,101-things-i-learned-in-architecture-school,ThreeMistakesOfMyLife,sense_sensibility_ver3_ek,philosophy_fun_algebra_librivox,in.ernet.dli.2015.539251,sophiesworld00jost,dreampsychologyp00freuuoft,im_nobody_librivox,Zoo_Magazine_April_17_2015_UK,normalpeoplebysallyrooney,Psychotronic_Video_23,prince_bn_librivox,canterville-ghost-in-hindi-unabridged,commie-book,san_0940,mashi_1110_librivox,all-spiderman-comics,unset0000unse_w4r4,in.ernet.dli.2015.342300,in.ernet.dli.2015.483120,deepworkrulesfor0000newp,MahatmaGandhiSpeech,warren-vampirella-001.cbr,discworld-audiobooks,HindSwaraj.IndianOpinion.2.vol34,in.ernet.dli.2015.551322,isaac-asimov-the-last-question,quran-juz-1-hindi-anuvad-translation,TheBrothersKaramazov,hpmor,The7HabitsOfHighlyEffectivePeople_201809,DurgaKaMandir,HowToWinFriendsInfluencePeople,mantoboohindi,martyrs_of_science_1308_librivox,PornocracyBookComplete,memoirs_holmes_0709_librivox,bharatkasamvidhanhindi,salmanrushdiemid0000unse,osho_collection01,simbaroarsfromli0000disn,TombRaiderLiteAdult,pramoedya-bumi-manusia_20240531,Psychotronic_Video_38,chunkyassesvol.1no.1d.d.teolijr.a.c21,wNfs_shri-rama-rasayana-by-rajendra-chadrayan-sultanpur-1982-rashmirathi-sahitya-prakashan,HPBadchalan,sexualitypsychol00freu,manssearchformea00vikt_0,EconomicAndCulturalRelationsBetweenPakistanAndTheSovietUnionDuring,premchandnirmalahindi,deathofasalesmandavidsuchetzo,priyanshi-jain_20230926_1614,meri-shrestha-kavitayein-bachchan-1,emerald-table,TantraSutra,meditations_descartes_dew_librivox,tat-ki-khoj-parsai,TheMetamorphosisPg5200,XJudgeDreddX,the-best-of-penthouse-pets-volume-1,a-brief-history-of-modern-india-spectrum-2019,VikterFrankl_manIsSearchingForMeaning,Kabuliwala-Hindi-RabindranathTagore,diaryofwimpykidh0000kinn,the-stranger-albert-camus_202202,doujin_My_Daughter_Has_Been_Hiding_Mother_Daughter_Incest_Porn_Books...,cd_the-rough-guide-to-bollywood_various-artists-alka-yagnik-asha-bhosle-ch,finally-legal-2008-13-holiday,notesfromundergr00dost_0,in.ernet.dli.2015.271967,WhoAmI-RamanaMaharshiEnglishAudiobook,richard-dawkins-the-selfish-gene,in.gov.ignca.18598,in.ernet.dli.2015.272001,isbn_9789352661213,HarryPotter-hedwigTheme,puran_garuda,Madhushala_201607,mancalledove0000back_n8o6,tokillmockingbir0000leeh,quiet-the-power-of-introverts-in-a-world-that-cant-stop-talking-susan-cain_202007,return_holmes_0708_librivox,iyengarpatanjaliyogsutrahindi,lp_sylvia-plath-reading-her-poetry_sylvia-plath,faiz-ahmed-faiz-translations-by-v.-g.-kiernan-1971,possessednovelin00dost,wg250,agatha-christie-the-body-in-the-library,in.ernet.dli.2015.443782,WhoAmI-RamanaMaharshiHindiAudiobook,100m-offers,8thanniversary_1308_librivox,Chetan_Bhagat_-_2_States_The_Story_of_My_Marriage.pdf,playboy-the-celebrities,manic_doujin_00024,divaneghalib-v6,ariel-sylvia-plath-sylvia-plath-z-lib.org,walkingdeadriseo0000jayb,b7bhns71y7ea0wo7psnjev6xus9lewhzj1chp6nv,munshi-premchand-comic-h,does-it-hurt,how-to-draw-female-small-gestures-illustration-pose-collection-reference-book,hustlers-taboo-september-october-2020,letterstoyoungpo0000rilk,sammaxsurfinthehighway,xatar2007_yandex_1_201804,in.ernet.dli.2015.37875,ada-y-la-nueva-pasion-llorando-tu-partida-1998-846,TMBSR4,learning-to-silence-the-mind-wellness-through-meditation-osho,notesfromundergr0000dost_c9t2,AmishTripathiImmortalsOfTheMeluhaBookZZ.org,in.ernet.dli.2015.442174,Kuttaydogs,gov.uscourts.ilnb.1067210,thinking-fast-and-slow_202308,thinkgrowrich0000hill_i2s5,j-r-r-tolkien-lord-of-the-rings-01-the-fellowship-of-the-ring-retail-pdf,shayari,memoirsofsherlockholmesv3_1502_librivox,KhoyaPaani-Hindi-MushtaqAhmedYusufi,greatexpectation1890dick,dhammapada_0707_librivox,manga_Akira-c01,deathivanilyitch_1104_librivox,gyaru-doujin,the-fall-albert-camus-z-lib.org,hpAy_shamsur-rehman-farooqi-aur-tafheem-i-ghalib-criticism-urdu-rehana-akhtar,beowulf_te_librivox,sexnaturalhistor00rodg,AncientIndiaRSSharmaNCERT,bizarre-sex-05-1976,thelawsofhumannature,HindiBook-mahabharatPart-1,SigmundFreud,NAMAK,fucking-trans-women-mira-bellwether-october-2010.cleaned,whenpeoplearebig00welc,priyanshi-jain_20230926,joothanuntouchab0000valm,dozakhnamaconversationsinhellbetweenghalibandmantobyrabisankarbalarunavasinhatrans,hmv-7-epe-1458-ghazals,wutheringheights01bron,eyeofworld0000unse,alices_adventures_1003,GreatExpectationsUrduSyedIrfanAli,forrest.gumplevel3_201907,MahabharataEp11,manga-vagabond-vizbig-edition-vol.-1,i-have-no-mouth-and-i-must-scream_202112,jujutsu-kaisen-volume-01-pdf-room_202401,cathedralscastle00erla,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Vol._1,ulyssesshake1927,whitenightsgentl0000dost,warpeace3498tols,EkGadheKiVapasi_974,littlelife0000yana,oppai_images,tlotrunabridged,GulzarAllam,mangamag_Weekly_Playboy,ZeldovichYaglomHigherMathematics,the-mahabharata-set-of-10-volumes,Balbharati,KahaniNachiketaKiKahani,TheHobbitAudiobook,greece_to_alexander1_0803_librivox1,HindiBhajanmp3-HanumanChalisaAartiyaan,TumanbayR42015,wisr8ein9zipfrh8r5q3cnysvvhtqmk7g9srgepc,Pocket_Porn_Special_15_The_Best_Of_Cum_3,threemeninboatto00jerorich,your_invisible_power_2104_librivox,in.ernet.dli.2015.454650,how-to-talk-to-anyone_202107,deathofivanilyic0000tols,AlanGarnerBBCr4,multilingual_short_works_020_poetry_prose_1810_librivox,wayofkings0000sand,ramayana_book1_0211_librivox,gitanjali00unse,mas-addict-manga,whitenightsother00dost,super-skill-techniques-for-drawing-people-toshi,in.ernet.dli.2015.507759,raseedi-ticket-amrita-pritam,Batman201-250,priyanshi-jain_20230926_1544,magorkihindi,in.ernet.dli.2015.526357,BBCr4Brideshead,republicshorey01platuoft,naukarani-ke-pati-se-tan-ki-aag-bujhayi,camus-albert-la-peste,sketches_of_fair_sex_1010_librivox,kids-stuf-the-right-stuf-international-2000-catalog_202212,RTFM-Harp-950221,devdashindi,in.ernet.dli.2015.447169,WarOfTheWorlds1938RadioBroadcast256kbps,collection-bdfr-tout-herge-herge-tintin-et-les-autres-plus-de-57-albums,hentai-no-1,RapeOfTheMind-ThePsychologyOfThoughtControl-A.m.MeerlooMd,lp_vidai-geet-marriage-songs-from-films_various-asha-bhosle-chorus-geeta-dutt-jagj,AbnormalPsychologyLectures,the-setting-sun-dazai-osamu,glimpses_of_bengal_1903_librivox,EatThatFrogHF,ParichayRamdhariSinghDinkar,andrew-loomis-fun-with-a-pencil,HarukiMurakami,patanjali-yoga-sutra-by-osho-in-hindi-pdf-free-download-2,pran_20210209,HalfGirlfriendChetanBhagat,psychology_of_the_unconscious_2011_librivox,isbn_9780804137386,manic_doujin_00002,wg958,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi,logicalchess_movebymove,san1919kiekbaat,notesfromundergr00dost,bhagavadgitaasitisoriginal1972edition,agatha-christie-the-murder-of-roger-ackroyd,goldengatenovel00seth,darktower00king,ost-english-brave_new_world_aldous_huxley,open-mic-night-part-1,castlenewtransla00kafk,theimogenquydramas,bestrussianshort13437gut,ekaurathazaardeewane,vigyan-bhairav-tantra-hindi_202012,20210206_20210206_2026,meluhakemritunjayimmortalsof,humarimohabbatnazm,TheDiscoveryOfIndia-Eng-JawaharlalNehru,isbn_9781522025665,1989-jungle-emperor-coloring-book-by-showa-japanese,the_fault_in_our_stars,i-have-no-mouth-and-i-must-scream_20220202,ramcharitmanas_202204,harrypotterphilo0000rowl_k0s6,KafkasProcess,oceanof-pdf.com-reverend-insanity-c-1-2063-gu-zhen-ren,metph00cela,creatingwebpages00vand,ABDL-Hypnosis,PersonaNoSekaiPromo2013,hamlet2_1206_librivox,Maximum_Perversum-mag-12,rONv_ande-ke-chhilke-mohan-rakesh,cd_the-legend-mehdi-hassan-ghazals-from-films_mehdi-hassan,CallOfCthulhu,PoemsOfKabir,Murdarakshas,Eom97Porn247-DungForYou,Cats-199810,manga_AkiSora-v05,its-a-sin,TheBestOfClassicalMusicMozartBeethovenBachChopin...ClassicalMusicPianoPlaylistMix,ancient_greek_philosopher_scientists_0809_librivox,1_20210930_20210930_1307,adeline-duet-01-h.-d.-carlton-haunting-adeline-2021-libgen.li,wg1098,prideandprejudice_1005_librivox,HindiBook-shriRamChritManas-1.pdf,0144.4.3,franzkafkasmetam0000unse,sherlockholmeskilokpriyakahaniyanhindi,chomskyonanarchism_202001,AagKaDaryaByQuratUlAinHairder,tempest_1002_librivox,english_literature_1310_librivox,DurjoyDattaDattaDurjoyIfItsNotForeverItsNotLove2013PenguinBooksLtd,lifeofdickens_1712_librivox,dracula_1006_librivox,BlueboySept1984Vol91,crimen_y_castigo_2105_librivox,SwamiVivekanandaSwamiVivekananda1893Speech,01-pratham-khanda-siddhartha-gautam-bodhisatva-buddha-kase-zale-bhag-pahila-janm,tales_chekhov_vol01_0906_librivox,PlatosRepublictrans.BloomText,buttman-volume-1405-original,bade-ghar-ki-beti-comic,houseofthedead_1311_librivox,PRIDEANDPREJUDICECOMICHINDI,PanchtantraKiShresthaKahaniyan,SurajKaSatvanGhoda-Hindi-DharamveerBharti,lp_classical-songs-from-films_various-asha-bhosle-khan-sahib-amir-khan-l,osho-es-dhammo-sanantano-065,theycalledusenem00take,the-power-of-habit-hindi-book-life-feeling,WealthOfNationsAdamSmith,05_20211108_202111,Nuts_2010-02-26,kafkaselectedlet0000fran,lp_mughal-e-azam_naushad-chorus-lata-mangeshkar-mohd-rafi-s,hindi-story-audiobook,manic_doujin_00039,edgequestionseriesjohnbrockmanthisexplainseverythingdeepbeautifulandeleganttheor,ShikwaAndJawab-e-shikwa,savarkar-yancha-athavani_by_renavikar,SahihBukhariHadithInUrduAllVolumes1-8,pir-e-kamil,norse-mythology_202201,the_sweetest_oblivion,1-shatter-me-destroy-me-unravel-me-fracture-me-ignite-me,death-on-the-nile_202203,pdfy-eJsc0BWsJFPlmB7O,poemsofrobertfro029898mbp,tuesdayswithmorr00albo_0,wuthering_heights_rg_librivox,vleu_saphal-manav-jeevan-vaidya-shambhu-nath-kaul,18_Wild_Vol.4_2016,80-20_202307,10-bramhananni-shudranna-adhogatis-kase-nele,AabEHayatByUmeraAhmedCompleteNovelZemtime.com,The_Psychotronic_Video_Guide_1996,amulet-8-supernova,whateverybodyissayingbyjoenavarro,ChhatrapatiShivajiMaharaj,sociedad-de-acomar-08-cuando-me-amara-s_202303,the-great-gatsby,NayafatAhmadFarazUrduShairi.com,chatursenvaishalikinagarvadhuhindi,relativity_librivox,Big_asses_90_Hot_and_sexy_girls,little_women_1101_librivox,TheHobbit_201905,fyodor-dostoevsky-richard-pevear-larissa-volokhonsky-crime-and-punishment,voyageout_1005_librivox,ShriRamcharitManasInHindiMp3ByShriMukeshJi,colorlesstsukuru0000mura_a1d0,RanjishHiSahiMehdiHassan,persuasion_0905_librivox,manga_BarefootGen-v01,WordForWordMeaningOfQuran3VolumeSet,lastnightofearth00buko,RaagDarbari,please-freeze-please,letterstoyoungpo0000unse,EverythingYouEverReallyNeededToKnowAboutPersonalFinanceOnJustOne,autobiographyst00gand,vol.-2_202104,hustler-usa-november-2004,terence-mckenna-complete-audio-archive,grey-fifty-shades-of-grey-as-told-by-christian_20200424,HusnaHiteshSonikFeatPiyushMishraCokeStudioMTVSeason2,AG3JumarKhutbaIslamerDristiteProcholitoVotePoddotiByDrMuhammadAsadullahAlGalibwww.jumarkhutba.com,Manzil-by-Shaykh-al-Hadith-Maulana-Muhammad-Zakariyya-r-a.pdf,bookofsecretssci0000osho,hayvanciftligigeorgeorwellkesmirlisamudra,genealogyofmoral00nietuoft,manga_Virgin_na_Kankei,in.ernet.dli.2015.346226,78_how-to-win-friends-and-influence-people_ruby-newman-and-his-orchestra-ray-norton-ri_gbia0158195a,overtime2_201907,mathematicalphilosophy_1508_librivox,poems_1706_librivox,Khomar-E-Gundom-By-Ibn-e-Insha,20230202_20230202_1325,penthouse-1978-10,lettersofvincent0000gogh,problemsofphilosophy_1706_librivox,cd_marasim_jagjit-singh-gulzar,it00king_1,NhaTaNuongTuKhongThichHopTH,dicrustBBCr4,fartherreacheso000masl,the-indus-valley-adventure,vikramovarshisanskritclassicshindi,goodnight-punpun_202312,hardcorehistory_20240414,podcast_diary-u-boat-commander-by_section-07_316938859,LalKitab1941,dni.ncaa.SAK-394_1-AC,if_kipling_librivox,stories-of-anton-chekov-1,hindswaraj.ambedkar.hindi.1,ammritaimarozaik0000tril,need-ka-nirman-fir-atmacharitra-harvanshrai-bachchan-1,GulliDandaByPremchand,Episode1-NovelChitralekhaByBhagawatiCharanBarma-2016-04-29ChisapaniNepal_201607,sociedad-de-acomar-08-cuando-me-amara-s_20230309,aqtujuhwcqeotfra1pfwrcex3j9s3ftp9h4ww5i8,1_20220306_20220306_1220,trialmetamorphos0000berk,AvadhutaGita-HindiAudiobook,RichDadPoorDadEBook_201803,VairagyaByPremchand,lifefatebbcr4,Hustler_Barely_Legal_March_2016,isbn_9788172341817,franco-rojas-y-su-grupo-sinceridad-prueba-de-amor-1999-314,across-the-spider-verse-the-art-of-the-movie,macbeth_1608_librivox,alcibiades1_1212_librivox,rawyouth00dostuoft,sleepstoriesadult,moby_dick_librivox,sociedad-de-acomar-juguetona,sexuallifeinanci00meye,wodehouse_shorts_1103_librivox,dni.ncaa.SAK-637-AC,best-of-mayfair-issue-17,fiftyshadesofgre0001jame_b2u2,CalculusMadeEasy,First_U_Think-11109276_atomic_habits,Krishna-Comic,trialpenguinmode00fran,howtowinfriendsi00carn_2,FinanceBehindTheVeilOfMoney,batmanyearone0000mill,adultmagazinsundarjivanbengali,MichaelFordLuciferianWitchcraftGrimoireOfTheSerpent,powerless-lauren-roberts-english-2023-z-library,DhanYatra-Hindi-MushtaqAhmedYusufi,manga_BokuraNoHentai-v01,hardrainfalling00carp_1,TheGodConspiracyOsho,the-kite-runner_202311,MarathiGita,podcast_bibliophilia_the-trial-by-franz-kafka_380824444,trial0000fran_y1i8,rbjd7ukszhk9sbtc7oodiddaqfmxbp3cgcfx85gu,bhagvadgeeta,MuhammadAliJinnah,journalsofsylvia00plat,biography-of-bhagat-singh,trial00kafk_2,the-return-of-the-king_soundscape-by-phil-dragash,3_20200517,AagKaDariya-Hindi,verwandlung_mw_0811_librivox,isbn_9780006550686,ShrimadBhagwadGeeta,house-of-leaves-by-mark-z.-danielewski,yogasutras1917edition_2008_librivox,girlwhoknewtoomu0000khan,Amritvani1,in.ernet.dli.2015.446967,agatha-christie_the-mysterious-affair-at-styles,stoner0000will,demon-slayer-kimetsu-no-yaiba_202312,ThreeMenInABoat,ahistorychristi01cheegoog,PCBalak,23_20200406,harrypottersorce0000rowl_h8m5,mrutunjay,lifeandlettersof00sanbrich,jaishankartitlihindi,maila-anchal-kannada-renu,theidiot02638gut,tuesdayswithmorr01997albo,Cheating_Housewives_USA_Vol._99_2016,kiterunnerriverh00khal_0,in.ernet.dli.2015.378435,LolitaAudioBook,18_Wild_Vol.96_2015,6WayPornBrasilAndPornMexico,frauds_forgeries_fake_news_2101_librivox,alice_in_wonderland_librivox,hanuman-chalisa-mahaviri,dni.ncaa.SAK-570_2-AC,JamesBondAudioBooks,the-malgudi-days,hari_om_tat_sat,sense_sensibility_1207_librivox,Sahaba.Kalamullah,The.Ramayana.of.Valmiki.by.Hari.Prasad.Shastri,abroadcranethoma00craniala,isbn_9780143418955,ageofrevolutiona00breu,in.ernet.dli.2015.101166,Das_Schloss_Franz_Kafka_1953,manga_Jungle_Taitei,lp_songs-to-remember-from-hindi-films_various-asha-bhosle-hemant-kumar-lakshmi-s,in.ernet.dli.2015.345847,in.ernet.dli.2015.484153,the-dictionary-of-body-language-a-field-guide-to-human-behavior-1,freedom-summer-hindi-audiobook,PrayaagShuklUsneKahaTha,NickMagPresentsWinter2006,1949SimoneDeBeauvoirTheSecondSex,ParayeGhonsleMein-Hindi-FyodorDostovesky,cd_gulistan-vol.-3_iqbal-bano,Psychotronic_Video_17,ASYOULIKEITHINDI,kripke-1980-naming-and-necessity,nonstop-agrremnt,SangamNusratjavedAkhtar,qhtt5motgvzw18aebyr0rag5pz8c0bpuqokowigc,TheFellowshipOfTherRingAudiobook,OldTimeRadio-1940s,manga_Ookii_Onnanoko_wa_Daisuki_Desu_ka,sisyphe-pdf-fr,colourpurple0000alic,the-adventures-of-captain-underpants,afterdark0000mura,evangelion-re-take-3-pt-br_202104,divanighalib-v9,twisted-hate-3,lessonsfromhistory-121224033058-phpapp01,shoedogmemoirbyc0000knig_m1k3,algebraofinfinit00roya,GirgitKaSapna-Hindi-MohanRakesh,merchantofvenrol00shakuoft,mayfair-lingerie-special-issue-38,young_adults_001_0907_librivox,csr049,manga_BillyBat-v01a,Bhagavad-Gita.with.the.Commentary.of.Sri.Shankaracharya,theremains-of-the-day-by-kazuo-ishiguro,premchandpremashramhindi,uglylove0000hoov,trading-in-the-zone-mark-douglas,11bajotumanto,godsgoddessesfro0000kama,a1544n,OSHO_Ram_Duware_Jo_Mare,heart_of_darkness,arabian_nights_01_0806,cainamystery_1503_librivox,being_earnest_librivox,RigvedInHindi,APJAbdulKalamIgnitedMindsPenguin,LeoTolstoyBBCDramaCollection,B-001-001-263,finally-legal-2009-01,artofwar3_pc_librivox,the-world-of-ice-fire,Barely_Legal_2008_08,warispeace00arun,shining-pdf,isbn_9780765377067,thought_vibration_ap_librivox,sal-mayweather-anti-politik,HindiPravachanMp3-shrimadBhagwatgeetaByPt.somnathSharma,rag-darbari-odia,20240429_20240429_1456,barely-legal-november-2022,GeetaiMarathiAudiobookHighQuality-Stereo,young-hustler-nl-42,wizardofoz_1001_librivox,eatthatfrog21gre00trac,cd_the-rough-guide-to-the-music-of-pakistan_various-artists-abida-parveen-adnan-sami-f,20201021_20201021_1105,demons00dost,ABRIEFHISTORYOFMODERNINDIASPECTRUM,FameistheSpurBBCr4,InterracialAdultPhotoIssue22017,MahabharataEp12,Swaraj-Gandhi-1947-12-20,think-and-grow-rich,nagraj-comics-collection,carnalcomicsjasminstclairecomixeroticsexhistoryofporn_201908,fightclub0000pala,adkar_up_by_ayoub-islam,a_good_girls_guide_to_murder_-_holly_jackson,studyinscarlet_0811_librivox,2-oedipus-at-colonus,ObeahSocietyOfBlackMastersMistressesD.D.TeoliJr.A.C.1,mythofsisyphusot0000albe,philosophybook0000unse,gabrielgarcamrqu0000unse_2002,AlfaazByMohsinAftabKelapuri,derfallalbertcamus1957_201907,LuckyLukeCollectionPDF,powerofyoursubc000jose,Cheri-2015,dni.ncaa.ICCR-1615-AC,SabhTonKhatarnaakPaashPunjabiLibrary,art-of-seduction-seema-anand,ps2_Avatar-_The_Last_Airbender_USA,dli.ernet.240835,TeluguMahatmaGandhiAudioFiles,midnightschi00rush,know-the-only-truth,40-rules-of-love,stories-of-vikram-betal,demon-slayer-chap-187,TheMonkWhoSoldHisFerrariRobinS.Sharma,jap-how-to-draw-girls-body-draw-a-sexy-girl-by-grasping-character-bone-and-flesh-sensation,in.ernet.dli.2015.308719,dni.ncaa.SAK-394_8-AC,ikigai-full-audiobook-hindi-ikigai-summary-in-hindi-128k,surrounded-by-idiots,historyofcynicis032872mbp,Psychotronic_Video_05,ghasiramkotwalh,the-53-best-vintage-porn-movies,friendslovers00robe,siddhartha_1912_librivox,manssearchformea00fran_0,tobateksinghetc,Psychotronic_Video_35,NUTS_Magazine_7_June_2013,in.ernet.dli.2015.473553,crescent_moon_1608_librivox,JisKeHamMamaHain-Hindi-SharadJoshi,religionofmanbei027987mbp,san2020-142,hindi-book-hindutva-vinayak-damodar-savarkar.,insheepsclothing0000simo,hobbitortherebac0000tolk_a2n1,handbookofplantf00hatt,pdfcoffee.com_before-the-coffee-gets-cold-toshikazu-kawaguchi-pdf-free,zerotoonenoteson0000thie,hind_swarajya_mk_gandhi_2010,nationalism00tagorich,ComManifesto,batman-animated-1998-scan-stacalkas,dli.sangeet.thumri.4,20240325_20240325_0618,22immutablelawso00alri,amulet_202301,cu31924070625854,in.ernet.dli.2015.444123,in.ernet.dli.2015.282497,tom_sawyer_librivox,auaben0050,Batman50100,critique_pure_reason_0709_librivox,1_20191115_20191115,communist_manifesto_mfs_librivox,warriors-manga-graphic-novels,Erotica_Universalis,NancyFridayMySecretGardenWomensSexualFantasies,trattato-di-anatomia-umana-anastasi-vol.-1-versione-blu,delhikaekyaadgarmushaira,kafkathetrial00fran,jawahar-bhai-mahadevi-H,ADSu_ret-samadhi-geetanjali-shri,practical_guide_to_self-hypnosis_af_librivox,ricadaidapuarada0000kiyo,AgathaChristie12RadioMysteries,in.ernet.dli.2015.412039,thinkgrowrichb00kimb,dvoJ_sankshipt-shiv-puran-with-illustration-gita-press,PlatosSymposium,Namal,The_Art_of_Perspective_Phil_Metzger_Digital,logic_of_hegel_1610_librivox,wars_of_the_jews_0908_librivox,Amateur_MILF_Photo_Magazine_Issue_29_2019,SlaveGirlManualV1.4,limitless-upgrade-your-brain-jim-kwik,NutukMustafaKemalATATRKSesliKitap,Bar_Sex,Karmayoga11022017,TAOTECHINGEnglistHindiTranslation,osho-rajneesh-main-mrityu-sikhata-hun,sombra-digital-footprint,renderingsfromghalib,in.ernet.dli.2015.445873,the-handmaids-tale_pdf,happinessadvanta00acho,HarlandBBCr4,UNFAKCC,OTRR_Maintained_Magic_Island,NorteYSurParte1,sexy-housewife-gair-mard,App-Say-Kaya-Parda-By-Ibn-e-Insha,lp_safar_kalyanji-anandji-kalyanji-anandji-kishore,settingsun0000daza,zindaginaqaabchehre,war_of_the_worlds_librivox,Ahankar-Hindi,Anal_sex-mag-12,04-the-tallyman,book_irish_poetry_1911_librivox,MyBrother_201809,fireandblood,ShayariOnly,salammbo_1309_librivox,genghiskhan_1710_librivox,63_20211019_20211019_1744,journeytothewestwuchengen1592,ebookcomicenglisheroticcarnalcomicsadultfilmstarschessiemoore_201908,UsneKahaTha-Hindi-GrouchoMarx,spcl-0346-h-ec-katpit-ki-lakdi,sampuran-kav-sangreh,heal_20220819,lettersofemilydi00dick,3_20200517_20200517,pg000026,the-48-laws-of-power-by-robert-greene_202201,in.ernet.dli.2015.176580,Works_of_Sankaracharya_with_Hindi_Translation,dni.ncaa.SAK-303-AC,Aab-e-hayatByMohammedHussainAzad,unfortunatelyitw0000darw,20240122_20240122_1249,20240325_20240325_0619,in.ernet.dli.2015.20640,twelveangrypigs_bradford,studiesinamosque00laneuoft,oedipus_rex_1008_librivox,this_side_paradise_librivox,v-for-vendetta-by-alan-moore-david-lloyd,04.BHARTIYADARSHANCharvakDarshan,in.ernet.dli.2015.403425,economics_1408_librivox,the-complete-works-of-khalil-gibran,lesbrownmindset,AtmaSangeet,in.ernet.dli.2015.409708,sachnoi.vnHarryPotter1-HonDaPhuThuy,happydeath00camu,BriefLivesBBCr4,zero-to-one-peter-thiel-and-blake-masters,unset0000unse_e9a3,TheJoyOfSex,hum-hai-tohar-babita-bhabhi_201805,juggs-no.-01-1978-c,audio_poetry_149_2006,IISHRigVeda,odyssey00gare,memory_rm_librivox,poesia-completa-sylvia-plath-z-lib.org,00493HikayatERumi,in.ernet.dli.2015.430918,Acc.No.6472AdvaitaVedanta1976,never-split-the-difference-negotiating-as-if-your-life-depended-on-it_202101,frank-herberts-dune-saga-collection-books-1-6-by-frank-herbert-z-lib.org_202204,DaleCarnegieHOWTODEVELOPSELFCONFIDENCEANDINFLUENCEPEOPLE,audio_poetry_99_2006,Dragnet_OTR,DasteSabaFaizAhmadFaizUrdu,princessbride0000will,invincible-v-24-the-end-of-all-things-part-01-2017-digital-zone-empire,DiwanGalib,ashoka-h,pacifica_radio_archives-BC0515A,TwentyLovePoemsAndASongOfDespair-PabloNeruda,discworld_202007,37_american_poems_0908_librivox,kiterunnergraphi0000hoss_y8n1,namaz-kai-silsile-main-yousuf-ludhiyaanwi-sahab-kai-chand-aitrazaat-or-unke-jawabaat,104-106-a-thousand-splendid-suns,the-5-am-club,girp_friedrich-nietzsche-the-birth-of-tragedy-translated-by-shaun-whiteside-penguin-books,InkarParveenShakirPdfbooksfree.pk,one-piece-volume-1_202308,touhou-illustration-techniques-by-copic-painters-from-coloring-to-illustration-making,OsamuDazaiCollection,in.ernet.dli.2015.155854,yazeedazmanto,barely-legal-2022,TAOUPANISHADHINDIPDFOSHOBHAAG1_201802,Book2EnergyEnhancementRemovalOfEnergyBlockagesManagingEnergyConnectionsAndMasteryOfRelationships,the-rational-male,kidf6ithkfbpfhnribg00qol6kmy7unecedqrpkg,TFR76-PussyParty-GoregrindPornAssault,ArminianismVsCalvinism,KavitaChalnaHamaraKamHaiShivmangalSinghSuman,YaadonKaIdiotBoxWithNeeleshMisraSeason1_201710,AkabirKaRamzanByShaykh-ul-HadithMuhammadZakariyyaKandhelvir.a,ifwewerevillains0000riom,Psychotronic_Video_03,AlanMooreCollectionIVAmericasBestComics,dune_20230417,TanhaTanhaByAhmadFarazWww.urdunoveldownload.blogspot.com,ghalibkechandpehlu,bobbyfischerteacheschess,PIYUSHMISHRABySunil,riddlesinhinduismambedkarb.r._912_s,NotesOnAnarchism,Anandmath,NikolaTeslaKaJeevan-Hindi,Youth.Kalamullah_201405,LabyrinthLibrary182OneHundredYearsOfSolitude,macbethgraphicno0000mcdo,JMWH_shaha-aur-mat-by-rajendra-yadav-bharatiya-gnanapith-kashi,powerofyoursubco0000murp_q2m9,spcl-0374-h-ec-dracula-ka-hamla,in.ernet.dli.2015.539222,1q840000mura_l6c0,kamasutraeroticf00marc,DushyantKumar,franzkafkathemetamorphosisen,lolita-1v-2-verzauberte-jager,ghazaliyatifarsi,william-shakespeare-merchant-of-venice-in-hindi,HUST0318ALLReduced,oPYj_apane-apane-ajanabi-by-agyeya-bharatiya-gyanpith-publication,kamasutrailustradoanonimo,wet-dreams-2018z,compoundeffectmu00hard,y-2mate.com-mohamed-tarek-mohamed-youssef-ft-zia-mohyeddin-burdah-sarsabz-dua,the-cruel-prince-holly-black-z-library,chorichupe,3TheHandmaidsTaleByMargaretAtwood,untitled-document-2_202310,sevenhplovecraftstories_pc_librivox,in.ernet.dli.2015.347883,tsunades-sexual-therapy-tsunade-no-inchiryou-2007,five_sci-fi_piper_librivox,completeillustra0000vats,Mix.Kalamullah,ariel00plat,100yearsofsolitu00senn,travis-scott-utopia-2023,awaramasihahindi,shekharau_gmail_201509,in.ernet.dli.2015.400605,history-of-ancient-and-early-medieval-india,proposal_0901_librivox,ThinkAndGrowRichHINDIAUDIOBOOKChunk2,RigvedaSamhithaAudioAndTextBhashyam_KannadaLanguafe,HindiBookManusmriti,rawyouth_1808_librivox,audio_poetry_2_2005,how-to-win-friends-and-influence-people-audiobook-in-hindi,ghaliboudihindi,eroticliterature0000mulc,Anal_sex-mag-47,thegambler02197gut,prophet1_1901_librivox,fanny_hill_librivox,overtime_201705,genealogy_of_morals_1507_librivox,short_scifi_038_1007_librivox,leave-it-to-psmith-1981,in.ernet.dli.2015.446914,MatsyaPurana,AsantoshKeDin-Hindi,pratibharaikonarkhindiedition,wishes-h,themetamorphoses26073gut,arthurthekingbbcr4,CollectionOfHindiPoems,in.ernet.dli.2015.451816,best-of-mayfair-issue-58,sociedad-se-fue-de-mi,WhoWasDr.VictorFrankl-Hindi-Dr.HenriAbramson,dli.ministry.14636,tohfa-shaadi-ma-illaj-o-amraaz,beowulf,scanned-document-3_20200910,selectionsfromdi0000ghal,MiyamotoMusashi-BookOfFiveRingsgoRinNoSho,1-2_20230202_20230202,kathopanishad-01,TheWayoftheSuperiorMan,hmrio,IndrajaalVidya,the-illustrated-book-of-signs-and-symbols-1000s-of-signs-and-symbols-from-around-the-world,1606010047-the-bell-jar,savarkarsmrutibydamle,the-fourty-rules-of-love-rumi,OSHO_Kahe_Hot_Adheer,time-warp_202011,rogersheringhamBBCr4,ac-dc-live-at-caste-donington-england-august-17-1991-full-concert-hd-50fps,jekyll_and_hyde_klh_0904_librivox,lihaafthequilteng,play-best-blondes-2015,EbookVersionOfToKillAMockingbird,MuftiKaramatula20181,conflux-the-lost-girls-jordan-wakefield,ulyssesshakes1925dec_2,XscD_20th-century-english-marathi-dictionary-vol.-2-jangamwadi-math-collection,originofspecies00darwuoft,thuviamaidofmars_1308_librivox,mamu-ki-gand-chud-gai,best-of-mayfair-issue-32,1984-george-orwell_20220511,in.ernet.dli.2015.380325,in.ernet.dli.2015.514894,20201009_20201009_1927,SherlockHolmes01,30_20190930_20190930,GrossmanStalingradBBCr4,shaklexicon01schmuoft,RangilaGandhi_72,famous_men_greece_0805_librivox,thedivinecomedyb08789gut,dongritodubaisix0000zaid,TheKamaSutraOfVatsyayana,naughty-school-girls-spring-2020,king_in_yellow_librivox,thebet_1708_librivox,travis-scott-utopia-flac-24-bits-88200khz,sociedad-de-acomar-08-cuando-me-amara-s_20230309_0347,peerekamilnovelbyumeraahmed,ACMJ_H15,AwaaraGardKiDiary,hindu_book_of_astrology_jp_librivox,ZeroToOnePeterThielUnabridged,Van.gogh.paintings,the-fourth-wing-pdf,cercle-vicieux,isbn_9781091477155,Cats-199802,TheConspiracyAgainstTheHumanRace,QadirNamaGalibMushaihdRazvi,euthyphro_librivox,world-history-from-the-ancient-world-to-the-digital-age,ThreeQuestions_LevTolstoy,poemsbyemilydick030021mbp,tamas-by-sahni-bhisham,HaightAshburyFreePressVol.1No.61968D.D.TeoliJr.A.C.1,wg280,HaiKahaKaIradaTumharaSanamMp3NusratFatehAliKhan,TheWinnerStandsAlone,purely-18-2013-08,gilpinsspace0000bret,sigmund-freud-the-future-of-an-illusion,yesno056TheFrankenstoneaKidsRefugeFromTheAdult,AshtavakraGita-MarathiAudiobook,BasKiYatraHarishankarParsai,lolita00nabo_2,KhutbaBanglaNoboborshoUdzaponByProf.Dr.M.AsadullahAlGhalib07.04.2017,DrGideonFellBBCRadio,whitenightsandot36034gut,ImcOnairPresents...RagasGhazalsAndGoethe2009Part13,sylvia-plath,shaitan-ka-interview-hindi,TrappedBBCr4Series,unclesdream_1412_librivox,the-hobbit_202304,bookoffiverings0000miya_g5e4,personal_anthology_shakespeare_librivox,JoeJackson-1979LAFMWhiskyAGoGo,Real_World_Digital_Photography,in-my-pocket-hindi-audiobook,harrypotterchamb0002rowl,poorfolkgambler00dost,Puruskar-Hindi,serkishobbit,hustler-usa-september-2018,goddelusion00dawk,DeathComesDancingCelebratingLifeWitSatyaBhartiMa,hustler-09-2015,philosophyofimmanuelkant_2102_librivox,los-ronisch-de-cbba-vol-01-1989_202212,stuartlifebackwa00mast,shortstories40745gut,Dr.BabasahebAmbedkarWritingsAndSpeechespdfsAllVolumes,paldea-mom-edmun-pokemon-rule-34,Nude_Photography_The_Art_And_the_Craft,Namal01to10,MaarifulQuranEnglsih8Volumes,conversationswit0000roon_t0o7,soundcloud-porn-wjbbgg,babylonblue00davi,Poemsofemilydick00dick_201303,BankaZamindar,childhood_english_librivox,OneHundredYearsOfSolitude,TheCloaktheOvercoatAndOtherStories,326329839-hindi-book-santon-ki-bani-maharaj-charan-singh_202101,Tensai_Bakabon_1988_J,2012-05-09AllamaIqbalMedicalCollege,richestbbcr4,gandhiforgivenessh,18eighteen-2024,thingshiddensinc0000gira,psychologyofstoc00seldrich,the-chakra-book-osho,Pleasure-mag-085,howtotalktoanyonepdfdrive.com,fightclubnovel0000pala,playboy-02-2020-edition-allemande-special-digital-edition,in.ernet.dli.2015.275553,To_His_Coy_Mistress,A1_Angels_Sexy_Girls_Adult_Photo_Magazine_Issue_01_2017,the-judge-will-never-die,lapvona-a-novel-ottessa-moshfegh-z-library,the-kite-runner_202101,iwillteachyoutob0000seth,aye-mere-watan-ke-08.41mts-lata,Mount_Athos__Selection_Of_Orthodox_Chants_,howtocookeveryth0000bitt_u8w4,osho-english-discources-a-e,vinland-saga-v-01-13-2013-2022-omnibus-edition-digital-danke-empire,lalkitabist75_gmail,HarivanshraiBachchanKiKavitayen-Hindi-HarivanshraiBachchan,avatar-the-last-airbender-the-art-of-the-animated-series,the-secret-of-the-nagas-hindi-audio-book,conan-the-barbarian-1-24,love-sex-fear-death-the-inside-story-of-the-process-church-of-the-final-judgment,metamorphosis0000kafk_c1d6,slutsoundsepisode17,holyquran_wordbyword_urdutranslation_pdf,HISTORYOFWESTERNPHILOSOPHYBYBERTRANDRUSSELL1945,Serial-Killer-Zodiac,one-h,atomic-habits-book-pdf-in-hindi-1,AlpanaVermaHindiPoems,PurusharthParamDev,1984ByGeorgeOrwell_167,MortalKombatComicBookCollection,in.ernet.dli.2015.450381,17-do-bhai-premchand,andrew-loomis-creative-illustration,in.ernet.dli.2015.474575,AClashOfKingsAStormOfSwordsAGameOfThrones,smartgirlsguidet00blue,bwb_KR-492-829,john-steinbeck-of-mice-and-men,RiwayatEFalsafaStoryOfPhilosophy_201612,in.ernet.dli.2015.415872,MurderOnTheOrientExpress_201803,men-only-volume-86-number-3-february-2022,raccolta-su..-comic-art-selezione-di-liberi-e-copertine-b-n-e-tuttocolore-comic-,love-time-mag-porn,rs-catalog,majorworksofalbe0000unse,productionbookfo00bake,18-eighteen-magazine-2012-04-original,in.ernet.dli.2015.458873,city_worlds_end_1203_librivox,TheGreatBookOfBestQuotesOfAllTime,ultimate-marvel-earth-1610,i-too-had-a-love-story,Dean_Yeagle_Adult_Cartoon_Anthology,thebrontesisters_202301,ella-fitzgerald-75-original-recordings,avatarlastairben0000yang_t0n6,wg848,cd_lolita_bob-harris-hal-hopper-james-mason-nelson-r,OshoMusicFromTheWorldOfOshoCD005Song005RhythmOfLife,bim_eighteenth-century_a-letter-of-advice-to-a-_e-f_1721,Debonair_v05n30_1968-11,AutobiographyOfASpirituallyOsho,walkingdeadcompe0000robe,themuslimahsexmanualahalalguidetomindblowingsex,4.01.-appendix-a_202402,ShriShivaGitaAudioBookenglish,Amazing_Fantasy_vol1_15_201607,nby_82803,worldoficefireun0000mart,Erotica_07,bestlesbianeroti00clei,Psychotronic_Video_39,premchandkankaalhindi,Cats-199703,agni-ki-udaan,venchikparasayee0000shri,jaishankarprasadkishresthakahaniyaanhindi,u9d5pjjnp0wgaige4xmsb8fcqj2ulcqr5dz5vmm8,kILz_schoolom-ko-patra-part-2-by-j-krishnamurthy-2001-india-krishnamurthy-foundation-trust,from-cyrus-to-alexander-a-history-of-the-persian-empire,movementinstones0000unse,manic_doujin_00007,astavakr-mahageeta-5,animal-farm-by-george-orwell-book-summary-in-hindi-audiobooks-in-hindi,MysticalPoemsOfRumiArberry,GhulamAliGhazals25,UndercoverBBCr4,EkGadheKiVapasi2,bone-jeff-smith,pados-ki-didi-ke-devar-se-chut-chudai,02MythOfSisyphus,a-game-of-thrones-illustrated-edition-george-r.-r.-martin,kamasutraofvatsy00vatsuoft,Extreme_Special_15_Teeny_Exzesse,whyyoushouldread0000hawe,OTRR_Broadway_Is_My_Beat_Singles,hardrainfalling0000carp,OTRR_Secrets_Of_Scotland_Yard_Singles,masterybyrobertgreenesection1_201911,esave-dark-psychology,KarmbhumiPremchand,runaways_202303,03-06_202104,memoirs_sherlock_holmes_1007_librivox,VivekachudamaniHindiAudiobook,KuchhToDuniyaKiAbhishekTiwari,TheHouseBBCr4,mantothandaghoshtauranyakahaniyaanhindiedition,dictionaryofengl01johnuoft,2401862-takahashi-takuhai-saki-de......-anoko-wa-ijimerarete-boku-ni-haji-o-sara,manga_Henshin_Kafka,besturdubooks9,bIbf_usne-kaha-tha-aur-anya-kahaniyan-kailash-prakash,in.ernet.dli.2015.445586,TheFranklinCover-upByFormerGreenBeretJohnDecamp,Anal_sex-mag-08,puran_bhagwat,AksEKhusbooByParveenShakir,ultadarkhtkrishanchander,fire_and_ice_librivox,rigveda-hindi-dr-ganga-sahay-sharma,Underworld_Beaucoup_Fish_1998,redneck-land-comic,the-courage-to-be-disliked-how-to-change-your-life-and-achieve-real-happiness_202402,TOBATEKSINGHHINDI,Mature_Ladies_Adult_Photo_Magazine_November_2017,MadhurikeNaach,metamorphosisoth0000kafk,tragedyofromeoan00shakuoft,the-book-of-secrets-by-osho_202203,fyodor-dostoevsky-the-idiot-in-hindi_20240507,sayings_of_confucius_librivox,Speed_Gibson_Of_The_International_Secret_Police,cd_supreme-collection-greatest-ghazals_mehdi-hassan,ecsd-2981-2-yjw-776,how-to-draw-underwear,KhutbaOfProf.Dr.Ghalib-2,solo-leveling-complete,milkhoney0000kaur,marvel-comics-1939-1949_202204,TheBrothersKaramazovRoyMarsden,mostbeautifulwom0000buko,romeojuliet_v4_1502_librivox,HeresySeries10,IntroductionToCriminalPsychology,eroticapoems00kennuoft,Nazm-FaizAhmadfaiz,return_of_tarzan_rs_librivox,USPlayboy196803,Incest_01,in.ernet.dli.2015.378862,theantichrist19322gut,beyond-order-12-more-rules-for-life-by-jordan-b.-peterson,raseediticket,avatarlastairben0000koni,thecallofcthulhu_2206_librivox,billofrights_madison_0801_librivox,higher-engineering-mathematics,VA-DJ_Lavish_Lee_-_Sex_Playlist_2-2017,manga_To_Love-Ru_Darkness_Digital_Colored_Comics,AsrarEKhudiByAllamaMuhammadIqbalUrduTranslationUrduinpage.com,devkurnidraupadikimahabharat,HindiBookMan.Ki.Shaktiyan.Tatha.JivanagathanKi.Sadhana.by.Swami.VivekanandJi,secretofnagas0000amis,NekiByPremchand,sata-jones-why-we-fall-in-love-xxx-imageset,ColorClimax2,BBC_Radio_4_Extra_20190909_090000,TowardsUnderstanding1,AFREEKIKAHANIHINDI,harrypottergoble0000rowl_o3u1,jekyll_and_hyde_librivox,psychocybernetic0000malt_i3v2,Vijnana-Bhairava-Tantra,FREE_background_music_dhalius,GeorgeCragge,howtowinfriendin0000dale,isbn_9781906787370,WinkMagazineDecember1947D.D.TeoliJr.A.C.1,knightofsevenkin0000mart_o8q3,poorscholarcomed00nevi,famous_men_middle_ages_0802_librivox1,doglapan-by-ashneer-grover-the-hard-truth-about-life-and-start-ups-full,TheOldManAndTheSea-Eng-Ernest,gaban-premchand,ThreeGhostStories_201702,pubmed-PMC3847687,IhyaUlumAlDinVol1,TrollopeBBCr4,cheri-volume-288-march-2020,redneck-land,photo-album-sex-positions-techniques-64s,crimepunishmentb0000unse,a-pocket-full-of-rye_202201,OTRR_Richard_Diamond_Private_Detective_Singles,96p-franz-kafka-the-metamorphosis-archive.org,PKetkarGC,phantom_opera_1304_librivox,cd_propaganda-and-control-of-the-public-mind_noam-chomsky,moonwalkingwitheinsteinfoerjoshua_201910,ehlY_my-experiment-with-truth-by-m.-k.-gandhi-trans.-by-m.-p.-poddar-2011-daimond-books,Group_Sex,Letters,2041920aatmarpan1,DirkGentlyBBCr4,secret-history-of-the-thulegesellschaft,adult-film-music,ragdarbari0000jaym,zarathustra-48_202309,negar,arniedarlingstar00corb,JagjitSinghHindYugm,gandhisautobiogr01gand,raghuvanshsanskritclassicshindi,PeshawarExprss-Hindi-KrishnaChander,premchand-soze-vatan,in.ernet.dli.2015.348763,BishopFanniHall1977D.D.TeoliJr.A.C.1,tafsir-ibn-kathir-hindi,SilentHillComicBookCollection,AlienTheIllustratedStory,anna_karenina_deutsch_1610_librivox,www.VintageSense.com-Vintage-Indian-Music-38n,BestUrduBooks15,shakespeareshaml01shak,wings-of-fire-all-books,Chapter05DiagonAlley,solo_pride_librivox,fortyrulesoflove0000shaf,Maah-O-Saal-E-Aashnayi-Memoir-By-Faiz-Ahmed-Faiz,VEDAVEDAMVEDICYAJURVEDAKRISHNAYAJURVEDACOMPLETEAUDIOSAMHITAARANYAKABRAHMANAMSriK,injuryandinsult00dostgoog,CharlesDuhigg.ThePowerOfHabit_201808,the-nude-beach-field-trip,understandingmed00mclu,21-arcadia,audio_poetry_126_2006,sexincomics0000horn,ElonMuskTeslaSpaceX,KuliatEIqbal,Alan_Watts_67_Lectures,in.ernet.dli.2015.539108,aliceinwonderland_1102_librivox,blacklacequickie00vari,BuriAatma,sleazoid_202201,AudioBooksGeorgeOrwell19843Of14_201811,sex-education.480p,god_of_war_-_Rina_Kent_OceanofPDF.com,genesisbigbangdi00schr,AnimalFarm-English-GeorgeOrwell,TheHobbitAnUnexpectedJourney,master-your-emotions-a-practical-guide-to-overcome-negativity-and-better-manage-_202403,sex_20190913,amateurs-series-softcore-monica-rise-xxx-imageset,revolution-2020-hindi-by-chetan-bhagat,prideprejudice00austuoft,in.ernet.dli.2015.483139,hypnotism_alpheus_0906_librivox,Bill-Nighy-as-Charles-Paris-by-book-order,Anandmath-Hindi,permanent_husband_ls_1709_librivox,pus-k-i-rat-premchand-hindi-audiobook,MansarovarPart3-Hindi-MunshiPremchand,wauem_1986007,VijayByPremchand,Batman250-300,UrduBooks_201302,cognitiveneurosc02edgazz,devils_202111,premchand-gaban,dailystoic366med0000holi,notesfromundergr00dost_3,bwb_T3-AGI-129,deadpoetssociety00klei,howtowinfriendsi0000carn_k4n5,bookofsecrets1120000osho,HindiBookValmikiRamayanPartIByGitaPress,Dhumil,audio_poetry_210_2007,in.ernet.dli.2015.341905,IndianBackgroundFluteMusicInstrumentalMeditationMusicYogaMusicSpaMusicForRelaxation,MinhajEInqalabNabwiSALLAHOAliheWasSallam,briefhistoryofev00wilb,annefrank00fran_0,Hindu.Dharma.by.Swami.Vivekananda,20230717_20230717_1512,thusspokezarathu00nietuoft,communistmani00marx,chanakya-niti,Vincent_van_Gogh,in.ernet.dli.2015.464252,100ClassicalMusicMasterpieces,Psychotronic_Video_26,J.C.CatfordALinguisticTheoryOfTranslationOxfordUniv.Press1965,MansarovarPart8-Hindi-MunshiPremchand,bushido_0912_librivox,ThePowerOfNowEckhartTolle_201806,in.ernet.dli.2015.483556,JudgeDredd2000AD,ChetanBhagatOneIndianGirl2016,chankyanitiaudiobook,1_20200503_20200503_1440,Young_Lesbian,TalkhiyanUrduSahirLudhiyanwi,hardcore-history,the-48-laws-of-power_202405,love_letters_ehl,nha-gia-kim.sna,videooze-8-spring-1996-gorbag,jhootan1_201909,HindiBookTaantrikKiDiaryPdf,abrahamlincoln_1306_librivox,newmarketwizards0000schw,OldHindiFilmSongs-HappyMood,shabkhoon-v1,age_of_innocence_librivox,Psychotronic_Video_02,Frankenstein1818Edition,hitler-speeches,MansarovarPart6-Hindi-MunshiPremchand,dharmayoddha-kalki-avatar-of-vishnu-by-kevin-missal-book-drive.com,think-like-a-monk-979,think-and-grow-rich-hindi-pdf-book,laozi_tao-te-ching,tomb-of-sand-by-geetanjali-shree,introduction_to_metaphysics_0909_librivox,the_four_agreements,viktor-emil-frankl-mans-search-for-meaning,HalaahalHarivanshRaiBacchan1946,WTRU_srimad-valmiki-ramayana-of-maharshi-valmiki-with-hindi-trans.-part-2-sundara-khn,the-success-sutra,GulzarKiTriveniyan,antichrist02niet,bolt-action-second-edition-rulebook,gonefishinBBCr4,ShatruAgyeya,cosmos_201910,02MadSciBespoke,AllTheBrightPlaces_201805,AmrataPreetamAleHasan1972,in.ernet.dli.2015.489471,PedagogyOfTheOppressed-English-PauloFriere,san2020-263,03.-no-me-agas-llorar,GHALIBHINDI,DonHaworthBBCr4,sociedad-se-fue-de-mi_20230724,midnightschildre00rush,in.ernet.dli.2015.296518,the-god-delusion-audiobook,premvani,factotum00buko_1,cd_welcome-to-the-world-of-the-classics_various-artists-anton-lesser-benedict-flyn,it-starts-with-us-life-feeling_202307,h8gwptovqvoj6g9onhjqyil1fdzoleay6kfd0svv,greatgatsby0000unse_c4w8,ministryofutmost0000roya_p7b0,OgZO_hindi-gadya-ka-vikas-by-gyanendra-kumar-uday-shankar-bhatt-gulab-rai-dr.-satya-p,deep_in_the_quiet_wood_1504.poem_librivox,ekladkiekjaamamritapritam,what_men_live_by_librivox,zarathustra-48,Psychotronic_Video_11,hindu_yogi_science_breath_mj_1509_librivox,ruqone-and-tha-god-fahim-and-mach-hommy,in.ernet.dli.2015.415434,Batman150-200,deartheoautobiog00gogh,percy-jackson-the-complete-series,meditation-GeorgeHays,BBCMarlowe,kamasutra_202005,dli.sangeet.thumri.8,le-ke-aya-hoon-mein-kuch-mohabbat-ke-phool-nusrat-fateh-ali-khan,in.ernet.dli.2015.484154,kanch-ke-tukde-urdu-krishan-chandar_202101,mindsetnewpsycho0000dwec_g9z4,dr.strangeanddr.doomtriumphandtorment1989,TheSealedNectar-Alhamdulillah-library.blogspot.in.pdf,franzkafkaparabl00poli,PsychopathologyOfEverydayLife,scion-of-ikshvaku-ram-chandra-amish-tripathi,how-to-day-trade-for-a-living-andrew-aziz-wealthgif-1,KaisaBachcha-Hindi,theconsolationof00boetuoft,Arsch_und_Fotze_01,20200930_20200930_0317,isbn_9780692627044,mullanaseeruddinkianokhiduniya,crimepunishmentf0000unse,colleen-hoover-it-ends-with-us-2020-simon-schuster,pakistanthepartitionofindiabrambedkar1945_137_K,12th-fail-novel-pdf-in-hindi-download,booksihaveloved0000bhag,ramayanam-audio,clubi-2302,jillkellycarnalcomics,howtobakeeveryth0000bitt,AkeliSiByMannuBhandari,courage00osho,collectednovelso0000fran,WhatIsSufism-martinLings,OceanofPDF.comAnnihilation,kiterunnerportra0000beni,TheSpiderV26N03194204,strangecaseofdr00stevuoft,in.ernet.dli.2015.279506,newtonspmathema00newtrich,BBC_Radio_2_20160928_053000_The_Chris_Evans_Breakfast_Show,the_twilight_of_the_idols_librivox,Gheesa,ramdhari-rashmi,in.ernet.dli.2015.300710,Batman100-150,TumhariBaatByMohsinAftabKelapuri,BuddhaAndHisDhamma,hot-girls-40,KalaamEMirMirTaqiMir_201410,AmishTripathiShiva03TheOathOfTheVayuputrasepub,twopoetales_ce_librivox,BBCIAIR,JosephMurphyThePowerOfYourSubconciousMind1988,VeerSavarkarSpeech,08-pista-08,RudraPanchakamKeshavBhattJyotishi_201904,MaulanaJalauddinRumi,jaishankar-prasad-titli,Gulamgiri-Hindi-JyotibaPhule,franzkafkashorts0000pasl,pigthatwantstobe0000bagg_x9i1,juliuscaesar1908shak,romancing-with-revolution-life-works-of-faiz-ahmad-faiz,NuskhaHayeWafaByFaizAhmedFaizUrduinpage.com,shikariauratein,critique-of-pure-reason,shakespearehamlethindi,naughty-neighbors-vol.-28-no.-5-2023,1q840000mura_v3d3,ThirdLetterToUncleSam-SaadatHasanManto,01TintinInTheLandOfTheSoviets,RTFM-Harp-940524,pathological_lying_accusation_swindling_1010_librivox,Psychotronic_Video_19,AmarBailByUmeraAhmadUrduinpage.com,VishwaParichay-Hindi,hindishabdsagarp005058mbp,the-shadow-lines,elon-musk-walter-isaacson,in.ernet.dli.2015.444380,priyanshi-jain_20230926_1537,time_machine_0805_librivox,chandoba-marathi-all,MohanRakeshKiDiary,brotherlawrencep00lawr,warrenbuffetts3f0000pysh,001santo33a,MahadeviVermaKahaniGillu,my-seditious-heart,ShockCinema81996,notesfromunderg00dost,casey-kasems-american-top-40-the-70s_202205,MIT9.00F04,agad12,clashofkingsbook00mart_0,p04ylyyj,shayari_201705,h9wdqkfusglai3skmzilthrg2wtdrkrjciovygr2,disney-adventures-v13i4,andrew.chumbleyazoetia,KavitaSachinTumneKarDiyaKamaal,buttman-volume-09-02-original,revistasexybrasilfebrero2017,KabirDohe-Hindi-SantKabir,mwlxcdp8qywhafdbghc8my96tfq53uyldeduh6ws,ramkumarjourneyw0000sham,sexwithstrangers0000unse,SadUrduPoetry,neversplitdiffer0000voss,manga_Berserk-v13,vigyan-bhairav-tantra-hindi-book-osho,bagh-o-bahar,a_20210615_202106,SUT760_Tantra_01_Buddhism_Kirti_Tsenshab_Grounds,NUTS_Magazine_May_17-23_2013,YukioMishimaCollection,lolita-by-nobokov,the-ethics-of-liberty-20191108,prideandprejudi02austgoog,ideas-drawing-techniques-to-create-attractive-fantasy-characters,notesfromundergr0000dost_e5y3,dont-believe-everything-you-think-by-joseph-nguyen,ito-junji-stuff-3,tofu_photos_redd,windupbirdchroni0000mura,sansar-ke-mahan-upanyas-rangey-raghav-1,3HOURSRomanticRelaxingSaxophoneMusic.HealingBackgroundForStressReliefStudyLoveCafe_201705,128kb-----SudaisAndShuraym----mixed---translation---mp3----quran---_866,three_musketeers_0712_librivox,betotherstories00chekiala,wasteland01elio,a-collection-of-low-headed-illustration-poses-for-girls,boodhikaki_201908,dostoyevskynotes00newy,malhaar-sangram,indiaaftergandhi00guha,mika-akitaka-mobile-suit-girl-art-works-mobile-suit-girl-ms_202101,tafseer-mariful-quran-sura-18-al-kahf-english-translation-pdf,shortpoetry_002_librivox,antifragilething0000tale,the-dream-of-a-ridiculous-man-by-fyodor-dostovesky-read-by-scott-dewey,Hairy_Wives_from_the_90s_Adult_Photomagazine_Issue_3_2018,PatanjaliYogaSutraBySwamiVivekananda,makeyourbedlittl0000mcra,takahashi-images,david-bohm-the-limits-of-thought-with-jiddu-krishnamurti,Fsi-MetropolitanFrenchFast-StudentText,duneherb00herb,CapitalismAGhostStory,HustlerUSASeptember2014,gang-bang-1985,la-metamorfosis,la-84-t-2-public-talk-02,halim_20200202,kino-nr-10-2006-pazdziernik-october,pornart2chloedes0000dahm,bharatiya-darsana-ki-ruparekah-harendra-prasad-sinha,artbook-Iron_Man,sophies-world-hindi,weirdtalesbbcr4,playboy-club-abella-danger-ahead-of-the-curve-39x,begum-akhtar-ghazals,chrismorris_bluejam,Pleasure-mag-009,NoamChomskyOnGovernmentsInTheFuture,jaishankar-prasad-kahani-sangrah,premchand11varshkasamayhindihindiedition,catcherinrye0000unse_i5b4,Psychotronic_Video_01,bookofdisquiet0000pess,sunderkand-gitapress-gorakhpur,art-models-life-nudes-for-drawing-painting-and-sculpting-by-johnson-maureen-john,in.ernet.dli.2015.377456,KaushalByPremchand,the_social_contract_1004_librivox,bookofkuzaritran0000juda,metamorphosis0000kafk_y8c1,WhoMovedMyCheese_201606,trial0000kafk_x7g8,gateway-experience-wave-1-track-1-orientation-the-gateway-tapes-no-ads,DinhLuyenThanMaTH,the_american_claimant_1205_librivox,mistbornfinalemp0000sand_a4i8,15August,SabitaBhabhiBengaliEpisode4,the-festival-of-gudi-padwa,SharhEDivanEGhalib-ProfessorYusufSaleemChishti,vishuddha-manusmriti-dr.-surendra-kumar,JhankiByMunshiPremchand,awfulgerman_librivox,manga_Kantai_Collection_-KanColle-_Wo-Class-chan_Is_Looking_Here_As_If_She_Wants_to_Be,captain-america-vol-1-scans,apology_of_socrates_plato_0908_librivox1,Sacrifice,DilKaRishtaSongsDL.com,in.ernet.dli.2015.545183,BBC_Radio_4_Extra_20200114_140000,the-satanic-verses-Audiobook,valmiki-ramayan-part-1-gita-press,schlaf-haruki-murakami-2002,msmarvelvol1nono0000wils,MahabharataEp10,how-to-read-a-person-like-a-book-from-ebooks-wide,instapdf.in-it-ends-with-us-879,street-fighter-friends-swimsuit-special-2017,HowMoneyWorksTheFactsVisuallyExplained,warhammer-path-to-victory-2-beneath-the-city-of-the-white-wolf,CollectedWorksOfRamanaMaharishi,daodejing_deutsch_0906_librivox,countofmontecris01duma,adventuresoftoms00twaiiala,1001_questions_grammar_2009_librivox,chronicleofdeath00garc_0,John_Raynes_Complete_Anatomy_and_Figure_Drawing_Chinese,manga_Ojousama_wa_Nigedashita,czechia-1995-12,fortyrules,in.ernet.dli.2015.466624,audio_poetry_195_2007,20230211_20230211_1637,letters-from-a-stoic-1,harrypotterhalfb0000rowl_f5b2,22-immutable-laws-of-marketing,Gitanjali-Marathi,priyanshi-jain_20230926_1457,isbn_9789460781094,in.ernet.dli.2015.300709,vat401959-08030810,sex-orgies-05,sacredgames0000chan,brant-pitre-the-case-for-jesus-the-biblical-and-historical-evidence-for-christ,in.ernet.dli.2015.319504,ChanakyaNeetiDarpanArthatRajNitiSamuccayaNavalKishorePress,briefe1906gogh,in.ernet.dli.2015.308233,JohnWyndhamBBCr4,FrontMagazine,creative_unity_1209_librivox,GitabitanAkhanda,AContractWithGodByWillEisner,Mehfil-e-ghazal07,the-kama-sutra-erotic-figures-in-indian-art-marc-de-smedt_202011,joibcstgxpxsiigvldmkjehbm03rdp48bprxyzox,godfather00puzo,ielts-academic-book-18,varios-interpretes-cumbia-surena-vol.-5-46,dli.sangeet.thumri.9,bhai-anantvir-singh-vancouver-may-2018-sunday-morning,priyanshi-jain_20230926_1547,vartmptmpgeneratedsocialpsychology7theditionbyelliotaronsontimothyd.wilsonrm.ake,leave-it-to-psmith,combi009,shecomesfirstthi0000kern,Sleazoid_Express_007_Joel_M_Reed_2005_OCR,20210515_202105,deadpoolwolverin0000unse,intuitionknowing0000osho,earth-science-geology-the-environment-and-the-universe-2008,NietzscheAndTheCrisisInPhilosophy,poshida-raaz-urdu-mufti-amrohvi,franzkafka0000unse,podcast_out-shadows_murder-by-dixie-mafia-par_401266835,peer-e-kamil-umera-ahmad,plague00camu,attitudeiseveryt0000jeff,poorfolk_1702_librivox,BBC_Bradbury,thakur125ganitpaheliyanhindi,Tabaqat_Hanabila,5-am-club,smart-phone-dumb-phone,wg871,buttman-magazine-volume-12-01-original,TheHindusAnAlternativeHistoryWendyDoniger_201402,AgathaChristieTimesSix,FIGURENUDEPHOTOGRAPHYANNUALVOL.71958ARTPHOTOGRAPHYMAGAZINE32,AntonioGramsciSelectionsFromThePrisonNotebooks,Psychotronic_Video_20,patchy-sensei,shatterme0000mafi,05-amhi-dharmantar-ka-karu-ichhito,MansarovarPart4-Hindi-MunshiPremchand,in.ernet.dli.2015.509603,bade-ghar-ki-beti-habeeb-ziya,lookingforalaska0000gree,Psychotronic_Video_40,gharjamaiaurdhikkarpremchand,black-book-of-english-vocabulary,CrimeAndPunishment,the-feeling-is-mutual-64,CLEOPATRAH,interpretationof1913freu,marvel-encyclopedia,gainax-datsui-hokan-keikaku-shinji-to-yukai-na-nakama-tachi-complete-genga-shuu-,thekiterunnerpdf_201906,isbn_9781420934212,dieverwandlung22367gut,how-prime-ministers-decide-book-pdf,homecoming0000earl_e6n9,king-of-greed-3-ana-huang,thedesignofeverydaythingsbydonnorman,disgrace00coet,maker_of_moons_1607_librivox,Young_Jump_2017-39,48LawsOfPower_201610,malayalamebooks,BBC_Radio_6_Music_20170118_210000_Gideon_Coe,RAZI11,m2r38ztkaznhxmlxphfmvijev1vkdzkjobjp3aad,in.ernet.dli.2015.522768,mansfield_park_librivox,agatha-christie-and-then-there-were-none,tale_two_cities_librivox,talesfromhitopad0000anan,songoficefirecom0000geor,OdysseyRenderedIntoEnglishPotReadTheOriginalTheHomer,psychologyofhumo00martrich,lettertofather0000kafk,Anal_sex-mag-46,LordPeterWimseyCollection3,dli.sangeet.thumri.2,OTRR_Dark_Fantasy_Singles,companyofwomen0000khus,aetrafnidafazlinumber,115.autobiographyofayogihindi,rich-dad-poor-dad-hindi-robert-kiyosaki,KnkH_dictionary-of-medicine-english-to-hindi-edited-by-s.-c.-sen-gupta-and-s.-c.-kapo,acmj-h1,sun-and-steel,round-the-horne,symposium_0909_librivox,TheGulagArchipelago-Threevolumes,fahrenheit4510000brad,ibne-insha-marathi,SayyadinaAbubakarSidiqueR.aKiZindagiKSunehreWaqiat,alan-watt-cttm-1641-blurb-mind-tinkerers-professional-with-media-bind-using-prov,jesusandthejewishrootsofmary,muraqqa-e-akbarabad-yani-tareekh-e-agra-saeed-ahmad-marahravi,AbrahamEralyTheMughalWorldLifeInIndiasBookZZ.org,udaanhindiedition,faultinourstars0000gree_s5l5,NorwegianWood_875,malena-2,Sex_Dictionary,oceanof-pdf.com-god-of-wrath-rina-kent,negeriparabedebahtereliye,2750_20190715,OTRR_Cruise_Of_The_Poll_Parrot_Singles,OscarWildeBBCRadioCollection,TheaVonHarbou19271963Mertopolis,harperleestokill00burn,gyorgy-e.-szonyi-john-dees-occultism-magical-exaltation-through-powerful-signs,osho-hindi-discourses-part-1-osho-rajneesh-free-download-borrow-and-streaming-internet-archive,best-of-mayfair-issue-49,dantesinferno00dantuoft,74611889-arabic-grammar-in-urdu-easy-way-to-learn-arabic-grammar-part-1-2,in.ernet.dli.2015.478892,Psychotronic_Video_30,TheBlackCat_339,Penthouse_v10n02_1978-10,icusld6fysqxcpb3hr3wiohrto18jszxyd6fi1zd,fazbear-frights-collection,Swamini,shining00step,krishna-1967-original,metamorphosis0000fran,the-drama-of-the-gifted-child,deewan-e-ghalib-by-vishav-nath,wg427,lost-islamic-history-part-6,TrappedBBCR4,heelshosevol.7no.41970d.d.teolijr.a.c.3,huck_finn_librivox,SuperHitGhazalsInHindiMp3,stranger0000camu_a0e0,in.ernet.dli.2015.342900,eksadaksattavangaliyan,12rulesforlifeanantidotetochaosbyjordanb.peterson_201911,how-to-draw-moe-underwear,HistoryOfAncientIndia,dli.ministry.29346,tantrakedivyaprayogrkrishna,avatarlastairben00teit,colossusotherpoe00plat,AshtavakraGitaSanskritHindi_201809,sleazoid-express,McGillLibrary-rbsc_isl_ijaz-i_bp80s357ca51891800z-16280,BestUrduBooks12,doctorwhoaudiovisuals,TimnahDrLacyCouch,in.ernet.dli.2015.481633,GameOfThrones_201607,myreminiscences_1410_librivox,gov.gpo.fdsys.CHRG-111shrg61600,queen_greatest-hits,Godan,bharatiyadarsanakiruparekahharendraprasadsinhamlbd_202003_913_h,romantic_poetry_001.poem,avatar-the-last-airbender-the-f.-c.-yee,BHAGATSINGHCOMIC,mayfair-volume-28-issue-5,1984_20220207,trattato-di-anatomia-umana-anastasi-vol.-2-versione-blu,runwithhuntedcha0000buko,anaarkali,in.ernet.dli.2015.269117,BusinessRingtones,kinginyellow00chamrich,OldRareHindiFilmSongs,gulon-mein-rang-bhare-mehdi-hasan,dictionaryoflati00robeuoft,osho-geeta-darshan-vol-1-osho-free-download-borrow-and-streaming-internet-archive,NUTS_Magazine_June_14-20_213,trialandmetamorp0000berk,artofwaroldestmi00suntuoft,AbrahamLincoln-Hindi,boys_book_famous_soldiers_1105_librivox,in.ernet.dli.2015.464177,premchand-kayakalp,november9novel0000hoov,kapil-gupta-gupta-kapil-atmamun-the-path-to-achieving-the-bliss-of-the-himalayan,RaggedTrouseredPhilanthropists,call-of-cthulhu-lovecraftian-horrors-game-art,history-of-ancient-and-early-medeival-india-from-the-stone-age-to-the-12th-century-pdfdrive,the-batman-who-laughs-the-deluxe-edition-2023-digital-son-of-ultron-empire,theconspiracyagainstthehumanraceacontrivanceofhorrorthomasligotti,e-book-vatsyayana-the-kama-sutra-1,mere-jawab-romantic-love-story-hindi-audiobook,studyinscarlet_bn_librivox,DeewanEMeerByMeerTaqiMeerUrduinpage.com,AlbertCamus_201405,OTRR_Philip_Marlowe_Singles,letterstoyoungth00piph,ambinterior3,NUTS_Magazine_The_Girls_of_NUTS_Summer_SPECIAL_2013,menwithoutwomens0000mura_b1t0,walkingdead01gut0000robe,mahabharata_condensed_om_librivox,ItsNotWhatYouKnow_201701,JK_E1,imgtopdf_1901231248004.pdf,clashofkingsbook00mart,MegastoreFebruary2018,lp_portrait-of-a-genius_mirza-ghalib-begum-akhtar-mohammed-rafi,20231202_20231202_1045,ghostsofelectricitydocumentary,isbn_9780552773317,sapiens-de-animales-a-dioses-audiolibro,returnsherlockholmes_v3_1507_librivox,kino-nr-10-2007-pazdziernik-october,peter_pan_0707_librivox,Future.Sex.Issue.06,www.VintageSense.com-Vintage-Indian-Music-37,rt-black-box-down,noelcowardbbcr4,howtoreadfilmmov0000mona,HP2-Windows-Prototype,the-secret-mirror-essays-on-urdu-poetry-shamsur-rahman-faruqi-ebooks,kino-nr-5-2007-maj-may,ShabEKhoonByAhmedFarazUrduinpage.com,andmountainechoe0000khal,modernhindishort0000unse,letrangerdecamus0000albe,Swaraj-Gandhi-1947-10-29,Sex_Master,crimepunishmentn00dost,keyaccountmanage0000chev_f1c0,RayBradbury_Fahrenheit451,wayofkings0000sand_h0x5,bestwomenserotic00marc_0,IntroductionToPsychologyLectures,ravindranathtagorekilokpriyakahaniyanhindiedition,BardcastCymbeline,trilogia-de-la-fundacion-by-isaac-asimov,watchmen00moor_0,the-fault-in-our-....,jane_eyre_librivox,thestrangecaseof00043gut,rigvedacomplete,candlestick-trading,in.ernet.dli.2015.545500,thegrass_1908.poem_librivox,darkpsychology200000mich,mind_and_its_education_1910_librivox,rajyog-hindi-audiobook-part-1-swami-vivekananda,in.ernet.dli.2015.464139,artofseduction0000craz,cd_the-perks-of-being-a-wallflower_various-artists-cocteau-twins-cracker-davi,i-am-malala,JosephConradBBCRadio,codeofkrillitane0000rich,malvikagni-mitra-urdu-translation-irfan-siddiqui-up-urdu-academy-lucknow,NovenoPodcast,TheWillToPower-Nietzsche,TheDaVinciCode_201308,AliensOmnibusVolume1,shiv-sutra,in.ernet.dli.2015.154654,upkar,aaobymanto,chand-ka-muh-teda-hai-by-gajanan-madhav-mukti-bodh-bhartiya-gyan-peeth-prakashan,tantricvisionsof0000kins,americanpsycho0000elli_j9t1,morningritualttrump,terminator-the_burning_earth_comics-1990,1AGameOfThrones_201507,dli.calcutta.10819,manga_Sabishisugite_Lesbian_Fuzoku_Ni_Ikimashita_Report,Bokharee_up_by_ayoub-islam,sexno111926,flash-gordon-and-the-fiery-desert-of-mongo-sunday-comics-strips-1942-43,thelastmughalthefallofadynastydelhi18572008vintagebooks_201910,winningchesstrap0000irvi,AmritaPritamKavita1,in.ernet.dli.2015.302590,eragon00paol_1,20210703_20210703_1153,EdgarWallaceBBCr4,ShayadHD,inspectorwestbbcr4,extremesexnewwor0000unse,0_sense_and_sensibility_librivox,GalbraithBBCr4,TantraSexSlaveBookComplete,datpiff-mixtape-m9dc758c,petite-vicieuse,TigaGodaanIblisKepadaYesusDiPadangGurunMatius41-11ByPdp.Johannes,podcast_drawings-prints-special_vincent-van-gogh-the-letters_1000092829259,in.ernet.dli.2015.509111,Metamorphosisin00Meri,shreemed-bhagwat-gita-20220406_20220406_0356,manga_ill-never-moan-for-you,Faisla-Hindi,dli.ministry.26697,ShahabNamaByQudratUllahShahabComplete,modern-indian-history-2-british-period-s.-c.-sarkar-k.-k.-datta,nasir-kazmi-shakhsiat-aur-fun,adhyatma-ramayan-part-18-swami-shri-akhandanand-saraswati-ji,nida-fazli-kavita,godofsmallthings0000roya_t1i9,123_20200211,encyclopediaofunusualsexpractices_201909,HindiBook--gitanjali-by-shriRabindranath-tagore.pdf,weliving00rand_0,PakistanBetweenMosqueAndMilitaryByHussainHaqqani,jujutsu-kaisen-manga,in.ernet.dli.2015.472282,TheHistoryOfO,0053OutOfThisWorldAdventures02195012.AvonC2c.Cimmerian32,premchandsevasadanhindi,bookoflifedailym00kris,SheehyToKillaMockingbirdChapter1Thinking,Ansgstrom,013TheBookOfWisdom,cormac-mccarthy-the-blood-meridian,sankshipt-mahabharat-vol-1-gita-press-gorakhpur,in.ernet.dli.2015.409742,TwilightOfTheIdolsOrHowToPhilosophizeWithAHammer,a-caribbean-mystery_202201,onehundredyearso0000garc_l6x7,Aatmaanubhuti.Tatha.Usake.Marga.by.Swami.Vivekananda,in.ernet.dli.2015.307395,a-midsummer-nights-dream-1999,tales_shakespeare_librivox,papa-ki-bitiya-baap-beti-ki-chudai,tvtunes_20712,batmanvolume1cou0000snyd,keralapadavali1981std1kerala,call_cthulhu_2401_librivox,InterracialAdultPhotoIssue12017,general-knowledge-ebook-for-ssc-cgl,tansenamarchitra0000anan,BrihadaranyakUpanishadGitaPressGorakhpur_201905,paradoxofchoice00barr,cheri-2013,TeslaProblemEnergy,vindicationofright00woll,bitterfruitveryb0000mano,letterstoyoungpo0000rain,rajeshpatimaamaincollectorbangayahindi,HELENKELLERKITEACHERANNIESULLIVANHINDI,calatog-hot-sexy-girls-models-instagram-2021,kino-nr-7-8-2007,in.ernet.dli.2015.398426,d876b46f-0086-4081-8618-6dc9f1ab8cff,ReturnToLittleRussiaREV3COVER2_201801,wisdomofpsychopa0000dutt,ChhayaGeetOnNidaFazli,Cavalcade_v07n10_1968-10,manga_ASexTherapist-c01to07,letters-on-ethics-to-lucilius-pdf-room,gc-leong-geography,best-of-mayfair-issue-30,2StatesChetanBhagatmarked,meditationsofemp00marcuoft,shakespearejuliuscaesarhindiedition,50_Magazine_Vol._8_2016,KateChopin_SelectShortStories,RelaxingSleepMusic.DeltaWavesBinauralBeatsHealingForDeepSleepStressReliefMeditation,TriplePleasureVol1No1,richdadpoordadwh00kiyo,umroaurshahenshaafrasiab,3fqjvd2gl0vlngxafzzkvjhde6l2oyrejuyfa27u,ASmallTownMurder,lovefreedomandalonenessanewvisionofrelatin,swamplandsofsoul0000holl,mitchalbomstuesd0000hatc,8Beats-Kaharwa-Taal,fyodordostoyevsk037685mbp,notes_underground_russian,in.ernet.dli.2015.347136,in.ernet.dli.2015.379218,CurlewinAutumnBBCr4,colorpurplenovel00walkrich,TheStoryOfASoulTheAutobLisieuxThrseDeSt.6502,encyclopediaofplantsandflowers,albertcamussstra00bloo,roalddahl_moretalesunexpected,hindivadioct22019final,ekleipsi59,mens-world-volume-09-number-02-1997,DWK119,jai.-bhim.-2021.720p.-hindi.-dubbed.-720p.-webrip.x-264-uwatch-free.net,KhalilGibranAnandPeedaUC,MansarovarPart5-Hindi-MunshiPremchand,AlQasimTibyaan1432,the-radio-amateurs-handbook-1942,brant-pitre-jesus-and-the-jewish-roots-of-the-eucharist-unlocking-the-secrets-of-the-last-supper,book_of_art_0807,NoamChomsky-1995-04-12-LinguisticsPhilosophy,dragrows-zex,isbn_9780805231366,IshaKenaKathaPrashnaMundakMandukya,hustler-taboo-0910-2023,Manto-Aankhen,deadpoolkillsmar0000bunn,nikola-tesla-on-light,showbusinessnove00thar,bhavishya-puran-gita-press-gorakhpur,DEKHBHAI_201605,no-excuses-the-power-of-self-discipline-pdfdrive,DanBrownTheDaVinciCode,HPMoRpodcast-Audiobook,twisted.games.elite,psychotronic_video_19_201809,OTRR_Escape_Singles,sheela-shadi-me-chudi-anjan-ladke-se,bd-chaurasias-human-anatomy-volume-3-head-neck-and-brain-6th-edition_20201225,abbu-aur-bhai-se-chudi,teFC_vipatra-by-gajanan-madhav-muktibodh-bharatiya-gnanapith-kashi,Psychotronic_Video_28,artofpersuasionw0000burg,04-21,HindiBook-santKabirBhajanDoha,pdfy-4isR04Rjy6azQi7p,the-restaurant-at-the-end-of-the-universe,ageneralintrodu00freugoog,howtoreadpersonl00nier,atomic-habits_20210723,mistbornfinalemp0000sand,dramaofgiftedch000mill,success-is-his-best-revenge,beautifulbritonsvol.9no.104d.d.teolijr.a.c.2,in.ernet.dli.2015.20749,vagabondinlitera00compuoft,TheAncientGeographyOfIndia,in.ernet.dli.2015.209262,fyodor-dostoevsky-the-idiot-in-hindi,darkforest0000liuc_z6r7,in-the-presence-of-absence-and-a-river-dies-of-thirst-darwish-mahmoud,sole-spokesman-jinnah-muslim-league-the-demand-for-pakistan-ayesha-jalal-cup,DaphneduMaurierBBCr4,001-aankhon-dekhi-sanch,love-sonnets-of-ghalib-dr.-sarfaraz-k.-niazi,SabitaBhabhiBengaliEpisode6,welcome-to-wskel,forever-is-a-lie-by-novoneel-chakraborty-vivians-e-library,cu31924027444284,analyze_people_on_sight_1105_librivox,islamic-books-hindi-pdf,eroticbookerotic0000filg,sophiesworldnove1994gaar,Sight_and_Sound_1961_01_BFI_GB,the120daysofsodom,burqay-by-sadat-hasan-manto_202010,hustler-usa-april-2024,in.ernet.dli.2015.269145,makeyourbedlittl0000mcra_l5p6,dli.language.1221,McGillLibrary-129783-5044,street-and-lane,sixofcrows0000bard_i3c5,SextonBlakeBBCr4,SrimadBhagavadGitaSanskritHindiEnglish,baccho-ki-kachahri-opt,ethicsgreekphil00hysluoft,simple-trading-book-1-1,python-crash-course-a-hands-on-project-based-introduction-to-programming_202204,ShreeKrishna_ravindraJain,thedoctorandthesaintcasteraceandannihilationofcastethedebatebetweenb.r.ambedkara,the-kite-runner-pdf,Alfie-webcomic-online,murderofrogerack0000agat_g7y3,a-murder-is-announced_202112,in.ernet.dli.2015.478775,womenandeconomi01gilmgoog,WhatTheBuddhaTaught_201606,diaryofvirginiaw0001wool,wo-piya-se-chudne-wali-thi,BBC_Radio_6_Music_20161005_200000_Gideon_Coe,in.ernet.dli.2015.472597,fundamentalchessopenings,chroniclesofbarchester,CharlesDuhiggThePowerOfHabit_201801,podcast_motivation-mondays_david-goggins-the-cure-to-la_1000426469242,NMRArch-01-17-054-letter-from-zia-mohyeddin,pornartchloedesl0000dahm,18plus-vol-13-2017,old-harrys-game,in.ernet.dli.2015.484112,ozymandias_librivox,Mehfil-e-ghazal004,extraordinary_lupin,ofmicemenpenguin00john,personalmbamaste0000kauf,byomkeshbakshi0000band,the-book-of-nothing-by-hsin-hsin-ming-talk-on-the-faith-mind-of-sosan-osho,falloficarus0000ovid,WolfmanJack-XerbRosaritoBeachMexico-1968,tomorrowibecomew0000odaf,worksofjohnlocke01lock,kathamrita1,kurt-vonnegut,sayings_of_lao_tzu_1809_librivox,mlbd.introductiontoin0000sati_t0v5,lastairbender00roma,hsnak00eyhguoft,valleyoffear_1511_librivox,RockNLearn-Dinosaur-Rap,LarryKingHowToTalkToAnyoneAnytimeAnywhere1of2,20201012_20201012_1148,OSHO_Jagat_Taraiya_Bhor_Ki,andhere-band-kamre-part-1-upnyas,georgewashington_bb_librivox,get-stufd-volume-19-issue-08-august-2007,z0avd001,gita-nochur,TheMartian_201808,osholivingdanger0000osho,les_mis_vol01_0810_librivox,shamenovel00rush,KavitaLoheKePedHareHongeRamdhariSinghDinkar,y1pl1r0wtiybzzyrzs4r4iikzujzbypmqgyze8ab,castle00kafk,KahaniKhudaKiKasamManto,CancansDeParis-mag-22-1967,lettresmilena0000fran,2007oneirabbcr4,dli.bengal.10689.19608,voltairecollection,18-babes-2009-01,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Volume_7,cg-images,31.friedricha.hayekcaminodeservidumbre,ost-english-2ws2610,pix-15,manaralibrary0000mana,annakarenina_dutch_1011_librivox,AlbertCamusVeJeanPaulSartreDaSamaninKarilatirilmasiComparisonOfAbsurdInAlbertCamusAndJenPaulSartre,kybalionstudyofh00thre,thinkbigunleashi00cars_1,storytelling-sounds-2021,cu31924103377051,el-principito_202206,how-to-draw-drawing-and-sketching-objects-and-environments-from-your-imagination-pdfdrive.com,Salty_v01n06_1969-04,the-art-of-manipulation_202106,leaves_of_grass_librivox,cd_the-kite-runner-original-motion-picture-so_alberto-iglesias-ahmad-zahir-bara-kherigi,18-eighteen-magazine-june-2010,AndriehVitimusHandsOnChaosMagicRealityMabOk.org,ACourtOfFrostAndStarlightACourtOfThornsAndRoses,sitara-the-book-of-passion,the.lord.of.the.rings.the.fellowship.of.the.ring_201910,i-was-never-yours,galilioh,FBIKnewHitlerWasAlive,how-to-draw-dresses_202111,candide_librivox,Cats-199709,completeroundthehorne,incest-magazine-1,greene-robert-48-laws-of-power,Magic_Island_201505,BizarreSex05,marvel-super-heroes-secret-wars-issue-2,manga-bleach-digital-colored-comics,ThinkingFastAndSlowDanielKahneman,kuchtokahye,jodorowsky-dune,SylviaPlathLadyLazarus,michael-parenti-blackshirts-and-reds,IrodovProblemsInGeneralPhysics,PrafullaKolkhyanKATHKTHANTARKASHIKAASSI,Ananda-Marga-Elementary-Philosophy-Hindi-1st-Edition,in.ernet.dli.2015.458629,wise-guy-socrates-hindi-audiobook,landarzt_0807_librivox,bakuboy01_gmail_R2ps,kupdf.net_riddles-in-hinduism-dr-br-ambedkar,forty_rules_of_love_by_elif_shafak,RupiKaurMilkAndHoneyAndrewsMcMeelPublishing2015,PenthouseLettersJanuary2018,one-thousand-roads-to-mecca-ten-centuries-of-travelers-writing-about-the-muslim-,KathaOKahini,inventionsresear00martiala,OnePiece1Fish,fuse-magazine-volume-64-2021,khushwantsinghon0000khus,meditations00marcuoft,Kp0164-theseGirlsAreSoFine,streetfightercomicbookcollection_202003,zero-to-one-hindi-pdf-download,MidnightsChildren,ciHQ_kaam-vigyan-hindi-text-on-erotics-sex-manual-calcutta-chandra-shekhar-pathak,250_20200817,manic_doujin_00031,s02e02dotpsychology,isbn_9780761178972,06-jatibhed-nirmulan-dr.-babasaheb-ambedkar,in.ernet.dli.2015.268970,maalavun-taak-deep,sapiens-yuval-noah-harari,AFHerold-The-Life-of-Buddha,UrduAudioNasheeds,journalsofsylvia00sylv,BullehShahKehendeNain_pdfbooksfree.pk,wazayefenadeali,solo-leveling_202307,e-book-room.-the-housemaid,staringatsunover00yalo,B-001-002-046,multilingual_short_works_017_1705_librivox,Cats-199710,ERIC_EJ1128161,powerofyoursubco00jose,chanakya-niti-in-nepali_hinduism,alexander-pushkin-collected-works-vol-1-poetry-hindi-progress-1982,3-bd-5705-ec-76666122-e-5-bcbc-89-f-591-b-2-c-620-aaefe,sZzk_rashmi-rathi-by-ramdhari-singh-dinkar-1954-shri-anjana-press-limited,colorpurple00walk_0,vincentvangogh00rabo,completepoemsofe00dick_1,the.lord.of.the.rings.the.fellowship.of.the.ring,gunahon-ka-devta-by-dharmaveer-bharti_20240707,gora_20200202,lettersoffyodorm00dostuoft,ncert-history-hindi,ArtOfWarBySunTzu,101-essays-that-will-change-the-way-you-think_202405,monstervolume10000uras,9781784707422,mysterious_stranger_1206_librivox,thebrotherskaram28054gut,wow-2021-broadcast,cheri-june-2011,kybalionstudyofh00init,kamsutra-book-in-hindi_202308,Dunya-Goal-Hai-By-Ibn-e-Insha,LFA_Lustig_0063,how-to-read-a-book-the-classic-guide-to-intelligent-reading-by-mortimer-j.-adley,uniform-girls-54,RichardDawkins_237,KalamMuhammadBakhshpunjabi,ShowSelector2,sociedad-de-acomar-08-cuando-me-amara-s,hustler-january-1980_202205,furtherstoriesfr0000anan,griefisthingwith0000port,KamliWaleMuhammadToonSadqeMp3UstadNusratFatehAliKhan,wuthering_heights_0801_librivox,the-once-and-future-king,PornScandinavia,all-my-sons-arthur-miller,Sight_And_Sound_2011.05_Wim_Wenders,FlashGordonFirstNewspaperComicStripJan71934ThruApril81934,bub_gb_NL4sAAAAYAAJ,hustler-18-plus-nl-2010-04,bheden-aur-bhediye-harishankar-parsai,looking-glass_librivox,ghost_stories_006_0809_librivox,in.ernet.dli.2015.444423,dni.ncaa.SAK-708_1-AC,shivastotravalibyutpaladevaenglishswamilakshmanjoo_202001,ImagineByJohnLennon,PsychedeliaRawArchivesOfTerenceMckennaTalks,LalithaSahasranamam_201603,InspResnickBBCr4,CONFUCIUSH,AsliKokaShastra,rubberlife1974d.d.teolijr.a.c.4,ShowSelector,HindiShivPuranAudio,InkarByParveenShakirUrduShairi.com,HindiHasya-vyangSankalan-Hindi,JaneEyre-CharlotteBronte,VolgaSeGanga-Hindi,AsliPrachinLalKitabGirdhariLalSharma,LaHasilByUmairaAhmedUrduinpage.com,lucent-gk-hindi-53-mb,goodomens,shrimad-bhagwad-geeta_202307,manga_Death_Note_L_Change_the_World,BBC_Radio_6_Music_20170919_200000_Gideon_Coe,the-way-of-the-superior-man-en,ThePhysicsOfGodAndTheQuantumGravityTheoryOfEverything,1SRIMADBHAGAVADGITAJOTHAJOTHOChapter16.pdf,audio_poetry_74_2006,ShreemadBhagwatGeeta,maalgudi-ka-mehmaan-hindi-novels-and-comics-r.-k.-narayan_202012,marketwizardsint00schw,zsyolpz3iuzc1itxmgduapdo5gjf1om05nlsyb56,martin_chuzzlewit_librivox,pdfy-LiYODFKQVdq850ry,BBC_Radio_6_Music_20170829_200000_Gideon_Coe,mobydickorwhale01melvuoft,OnenightAtCallCenter,lp_when-melody-was-queen_various-chorus-lata-lata-mangeshkar-mohd-r,BBCAVPM,Amateur_MILFs_Nude_and_Kinky_Adult_Photo_Magazine_Volume_16,the-three-investigators,in.ernet.dli.2015.415637,combinepdf_202102,the-Power-of-your-Subconscious-Mind-Hindi-2,KavitaMadhuShala1HarivanshRaiBachchan,MahabharatInUrduGargAndCo,greaterkeyofsolo00solo,RobertFrostCompletePoemsOfRobertFrost,lfpazxj65wmy2ggonikyuiwezhtuwhrqsrepwio2,12RulesForLifeAnAntidoteToChaosByJordanB.Peterson_201812,twelfth_night_0906_librivox,in.ernet.dli.2015.532198,ALifeInLetters-AntonChekov,pirate-erotic-mens-magazines,housewithoutwind0000hash_y5l1,the-art-of-focus-Not-Dan-Koe,byblosthroughage0000jide,kafka-ki-lokpriya-kahaniyan-hindi-edition,lp_experiment-and-ecstasy-his-great-songs-fro_salil-chowdhury-asha-bhosle-chorus-lata-ma,freddy-vs-jason-vs-ash-01,tragedyofothello00shakuoft,cotelnv,Swaraj-Gandhi-1947-11-25,TheStoryOfTheCommitteeOf300,y-2mate.com-it-starts-with-us-audiobook-colleen-hoover-chapter-1-real-voice,thecaskofamontil01063gut,185512201GuidoCrepaxValentina,dictionaryoffren00belluoft,20201022_20201022_1121,Snowfield,amaliyaat-by-allama-abdul-mustafa-azmi,IndianClassicalMusic,understanding-comics,Manga2017digitaldanke-empire,kaise-maine-apne-sasur-ji-se-car-me-chudwaya,ew-images,escape0000much,TheFathersHistorians,john-green-the-fault-in-our-stars-full-audiobook.f-251,rogue-ascension-book-1,cu31924026700827,mancalledovenove0000back_o5p4,HindiBhajansMp3-pradeepJi,copywriting-secrets-by-jim-edwards-z-lib.org,begegnungen_a1_2,aristotledeanima005947mbp,bg8commentaries,RudyardKipling-TheJungleBook,CIAUFO,CoreyWayneHowToBeA3Man,asmanthinketh00alleiala,FranzKafkaBBCr4,AmericanStories,lifeofshivajimah00keluiala,essentialrumi00jala,the-mountain-is-you-transforming-self-sabotage-into-self-mastery-by-brianna-wiest-z-lib.org,rosieproject0000sims_p1n4,alphabetsoldnewf00dayl,RAE82NewYears,encyclopediaofworldhistory_201912,tolstoy_ls_1412_librivox,office-of-film-and-literature-classification_0900587.000,saadathasanmanto0000edtd,hardthingaboutha0000horo,flowersforalgern2004keye,quran-hindi-translation-tafsir-anuvad-king-fahad-high-res,JoseSilvaTheSilvaMindControlMethod,ShriKrishnaBhaktirAmritaBindu,Rapture_v01n03_1959.Beacon_Darwin-McCoy,Gulzar-e-MadinaShaoib-Raza-Qadri,HindiBookSurdasAurBhramargeet,huang-ana-1.-twisted-love.-lumina-din-intunericul-lui-scan,mertvyedushi11,tchxnpp0fqrkk589f84q344kltj7i4fj7nebopfm,anatomy_humanbody_1_0901_librivox,tantraspirituali0000osho,04TheSearchForTheStolenIdol,HowTheSecretChangedMyLifeByRhondaByrne,MadhyaRatreli,batman.-1989.-main.-theme,theilluminatiformulausedtocreateanundetectabletotalmindcontrolledslavebyfritrzsp,collectedshortst0000fran,the-spider-v-02n-03-1934-04-sas-exciter,openDemocracy_pamuk_atwood_rushdie_2,kama-sutra-a-position-a-day-365-days-a-year.,endingoftime00kris,meinkampf_minha_luta,das-wehrschach,mastermargarita00bulgrich,homeriliad0000evri,yugandhar-shri-krishna,bhagvadgeeta_201607,PuraskarByPrasad,KhilafatOMalookeyatSyedAbulAlaMaududiUrdu,queen_elizabeth_0901_librivox,MeAndRumi,TalesOfGnosisCollege05,khattarkaka,tolkien-j.-the-lord-of-the-rings-harper-collins-ebooks-2010,depthsofmadness0000debi,GarbhGitaHindiAudioBook,dailystoicjourna0000holi,Psychotronic_Video_09,manners_202002,in.ernet.dli.2015.349362,LaghuUpanyasAurKahaniyan-Hindi,manga_Queens_Blade_Bitoshi_Gaiden_Tome_of_the_Ancient_Princess,WolverineOldManLogan,BargENeyByNasirHussainKazmi_201507,letterstomilena0000will,darkromancecolle0000unse,All_Souls_Unitarian_Church__Tulsa_OK-12_11_Podcast,hatinggame0000thor_i6j8,intoheartoftruth00mcaf,modelling-ke-liye-casting-couch-sex,wings-of-fire-by-abdul-kalam-printers1,ost-english-apassagetoindia,swatantrata-sangram-hindi-bipin-chandra,diariesoffranzka0000kafk,IkshvakuKeVanshaj,neverletmego0000ishi_z8y5,DWK107,hemi-sync-journal-1990-2-spring,AyeBhagatSinghTuZindaHai,in.ernet.dli.2015.484148,pythonfordummies0000maru,zero-to-one-book,Psychotronic_Video_41,adadon-ki-hukumat-by-kash-al-barni,thebreakdownepisode315,public-places,a-short-history-of-nearly-eve-terje-g.-simonsen_202203,aristotlesmetaph0001aris,jeune-fille-au-pair,ibnuukinpjvtrob1dokwenlpfba4nkwvnd0g7ye2,BBC_Radio_4_Extra_20170618_133000_Arundhati_Roy__The_Ministry_of_Utmost_Happiness_Omnibus,iamdynamitealter0000rapp,ZindagiGulzaarHe,Shankhnad,zGAb_yug-purush-ganesh-shankar-vidyarthi-vyaktitva-aur-krititva-vol-2-ed-by-shri-tila,the-bhagat-singh-reader-bhagat-singh-chaman-lal-z-lib.org,completeworksed03poegoog,1q84books120000mura,SuryakantTripathiNiralaRamKiShaktiPooja,MahabharataEp5,bhagwat-geeta-gujrati,think-and-grow-rich_202408,republicplat02plat,sufism_tasawwuf_outlook_P1,premchandaahutihindi,manga_library_Hentai_Elf_to_Majime_Orc,greatexpectatio00dick,RigVedaInHindi,nusratcollection_20170416_0341,powerofyoursubco0000murp_y1b6,beyond-psychology-osho_202101,the-milf-chronicles-dirty-family-stories,RamakrishnaMissionGuidedMeditation,hc011MastaBruce-SonicXxxProject,MansarovarPart7-Hindi-MunshiPremchand,smart-girls-guide-to-privacy-2015,TheArtOfWatchingFilms,soundcloud-652647479,PrafullaKolkhyanBigarKaDarAurImanKiBat_201302,KavitaAMaaTaresaJavedAkhtar,eroticafrompenth0000unse,UnchasDinByAmritaPritam,karlmarxanessay_1409_librivox,in.ernet.dli.2015.424658,hitchhikersguide00doug_1,StateStrategiesToCreatePositiveImagesOfWar,AnimeRGHunterXHunter2011COMPLETEBD720pHEVCx265KaMi,meri-wife-heart-touching-love-shayari-husband-to-wife-shayarix,mach-hommy-and-tha-god-fahim-notorious-dump-legends-volume-2,pl-france-f-vrier-avril-2021,edinburghdetective1to12,Bestiario_201410,raj3elsada-Sa7e7Trgheb1,great_composers_1102_librivox,2.09_20231008,dni.ncaa.SAK-708_2-AC,meditaciones_2210_librivox,MohsinNaqviKaMuntakhibKalam,BookOfNature-English-RuskinBond,a604578400platuoft,s01e01theclothestheystoodupin,how-to-draw-a-little-h-costume-h_202111,bible_kjv_complete_2001_librivox,Gandhi-NamakYatra-Hindi-AliceM,MoreBubbles,jiz-comics-restored,black-sun-aryan-cults-esoteric-nazism-and-the-politics-of-identity-pdfdrive,AdvanceVaastuAndRemedies,americanpsycho0000elli_u2i7,adVN_introduction-to-indian-philosophy-of-satish-chandra-chattopadhay-and-dr.-dherend,fortyrulesoflove00shaf,salems-lot_202205,Kanupriya-Hindi,miss-peregrines-home-for-peculiar-children-pdf,the-naughty-professor,works_poe_raven_edition_vol2_0912,sushant-rajput-camus-and-the-myth-of-sisyphus,SecretsOfMentalMath,Frivol-mag-112,carnalcomicstabithastevens_201908,BBCR4Ghosts,KenWhitmoreBBCr4,26dadsarmy19740617presentarms,capital_vol1_0810_librivox,origin_species_librivox,the-millionaire-fastlane-mj-de-marco,Karmbhumi-Hindi-Premchand,pdfcoffee.com_loona-pdf-pdf-free,NishaNimantran-HarivanshRaiBachchan,the-law-of-attraction-in-hindi-pdf-1,junji-ito-collection,quranarabichindimp3,mopla-book_202110,ijm92hpazijw315v6praxix3w3nrabsr9f3wscwv,EustaceMullinsSigmundFreudAntichristDevil1997,manga-vagabond-vizbig-edition-vol.-2,kabiramarchitrak0000anan,how-to-draw-manga-girl-with-swimsuit,ssc-mathematics-by-pinnacle,lp_wish-me-luck_ofra-haza,hobbitortherebac0000tolk_b5p9,the-dhammapada-by-osho-compiled,UnknownSquaredCircleMoreThanMeets...P7BruceLyonsUnexpectedJourney,in.ernet.dli.2015.348751,parveen-shakir-letters,elmundodelmanana0000eesu,crimepunishment1917dost,CompleteSahihMuslimHadithInURDU,1_20200207_20200207_0812,dni.ncaa.SAK-293-AC,A.EWaiteTheSecretTraditionInFreemasonry_20170511_0211,pascha-15,isbn_0805202005,audio_poetry_211_2007,daridra-narayan-rajat-raten-dosteovsky-hindi,a-room-of-ones-own-and-three-guineas,manga_Onikirimaru,the_decameron_0903_librivox1,Psychotronic_Video_29,KafkaDasUrteil,angels-demons-dan-brown,EidGah-2013_201310,Frivol-mag-258,darkmatternovel0000crou_n9e8,Visual-pose-book,MolecularBiologyOfTheCell5th,39_20211119,MenAreFromMarsWomenAreFromVenus_201803,psychologyreinca00kidd,KavitaSurdasKePad,StartWithWhy-SimonSinek,smut-honey-podcast-ep-8,cosmos_de_carl_sagan,vishnu-puran-illustrated-with-hindi-translations-gita-press-gorakhpur,HazratUmarFarooqr.akay100Qissay,breakinghabitofb0000drjo,isbn_9788175082328,Club_MILF_-_Volume_385_2019,SciFiAudiobooks,science-of-steam-cooking-krishnacharya-g.-v.-1911,wolfman-jack-and-the-border-blasters,yume-ost-we-are,rj-01038110-images,velamma-hindi-episode-119,fundamentosdelta00octa,carlton-h.-d.-satans-affair,trial0000fran_m0c9,z1jvtbu2gv9sw0lqgd0imxvafkipoczozaeeifpb,drawingforbeginn00furn,lp_the-hitch-hikers-guide-to-the-galaxy-part_douglas-adams,01-atomic-habits-by-james-clear-full-audiobook,stefan-zweig-amok-kosucusu-sesli-kitap-arsivi,pretenders-landgraaf-pink-pop-festival-1984,in.ernet.dli.2015.268297,Chacha_Chaudhary_Comics_Collection_in_Bengali,divinecomedy2dramatic_1509_librivox,Frivol-mag-097cbz,YogaVasistha-HindiAudiobook-Prakaran3-Utpatti,FaizAhmadFaizPoetryByArshHassan,GCLeongGeography,astrophysicsforpeopleinahurrybyneildegrassetysonpdfdrive.com,FourVedas-SanskritTextWithHindiCommentaryByPanditJaydevSharma,TablaLoopsForComposingMusic,LauteHueMusafir-Hindi,taboo00viol,20201201_20201201_0844,Mature_Ladies_Adult_Photo_Magazine_Volume_14,AXSM_mahabharata-part-1-gita-press-gorakhpur,loona_202209,crimeandpunishme02554gut,tihpodcastMonMar042019,sophiesworld0000jost,labyrinthofevils00jame,batman-the-long-halloween,aliens-colonial-marines-technical-manual,PDJamesBBCRadioDramas,dojing16-ff1,ABriefHistoryOfPakistan,ladywiththedog_1301_librivox,60-no-longer-human,hhgttg-ab,cd_to-kill-a-mockingbird_malchicks,Tolstoy-Anna-Karenina-Parts-1-4-hindi,TheBookOfMirdad,marvel-encyclopedia-new-edition_202312,ENGLISHGRAMMARINUSEINTERMEDIATE,talkingamericanc00carb,oceanof-pdf.com-trading-in-the-zone-master-the-market-wit-mark-douglas,khaldia-library9,artinneedleworkb00dayl,my-friend-dahmer,doujin_Mom_Please_Punish_Me_Again,foundation00asim_0,passionate_pilgrim_cal_librivox,carnalcomicsgingerlynn_201908,adventuressherlockholmes_v4_1501_librivox,AtTheMountainsOfMadnessAGraphicNovel,h-gal_images,manssearchformea0000fran_p2h1,BBC_Radio_6_Music_20161003_200000_Gideon_Coe,NeilDeGrasseTysonAstrophysicsForPeopleInAHurry_201904,06Feb2018145634,Garuda-Comic,kiterunnerkhaled0000unse_d0h2,the-illusions-of-postmodernism-terry-Eagleton-z-library,paraspattharh,auaben0010,in.ernet.dli.2015.283232,Barely_Legal_2014_06,ruemorgue_rtx_librivox,teachingsofthetaoevawong,327417477WilliamGoldingLordOfTheFliesPdf,MystAffStyles,HotPoppinPregnancyFetishD.D.TeoliJr.A.C.1,osho-love-freedom-and-aloneness-the-koan-of-relationships-2002,MadameBovary,BaitEng,in.ernet.dli.2015.403747,fouragreementsp00ruiz_0,20211213_20211213_0513,ProblemsOfPhilosophyTheBertrandRussell,jaishankarmamtahindi,onehundredyearso0000garc_y5v5,nightflightsaintexuperyantoinede1900,04-prakaran-16-mazi-atmakatha-dr.-babasaheb-ambedkar,Underworld-ChilledMix,JoeOrtonsLoot,WATTBBCR4,bbc-sci-fi-radio-plays-part-eight,EP6LessonsLearntStealLikeAnArtist2204201822.49,withoutfearlifet0000naya,MahavidyaMahakaliMantraTantraSadhnaEvamSiddhiByShriSumitGirdharwalJi,MastermindHowToThinkLikeSherlockHolmes,lp_the-hobbit_jrr-tolkien-nicol-williamson,kiterunner0794hoss,politicalthought00bark,nude-exploeation-1,legrandromanindi0000shas,KishorKumarHits,in.ernet.dli.2015.539221,marcus-aurelius-emperor-of-rome-martin-hammond-diskin-clay-meditations,hookedhowtobuild0000eyal,psychoanalysis_1710_librivox,SachitraSamudrikRahasyaBhashaTikaJyotishPrakashan,learn-korean-language,DownloadFile_201704,discourse_inequality_ej_librivox,ROoI_gyata-se-mukti-of-j.-krishnamurti-by-harish-krishnamurti-foundation-varanasi,ageofinnocence_2007_librivox,littlelameprince0000miss_i1b6,MoreHowToDrawMangaVol.1TheBasicsOfCharacterDrawing,billie-eilish_202109,pirekamilperfect0000ahma,killerinstinct0000barn,premchandvardanhindi,The_Silmarillion,tuesdayswithmorriefulltext,hustler-39-s-taboo-2014-11-12,hungrytide0000ghos,Fugmans-stories,tihpodcastTueMay052020,RAE83BeatlesWhite,intimacy-trusting-oneself-and-the-other-by-osho,jahangiramarchit0000anan,Jadu-Ki-Duniya-The-Evil-Eye-Black-Magic-Jinn-Urdu-audio-lecture,pyar_ki_niv_hindi_kahani_stories_in_hindi_hindi_moral_story_hindi_kahaniya_-176063475647294771,petits-contes-pour-grandes-personnes-hd,lp_movie-melodies-of-madan-mohan_madan-mohan-lata-mangeshkar-manna-dey-mohd,haunting-adeline_202405,taormino-t.-the-anal-sex-position-guide-2009,faizan-e-namaz,PrafullaKolkhyanKITANEPAKISTAN,dogmeetrituelde01lvgoog,ThePremonitionsBureauBBCr4,HamOnRyeByCharlesBukowski,TheManInTheBlackSuitStephenKing,BigBusinessLark,beppe-cunico-passion-love-heart-soul-2020,AgathaRaisinBBCr4,SteveGardinerBBCr4,miracleoflovesto00ramd,20seikishonentwe0000uras_k5w1,caligula0000albe,VirginiaWoolfARoomOfOnesOwn2015,americandictiona01websrich,decline_fall_1_0707_librivox,revoltofangels00fran,flash-gordon-sunday-newspaper-strips-1934-1935-76-weeks,warren-vampirella-099,marvel-skin-pack,unfuck-yourself-audiobook-by-vaibhav-khade.-7z,1960sOHSii,sophies-world,FigureDrawingForAllItSWorth_20180306,BBC_Radio_6_Music_20170417_200000_Gideon_Coe,xxz97ziotea725beze84kjzngoqlnw8oxlconfis,animalfarmtamsingreigatobyj,indistractable_202405,darkmatternovel0000crou,castle00kafk_2,whattodrawhowtod00lutz,20230717_20230717_1439,DashtESabaByFaizAhmedFaizUrduinpage.com,encyclopediaofvedicastrologyyourprofessionupsanddownsshankeradawal_202003_732_w,haunting-adeline-cat-and-mouse-duet,teenyakkeurdugulshannanda,allfnafbooks,AHistoryOfSufismInIndiaVol.OneSaiyidAtharAbbasRizvi,TheSufferingOfBeingKafka,summary-jannat-ke-pattey,belovedprophetlo00gibr,HamaraMulk,EdwardBernaysWomenSmokingAdCampaignPropaganda,in.ernet.dli.2015.464271,OTRR_Suspense_Singles,40_Something_SP254,MiratUlUroosByDeputyNazeerAhmad,shakespeareworks01claruoft,Zakoula-Greek-Translated-Adult-Comics,MarkFisherCapitalistRealismIsThereNoAltbOk.org,pehli-barish-nasir-kazmi,immortals-of-meluha-marathi,wahrheitpfad_buddha_librivox_1007,WhatToSayAfterYouSaidhello,podcast_life-with-books_forty-rules-of-love_371912994,dni.ncaa.SAK-795_1-AC,LESTINIRMALA,VivaldiWinter,TheProphetGibran,rknarayan-guide-hindi,Revolution2020ChetanBhagatdldqps.tk,DoctorWhoMagazines,mashiandotherst00tagogoog,cu31924079747485,in.ernet.dli.2015.348749,notesofdirtyoldm00buko,Pon-Pon1,palaceofillusion00diva,haebyonuikapukak0000mura,arabiannights10_1907_librivox,36-mansur-yaman-kalyan-1-pata-tore-karan-bengeri,king-of-pride,SteelyDan-KMETBroadcast1974,in.ernet.dli.2015.303002,Gmail_201611,anton-chekov-plays-in-hindi-raduga-1985_202408,lajjatasleemanas020901mbp,finally-legal-2008-12,EvergreenHitsOfDevAnandsungByKishoreKumar,AAJKEURDUSHAYARHINDI,sapiens-a-brief-history-of-humankind_202311,manga_BoingBoingTeacher-c01,allencarrsquitsm0000alle,KhudaKiBastiUrduNovelByShoukatSiddiquiZemtime.com,TeriYaadPoetryCollectionByMohsinAftabKelapuri,in.ernet.dli.2015.444382,podcast_audiofile-magazine_metamorphosis-by-franz-kafka_408834576,MeraGhumHiAakhirMereKaamAaya,blackhole0000burn,Taboo_Old_and_Young_Issue_02_2017,nativeamericanme0000moer,biography_of_APJ_Abdul_Kalam,in.ernet.dli.2015.446933,lp_the-four-seasons_antonio-vivaldi-leonard-bernstein-the-new,beyond-duality-the-art-of-transcendence,whitetiger00arav,7th_anniversary_collection_1208_librivox,redrising0000pier,s01e01thetestamentsomnibus,JulusPhanishwarNathRenu,Decagonal_Frequencies,beyondgoodandevi04363gut,GabrielGarciaMarquezCienAnosDeSoledad,XAHH_kaal-chetana-amrita-pritam,secret-window-secret-garden,in.ernet.dli.2015.379675,Barely_Legal_2016_09_Original,sriramakrishnaam0000anan,illustration-deconstructs-new-book,jungle-taitei-complete-manga,copy-of-metasex.-issue-1,inspector-thorn-the-lucas-testament-michael-robson,TheCollectiveUnconsciousAndItsArchetypes_100,lifeofantony_1308_librivox,LaMetamorfosi,disciplinedtrade00doug_0,gravitysrainbow00pync_0,PlayboyUSAOctober2013TheCollegeIssue,ENGLISHQuestions_201801,alex-hirsch-gravity-falls-lost-legends-2018-1368021425-9781368021425-libgen.lc,controversy_1011_librivox,zinesvolumetwozi00vval,harem-pylate,Arthashastra_Of_Chanakya__Other_Books,GulzaarKiKavitaJabMaiChhotaTha,17-the-alchemist-bonus-1,ChauthiKaJoda,it-starts-with-us-life-feeling,MapsofMeaning2017,AdharByPremchand,isbn_9780470108543,arina-tanemura-illustration-making-book,SEX_1926-11_Darwination-McCoy,allen-carr-the-illustrated-easyway,knowledgeexternalworld_1508_librivox,Psychotronic_Video_04,ParizadCompletSigned,mundan-harishankar-parsai,jane-austen-pride-and-prejudice-stevenson,MachiavelliNiccoloThePrinceEN1513239P.,ZAhmedUrduPoetryPodcast_1,scanned-document-49_20200910,poesia-completa-jorge-luis-borges-z-lib.org,lp_laila-majnu_madan-mohan-jaidev-ambar-kumar-anuradha-az,ac_goetia,ltxR_kirpal-kaur-novel-punjabi-by-bhai-pratap-singh-punjabi-novel-company-aamritsar,YatharthGeetaBengaliAudio,rani-tatt,hinduism_and_buddhism_vol2_2011_librivox,goddelusion0000dawk_k1d9,BoodhiKakiPremchand,1234_20190925,clashofkings0000mart,audio_poetry_62_2006,berman-l.-loving-sex.-the-book-of-joy-and-passion-2011,caligula-albert-camus-1992,5678_20190907_20190907,r7l1h7xxfzedh44pgrcpodcpqe9ycrauqdmlvbzs,BOYSCompressed,artoffencing01sena,indianconstituti0000aust,SalokBhagatKabirJioKe,newtonphilosophy00pembuoft,Metasex,MarathiNovelAudioBookMohaAttractionGenreRomance,BBCr4ShardlakePlays,in.ernet.dli.2015.342907,play-den-january-2021,the-emerald-tablet-of-hermes,cd_lost-kingz_thagodfahim-architect-13-c-lance-dj-muggs,milmanual-us-marine-corps---mwtc-winter-survival-course-handbook,HistoryAgricultureIndia1,flash-gordon-1934-1947,idle_thoughts_librivox,incest-magazine-special-daddys-girl-2,cheeks-volume-298-2021,mysticism00russuoft,newsextherapyact00kapl,SamuelBeckettEndgame_20190206,Playboy_December_2014_ZA,rolfe-dewolfe-mech-folder-incomplete,cd_best-of-saint-saens_camille-saintsaens-eugene-goosens-philharm,images_20230810,cu31924052393315,gentlemaninmosco0000towl,short_scifi_32_1001_librivox,theleopardinautumnseries1,KavitaHarishankarParsaiAakhirPayaToKyaPaya,AstroPalmistryBYMIHIRACHARYA,TheWonderThatWasIndiaByALBasham,in.gov.ignca.44048,Abdullah-by-Hasim-Nadeem,in.ernet.dli.2015.345839,dracula_v4_1903_librivox,Episode1-LailaMajnu-Part-kathbhitrakaGeetharutimesFm90.6Mhz,oshofirstbuddhai0000deva,MardaneArabHindiVolumeNo.2,Bhimsen-Joshi,b9cbgwtavhcxzngis0r0caktawp6wssbkqefsycs,in.ernet.dli.2015.458322,al-aqidah_al-thahawiyyah_202002,ERO-13,very-special-prison,thebirthoftraged00nietuoft,larken-rose-the-most-dangerous-superstition-iron-web-publications-2011,cd_gangs-of-wasseypur_sneha-khanwalkar-piyush-mishra,MusnadAhmadIbnHambalTarjamahByShaykhMuhammadZafarIqbal,poisonedbreadtra0000unse,lp_saraswatichandra_kalyanji-anandji-chorus-lata-mangeshkar-ma,the-stranger_202404,stovegodcooksrocmarcianoifthesekitchenwallscouldtalk,Gauranpuransaroddhar,ResidentEvilComicBookCollection,elalquimista0000coel_x4e8,naked-in-nature-004,indias-struggle-for-independence_202106,isbn_055322638,SlammedAudioBook_ESHAYAT,YamadaShojiTheMythOfZenInTheArtOfArchery,indias_love_lyrics_1905_librivox,in.ernet.dli.2015.435939,ezra-pound_202209,A.EWaiteTheDoctrineAndLiteratureOfTheKabalah,oshonotesofmadma0000bhag,barely-legal-january-2022,Sight_And_Sound_2014.05_Jean_Harlow_Hollywood_before_the_censors,rich-dad-and-poor-dad,system-change-a-lit-rpg-adventure-system-universe-book-1,TheArtOfLoving,RangeelaRasulpdf,us_history_vol1_librivox,baldursgate-dia-5e,beginnersenglish00noli_1,timburtonsnightm00timb,meeraji-ki-nazmein,javed-akhtar-interview-air-april-11th-2020-on-dil-ki-awaaz,manga_Domestic_na_Kanojo,podcast_better-living-through-books_episode-1-thinking-fast-s_381165011,notesonindianhis00marxuoft,datpiff-mixtape-m3bc3a91,krishnakey0000sang,siddhartha02500gut,TheMagicOfThinkingBig,passage_to_india_2207_librivox,BBC_Radio_2_20160913_053000_The_Chris_Evans_Breakfast_Show,indiaancientpastbyrssharma,AbeLymanCollection1925-1934,priyanshi-jain_20230926_1551,pdfy-RtCf3CYEbjKrXgFe,manga_Berserk-v10,draculabr00stokuoft,1681939-images,jungle-fantasy-annual-20172017digi,dream_within_dream_librivox,andmountainsecho00khal,we-the-people-nani-a-palkhivala,01Scofield1917MatthewNT,raj-comics-anthony-collection,NafsanayByQudratUllahShahabUrduShairi.com,Teen_Spirit_001,milf-part-3-fall-semester,incest-magazine-special-oedipussy-2,wg847,premchandsajjanatakadandhindi,rainermariarilke_poems_1509_librivox,Dean_Yeagle_Scribblings_vol._3_sketchbook,historyofmagicin00lv,UttarakhandKaSona-Baanjh-Hindi,OTRR_Tarzan_Singles_TLotJ,Panty_MILFs_Adult_Photo_Magazine_Volume_2,the-rise-of-the-dragon-george-r.-r.-martin-au,watchmen,HeerWarisShahPt1AbidaParveen,dli.ernet.438834,milkhoney0000kaur_k2f2,firstman00camu,the-complete-daredevil-collection,psychopathologyo00freuuoft,in.ernet.dli.2015.478799,meenakshijainmedievalindia2002ncert,HindiBook-meera-Sudha-sindhu,greta-thunberg-turn-off-lights-nano-d.-d.-teoli-jr.-a.-c.,thephilosophyofi47880gut,empireofbusiness_2010_librivox,power-les-48-lois-de-pouvoir-robert-greene_202109,ZBNFHINDI,the-history-of-art-janson,andrewloomiscreative.illustration,Psychotronic_Video_33,Brazil_Sexotics_Adult_Photo_Magazine_November_2017,BhagvadGitaNotesComplete-GaurangaPriyaDasa,ElPrincipitoAntoineDeSaintExupery,3rdBrother-GraphicNovel,divinemercyinmys00faus,CrimeAndPunishment1866Dostoyevsky,volume-5,baburnamainengli01babuuoft,KhutbaMyanmarMusolmanderNirjatonByProf.Dr.M.AsadullahAlGhalib18.11.2016,058_20220806_20220806,lighthouse_contemporary_reviews_2310_librivox,leonardcohen-thanksforthedance2019_201911,timefortomorrow00ross,andthentherewerechri00chri,HyMm_psychology-of-music-report-of-seminar-january-1975-by-various-authors-sangeet-na,michael-jackson-discography-1972-2009,KhazaneValaTapu-Comic-Hindi,little_wars_librivox,TheMonkWhoSoldHisFerrariAudiobook,NQQz_swami-vivekanand-ki-vani-by-swami-brahmasthanand-ramakrishna-math-nagpur,fritjof-capra-tao-of-physics-ocr,naqshifaryadi00faizuoft,everything-i-know-about-love-dolly-alderton,ethicalbrain00gazz,ShockCinema192001,Vulture-NoLongerHuman,ImcOnairPresents...RabindraSangeet-AVoiceForAll2009Part13,HindiBookNityaKarmPoojaPrakashCompletebyGitaPress,autobiographyofa07452gut,04TheHouseOfHades,XXXApartmentsEpisode3,wihq_schoolom-ko-patra-part-2-by-j-krishnamurthy-2001-india-krishnamurthy-foundation-trust,pdfcoffee.com-the-lost-book-of-herbal-remedies-by-nicole-apelian-claude-davis-z-liborg,in.ernet.dli.2015.307292,comoleerelcuerpo0000ohas,isbn_9780671701185,parmanu,Paksindh,flowersforalgern00keye,gundam-mobile-suit-bible-01,story_keller_librivox,how_we_think_la_1512_librivox,nm_20240312,HealthPsychology2ndEdgnv64,SecretsOfTheSelfAsrarEKhudi,eminem-the-death-of-slim-shady-coup-de-grace-eminem-the-death-of-slim-shady-coup,the-book-of-women-osho_202309,in.ernet.dli.2015.304978,the-secret-science-of-numerology-the-hidden-meaning-of-numbers-and-letters-pdfdrive,artofthinkingcle0000dobe_b3z7,in.ernet.dli.2015.484032,missionaries-in-india-continuities-changes-deilemmas-arun-shourie,my-gita-explained-2,bookofusefulplan00rogerich,hustler-39-s-taboo-2014-09-10,thegrandinquisit08578gut,lp_purab-aur-pachhim_kalyanji-anandji-asha-bhosle-brij-bhushan,consolationsofph0000debo,IshqKaAinAleemulHaqHaqqi,lettertofriend00sain,greatindiannovel00thar,The_Urban_Sketcher_Techniques_for_Seeing_and_Drawing_on_Location_by_Marc_Taro_Ho,hpot_librivox,SarveshwarDayalSaxenaKiKuchKavitayen-Hindi,bharat-ka-samvidhan-hindi-salil-anil-kumar-z-library,Complete_Works_of_Jibananda_Vidyasagara,grimm_fairy_tales_1202_librivox,Gulzar_201705,omen_of_the_stars_05_-_the_forgotten_warrior-2,MohenjodaroKiMaya-Hindi,MADILOG,english-idioms-in-use-intermediate-book-with-answers-2017,historyoflatinam005150mbp,TheCycleOfSpring,islam-said-havva__1304255878060831,attitudeiseveryt0000kell_l2d9,influencescience00cial_1,venice-ka-saudagar-rangey-raghav-1,TheMadman-English-KhalilGibran,in.ernet.dli.2015.361009,pdfy-45Yz653E8l86bAEM,BardcastTwelfthNight,gabrielgarcamrqu0000unse_w4u6,the-indian-war-of-independence-of-1857-veer-savarkar-1.30.38-pm,completeprophecinost,attitudeiseveryt0000kell,CHINAH,yashpalmeriteriuskibaathindi,HHBD_201911,norwegianwood0000mura,Bat_Man_by_Lew_Merrill_1936_2002_Reprint,Bukowskicollection,vedant-darshan-brahma-sutra-gita-press-gorakhpur,HustlersTabooUsa20150910,the-will-to-change-men-masculinity-and-love-by-bell-hooks-z-lib.org.epub,tagorereader0000unse,beautifulbastard0000laur,kino-nr-9-2007-wrzesien-september,in.ernet.dli.2015.443822,t9-t9,goldfinch0000tart,rina-kent-god-of-malice-z-lib.io,blackbeauty_librivox,thusspakezara00nietiala,AlQuranWithBengaliBanglaTranslation-ReciterMisharyRashidAl-Afasy,alchemistfableab00coel,18-eighteen-magazine-october-2017,vo-sala-khaddarwala-ved-prakash-sharma-merath,bulfinch_myth_age_fable_0810_librivox3,in.ernet.dli.2015.396984,an-introduction-to-indian-philosophy-satischandra-chatterjee-dhirendramohan-datta,IntroductionToNutritionBook,tokyoghoulmangacomplete,childrenshomerad00colu,AakhrEShabKeHumsafar,Horny-Aunty-By-Desigandikahani.blogspot.com,jyotishlalkitabb.m.gosvami,wg789,rock-melodic-radio-aor-melodic-rock-hard-rock-recorded-radio-2023-03-19-14-21-16,songofachilles0000mill,Psychotronic_Video_06,OSHO_Udio_Pankh_Pasar,GoneGirl2014_201501,TheAltarOfVenus,UnderstandingPatriarchy,HindiBookSankshiptYogaVasisthaByGitaPress,charles-dickens_david-copperfield,Rigvedcollection,phish2024-08-16.Munda.mk4v.PSP2.flac24,TheSecretbook,50Plus_MILFs_No224_-_Original,confession_1505_librivox,judge-dredd-the-day-the-law-died-2-2,gujarat-no-nath-merged-kanaiyala-munshi-gujrati,lawofsuccess0000hill,the-monk-who-sold-his-ferrari-a-fable-about-fulfilling-your-dreams-reaching-your,adult_201701,dli.calcutta.10944,BraveNewWorldByAldousHuxleyAudioBook4Of7,BasicEnglishGrammarERWINHARIKURNIAWAN,kamsutra-book-in-hindi,isbn_0671752847,stealingfirehows0000unse,ZarLataShumZarZal,AakhiriPadaav-HindiStoryBook-KahaniSangrahaByShubhashNeerav,spree-v-1-n-9-1959-0040a,thoughtsonpakist035271mbp,douglas-adams-the-hitch-hikers-guide-to-the-galaxy-vinyl,paul-temple-and-steve,goddelusion0000dawk_o9r0,lord-of-the-mysteries,cdromxn26diciembre1997,vocabularyofengl00barnrich,dni.ncaa.SAK-575-AC,adolfhitler-meinkampfband1-horbuchdeutsch,story_mankind_0906,TFR1098-VaginalCadaver-PornTunes,dni.ncaa.SAK-924-AC,confessions_augustine_0911_librivox,the-invisible-life-of-addie-la-rue-by-v-e-schwab,richdadpoordadwh0000kiyo_t8n6,in.ernet.dli.2015.218475,sandmanvol4seaso0000gaim,ALifeOfBlissBbc,sexmanualforpeop0000ivor,GhazaliyaatEMeerTaqiMeer,Barely_Legal_2014_09,the_invisible_man_2102_librivox,HistoryOfMuslimPhilosophy,biopsychology,Bhagawat-Gadya-Marathi-Skandha01,historymodernphilosophy_2101_librivox,yDZK_nave-kiran-by-v-s-khandekar-marathi-1947-r-j-deshmukh,taraqqipasandadab,briefhistoryofti0000hawk_n1e8,sadhguruji01,pluto_20231110,harrypotterdeath0000rowl_z5e5,h97h85axqlqjf60ss1r9ubi7tktubonj7c0tcmxc,sex-a-manual,Score_Big_Boobs_Winter_Catalog_2015,mangalsutrapremchand,nicomachean_ethics_ge_librivox,mrutyunjay,DeathOfTheFamily_201804,KamakhyaMantraSadhanaEvamSiddhiInHindiByGurudevShriYogeshwaranandJi,BBC_Radio_6_Music_20160914_200000_Gideon_Coe,onliberty00inmill,idiotfyoddoordos0000cons,mayfair-volume-38-issue-10,the-prophet-by-kahlil,oedipusplays00soph,ThinkOnTheseThingsByKrishnamurti1.pdf,python-data-science-handbook.pdf,maskoflove0000barb,arvopartfratres_202103,indianrenaissanceindiasriseafterathousandyearsofdeclinesanjeevsanyal_897_P,podcast_book-club-shmook-club-talkb_bcsc-65-the-devil-whit_364184443,jojosbizarremarriedlifeclamp,war-of-lanka-ram-chandra-series-book-4-by-tripathi-amish-pdfread.net,umbrearlypoemsof00pounrich,startrekencyclop00unse,StarTrek-Contact-3,tintin-breaking-free,aperfectspybbcr4,IMPROVISEDWEAPONSKURTSAXONTHECOMPLETECOLLECTIONGRANNDADSPMJBSURVIVORGREATSTHERUSSIANS,GarudaPuranamSimpleTelugu,akira-toriyama-the-world-anime-special,three_little_pigs_librivox,Realmbreaker,meishaonuirasutonoriarunajibyinhe,2018Fundamentals.ofPython,1133_20191022,FreemasonryAndJudaismSecretPowersBehindRevolutionVicomteDePoncins_201609,TerrenceRattiganBBCr4,scanned-document-25,rigormortisbbcr4,m6xp0ege2fxgokoxfvpntzxeeyznvoppkucaobzw,faithfamilydutch00robe,windsandstars00sain,priyanshi-jain_20230926_1606,globalizationofw0000unse_g5k1,ArunaLama-UdiJaunBhane,homo_sapiens_romantrilogie_1508_librivox,the-creative-act-a-way-of-being-by-rick-rubin,auguste_comte_positivism_bb_librivox,HolyQuranEnglishTranslation,it0000king,the-world-of-fatwas,AnarchismRadicalFeminism5,chapter-1_202106,the-art-of-h.-p.-lovecraft-s-cthulhu-mythos,TheKeyToTheMysteries,osamu-tezuka-complete-manga-works_202307,genkosha2019,Sexy_Pussy_No_2_Special_Extreme,dni.ncaa.SAK-739_2-AC,in.ernet.dli.2015.184765,theuseofknowledgeinsociety_2406_librivox,NidaFazliAndShailshJi,manaralibrary0004mana,dasschlossfranzkafka1953,KavitaGopaldasNeeraj,santa-lilio-sangre-ayami-kojima-artworks,cd_solar-system_rockn-learn,ego-is-the-enemy-by-ryan-holiday,Psychotronic_Video_15,pdfy-kxJuN00KtPU1iooO,ov57cgids7eyfofixzr7t9f6d7rztcirxusurf,ack-bhagawat-the-krishna-avatar,in.ernet.dli.2015.307309,Book1969LiewellynAToZHoroscopeMakerAndDelineatorKPRedIt,G.BachelardThePoeticsOfSpace,terminator-now-005-the-burning-earth,rosswilsonanatom0000waug_y8r9,in.ernet.dli.2015.304730,podcast_audiolibros-online_-audiolibro-la-metamorfos_1000419448496,glasscastlememoi0000wall_d1r4,YatharthGeetaKannadaAudio,hard-times-create-strong-men-stefan-aarnio,principlesofphys00pjep,NayyaraNoor--AeJazbaEDil,14.MuhammadBinQasim1Pdfbooksfree.pk,comedyoferrors_1011_librivox,in.ernet.dli.2015.404047,shibram-chakraborty-hindi-story-audiobooks,beholdapalehorsebymiltonwilliamcooper1991_202003,collected-stories-franz-kafka,Episode50KrishnaAndKarna,ChiefKiDaavatBheeshmSahni,raj3elsad-Sa7e7Trgheb2,champak-august-first-2006,OTRR_Jerry_of_the_Circus_Singles,Jitendra-Abhisheki-marathi-song,familiesoffrench00swan,ChapelPerilousSerial-NewUploads,GovernmentGazetteOfUttarPradesh,b24926747,01.-kamyu-alber-padenie,erotica_of_osamu_tezuka,hound_baskervilles_librivox,AnnihilationOfCaste-Munnurai1,breast-stories-by-mahasweta-devi-mahasveta-debi-gayatri-chakravorty-spivak,AutobiographyOfAYogiHindi_201703,Unitarian_Universalist_Church_of_Lexington_s_Podcast-11557590_10_23_the_courage_,the-power-of-your-subconscious-mind-joseph-murphy-complete-hindi-audiobo-128k,marryhimcasefors00gott,RaversUniformSpecialIssueNo1Superuk,beyond-enlightenment-osho_202101,HindSwaraj-tag-2-08-,YaramBySumairaHameed,Total_Film_and_SFX_Present_80s_Movies_2015_UK,ozx01h029gi6xmbrgkzs8njhyo0u9bmzcpajo7tp,deadpool-samurai,OmChanting,BeyondOurKenCompleteSeries4,hindswarajorindi00ganduoft,AlanMooreEssentials,BodyLanguageAllanPease,behaviorinorgani0000gree_l2i4,sim_playboy_january-1969-december-1973_16-20_cumulative-index,tendingheartofvi00guro,a-biography-of-the-prophet-of-islam-in-the-light-of-the-original-sources,horror_003_librivox,wutheringheights_1306_librivox,best-of-pamela-anderson,kamasutraidiotsguide,mrspaceship_pc_librivox,the_house_with_the_mezzanine_and_other_stories_1309_librivox,prernanuzharnutw0000drji,JoeOrtonsEntertainingMr.Sloane,LucentsGeneralKnowledgeWww.qmaths,bible_kjv_01_02_03_0908_librivox,belampuntoyourse00osho,famous_men_rome_0803,MantoKutteKIDuvaMadhavi,StrayBirds,vinland-saga-01-107,mansoor_p.l.deshpande,ost-business-core-concepts-of-marketing,kriya-yoga-the-science-of-life-force-pdfdrive,ost-english-timemachineinven00welluoft,PanoramaOfIndianPainting,10-hours-hot-tub-white-noise-river-320,su-that-colleen-hoover-iusach-dich,takberat_______al3eed-------mp3,ost-english-the_idiot,i-want-to-eat-your-pancreas-2014,sexyouthsexeduca0000camp,Tagore-Instrumentals,python-crash-course.pdf-pdfdrive,consolationofphi029292mbp,phantomlover_1110_librivox,MTpa_godan-of-munshi-premchandra-bharatiya-granth-niketan-delhi,babarao-savarkar-v003,HitlerTableTalk,ovocny_strom_a_jeho_pesteni,fundamentalsoftr0000yinh,lp_plath_sylvia-plath,folkloreofcotswo0000brig,fallandoutsider00camu,sylvia-plath-street-song-www.-etoile.-app,in.ernet.dli.2015.342406,ashram_202102,vangoghselfportr00gogh,doctorwhothestonerosereadbydavidtennantaudiobook,cd_the-sea-hawk-previn-conducts-korngold_erich-wolfgang-korngold,enchanted_castle_pe_librivox,tibetan-book-of-the-dead,JOHNTODDTapeB,BegumAkhtarHindYugm,ThinkingInC,american_history_librivox,kupdf.net_232472817-robert-greene-masterypdf,autechre12hrmix,TheTryalOfMaryBlandySpinsterForTheMurderOfHerFatherFrancis,VOK499FireAndBloodWithGeorgeR.R.MartinARecap_20181209,youanovelofdarko0000kepn,dli.language.2486,super-gene-twelve-winged-dark-burning-ange,joyofgaysexi00silv,visualartshistor00hono,porn-links-updated-10-17-2022,hindi-urdu,mammothbookofero0000unse_g7g4,newfirstspanish00wormgoog,the-book-of-ram,wo-piya-se-chudne-wali-th-song-antarvasna-audio-sex-story,kino-nr-2-2006-luty-february,jamendo-097169,nusratcollection_20170412,kamasutra-ilustrado,feartrembling0000kier,gardenofkama_2104_librivox,QuranTafseerInUrduFULLDr.IsrarAhmedIntroduction,the-creative-act-by-rick-rubin,thinkbigunleashi0000cars,the-grand-bible-3rd-edition-2021,akira-book-05,herbertwest_reanimator_pc_librivox,IanHolmBBCr4,zen-and-the-art-of-motorcycle-maintenance_202105,kantproblemofmet00heid,moomin-yasuhiro-nakura-art-works_202012,dli.language.0123,manic_doujin_00014,rhetoric_ge_librivox,einsteinstheoryo00born,dramaofgiftedchi00mill_1,gayscience0000niet,hindi-shayari,Level4Emma,hindutva1923,mayfair-volume-29-issue-13-1994,elprincipito00sain,oedipuskingtext00sophgoog,doujin_Selfish_Top_and_Airheaded_Bottoms_Yuri_Smut,Mature_Ladies_Adult_Photo_Magazine_Issue_16,adrarp6zxqtvupyqtmld3g8vgdo4forq7ixdbwvx,raidas-pad-final-2,BBC_Radio_4_Extra_20170611_133000_Arundhati_Roy__The_Ministry_of_Utmost_Happiness_Omnibus,mysticismlogicot00russ,thebreakdownepisode317,KabirSahibKaSaakhiSangrah-Hindi,theprinciplesofp01jameuoft,criminalinvestigation2_1607_librivox,tintin-the-complete-companion-pdfdrive,dramaofgiftedchi00mill_0,husnuak00eyhg,razzle-vol-14-no-06,mayfair-volume-48-issue-08,kitab-ka-kafan-krishan-chander,thisexplainsever0000unse,cheri-2014,twentiethcentury00bhanrich,priyanshi-jain_20230926_1557,tafseer-mariful-quran-sura-19-maryam-english-translation-pdf,odyssey01_1711_librivox,slut-sounds-podcast-ep-20,cd_blood-meridian_numb,turns_thought_modern_philosophy_librivox,conspiracyagains0000thom' + const itemIds = 'mushayre-jaun,khushboo-parveen-shakir,meaning_201910,shayad-jaun-eliya,janan-janan-audio-book,ShivKumarBatalviHindYugm,yaani-ghazals,shiv-kumar-bbatalvi,adabi-interviews,gumaan-ghazals,BalKavitaChooheKiDilliYatraRamdhariSinghDinkar,ghazals_ghalib_0809_librivox,satya-ke-sath-mere-prayog,LekinByJaunElia,baileyscafe00nayl,baileyscafe000nayl,ost-english-metamorphosis-by-franz-kafka,ShaidByJaunElia,in.ernet.dli.2015.63318,franz-kafka-the-trial,selectedshortsto00fran,godan-by-munshi-premchand-gyannidhi.com,franzkafkasmetam00bloo,in.ernet.dli.2015.499492,poems_1706_librivox,MahaGeetaByOshoInHindiPart1,12RulesForLifeJordanB.PetersonAnAntidoteToChaos,in-the-company-of-a-poet-by-kabir-nasreen-munni,osho-literature-in-hindi,HindiBook-ashtavakraGeeta.pdf,rand-ayn-the-fountainhead,StoriesByPremchand,norwegianwood00mura,KafanPremchand' const ids = itemIds.split(','); let batch = db.batch(); diff --git a/functions/recommendation/collaborative.js b/functions/recommendation/collaborative.js index 04eed0d5f..3572bad62 100644 --- a/functions/recommendation/collaborative.js +++ b/functions/recommendation/collaborative.js @@ -24,7 +24,7 @@ const db = getFirestore(); const EVENTS_OF_INTEREST = ['read_item', 'play_item', 'add_favorite']; const ACTIVE_USER_THRESHOLD_DAYS = 60; -const SIMILARITY_THRESHOLD = 0.3; +const SIMILARITY_THRESHOLD = 0.45; async function calculateCollaborativeRecommendations() { try { @@ -220,7 +220,7 @@ async function saveRecommendations(userId, recommendations) { return; } - const userRecommendationsRef = db.collection('recommendations').doc(userId).collection('collaborative'); + const userRecommendationsRef = db.collection('user_recommendations').doc(userId).collection('collaborative'); try { const batch = db.batch(); diff --git a/functions/recommendation/content_filtering.js b/functions/recommendation/content_filtering.js index d9bff41dc..2a7a18f88 100644 --- a/functions/recommendation/content_filtering.js +++ b/functions/recommendation/content_filtering.js @@ -50,14 +50,37 @@ async function generateContentBasedRecommendations() { const activeUsers = await getActiveUsers(); console.log(`Found ${activeUsers.length} active users for content-based recommendations`); + let allUserItemIds = {}; + for (const userId of activeUsers) { + const userInteractions = await getUserInteractions(userId); + allUserItemIds[userId] = userInteractions.map(interaction => interaction.item_id); + const userProfile = await buildUserProfile(userId); console.log(`Built user profile for user ${userId}:`, JSON.stringify(userProfile, null, 2)); const recommendations = await generateUserRecommendations(userId, userProfile); console.log(`Generated ${recommendations.length} recommendations for user ${userId}`); - await saveRecommendations(userId, recommendations); - console.log(`Completed content-based recommendations for user ${userId}`); + if (recommendations.length > 0) { + await saveRecommendations(userId, recommendations); + console.log(`Saved ${recommendations.length} recommendations for user ${userId}`); + } else { + console.log(`No recommendations generated for user ${userId}. Skipping save.`); + } } + + // Consolidate all item IDs across all users + const allItemIds = new Set(); + for (const itemIds of Object.values(allUserItemIds)) { + itemIds.forEach(id => allItemIds.add(id)); + } + + // Log all item IDs in a single, comma-separated line + console.log('All item IDs:'); + console.log([...allItemIds].join(',')); + + // Log all user IDs in a single, comma-separated line + console.log('All user IDs:'); + console.log(Object.keys(allUserItemIds).join(',')); } async function getActiveUsers() { @@ -90,32 +113,46 @@ async function getActiveUsers() { AND FORMAT_DATE('%Y%m%d', CURRENT_DATE()) AND event_name IN (${EVENTS_OF_INTEREST.map(event => `'${event}'`).join(',')}) ) - LIMIT 5 + LIMIT 500 `; const [rows] = await bigquery.query({ query }); return rows.map(row => row.user_id); + // For testing purposes, return a fixed set of user IDs + // return [ + // '2fc6c7a7e7e101d923f017cc4df1f786', + // '29643dbf9a3146472e0d9ef74de5b1aa', + // 'a9896783fb0aa798f6f80b389bfd83d8', + // '81bf680912fce21ecaf97ae0681fbd41', + // '9b01d4fa48d1af95a158e1bf58537fb0' + // ]; } async function buildUserProfile(userId) { const userInteractions = await getUserInteractions(userId); + console.log(`Retrieved ${userInteractions.length} interactions for user ${userId}`); const profile = { - subjects: {}, - creators: {}, - languages: {}, - collections: {}, - formats: {}, - keywords: {} + subject: {}, + creator: {}, + language: {}, + collection: {}, + mediatype: {}, }; - + for (const interaction of userInteractions) { const itemMetadata = await getItemMetadata(interaction.item_id); + console.log(`Processing item ${interaction.item_id}`); + if (!itemMetadata) { + console.log(`No metadata found for item ${interaction.item_id}`); + } else { + console.log(`Retrieved metadata for item ${interaction.item_id}:`, JSON.stringify(itemMetadata, null, 2)); + } if (itemMetadata) { - updateProfileCounts(profile.subjects, itemMetadata.subjects); - updateProfileCounts(profile.creators, itemMetadata.creators); - updateProfileCounts(profile.languages, itemMetadata.languages); - updateProfileCounts(profile.collections, itemMetadata.collections); - updateProfileCounts(profile.formats, itemMetadata.formats); + updateProfileCounts(profile.subject, itemMetadata.subject); + updateProfileCounts(profile.creator, itemMetadata.creator); + updateProfileCounts(profile.language, itemMetadata.language); + updateProfileCounts(profile.collection, itemMetadata.collection); + updateProfileCounts(profile.mediatype, itemMetadata.mediatype); const keywords = itemMetadata.description.flatMap(extractKeywords); updateProfileCounts(profile.keywords, keywords); @@ -227,12 +264,11 @@ async function hasUserInteracted(userId, itemId) { function calculateSimilarity(userProfile, item) { let similarity = 0; const weights = { - subjects: 0.3, - creators: 0.2, - languages: 0.1, - collections: 0.1, - formats: 0.1, - keywords: 0.2 + subject: 0.3, + creator: 0.2, + mediatype: 0.2, + language: 0.1, + collection: 0.1, }; for (const feature in weights) { @@ -254,8 +290,7 @@ function calculateFeatureSimilarity(userFeatures, itemFeature) { async function saveRecommendations(userId, recommendations) { const userRecommendationsRef = db.collection('user_recommendations').doc(userId); await userRecommendationsRef.set({ - contentBased: recommendations, - updatedAt: admin.firestore.FieldValue.serverTimestamp() + contentBased: recommendations }, { merge: true }); } From 4c044fc99b54fa09bda86c6464f27e14062f45fb Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Thu, 5 Sep 2024 23:09:27 +0530 Subject: [PATCH 32/33] update compose to 1.7.0 --- .../remote/config/RemoteConfigExtensions.kt | 3 --- gradle/libs.versions.toml | 17 +++++++++-------- .../main/java/org/kafka/homepage/Homepage.kt | 2 -- .../org/kafka/homepage/HomepageViewModel.kt | 2 -- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt index 4f6b3a53a..0a7bc845a 100644 --- a/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt +++ b/core/remote-config/src/main/java/com/kafka/remote/config/RemoteConfigExtensions.kt @@ -8,7 +8,6 @@ const val RECOMMENDATION_ENABLED = "recommendation_data_enabled" const val VIEW_RECOMMENDATION_ENABLED = "view_recommendation_data_enabled" const val USE_RECOMMENDATION_ENABLED = "use_recommendation_data_enabled" const val RECOMMENDATION_ROW_ENABLED = "recommendation_row_enabled" -const val RECOMMENDATION_ROW_INDEX = "recommendation_row_index" const val RELATED_CONTENT_ROW_ENABLED = "related_content_row_enabled" const val ONLINE_READER_ENABLED = "online_reader_enabled" const val MIN_SUPPORTED_VERSION = "min_supported_version" @@ -37,8 +36,6 @@ fun RemoteConfig.isUseRecommendationEnabled() = getBoolean(USE_RECOMMENDATION_EN fun RemoteConfig.isRecommendationRowEnabled() = getBoolean(RECOMMENDATION_ROW_ENABLED) -fun RemoteConfig.recommendationRowIndex() = getLong(RECOMMENDATION_ROW_INDEX).toInt() - fun RemoteConfig.isRelatedContentRowEnabled() = getBoolean(RELATED_CONTENT_ROW_ENABLED) fun RemoteConfig.isOnlineReaderEnabled() = getBoolean(ONLINE_READER_ENABLED) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cb6414207..59157065b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,10 +3,11 @@ accompanist = "0.34.0" appupdate = "2.1.0" agp = "8.6.0" androidxhilt = "1.2.0" -androidxlifecycle = "2.8.4" +androidxlifecycle = "2.8.5" coil = "2.6.0" compose-alpha = "2024.08.00-alpha02" -compose-bom = "2024.06.00" +compose-bom = "2024.09.00" +compose-material-navigation = "1.7.0-beta01" compose-multiplatform = "1.6.11" coroutines = "1.8.1" dagger = "2.51.1" @@ -15,10 +16,10 @@ haze="0.7.3" kotlin = "2.0.10" kotlin-immutable = "0.3.7" kotlininject = "0.7.1" -material3 = "1.2.1" +material3 = "1.3.0" media3 = "1.3.1" mixpanel = "7.0.0" -navigation = "2.8.0-rc01" +navigation = "2.8.0" okhttp = "4.12.0" pdfviewer = "3.2.0-beta.1" retrofit = "2.9.0" @@ -67,7 +68,7 @@ rebugger = "com.github.theapache64:rebugger:1.0.0-alpha06" media = "androidx.media:media:1.7.0" palette = "androidx.palette:palette-ktx:1.0.0" -androidx-activity-compose = "androidx.activity:activity-compose:1.9.1" +androidx-activity-compose = "androidx.activity:activity-compose:1.9.2" androidx-collection = "androidx.collection:collection-ktx:1.4.3" androidx-core = "androidx.core:core-ktx:1.13.1" androidx-documentfile = "androidx.documentfile:documentfile:1.0.1" @@ -99,8 +100,8 @@ androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = " coil-coil = { module = "io.coil-kt:coil", version.ref = "coil" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } -#compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } -compose-bom = { module = "dev.chrisbanes.compose:compose-bom", version.ref = "compose-alpha" } +compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } +#compose-bom = { module = "dev.chrisbanes.compose:compose-bom", version.ref = "compose-alpha" } compose-runtime-runtime = { module = "androidx.compose.runtime:runtime" } compose-animation-animation = { module = "androidx.compose.animation:animation" } compose-foundation-foundation = { module = "androidx.compose.foundation:foundation" } @@ -108,7 +109,7 @@ compose-foundation-layout = { module = "androidx.compose.foundation:foundation-l compose-material-iconsext = { module = "androidx.compose.material:material-icons-extended" } compose-material-material = { module = "androidx.compose.material:material" } compose-material-material3 = { module = "androidx.compose.material3:material3", version.ref = "material3" } -compose-material-navigation = { module = "androidx.compose.material:material-navigation" } +compose-material-navigation = { module = "androidx.compose.material:material-navigation", version.ref = "compose-material-navigation" } compose-ui-test = { module = "androidx.compose.ui:ui-test-junit4" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-ui-viewbinding = { module = "androidx.compose.ui:ui-viewbinding" } diff --git a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt index f57292bfc..bb72a8ed4 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/Homepage.kt @@ -74,7 +74,6 @@ fun Homepage(viewModel: HomepageViewModel = hiltViewModel()) { AnimatedVisibilityFade(visible = viewState.homepage.collection.isNotEmpty()) { HomepageFeedItems( homepage = viewState.homepage, - recommendationRowIndex = viewModel.recommendationRowIndex, showCarouselLabels = viewModel.showCarouselLabels, appShareIndex = viewState.appShareIndex, openItemDetail = viewModel::openItemDetail, @@ -108,7 +107,6 @@ fun Homepage(viewModel: HomepageViewModel = hiltViewModel()) { private fun HomepageFeedItems( homepage: Homepage, appShareIndex: Int, - recommendationRowIndex: Int, showCarouselLabels: Boolean, openRecentItemDetail: (String) -> Unit, openItemDetail: (String) -> Unit, diff --git a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt index 1bb66a237..0a9633479 100644 --- a/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt +++ b/ui/homepage/src/main/java/org/kafka/homepage/HomepageViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kafka.data.model.SearchFilter import com.kafka.remote.config.RemoteConfig -import com.kafka.remote.config.recommendationRowIndex import com.kafka.remote.config.showFeaturedItemLabels import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.StateFlow @@ -44,7 +43,6 @@ class HomepageViewModel @Inject constructor( private val remoteConfig: RemoteConfig, ) : ViewModel() { private val uiMessageManager = UiMessageManager() - val recommendationRowIndex by lazy { remoteConfig.recommendationRowIndex() } val showCarouselLabels by lazy { remoteConfig.showFeaturedItemLabels() } val state: StateFlow = combine( From f945b4bd1e2a5712a6af6a1e70f5c39dfacff2bc Mon Sep 17 00:00:00 2001 From: vipulkumar Date: Fri, 6 Sep 2024 01:41:33 +0530 Subject: [PATCH 33/33] Resume playback from the last position when user plays it again --- .../initializer/AudioProgressInitializer.kt | 51 ++++++++++++++----- .../java/com/kafka/data/dao/RecentsDao.kt | 4 +- .../kafka/domain/interactors/ResumeAlbum.kt | 2 +- .../interactors/recent/IsResumableAudio.kt | 1 + 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/kafka/user/initializer/AudioProgressInitializer.kt b/app/src/main/java/com/kafka/user/initializer/AudioProgressInitializer.kt index 8ee4f6cc1..147f1a721 100644 --- a/app/src/main/java/com/kafka/user/initializer/AudioProgressInitializer.kt +++ b/app/src/main/java/com/kafka/user/initializer/AudioProgressInitializer.kt @@ -6,7 +6,12 @@ import com.sarahang.playback.core.PlaybackConnection import com.sarahang.playback.core.albumId import com.sarahang.playback.core.fileId import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.kafka.base.AppInitializer import org.kafka.base.CoroutineDispatchers @@ -29,22 +34,42 @@ class AudioProgressInitializer @Inject constructor( override fun init() { coroutineScope.launch(dispatchers.io) { - playbackConnection.nowPlaying + playbackConnection.playbackProgress + .filter { it.isPlaying } + .buffer(1) + .map { it.position + it.elapsed } + .filter { it % 5000 < 1000 } + .onEach { debug { "Updating recent audio position: $it" } } + .distinctUntilChanged() .collectLatest { timestamp -> - debug { "Updating progress for $timestamp" } - - playbackConnection.nowPlaying.value.albumId?.let { albumId -> - playbackConnection.nowPlaying.value.fileId.let { fileId -> - val audioItem = recentAudioDao.getByAlbumId(albumId) - if (audioItem == null) { - val audio = RecentAudioItem(fileId = fileId, albumId = albumId) - recentAudioDao.insert(audio) - } else { - recentAudioDao.updateNowPlaying(albumId = albumId, fileId = fileId) - } - } + val nowPlaying = playbackConnection.nowPlaying.value + nowPlaying.albumId?.let { albumId -> + updateRecentAudio( + albumId = albumId, + fileId = nowPlaying.fileId, + timestamp = timestamp + ) } } } } + + private suspend fun updateRecentAudio(albumId: String, fileId: String, timestamp: Long) { + val audioItem = recentAudioDao.getByAlbumId(albumId) + if (audioItem == null) { + val audio = RecentAudioItem( + fileId = fileId, + albumId = albumId, + currentTimestamp = timestamp, + duration = 0 // duration is not available + ) + recentAudioDao.insert(audio) + } else { + recentAudioDao.updateNowPlaying( + albumId = albumId, + fileId = fileId, + currentTimestamp = timestamp + ) + } + } } diff --git a/data/database/src/main/java/com/kafka/data/dao/RecentsDao.kt b/data/database/src/main/java/com/kafka/data/dao/RecentsDao.kt index cb6b12455..a790813a3 100644 --- a/data/database/src/main/java/com/kafka/data/dao/RecentsDao.kt +++ b/data/database/src/main/java/com/kafka/data/dao/RecentsDao.kt @@ -26,6 +26,6 @@ abstract class RecentAudioDao : EntityDao { @Query("select * from recent_audio where albumId = :albumId") abstract fun observeByAlbumId(albumId: String): Flow - @Query("update recent_audio set fileId = :fileId where albumId = :albumId") - abstract suspend fun updateNowPlaying(albumId: String, fileId: String) + @Query("update recent_audio set fileId = :fileId, currentTimestamp = :currentTimestamp where albumId = :albumId") + abstract suspend fun updateNowPlaying(albumId: String, fileId: String, currentTimestamp: Long) } diff --git a/domain/src/main/java/org/kafka/domain/interactors/ResumeAlbum.kt b/domain/src/main/java/org/kafka/domain/interactors/ResumeAlbum.kt index 68b56d743..4aa26a19c 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/ResumeAlbum.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/ResumeAlbum.kt @@ -29,6 +29,6 @@ class ResumeAlbum @Inject constructor( analytics.log { playItem(itemId = params, index = index) } - playbackConnection.playAlbum(params, index) + playbackConnection.playAlbum(params, index, audio?.currentTimestamp) } } diff --git a/domain/src/main/java/org/kafka/domain/interactors/recent/IsResumableAudio.kt b/domain/src/main/java/org/kafka/domain/interactors/recent/IsResumableAudio.kt index bf778143e..4a288e78e 100644 --- a/domain/src/main/java/org/kafka/domain/interactors/recent/IsResumableAudio.kt +++ b/domain/src/main/java/org/kafka/domain/interactors/recent/IsResumableAudio.kt @@ -24,6 +24,7 @@ class IsResumableAudio @Inject constructor( val files = audioDataSource.findAudiosByItemId(params.itemId) files.map { it.id }.indexOf(recentAudio?.fileId) > 0 + || (recentAudio?.currentTimestamp ?: 0) > 0 }.flowOn(dispatchers.io) }