diff --git a/002_source/ionic_mobile/.browserslistrc b/002_source/ionic_mobile/.browserslistrc new file mode 100644 index 0000000..ade7392 --- /dev/null +++ b/002_source/ionic_mobile/.browserslistrc @@ -0,0 +1,6 @@ +Chrome >=79 +ChromeAndroid >=79 +Firefox >=70 +Edge >=79 +Safari >=14 +iOS >=14 \ No newline at end of file diff --git a/002_source/ionic_mobile/.editorconfig b/002_source/ionic_mobile/.editorconfig new file mode 100644 index 0000000..09c9c98 --- /dev/null +++ b/002_source/ionic_mobile/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 120 + +[*.md] +indent_size = 2 +trim_trailing_whitespace = true diff --git a/002_source/ionic_mobile/.eslintrc.cjs b/002_source/ionic_mobile/.eslintrc.cjs new file mode 100644 index 0000000..a6db940 --- /dev/null +++ b/002_source/ionic_mobile/.eslintrc.cjs @@ -0,0 +1,15 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: ['plugin:react/recommended', 'eslint:recommended'], + parserOptions: { + ecmaVersion: 2020 + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' + }, + settings: { react: { version: 'detect' } } +}; diff --git a/002_source/ionic_mobile/.github/copilot-instructions.md b/002_source/ionic_mobile/.github/copilot-instructions.md new file mode 100644 index 0000000..b0f4b49 --- /dev/null +++ b/002_source/ionic_mobile/.github/copilot-instructions.md @@ -0,0 +1,40 @@ +# MOBILE app project + +This is a mobile app project, it is like a letter card for children to learn vocabularies + +## Tech Stack + +- TypeScript 5 +- ionic 8 +- capacitor +- react 18 +- typescript 5 +- vite 5 + +## Directory Structure + +When introducing changes to the project, always follow the directory structure below: + +- `./src` - source code +- `./src/scripts` - developer scripts +- `./public` - public assets +- `./cypress` - cypress tests +- `./android` - android app source code by ionic + +When modifying the directory structure, always update this section. + +## Guidelines + +- this is an ionic capacitor app +- this is the link to ionic docs +- this is the link to ionic react docs +- use typescript and vite +- don't use any other framework unless specifically requested +- use ionic platform specific components +- use ionic platform specific router +- use `async await` for promises +- use `async await` for async functions with `try` `catch` +- readme.md should be in the root directory +- readme.md should use markdown +- readme.md should explain the purpose of the application, the project structure, and the technologies used, adn link to the documentation for each technology +- readme.md should explain the values in the .env file diff --git a/002_source/ionic_mobile/.gitignore b/002_source/ionic_mobile/.gitignore new file mode 100644 index 0000000..4b5511d --- /dev/null +++ b/002_source/ionic_mobile/.gitignore @@ -0,0 +1,36 @@ +**/*.log +**/*.del +**/*.bak +**/*del + +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/dist + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +/.nx +/.nx/cache +/.vscode/* +!/.vscode/extensions.json +.idea + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Optional eslint cache +.eslintcache diff --git a/002_source/ionic_mobile/.prettierrc b/002_source/ionic_mobile/.prettierrc new file mode 100644 index 0000000..f488b87 --- /dev/null +++ b/002_source/ionic_mobile/.prettierrc @@ -0,0 +1,9 @@ +{ + "printWidth": 120, + "quoteProps": "consistent", + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-unused-imports-configurable"] +} diff --git a/002_source/ionic_mobile/.vscode/extensions.json b/002_source/ionic_mobile/.vscode/extensions.json new file mode 100644 index 0000000..75adeaa --- /dev/null +++ b/002_source/ionic_mobile/.vscode/extensions.json @@ -0,0 +1,21 @@ +{ + "recommendations": [ + "redhat.vscode-yaml", + "yzhang.markdown-all-in-one", + "esbenp.prettier-vscode", + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.debugpy", + "ms-python.black-formatter", + "ms-python.isort", + "ms-python.pylint", + "bierner.markdown-mermaid", + "shd101wyy.markdown-preview-enhanced", + "yzhang.markdown-all-in-one", + "matt-meyers.vscode-dbml", + "nicolas-liger.dbml-viewer", + "aflalo.dbml-formatter", + "bierner.markdown-mermaid", + "christian-kohler.path-intellisense" + ] +} diff --git a/002_source/ionic_mobile/Dockerfile b/002_source/ionic_mobile/Dockerfile new file mode 100644 index 0000000..b6aebb7 --- /dev/null +++ b/002_source/ionic_mobile/Dockerfile @@ -0,0 +1,5 @@ +FROM 192.168.10.61:5000/nvm_ubuntu:latest + +WORKDIR /app + +RUN nvm install 22 diff --git a/002_source/ionic_mobile/README.md b/002_source/ionic_mobile/README.md new file mode 100644 index 0000000..30e68d5 --- /dev/null +++ b/002_source/ionic_mobile/README.md @@ -0,0 +1,61 @@ +# README + +## environment and requirements + +- windows 10 / mac +- node 18 +- ionic 7 +- android studio 2023.3.1 + - for windows download [here](https://redirector.gvt1.com/edgedl/android/studio/install/2023.3.1.20/android-studio-2023.3.1.20-windows.exe) + +## to start dev environment + +### windows environment + +```batch +> .\scripts\win\000_clean.bat +> .\scripts\win\002_build_w.bat +``` + +### mac environment + +```bash +$ ./scripts/mac/000_clean.bat +$ ./scripts/mac/002_build_w.bat +``` + +### to update contents + +#### 1 vocabulary/connectives + +> 曾經有一個 concern , 圖解像度比較低,要講埋 + +`public/data/Lesson/content.json` + +#### 2 quiz + +> 記得講 DEBUG 果幾個點整走,同埋要解釋唔關 code 事 + +`public/data/Quiz/ListeningPractice/content.json` +`public/data/Quiz/MatchingFrenzy/content.json` +`public/data/Quiz/ConnectivesRevision/content.json` + +## to build apk + +```batch +1. sync to android studio +ionic > project > open in android studio + +# in vscode -> ionic +1. build in ionic +2. sync in ionic +3. open android studio + +# in android studio +1. open project in android studio +`./source/mobile_trunk/android` + +4. tools > build release apk +``` + +![alt text](docs/ionic_open_android_studio.png) diff --git a/002_source/ionic_mobile/android/.gitignore b/002_source/ionic_mobile/android/.gitignore new file mode 100644 index 0000000..48354a3 --- /dev/null +++ b/002_source/ionic_mobile/android/.gitignore @@ -0,0 +1,101 @@ +# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public + +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml diff --git a/002_source/ionic_mobile/android/app/.gitignore b/002_source/ionic_mobile/android/app/.gitignore new file mode 100644 index 0000000..043df80 --- /dev/null +++ b/002_source/ionic_mobile/android/app/.gitignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/002_source/ionic_mobile/android/app/build.gradle b/002_source/ionic_mobile/android/app/build.gradle new file mode 100644 index 0000000..6011e85 --- /dev/null +++ b/002_source/ionic_mobile/android/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' + +android { + namespace "io.ionic.starter" + compileSdk rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "io.ionic.starter" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + aaptOptions { + // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. + // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 + ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + flatDir{ + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation project(':capacitor-android') + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch(Exception e) { + logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} diff --git a/002_source/ionic_mobile/android/app/capacitor.build.gradle b/002_source/ionic_mobile/android/app/capacitor.build.gradle new file mode 100644 index 0000000..e72dd11 --- /dev/null +++ b/002_source/ionic_mobile/android/app/capacitor.build.gradle @@ -0,0 +1,24 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + implementation project(':capacitor-app') + implementation project(':capacitor-filesystem') + implementation project(':capacitor-haptics') + implementation project(':capacitor-keyboard') + implementation project(':capacitor-splash-screen') + implementation project(':capacitor-status-bar') + +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/002_source/ionic_mobile/android/app/debug/output-metadata.json b/002_source/ionic_mobile/android/app/debug/output-metadata.json new file mode 100644 index 0000000..a96c559 --- /dev/null +++ b/002_source/ionic_mobile/android/app/debug/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "io.ionic.starter", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-debug.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/proguard-rules.pro b/002_source/ionic_mobile/android/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/002_source/ionic_mobile/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/002_source/ionic_mobile/android/app/release/output-metadata.json b/002_source/ionic_mobile/android/app/release/output-metadata.json new file mode 100644 index 0000000..d770488 --- /dev/null +++ b/002_source/ionic_mobile/android/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "io.ionic.starter", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/002_source/ionic_mobile/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f2c2217 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import android.content.Context; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/002_source/ionic_mobile/android/app/src/main/AndroidManifest.xml b/002_source/ionic_mobile/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ce131fc --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/ionic_mobile/android/app/src/main/java/io/ionic/starter/MainActivity.java b/002_source/ionic_mobile/android/app/src/main/java/io/ionic/starter/MainActivity.java new file mode 100644 index 0000000..73e3a98 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/java/io/ionic/starter/MainActivity.java @@ -0,0 +1,5 @@ +package io.ionic.starter; + +import com.getcapacitor.BridgeActivity; + +public class MainActivity extends BridgeActivity {} diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-hdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 0000000..c4df346 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-ldpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-ldpi/splash.png new file mode 100644 index 0000000..162cd4e Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-ldpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-mdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 0000000..eb077eb Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png new file mode 100644 index 0000000..c4df346 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png new file mode 100644 index 0000000..162cd4e Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png new file mode 100644 index 0000000..eb077eb Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png new file mode 100644 index 0000000..8e4029a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png new file mode 100644 index 0000000..4e069b8 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png new file mode 100644 index 0000000..86c756a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 0000000..8e4029a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 0000000..4e069b8 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 0000000..86c756a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-night/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-night/splash.png new file mode 100644 index 0000000..162cd4e Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-night/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-hdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-hdpi/splash.png new file mode 100644 index 0000000..597e9de Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-ldpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-ldpi/splash.png new file mode 100644 index 0000000..086f65c Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-ldpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-mdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-mdpi/splash.png new file mode 100644 index 0000000..d4fb7a8 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png new file mode 100644 index 0000000..597e9de Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png new file mode 100644 index 0000000..086f65c Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png new file mode 100644 index 0000000..d4fb7a8 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png new file mode 100644 index 0000000..531a774 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png new file mode 100644 index 0000000..ec91a96 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png new file mode 100644 index 0000000..9cfbb21 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png new file mode 100644 index 0000000..531a774 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 0000000..ec91a96 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 0000000..9cfbb21 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/002_source/ionic_mobile/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable/ic_launcher_background.xml b/002_source/ionic_mobile/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/ionic_mobile/android/app/src/main/res/drawable/splash.png b/002_source/ionic_mobile/android/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000..d4fb7a8 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/drawable/splash.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/layout/activity_main.xml b/002_source/ionic_mobile/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b5ad138 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..0aa82aa --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..0aa82aa --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..1373809 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000..608b69a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..608b69a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..3136466 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 0000000..9a0481c Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png new file mode 100644 index 0000000..cdb42ce Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png new file mode 100644 index 0000000..cdb42ce Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png new file mode 100644 index 0000000..02bfc49 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..8001526 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 0000000..341f8ac Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..341f8ac Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..07a4fc5 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..c08a31d Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000..7279880 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7279880 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..2c905fa Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..cda1b84 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..241b2ea Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..241b2ea Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e136133 Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2f787fc Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000..8394b3a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8394b3a Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..afbc0ba Binary files /dev/null and b/002_source/ionic_mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/002_source/ionic_mobile/android/app/src/main/res/values/ic_launcher_background.xml b/002_source/ionic_mobile/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/main/res/values/strings.xml b/002_source/ionic_mobile/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..3b69bb9 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + lettersoup_app_poc + lettersoup_app_poc + io.ionic.starter + io.ionic.starter + diff --git a/002_source/ionic_mobile/android/app/src/main/res/values/styles.xml b/002_source/ionic_mobile/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..be874e5 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/main/res/xml/file_paths.xml b/002_source/ionic_mobile/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..bd0c4d8 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/002_source/ionic_mobile/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/002_source/ionic_mobile/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 0000000..0297327 --- /dev/null +++ b/002_source/ionic_mobile/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,18 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/002_source/ionic_mobile/android/build.gradle b/002_source/ionic_mobile/android/build.gradle new file mode 100644 index 0000000..85a5dda --- /dev/null +++ b/002_source/ionic_mobile/android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'com.google.gms:google-services:4.4.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/002_source/ionic_mobile/android/capacitor.settings.gradle b/002_source/ionic_mobile/android/capacitor.settings.gradle new file mode 100644 index 0000000..a4bdebc --- /dev/null +++ b/002_source/ionic_mobile/android/capacitor.settings.gradle @@ -0,0 +1,21 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') + +include ':capacitor-app' +project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') + +include ':capacitor-filesystem' +project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') + +include ':capacitor-haptics' +project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android') + +include ':capacitor-keyboard' +project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') + +include ':capacitor-splash-screen' +project(':capacitor-splash-screen').projectDir = new File('../node_modules/@capacitor/splash-screen/android') + +include ':capacitor-status-bar' +project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') diff --git a/002_source/ionic_mobile/android/gradle.properties b/002_source/ionic_mobile/android/gradle.properties new file mode 100644 index 0000000..2e87c52 --- /dev/null +++ b/002_source/ionic_mobile/android/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true diff --git a/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.jar b/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..033e24c Binary files /dev/null and b/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.properties b/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c747538 --- /dev/null +++ b/002_source/ionic_mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/002_source/ionic_mobile/android/gradlew b/002_source/ionic_mobile/android/gradlew new file mode 100644 index 0000000..fcb6fca --- /dev/null +++ b/002_source/ionic_mobile/android/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/002_source/ionic_mobile/android/gradlew.bat b/002_source/ionic_mobile/android/gradlew.bat new file mode 100644 index 0000000..6689b85 --- /dev/null +++ b/002_source/ionic_mobile/android/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/002_source/ionic_mobile/android/settings.gradle b/002_source/ionic_mobile/android/settings.gradle new file mode 100644 index 0000000..3b4431d --- /dev/null +++ b/002_source/ionic_mobile/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/002_source/ionic_mobile/android/variables.gradle b/002_source/ionic_mobile/android/variables.gradle new file mode 100644 index 0000000..8ef305d --- /dev/null +++ b/002_source/ionic_mobile/android/variables.gradle @@ -0,0 +1,16 @@ +ext { + minSdkVersion = 22 + compileSdkVersion = 34 + targetSdkVersion = 34 + androidxActivityVersion = '1.8.0' + androidxAppCompatVersion = '1.6.1' + androidxCoordinatorLayoutVersion = '1.2.0' + androidxCoreVersion = '1.12.0' + androidxFragmentVersion = '1.6.2' + coreSplashScreenVersion = '1.0.1' + androidxWebkitVersion = '1.9.0' + junitVersion = '4.13.2' + androidxJunitVersion = '1.1.5' + androidxEspressoCoreVersion = '3.5.1' + cordovaAndroidVersion = '10.1.1' +} \ No newline at end of file diff --git a/002_source/ionic_mobile/assets/.gitkeep b/002_source/ionic_mobile/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/assets/icon-background.png b/002_source/ionic_mobile/assets/icon-background.png new file mode 100644 index 0000000..8829de4 Binary files /dev/null and b/002_source/ionic_mobile/assets/icon-background.png differ diff --git a/002_source/ionic_mobile/assets/icon-foreground.png b/002_source/ionic_mobile/assets/icon-foreground.png new file mode 100644 index 0000000..8829de4 Binary files /dev/null and b/002_source/ionic_mobile/assets/icon-foreground.png differ diff --git a/002_source/ionic_mobile/assets/icon-only.png b/002_source/ionic_mobile/assets/icon-only.png new file mode 100644 index 0000000..29cd961 Binary files /dev/null and b/002_source/ionic_mobile/assets/icon-only.png differ diff --git a/002_source/ionic_mobile/assets/lettersoup_logo.jpg b/002_source/ionic_mobile/assets/lettersoup_logo.jpg new file mode 100644 index 0000000..a954988 Binary files /dev/null and b/002_source/ionic_mobile/assets/lettersoup_logo.jpg differ diff --git a/002_source/ionic_mobile/assets/lettersoup_logo_1024.jpg b/002_source/ionic_mobile/assets/lettersoup_logo_1024.jpg new file mode 100644 index 0000000..a954988 Binary files /dev/null and b/002_source/ionic_mobile/assets/lettersoup_logo_1024.jpg differ diff --git a/002_source/ionic_mobile/assets/lettersoup_logo_1024.png b/002_source/ionic_mobile/assets/lettersoup_logo_1024.png new file mode 100644 index 0000000..3ff5c7d Binary files /dev/null and b/002_source/ionic_mobile/assets/lettersoup_logo_1024.png differ diff --git a/002_source/ionic_mobile/assets/splash-dark.png b/002_source/ionic_mobile/assets/splash-dark.png new file mode 100644 index 0000000..8ea0df4 Binary files /dev/null and b/002_source/ionic_mobile/assets/splash-dark.png differ diff --git a/002_source/ionic_mobile/assets/splash.png b/002_source/ionic_mobile/assets/splash.png new file mode 100644 index 0000000..8ea0df4 Binary files /dev/null and b/002_source/ionic_mobile/assets/splash.png differ diff --git a/002_source/ionic_mobile/assets/update_assets.bat b/002_source/ionic_mobile/assets/update_assets.bat new file mode 100644 index 0000000..37f40f0 --- /dev/null +++ b/002_source/ionic_mobile/assets/update_assets.bat @@ -0,0 +1,3 @@ +npx @capacitor/assets generate --iconBackgroundColor '#eeeeee' --iconBackgroundColorDark '#222222' --splashBackgroundColor '#eeeeee' --splashBackgroundColorDark '#111111' + +echo "done" diff --git a/002_source/ionic_mobile/capacitor.config.ts b/002_source/ionic_mobile/capacitor.config.ts new file mode 100644 index 0000000..2cadd66 --- /dev/null +++ b/002_source/ionic_mobile/capacitor.config.ts @@ -0,0 +1,15 @@ +import type { CapacitorConfig } from "@capacitor/cli"; + +const config: CapacitorConfig = { + appId: "io.ionic.starter", + appName: "lettersoup", + webDir: "dist", + android: { + buildOptions: { + keystorePath: "C:\\_carousell\\_lettersoup\\_trunk\\key\\default.jks", + keystoreAlias: "key0", + }, + }, +}; + +export default config; diff --git a/002_source/ionic_mobile/clear_node_modules.cjs b/002_source/ionic_mobile/clear_node_modules.cjs new file mode 100644 index 0000000..0b6278e --- /dev/null +++ b/002_source/ionic_mobile/clear_node_modules.cjs @@ -0,0 +1,27 @@ +const fs = require("fs"); +const path = require("path"); + +function removeNodeModules(dir) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + if (entry.name === "node_modules") { + fs.rmSync(fullPath, { recursive: true }); + } else { + removeNodeModules(fullPath); + } + + if (entry.name === ".next") { + fs.rmSync(fullPath, { recursive: true }); + } else { + removeNodeModules(fullPath); + } + } + } +} + +removeNodeModules("."); +console.log("All 'node_modules' directories have been removed."); diff --git a/002_source/ionic_mobile/cypress.config.ts b/002_source/ionic_mobile/cypress.config.ts new file mode 100644 index 0000000..e7077cd --- /dev/null +++ b/002_source/ionic_mobile/cypress.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "cypress"; + +export default defineConfig({ + e2e: { + baseUrl: "http://localhost:5173", + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); diff --git a/002_source/ionic_mobile/cypress/e2e/Lesson/Connectives/helloworld.cy.ts b/002_source/ionic_mobile/cypress/e2e/Lesson/Connectives/helloworld.cy.ts new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/cypress/e2e/Lesson/Vocabulary/helloworld.cy.ts b/002_source/ionic_mobile/cypress/e2e/Lesson/Vocabulary/helloworld.cy.ts new file mode 100644 index 0000000..d4f439d --- /dev/null +++ b/002_source/ionic_mobile/cypress/e2e/Lesson/Vocabulary/helloworld.cy.ts @@ -0,0 +1,6 @@ +describe('My First Test', () => { + it('Visits the app root url', () => { + cy.visit('/'); + cy.contains('ion-content', 'Lesson'); + }); +}); diff --git a/002_source/ionic_mobile/cypress/e2e/hellowold.cy.ts b/002_source/ionic_mobile/cypress/e2e/hellowold.cy.ts new file mode 100644 index 0000000..d4f439d --- /dev/null +++ b/002_source/ionic_mobile/cypress/e2e/hellowold.cy.ts @@ -0,0 +1,6 @@ +describe('My First Test', () => { + it('Visits the app root url', () => { + cy.visit('/'); + cy.contains('ion-content', 'Lesson'); + }); +}); diff --git a/002_source/ionic_mobile/cypress/fixtures/example.json b/002_source/ionic_mobile/cypress/fixtures/example.json new file mode 100644 index 0000000..02e4254 --- /dev/null +++ b/002_source/ionic_mobile/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/002_source/ionic_mobile/cypress/support/commands.ts b/002_source/ionic_mobile/cypress/support/commands.ts new file mode 100644 index 0000000..95857ae --- /dev/null +++ b/002_source/ionic_mobile/cypress/support/commands.ts @@ -0,0 +1,37 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } diff --git a/002_source/ionic_mobile/cypress/support/e2e.ts b/002_source/ionic_mobile/cypress/support/e2e.ts new file mode 100644 index 0000000..f80f74f --- /dev/null +++ b/002_source/ionic_mobile/cypress/support/e2e.ts @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/002_source/ionic_mobile/docs/.gitkeep b/002_source/ionic_mobile/docs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/docs/G8dLcA7qbv.png b/002_source/ionic_mobile/docs/G8dLcA7qbv.png new file mode 100644 index 0000000..a262c60 Binary files /dev/null and b/002_source/ionic_mobile/docs/G8dLcA7qbv.png differ diff --git a/002_source/ionic_mobile/docs/KZrzamM8nJ.png b/002_source/ionic_mobile/docs/KZrzamM8nJ.png new file mode 100644 index 0000000..a2df774 Binary files /dev/null and b/002_source/ionic_mobile/docs/KZrzamM8nJ.png differ diff --git a/002_source/ionic_mobile/docs/ionic_open_android_studio.png b/002_source/ionic_mobile/docs/ionic_open_android_studio.png new file mode 100644 index 0000000..d317035 Binary files /dev/null and b/002_source/ionic_mobile/docs/ionic_open_android_studio.png differ diff --git a/002_source/ionic_mobile/index.html b/002_source/ionic_mobile/index.html new file mode 100644 index 0000000..46fb89b --- /dev/null +++ b/002_source/ionic_mobile/index.html @@ -0,0 +1,32 @@ + + + + + Letter card App + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/002_source/ionic_mobile/ionic.config.json b/002_source/ionic_mobile/ionic.config.json new file mode 100644 index 0000000..56b7c8c --- /dev/null +++ b/002_source/ionic_mobile/ionic.config.json @@ -0,0 +1,7 @@ +{ + "name": "lettersoup_app_poc", + "integrations": { + "capacitor": {} + }, + "type": "react-vite" +} diff --git a/002_source/ionic_mobile/key/NOTES.md b/002_source/ionic_mobile/key/NOTES.md new file mode 100644 index 0000000..2de439f --- /dev/null +++ b/002_source/ionic_mobile/key/NOTES.md @@ -0,0 +1,8 @@ +# NOTES + +``` +alias: `key0` +password: `123456` +``` + +![alt text](studio64_M0uD4u8cdN.png) diff --git a/002_source/ionic_mobile/key/default.jks b/002_source/ionic_mobile/key/default.jks new file mode 100644 index 0000000..0b994f0 Binary files /dev/null and b/002_source/ionic_mobile/key/default.jks differ diff --git a/002_source/ionic_mobile/key/studio64_M0uD4u8cdN.png b/002_source/ionic_mobile/key/studio64_M0uD4u8cdN.png new file mode 100644 index 0000000..d8356f3 Binary files /dev/null and b/002_source/ionic_mobile/key/studio64_M0uD4u8cdN.png differ diff --git a/002_source/ionic_mobile/nodemon.json b/002_source/ionic_mobile/nodemon.json new file mode 100644 index 0000000..1f03020 --- /dev/null +++ b/002_source/ionic_mobile/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts,tsx", + "exec": "npm run bulid" +} diff --git a/002_source/ionic_mobile/package-lock.json b/002_source/ionic_mobile/package-lock.json new file mode 100644 index 0000000..3320437 --- /dev/null +++ b/002_source/ionic_mobile/package-lock.json @@ -0,0 +1,16308 @@ +{ + "name": "lettersoup_app_poc", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lettersoup_app_poc", + "version": "0.0.1", + "dependencies": { + "@capacitor/android": "^6.2.0", + "@capacitor/app": "6.0.2", + "@capacitor/core": "6.2.0", + "@capacitor/filesystem": "^6.0.2", + "@capacitor/haptics": "6.0.2", + "@capacitor/keyboard": "6.0.3", + "@capacitor/splash-screen": "^6.0.3", + "@capacitor/status-bar": "6.0.2", + "@ionic/prettier-config": "^4.0.0", + "@ionic/react": "^8.0.0", + "@ionic/react-router": "^8.0.0", + "@ionic/storage": "^4.0.0", + "@lifeomic/attempt": "^3.1.0", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.8.1", + "i18next": "^24.2.2", + "ionicons": "^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^15.4.1", + "react-markdown": "^9.0.3", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-use": "^17.6.0", + "react-use-audio-player": "^2.3.0-alpha.1", + "remark-gfm": "^4.0.0" + }, + "devDependencies": { + "@capacitor/assets": "^3.0.5", + "@capacitor/cli": "6.2.0", + "@ianvs/prettier-plugin-sort-imports": "^4.4.1", + "@testing-library/dom": ">=7.21.4", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.4.3", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-legacy": "^5.0.0", + "@vitejs/plugin-react": "^4.0.1", + "cypress": "^13.5.0", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "jsdom": "^22.1.0", + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-unused-imports-configurable": "^1.14.2", + "terser": "^5.4.0", + "typescript": "^5.1.6", + "vite": "~5.2.0", + "vitest": "^0.34.6" + }, + "engines": { + "node": "==18" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" + }, + "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", + "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.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "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.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capacitor/android": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.2.0.tgz", + "integrity": "sha512-3YIDPylV0Q2adEQ/H568p496QdYG0jK/XGMdx7OGSqdBZen92ciAsYdyhLtyl91UVsN1lBhDi5H6j3T2KS6aJg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.2.0" + } + }, + "node_modules/@capacitor/app": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-6.0.2.tgz", + "integrity": "sha512-SiGTGgslK4TbWJVImCUL1odul7/YFkVfkYtAYS9AAEzQpxBECBeRnuN3FFBcfZ9eiN1XxFBFchhiwpxtx/c7yQ==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/assets": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@capacitor/assets/-/assets-3.0.5.tgz", + "integrity": "sha512-ohz/OUq61Y1Fc6aVSt0uDrUdeOA7oTH4pkWDbv/8I3UrPjH7oPkzYhShuDRUjekNp9RBi198VSFdt0CetpEOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@capacitor/cli": "^5.3.0", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@trapezedev/project": "^7.0.10", + "commander": "8.3.0", + "debug": "4.3.4", + "fs-extra": "10.1.0", + "node-fetch": "2.7.0", + "node-html-parser": "5.4.2", + "sharp": "0.32.6", + "tslib": "2.6.2", + "yargs": "17.7.2" + }, + "bin": { + "capacitor-assets": "bin/capacitor-assets" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@capacitor/assets/node_modules/@capacitor/cli": { + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.8.tgz", + "integrity": "sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^2.0.0", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@capacitor/assets/node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@capacitor/assets/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@capacitor/assets/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@capacitor/assets/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@capacitor/assets/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@capacitor/assets/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/assets/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/assets/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/assets/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@capacitor/assets/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/assets/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/assets/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@capacitor/cli": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.2.0.tgz", + "integrity": "sha512-EWcXG39mZh35zrHhOqzN1ILeSyMRyEqWVtQDXqMGjCXYRH6b6p5TvyvLDN8ZNy26tbhI3i79gfrgirt+mNwuuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^2.0.0", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@capacitor/cli/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/cli/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/cli/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/cli/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/cli/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.2.0.tgz", + "integrity": "sha512-B9IlJtDpUqhhYb+T8+cp2Db/3RETX36STgjeU2kQZBs/SLAcFiMama227o+msRjLeo3DO+7HJjWVA1+XlyyPEg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/filesystem": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-6.0.2.tgz", + "integrity": "sha512-OUDjGPljC3/q6wFnCCBUgElfZgAaSaoKeh0ij2eoDygn5KVXta+5CiJ7H7o2/ziTW6WOyvP0++EC3DT0TzR23A==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/haptics": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-6.0.2.tgz", + "integrity": "sha512-xcFdIH4iIIeW2+1lzmlYMVicqB9ytaiuZ9NE3a9laKFPvMGC7hdj6i6tHFezwPJ/96xkHOwXT2b0F8Mh9xtTWg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/keyboard": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-6.0.3.tgz", + "integrity": "sha512-V/mURxBI68HvClYjrGBlOriWkwYN7r+cWid/igJz/3scNc/V81DgQ9fpoLr4W0I5NY7YxOesjIJLuLO+LT18mQ==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/splash-screen": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-6.0.3.tgz", + "integrity": "sha512-tpVljeNGSwVCIc8lMQkyiCQFokk2PwgYPdDtPnGjFthqmXW/WhIxW8QYl4MUqyLwwgwTEbp4u3Kcv2zqQu2L6Q==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-6.0.2.tgz", + "integrity": "sha512-AmRIX6QvFemItlY7/69ARkIAqitRQqJ2qwgZmD1KqgFb78pH+XFXm1guvS/a8CuOOm/IqZ4ddDbl20yxtBqzGA==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz", + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.0", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.13.1", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "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/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "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/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.1.tgz", + "integrity": "sha512-F0/Hrcfpy8WuxlQyAWJTEren/uxKhYonOGY4OyWmwRdeTvkh9mMSCxowZLjNkhwi/2ipqCgtXwwOk7tW0mWXkA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/generator": "^7.26.2", + "@babel/parser": "^7.26.2", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "semver": "^7.5.2" + }, + "peerDependencies": { + "@vue/compiler-sfc": "2.7.x || 3.x", + "prettier": "2 || 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/core": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.4.1.tgz", + "integrity": "sha512-D5xpw5TF2wldpAWE0rHq3L+5T79EjR6d++QFpprjp+q+cFjjhOnfGD+2k7gLlWepAod9LUUigeL0JF02C2wgRQ==", + "license": "MIT", + "dependencies": { + "@stencil/core": "4.20.0", + "ionicons": "^7.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/prettier-config": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ionic/prettier-config/-/prettier-config-4.0.0.tgz", + "integrity": "sha512-0DqL6CggVdgeJAWOLPUT73rF1VD5p0tVlCpC5GXz5vTIUBxNwsJ5085Q7wXjKiE5Odx3aOHGTcuRWCawFsLFag==", + "license": "MIT", + "peerDependencies": { + "prettier": "^2.4.0 || ^3.0.0" + } + }, + "node_modules/@ionic/react": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.4.1.tgz", + "integrity": "sha512-QGxcNilIAMWylgKFQuojESDm7T5aRopKDqsH7c0mdRZPMA5o5i9ErnjBfhZgG7ABuyZ7m+T3TWHqzE/umX43ng==", + "license": "MIT", + "dependencies": { + "@ionic/core": "8.4.1", + "ionicons": "^7.0.0", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@ionic/react-router": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.4.1.tgz", + "integrity": "sha512-OFfN07lBc/kNjyWqVNMraA/ZlqguveybCtXYuVuqHf0QshrakT+JYhuJQof5sEbqRq4GFbgqOeCJqL+3jozDZA==", + "license": "MIT", + "dependencies": { + "@ionic/react": "8.4.1", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1" + } + }, + "node_modules/@ionic/storage": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-4.0.0.tgz", + "integrity": "sha512-3N21P19Xk6cICLnSXZ3ilRqbSXAGSFeIF3HNqz+1kARcm0UFT/vwmZreaXtFyq437vvEWOfJ2enlj3JHLKS0FA==", + "license": "MIT", + "dependencies": { + "localforage": "^1.9.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.3", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-fs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "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", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "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", + "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.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "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", + "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", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "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==", + "license": "MIT" + }, + "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", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lifeomic/attempt": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.1.0.tgz", + "integrity": "sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==", + "license": "MIT" + }, + "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/@prettier/plugin-xml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "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" + }, + "node_modules/@stencil/core": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.20.0.tgz", + "integrity": "sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==", + "license": "MIT", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trapezedev/gradle-parse": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.1.3.tgz", + "integrity": "sha512-WQVF5pEJ5o/mUyvfGTG9nBKx9Te/ilKM3r2IT69GlbaooItT5ao7RyF1MUTBNjHLPk/xpGUY3c6PyVnjDlz0Vw==", + "dev": true, + "license": "SEE LICENSE" + }, + "node_modules/@trapezedev/project": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.1.3.tgz", + "integrity": "sha512-GANh8Ey73MechZrryfJoILY9hBnWqzS6AdB53zuWBCBbaiImyblXT41fWdN6pB2f5+cNI2FAUxGfVhl+LeEVbQ==", + "dev": true, + "license": "SEE LICENSE", + "dependencies": { + "@ionic/utils-fs": "^3.1.5", + "@ionic/utils-subprocess": "^2.1.8", + "@prettier/plugin-xml": "^2.2.0", + "@trapezedev/gradle-parse": "7.1.3", + "@xmldom/xmldom": "^0.7.5", + "conventional-changelog": "^3.1.4", + "cross-spawn": "^7.0.3", + "diff": "^5.1.0", + "env-paths": "^3.0.0", + "gradle-to-js": "^2.0.0", + "ini": "^2.0.0", + "kleur": "^4.1.5", + "lodash": "^4.17.21", + "mergexml": "^1.2.3", + "plist": "^3.0.4", + "prettier": "^2.7.1", + "prompts": "^2.4.2", + "replace": "^1.1.0", + "tempy": "^1.0.1", + "tmp": "^0.2.1", + "ts-node": "^10.2.1", + "xcode": "^3.0.1", + "xml-js": "^1.6.11", + "xpath": "^0.0.32", + "yargs": "^17.2.1" + } + }, + "node_modules/@trapezedev/project/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@trapezedev/project/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@trapezedev/project/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^9.0.4", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.9" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "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", + "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", + "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", + "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", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai-subset": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", + "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "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" + }, + "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", + "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", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/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", + "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/@types/jest/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" + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.3.tgz", + "integrity": "sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true, + "license": "MIT" + }, + "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" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "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", + "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" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.4.3.tgz", + "integrity": "sha512-wsyXK9mascyplcqvww1gA1xYiy29iRHfyciw+a0t7qRNdzX6PdfSWmOoCi74epr87DujM+5J+rnnSv+4PazqVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.8", + "@babel/preset-env": "^7.25.8", + "browserslist": "^4.24.0", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.38.1", + "magic-string": "^0.30.12", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.15.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "0.34.6", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/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", + "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/@vitest/snapshot/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" + }, + "node_modules/@vitest/spy": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/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", + "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/@vitest/utils/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" + }, + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chevrotain": "7.1.1" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", + "license": "MIT" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "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/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": 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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "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/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "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/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.1.tgz", + "integrity": "sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/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/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/bare-events": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.3.tgz", + "integrity": "sha512-pCO3aoRJ0MBiRMu8B7vUga0qL3L7gO1+SW7ku6qlSsMLwuhaawnuvZDyzJY/kyC63Un0XAB0OPUcfF1eTO/V+Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + } + }, + "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==", + "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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "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", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "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", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "browserslist": "*" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "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", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "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" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "dev": 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==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": 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/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "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/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/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", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/conventional-changelog-writer/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", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/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", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/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", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/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", + "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/conventional-changelog-writer/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/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", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/conventional-commits-parser/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", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/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", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/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", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/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", + "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/conventional-commits-parser/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-commits-parser/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-commits-parser/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-commits-parser/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/conventional-commits-parser/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/cypress": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", + "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "^3.0.6", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "ci-info": "^4.0.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.3", + "tree-kill": "1.2.2", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + } + }, + "node_modules/cypress/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/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", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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/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==", + "dev": true, + "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/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.76", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", + "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.8", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz", + "integrity": "sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.0", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "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.1", + "@humanwhocodes/config-array": "^0.13.0", + "@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-plugin-react": { + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "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/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/eslint/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/eslint/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/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/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/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "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", + "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/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/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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", + "engines": { + "node": ">=0.8.0" + } + }, + "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", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/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.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-pkg-repo/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/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", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/git-raw-commits/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", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/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", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/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", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/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", + "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/git-raw-commits/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/git-raw-commits/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/git-raw-commits/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/git-raw-commits/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-raw-commits/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/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", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/git-semver-tags/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", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/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", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/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", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/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", + "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/git-semver-tags/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/git-semver-tags/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-semver-tags/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT" + }, + "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/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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" + }, + "node_modules/gradle-to-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.1.tgz", + "integrity": "sha512-is3hDn9zb8XXnjbEeAEIqxTpLHUiGBqjegLmXPuyMBfKAggpadWFku4/AP8iYAGBX6qR9/5UIUIp47V0XI3aMw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.merge": "^4.6.2" + }, + "bin": { + "gradle-to-js": "cli.js" + } + }, + "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/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/howler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", + "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, + "node_modules/i18next": { + "version": "24.2.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.2.tgz", + "integrity": "sha512-NE6i86lBCKRYZa5TaUDkU5S4HFgLIEJRLr3Whf2psgaxBleQ2LC1YW1Vc+SCgkAW7VEzndT6al6+CzegSUHcTQ==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "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/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "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/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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ionicons": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", + "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", + "license": "MIT", + "dependencies": { + "@stencil/core": "^4.0.3" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "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/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/iterator.prototype": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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", + "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-diff/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/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", + "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/jest-diff/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" + }, + "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", + "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", + "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-matcher-utils/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/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", + "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/jest-matcher-utils/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" + }, + "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", + "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-message-util/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/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", + "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/jest-message-util/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" + }, + "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", + "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-util/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", + "engines": { + "node": ">=8" + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "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/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "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", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "> 0.8" + } + }, + "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/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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" + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "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.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mergexml": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.4.tgz", + "integrity": "sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@xmldom/xmldom": "^0.7.0", + "formidable": "^3.5.1", + "xpath": "0.0.27" + } + }, + "node_modules/mergexml/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mergexml/node_modules/xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz", + "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "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", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "ufo": "^1.5.4" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/nano-css": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", + "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "license": "Unlicense", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "css-tree": "^1.1.2", + "csstype": "^3.1.2", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^7.0.1", + "rtl-css-js": "^1.16.1", + "stacktrace-js": "^2.0.2", + "stylis": "^4.3.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/native-run": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/native-run/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT" + }, + "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-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "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/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "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", + "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-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "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" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "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", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-types": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.0.tgz", + "integrity": "sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.3", + "pathe": "^1.1.2" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "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/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", + "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9", + "vue-tsc": "^2.1.0" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-unused-imports-configurable": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-unused-imports-configurable/-/prettier-plugin-unused-imports-configurable-1.14.2.tgz", + "integrity": "sha512-3T0QKYjdyz3Os434qcae1znfjln+hYdonjMlhsY0cboa6QJ0olU4y9/vvFw4wwd/d4HKKuhFLSbtnpFk0ISYiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ts-morph": "24.0.0" + }, + "peerDependencies": { + "prettier": "3.4.2" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "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", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/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", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-i18next": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.1.tgz", + "integrity": "sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.3.tgz", + "integrity": "sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/react-use": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.0.tgz", + "integrity": "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==", + "license": "Unlicense", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.6.2", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react-use-audio-player": { + "version": "2.3.0-alpha.1", + "resolved": "https://registry.npmjs.org/react-use-audio-player/-/react-use-audio-player-2.3.0-alpha.1.tgz", + "integrity": "sha512-VrfRQcG2Hosl5TzOfYTwf40o7LRmUp41w8/g4Mbzta3pOxxU8K8dZ7pM5P9wCa77bW1vZeImUgsRTQd85ZXWNw==", + "license": "MIT", + "dependencies": { + "howler": "^2.2.3" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/replace/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", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/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", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/replace/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", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/replace/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" + }, + "node_modules/replace/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", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/replace/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", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/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", + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/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", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/replace/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", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace/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", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/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", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/replace/node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/replace/node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/replace/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/replace/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "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/rollup": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "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/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "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==", + "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/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true, + "license": "ISC" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "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/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "license": "Unlicense", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/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", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, + "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" + }, + "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", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "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", + "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", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "dev": 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/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "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", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/systemjs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz", + "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "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/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.70.tgz", + "integrity": "sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.70" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.70.tgz", + "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "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", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "license": "Unlicense" + }, + "node_modules/ts-morph": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-24.0.0.tgz", + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.25.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "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/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.14.tgz", + "integrity": "sha512-TFQLuwWLPms+NBNlh0D9LZQ+HXW471COABxw/9TEUBrjuHMo9BrYBPrN/SYAwIuVL+rLerycxiLT41t4f5MZpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "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/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "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/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": 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==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xcode/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-js/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/xpath": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", + "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": 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" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": 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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/002_source/ionic_mobile/package.json b/002_source/ionic_mobile/package.json new file mode 100644 index 0000000..dd1959f --- /dev/null +++ b/002_source/ionic_mobile/package.json @@ -0,0 +1,82 @@ +{ + "name": "lettersoup_app_poc", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite --host --cors --force --strictPort --clearScreen", + "build": "tsc && vite build && npx cap copy", + "ionic_build": "npx vite build && npx cap copy", + "ionic_sync": "npx cap sync --inline", + "ionic_pre_android_studio": "npm run ionic_build && npm run ionic_sync", + "preview": "vite preview", + "test.e2e": "cypress run", + "test.unit": "vitest", + "lint": "eslint", + "run_android": "npx vite build && npx cap copy android && npx cap run android --target=8L5PT4S84HWKOB4H --no-build --no-sync", + "update_splash": "npx @capacitor/assets generate --iconBackgroundColor \"#eeeeee\" --iconBackgroundColorDark \"#222222\" --splashBackgroundColor \"#eeeeee\" --splashBackgroundColorDark \"#111111\"", + "update_app_icon": "npx capacitor-assets generate", + "import_001_vocabulary": "cd tools/001_vocabulary && node ./import.cjs", + "import_002_connectives": "cd tools/002_connectives && node ./import.cjs", + "import_003_questions": "cd tools/003_questions && node ./import.cjs", + "fix:prettier": "prettier ./src --write --config ./.prettierrc", + "build_w": "npx nodemon --exec \"npm run build\"" + }, + "dependencies": { + "@capacitor/android": "^6.2.0", + "@capacitor/app": "6.0.2", + "@capacitor/core": "6.2.0", + "@capacitor/filesystem": "^6.0.2", + "@capacitor/haptics": "6.0.2", + "@capacitor/keyboard": "6.0.3", + "@capacitor/splash-screen": "^6.0.3", + "@capacitor/status-bar": "6.0.2", + "@ionic/prettier-config": "^4.0.0", + "@ionic/react": "^8.0.0", + "@ionic/react-router": "^8.0.0", + "@ionic/storage": "^4.0.0", + "@lifeomic/attempt": "^3.1.0", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.8.1", + "i18next": "^24.2.2", + "ionicons": "^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-i18next": "^15.4.1", + "react-markdown": "^9.0.3", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-use": "^17.6.0", + "react-use-audio-player": "^2.3.0-alpha.1", + "remark-gfm": "^4.0.0" + }, + "devDependencies": { + "@capacitor/assets": "^3.0.5", + "@capacitor/cli": "6.2.0", + "@ianvs/prettier-plugin-sort-imports": "^4.4.1", + "@testing-library/dom": ">=7.21.4", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.4.3", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-legacy": "^5.0.0", + "@vitejs/plugin-react": "^4.0.1", + "cypress": "^13.5.0", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "jsdom": "^22.1.0", + "prettier": "^3.4.2", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-unused-imports-configurable": "^1.14.2", + "terser": "^5.4.0", + "typescript": "^5.1.6", + "vite": "~5.2.0", + "vitest": "^0.34.6" + }, + "description": "An Ionic project", + "engines": { + "node": "==18" + } +} \ No newline at end of file diff --git a/002_source/ionic_mobile/public/assets/ExitButton.jfif b/002_source/ionic_mobile/public/assets/ExitButton.jfif new file mode 100644 index 0000000..f47d34f Binary files /dev/null and b/002_source/ionic_mobile/public/assets/ExitButton.jfif differ diff --git a/002_source/ionic_mobile/public/assets/icons/android-chrome-192x192.png b/002_source/ionic_mobile/public/assets/icons/android-chrome-192x192.png new file mode 100644 index 0000000..142d97b Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/android-chrome-192x192.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/android-chrome-512x512.png b/002_source/ionic_mobile/public/assets/icons/android-chrome-512x512.png new file mode 100644 index 0000000..14edd91 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/android-chrome-512x512.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/android-maskable-192x192.png b/002_source/ionic_mobile/public/assets/icons/android-maskable-192x192.png new file mode 100644 index 0000000..142d97b Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/android-maskable-192x192.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/android-maskable-512x512.png b/002_source/ionic_mobile/public/assets/icons/android-maskable-512x512.png new file mode 100644 index 0000000..14edd91 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/android-maskable-512x512.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/apple-touch-icon.png b/002_source/ionic_mobile/public/assets/icons/apple-touch-icon.png new file mode 100644 index 0000000..bd2aa34 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/apple-touch-icon.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/favicon-16x16.png b/002_source/ionic_mobile/public/assets/icons/favicon-16x16.png new file mode 100644 index 0000000..6340bf4 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/favicon-16x16.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/favicon-32x32.png b/002_source/ionic_mobile/public/assets/icons/favicon-32x32.png new file mode 100644 index 0000000..23d037b Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/favicon-32x32.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/favicon.ico b/002_source/ionic_mobile/public/assets/icons/favicon.ico new file mode 100644 index 0000000..4e66116 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/favicon.ico differ diff --git a/002_source/ionic_mobile/public/assets/icons/favicon.png b/002_source/ionic_mobile/public/assets/icons/favicon.png new file mode 100644 index 0000000..605c985 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/favicon.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-128.webp b/002_source/ionic_mobile/public/assets/icons/icon-128.webp new file mode 100644 index 0000000..9be5c46 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-128.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-192.webp b/002_source/ionic_mobile/public/assets/icons/icon-192.webp new file mode 100644 index 0000000..8394b3a Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-192.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-256.webp b/002_source/ionic_mobile/public/assets/icons/icon-256.webp new file mode 100644 index 0000000..75ec91d Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-256.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-48.webp b/002_source/ionic_mobile/public/assets/icons/icon-48.webp new file mode 100644 index 0000000..341f8ac Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-48.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-512.webp b/002_source/ionic_mobile/public/assets/icons/icon-512.webp new file mode 100644 index 0000000..d26f516 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-512.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-72.webp b/002_source/ionic_mobile/public/assets/icons/icon-72.webp new file mode 100644 index 0000000..608b69a Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-72.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon-96.webp b/002_source/ionic_mobile/public/assets/icons/icon-96.webp new file mode 100644 index 0000000..7279880 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon-96.webp differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon.png b/002_source/ionic_mobile/public/assets/icons/icon.png new file mode 100644 index 0000000..14edd91 Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/icon_144.png b/002_source/ionic_mobile/public/assets/icons/icon_144.png new file mode 100644 index 0000000..12872ca Binary files /dev/null and b/002_source/ionic_mobile/public/assets/icons/icon_144.png differ diff --git a/002_source/ionic_mobile/public/assets/icons/site.webmanifest b/002_source/ionic_mobile/public/assets/icons/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/002_source/ionic_mobile/public/assets/icons/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/002_source/ionic_mobile/public/audio.mp3 b/002_source/ionic_mobile/public/audio.mp3 new file mode 100644 index 0000000..d90bfa2 Binary files /dev/null and b/002_source/ionic_mobile/public/audio.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/.gitkeep b/002_source/ionic_mobile/public/data/Lesson/c/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_cause_and_effect.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_cause_and_effect.jpg new file mode 100644 index 0000000..d1b2886 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_cause_and_effect.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_comparing.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_comparing.jpg new file mode 100644 index 0000000..834654e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_comparing.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_emphasizing.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_emphasizing.jpg new file mode 100644 index 0000000..e706c14 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_emphasizing.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_making_conclusion.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_making_conclusion.jpg new file mode 100644 index 0000000..f5d59b3 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_making_conclusion.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_sequence.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_sequence.jpg new file mode 100644 index 0000000..d61d128 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_sequence.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/images/ci_time.jpg b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_time.jpg new file mode 100644 index 0000000..7ecbc09 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/images/ci_time.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/.gitkeep b/002_source/ionic_mobile/public/data/Lesson/c/sounds/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Aboveall.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Aboveall.mp3 new file mode 100644 index 0000000..d6bc0cb Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Aboveall.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/After.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/After.mp3 new file mode 100644 index 0000000..2c17358 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/After.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Allinall.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Allinall.mp3 new file mode 100644 index 0000000..d0f7109 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Allinall.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Alternatively.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Alternatively.mp3 new file mode 100644 index 0000000..1f6d2e0 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Alternatively.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Because.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Because.mp3 new file mode 100644 index 0000000..52690c4 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Because.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Before.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Before.mp3 new file mode 100644 index 0000000..c4c8a76 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Before.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Clearly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Clearly.mp3 new file mode 100644 index 0000000..5ca413c Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Clearly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Consequently.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Consequently.mp3 new file mode 100644 index 0000000..567837d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Consequently.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Dueto.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Dueto.mp3 new file mode 100644 index 0000000..fff2df6 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Dueto.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Equally.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Equally.mp3 new file mode 100644 index 0000000..923e4de Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Equally.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Especially.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Especially.mp3 new file mode 100644 index 0000000..1eaba79 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Especially.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Firstly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Firstly.mp3 new file mode 100644 index 0000000..e872648 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Firstly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inconclusion.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inconclusion.mp3 new file mode 100644 index 0000000..ae0e6aa Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inconclusion.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Incontrast.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Incontrast.mp3 new file mode 100644 index 0000000..f0ed801 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Incontrast.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Infact.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Infact.mp3 new file mode 100644 index 0000000..2ce0ece Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Infact.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inshort.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inshort.mp3 new file mode 100644 index 0000000..dc2ee2a Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Inshort.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Lastbutnotleast.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Lastbutnotleast.mp3 new file mode 100644 index 0000000..6958612 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Lastbutnotleast.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Moreover.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Moreover.mp3 new file mode 100644 index 0000000..d78cb0e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Moreover.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthecontrary.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthecontrary.mp3 new file mode 100644 index 0000000..9d74aa3 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthecontrary.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Ontheotherhand.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Ontheotherhand.mp3 new file mode 100644 index 0000000..31e8a3d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Ontheotherhand.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthewhole.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthewhole.mp3 new file mode 100644 index 0000000..8292d02 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Onthewhole.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Particularly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Particularly.mp3 new file mode 100644 index 0000000..92c673f Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Particularly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Secondly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Secondly.mp3 new file mode 100644 index 0000000..083fdb4 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Secondly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Since.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Since.mp3 new file mode 100644 index 0000000..df73159 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Since.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Suddenly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Suddenly.mp3 new file mode 100644 index 0000000..884dcb2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Suddenly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Therefore.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Therefore.mp3 new file mode 100644 index 0000000..5c6b549 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Therefore.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tobeginwith.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tobeginwith.mp3 new file mode 100644 index 0000000..441ece6 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tobeginwith.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tosumup.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tosumup.mp3 new file mode 100644 index 0000000..529b006 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Tosumup.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Undoubtedly.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Undoubtedly.mp3 new file mode 100644 index 0000000..ebe3ac1 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Undoubtedly.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/Until.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Until.mp3 new file mode 100644 index 0000000..dfcfba3 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/Until.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/c/sounds/While.mp3 b/002_source/ionic_mobile/public/data/Lesson/c/sounds/While.mp3 new file mode 100644 index 0000000..eeb3327 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/c/sounds/While.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/content.json b/002_source/ionic_mobile/public/data/Lesson/content.json new file mode 100644 index 0000000..b0c3d9f --- /dev/null +++ b/002_source/ionic_mobile/public/data/Lesson/content.json @@ -0,0 +1,624 @@ +[ + { + "name": "vocabulary", + "path": "vocabulary", + "content": [ + { + "cat_name": "Technology", + "cat_image": "/data/Lesson/v/images/ci_technology.jpg", + "content": [ + { + "word": "keyboard", + "word_c": "鍵盤", + "sample_e": "I type on my **keyboard**.", + "sample_c": "我用**鍵盤**打字。", + "sound": "/data/Lesson/v/sounds/keyboard.mp3", + "image": "/data/Lesson/v/images/keyboard.jpg" + }, + { + "word": "mouse", + "word_c": "滑鼠", + "sample_e": "I use a mouse to click.", + "sample_c": "我用滑鼠點選。", + "sound": "/data/Lesson/v/sounds/mouse.mp3", + "image": "/data/Lesson/v/images/mouse.jpg" + }, + { + "word": "computer", + "word_c": "電腦", + "sample_e": "My computer is very fast.", + "sample_c": "我的電腦速度非常快。", + "sound": "/data/Lesson/v/sounds/computer.mp3", + "image": "/data/Lesson/v/images/computer.jpg" + }, + { + "word": "mobile phone", + "word_c": "手機", + "sample_e": "I call my friend on my mobile phone.", + "sample_c": "我用手機打電話給朋友。", + "sound": "/data/Lesson/v/sounds/mobile_phone.mp3", + "image": "/data/Lesson/v/images/mobile_phone.jpg" + }, + { + "word": "social media", + "word_c": "社交媒體", + "sample_e": "I share photos on social media.", + "sample_c": "我在社交媒體上分享照片。", + "sound": "/data/Lesson/v/sounds/social media.mp3", + "image": "/data/Lesson/v/images/socialmedia.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Art", + "cat_image": "/data/Lesson/v/images/ci_art.jpg", + "content": [ + { + "word": "watercolor", + "word_c": "水彩", + "sample_e": "I like to paint with watercolor.", + "sample_c": "我喜歡用水彩畫畫。", + "sound": "/data/Lesson/v/sounds/watercolor.mp3", + "image": "/data/Lesson/v/images/watercolor.jpg" + }, + { + "word": "photography", + "word_c": "攝影", + "sample_e": "I need a camera to do photography.", + "sample_c": "我需要照相機來進行攝影。", + "sound": "/data/Lesson/v/sounds/photography.mp3", + "image": "/data/Lesson/v/images/photography.jpg" + }, + { + "word": "palette", + "word_c": "調色盤", + "sample_e": "He mixes colors on his palette.", + "sample_c": "他在調色板上調色。", + "sound": "/data/Lesson/v/sounds/palette.mp3", + "image": "/data/Lesson/v/images/palette.jpg" + }, + { + "word": "artist", + "word_c": "藝術家", + "sample_e": "The artist paints beautiful pictures.", + "sample_c": "藝術家畫出美麗的圖畫。", + "sound": "/data/Lesson/v/sounds/artist.mp3", + "image": "/data/Lesson/v/images/artist.jpg" + }, + { + "word": "canvas", + "word_c": "畫布", + "sample_e": "We draw on a canvas.", + "sample_c": "我們在畫布上畫畫。", + "sound": "/data/Lesson/v/sounds/canvas.mp3", + "image": "/data/Lesson/v/images/canvas.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Nature", + "cat_image": "/data/Lesson/v/images/ci_nature.jpg", + "content": [ + { + "word": "flood", + "word_c": "洪水", + "sample_e": "The flood covered the streets.", + "sample_c": "洪水覆蓋了街道。", + "sound": "/data/Lesson/v/sounds/flood.mp3", + "image": "/data/Lesson/v/images/flood.jpg" + }, + { + "word": "typhoon", + "word_c": "颱風", + "sample_e": "A typhoon brings strong wind and rain.", + "sample_c": "颱風帶來強風大雨。", + "sound": "/data/Lesson/v/sounds/typhoon.mp3", + "image": "/data/Lesson/v/images/typhoon.jpg" + }, + { + "word": "ocean", + "word_c": "海洋", + "sample_e": "We can find jellyfish in the ocean.", + "sample_c": "我們可以在海洋中找到水母。", + "sound": "/data/Lesson/v/sounds/ocean.mp3", + "image": "/data/Lesson/v/images/ocean.jpg" + }, + { + "word": "canyon", + "word_c": "峽谷", + "sample_e": "We hiked in the canyon.", + "sample_c": "我們在峽谷遠足。", + "sound": "/data/Lesson/v/sounds/canyon.mp3", + "image": "/data/Lesson/v/images/canyon.jpg" + }, + { + "word": "mammal", + "word_c": "哺乳動物", + "sample_e": "A dog is a mammal.", + "sample_c": "狗是一種哺乳動物。", + "sound": "/data/Lesson/v/sounds/mammal.mp3", + "image": "/data/Lesson/v/images/mammal.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Workplace", + "cat_image": "/data/Lesson/v/images/ci_workplace.jpg", + "content": [ + { + "word": "interview", + "word_c": "面試", + "sample_e": "I have a job interview tomorrow.", + "sample_c": "我明天有一個工作面試。", + "sound": "/data/Lesson/v/sounds/interview.mp3", + "image": "/data/Lesson/v/images/interview.jpg" + }, + { + "word": "president", + "word_c": "總統", + "sample_e": "The president of the U.S. is Donald Trump now.", + "sample_c": "現在的美國總統是唐納德·川普。", + "sound": "/data/Lesson/v/sounds/president.mp3", + "image": "/data/Lesson/v/images/president.jpg" + }, + { + "word": "manager", + "word_c": "經理", + "sample_e": "My manager helps me at work.", + "sample_c": "我的經理在工作中幫助我。", + "sound": "/data/Lesson/v/sounds/manager.mp3", + "image": "/data/Lesson/v/images/manager.jpg" + }, + { + "word": "intern", + "word_c": "實習生", + "sample_e": "The intern is learning a lot.", + "sample_c": "實習生學到了很多東西。", + "sound": "/data/Lesson/v/sounds/intern.mp3", + "image": "/data/Lesson/v/images/intern.jpg" + }, + { + "word": "promotion", + "word_c": "升遷", + "sample_e": "She got a promotion at her job.", + "sample_c": "她在工作中得到了升遷。", + "sound": "/data/Lesson/v/sounds/promotion.mp3", + "image": "/data/Lesson/v/images/promotion.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Sports", + "cat_image": "/data/Lesson/v/images/ci_sports.jpg", + "content": [ + { + "word": "athlete", + "word_c": "運動員", + "sample_e": "He is a great track athlete.", + "sample_c": "他是一位出色的田徑運動員。", + "sound": "/data/Lesson/v/sounds/athlete.mp3", + "image": "/data/Lesson/v/images/athlete.jpg" + }, + { + "word": "coach", + "word_c": "教練", + "sample_e": "My coach trains me every week.", + "sample_c": "我的教練每個星期都會訓練我。", + "sound": "/data/Lesson/v/sounds/coach.mp3", + "image": "/data/Lesson/v/images/coach.jpg" + }, + { + "word": "competitor", + "word_c": "競爭者", + "sample_e": "She is my competitor in the race.", + "sample_c": "她是我在比賽中的競爭對手。", + "sound": "/data/Lesson/v/sounds/competitor.mp3", + "image": "/data/Lesson/v/images/competitor.jpg" + }, + { + "word": "kayaking", + "word_c": "划皮艇", + "sample_e": "We went kayaking on the lake.", + "sample_c": "我們去湖上划皮艇。", + "sound": "/data/Lesson/v/sounds/kayaking.mp3", + "image": "/data/Lesson/v/images/kayaking.jpg" + }, + { + "word": "badminton", + "word_c": "羽毛球", + "sample_e": "I play badminton with my friends.", + "sample_c": "我和朋友一起打羽毛球", + "sound": "/data/Lesson/v/sounds/badminton.mp3", + "image": "/data/Lesson/v/images/badminton.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "News", + "cat_image": "/data/Lesson/v/images/ci_news.jpg", + "content": [ + { + "word": "inflation", + "word_c": "通貨膨脹", + "sample_e": "Inflation makes products more expensive.", + "sample_c": "通貨膨脹使產品更加昂貴。", + "sound": "/data/Lesson/v/sounds/inflation.mp3", + "image": "/data/Lesson/v/images/inflation.jpg" + }, + { + "word": "poverty", + "word_c": "貧窮", + "sample_e": "Poverty is a serious problem.", + "sample_c": "貧窮是一個嚴重的問題。", + "sound": "/data/Lesson/v/sounds/poverty.mp3", + "image": "/data/Lesson/v/images/poverty.jpg" + }, + { + "word": "global warming", + "word_c": "全球暖化", + "sample_e": "Global warming affects the earth.", + "sample_c": "全球暖化會影響地球。", + "sound": "/data/Lesson/v/sounds/global_warming.mp3", + "image": "/data/Lesson/v/images/global_warming.jpg" + }, + { + "word": "discrimination", + "word_c": "歧視", + "sample_e": "Discrimination is unfair to people.", + "sample_c": "歧視對人們不公平。", + "sound": "/data/Lesson/v/sounds/discrimination.mp3", + "image": "/data/Lesson/v/images/discrimination.jpg" + }, + { + "word": "suicide", + "word_c": "自殺", + "sample_e": "A man committed suicide last week.", + "sample_c": "上周有一個人自殺了。", + "sound": "/data/Lesson/v/sounds/suicide.mp3", + "image": "/data/Lesson/v/images/suicide.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Basic", + "cat_image": "/data/Lesson/v/images/ci_basic.jpg", + "content": [ + { + "word": "Monday", + "word_c": "星期一", + "sample_e": "Monday is the first day of the week.", + "sample_c": "星期一是一周的第一天。", + "sound": "/data/Lesson/v/sounds/Monday.mp3", + "image": "/data/Lesson/v/images/Monday.jpg" + }, + { + "word": "Tuesday", + "word_c": "星期二", + "sample_e": "They learn English on Tuesday.", + "sample_c": "他們星期二學習英語。", + "sound": "/data/Lesson/v/sounds/Tuesday.mp3", + "image": "/data/Lesson/v/images/Tuesday.jpg" + }, + { + "word": "Wednesday", + "word_c": "星期三", + "sample_e": "Every Wednesday, we go to the park.", + "sample_c": "每個星期三,我們都會去公園。", + "sound": "/data/Lesson/v/sounds/Wednesday.mp3", + "image": "/data/Lesson/v/images/Wednesday.jpg" + }, + { + "word": "Thursday", + "word_c": "星期四", + "sample_e": "I eat at my mother's place on Thursdays.", + "sample_c": "每個星期四, 我在媽媽家吃飯。", + "sound": "/data/Lesson/v/sounds/Thursday.mp3", + "image": "/data/Lesson/v/images/Thursday.jpg" + }, + { + "word": "Friday", + "word_c": "星期五", + "sample_e": "I party with my friends every Friday night.", + "sample_c": "每個星期五晚上,我都會和朋友們開派對。", + "sound": "/data/Lesson/v/sounds/Friday.mp3", + "image": "/data/Lesson/v/images/Friday.jpg" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + } + ] + }, + { + "name": "Connectives", + "path": "Connectives", + "content": [ + { + "cat_name": "sequence", + "cat_image": "/data/Lesson/c/images/ci_sequence.jpg", + "content": [ + { + "word": "Firstly", + "word_c": "首先", + "sample_e": "Firstly, we need to set the goals of the plan.", + "sample_c": "首先,我們需要訂立計劃的目標。", + "sound": "/data/Lesson/c/sounds/Firstly.mp3" + }, + { + "word": "Secondly", + "word_c": "第二", + "sample_e": "Secondly, we should think about the safety issues.", + "sample_c": "其次,我們要考慮安全問題。", + "sound": "/data/Lesson/c/sounds/Secondly.mp3" + }, + { + "word": "Moreover", + "word_c": "此外", + "sample_e": "Moreover, this plan can also improve efficiency.", + "sample_c": "加上,這個方案還能提高效率。", + "sound": "/data/Lesson/c/sounds/Moreover.mp3" + }, + { + "word": "To begin with", + "word_c": "首先", + "sample_e": "To begin with, we should bring our own bag to go shopping.", + "sample_c": "首先,我們應該帶自己的購物袋去購物。", + "sound": "/data/Lesson/c/sounds/Tobeginwith.mp3" + }, + { + "word": "Last but not least", + "word_c": "最後但同樣重要", + "sample_e": "Last but not least, teamwork is important.", + "sample_c": "最後但同樣重要的一點是,團隊合作非常重要。", + "sound": "/data/Lesson/c/sounds/Lastbutnotleast.mp3" + } + ] + }, + { + "cat_name": "cause and effect", + "cat_image": "/data/Lesson/c/images/ci_cause_and_effect.jpg", + "content": [ + { + "word": "Therefore", + "word_c": "因此", + "sample_e": "He is sick. Therefore, he will not go to school.", + "sample_c": "他病了。因此,他不會去上學。", + "sound": "/data/Lesson/c/sounds/Therefore.mp3" + }, + { + "word": "Consequently", + "word_c": "所以", + "sample_e": "He studied hard. Consequently, he scored high on the exam.)", + "sample_c": "他很努力學習。因此,他在考試中取得了高分。", + "sound": "/data/Lesson/c/sounds/Consequently.mp3" + }, + { + "word": "Due to", + "word_c": "由於", + "sample_e": "Due to bad weather, the event was canceled.", + "sample_c": "由於天氣惡劣,活動被取消。", + "sound": "/data/Lesson/c/sounds/Dueto.mp3" + }, + { + "word": "Because", + "word_c": "因為", + "sample_e": "We chose this location because it is convenient for transportation.", + "sample_c": "我們選擇這個地點是因為這裡交通便利。", + "sound": "/data/Lesson/c/sounds/Because.mp3" + }, + { + "word": "Since", + "word_c": "自從", + "sample_e": "Since he joined the team, our business has improved.", + "sample_c": "自從他加入團隊以來,我們的業務有所改善。", + "sound": "/data/Lesson/c/sounds/Since.mp3" + } + ] + }, + { + "cat_name": "comparing", + "cat_image": "/data/Lesson/c/images/ci_comparing.jpg", + "content": [ + { + "word": "In contrast", + "word_c": "相對而言", + "sample_e": "We sold 10 presents last month. In contrast, our competitor sold 50% more presents.", + "sample_c": "上個月我們賣了 10 份禮物。相比之下,我們的競爭對手的禮物銷量比我們多 50%。", + "sound": "/data/Lesson/c/sounds/Incontrast.mp3" + }, + { + "word": "On the other hand", + "word_c": "另一方面", + "sample_e": "I want to learn more by reading books. On the other hand, I don't have enough time to read more.", + "sample_c": "我想透過閱讀來學習更多知識。另一方面,我沒有足夠的時間閱讀更多內容。", + "sound": "/data/Lesson/c/sounds/Ontheotherhand.mp3" + }, + { + "word": "Alternatively", + "word_c": "或者", + "sample_e": "We can choose this restaurant, alternatively consider other diners.", + "sample_c": "我們可以選擇這家餐廳,或考慮其他餐廳。", + "sound": "/data/Lesson/c/sounds/Alternatively.mp3" + }, + { + "word": "On the contrary", + "word_c": "相反地", + "sample_e": "Most people think Christmas will be cold this year. On the contrary, it is the hottest Christmas dated in history.", + "sample_c": "大多數人認為今年的聖誕節將會很寒冷。相反,這是史上最熱的聖誕節。", + "sound": "/data/Lesson/c/sounds/Onthecontrary.mp3" + }, + { + "word": "Equally", + "word_c": "同樣地", + "sample_e": "We need customers to learn about our service. Equally, we need to pay attention to customer needs.", + "sample_c": "我們需要客戶了解我們的服務。同樣,我們需要關注客戶的需求。", + "sound": "/data/Lesson/c/sounds/Equally.mp3" + } + ] + }, + { + "cat_name": "emphasizing", + "cat_image": "/data/Lesson/c/images/ci_emphasizing.jpg", + "content": [ + { + "word": "Especially", + "word_c": "特別是", + "sample_e": "I like all fruits, especially strawberries.", + "sample_c": "我喜歡所有的水果,尤其是草莓。", + "sound": "/data/Lesson/c/sounds/Especially.mp3" + }, + { + "word": "Particularly", + "word_c": "尤其是", + "sample_e": "He is particularly outstanding in mathematics.", + "sample_c": "他在數學方面尤其優秀。", + "sound": "/data/Lesson/c/sounds/Particularly.mp3" + }, + { + "word": "In fact", + "word_c": "事實上", + "sample_e": "She passed her driving test. In fact, she scored a full mark.", + "sample_c": "她通過了駕駛考試。事實上,她得了滿分。", + "sound": "/data/Lesson/c/sounds/Infact.mp3" + }, + { + "word": "Undoubtedly", + "word_c": "毫無疑問地", + "sample_e": "Undoubtedly, he is one of the most talented members of our team.", + "sample_c": "毫無疑問,他是我們團隊中最有才華的成員之一。", + "sound": "/data/Lesson/c/sounds/Undoubtedly.mp3" + }, + { + "word": "Clearly", + "word_c": "顯然地", + "sample_e": "Clearly, we need to improve our strategy.", + "sample_c": "顯然,我們需要改進我們的策略。", + "sound": "/data/Lesson/c/sounds/Clearly.mp3" + } + ] + }, + { + "cat_name": "time", + "cat_image": "/data/Lesson/c/images/ci_time.jpg", + "content": [ + { + "word": "Above all", + "word_c": "最重要的是", + "sample_e": "Above all, our health matters the most.", + "sample_c": "最重要的是,我們的健康是最重要的。", + "sound": "/data/Lesson/c/sounds/Aboveall.mp3" + }, + { + "word": "Before", + "word_c": "在...之前", + "sample_e": "Before the meeting, we need to prepare all materials.", + "sample_c": "在會議之前,我們需要準備好所有的材料。", + "sound": "/data/Lesson/c/sounds/Before.mp3" + }, + { + "word": "After", + "word_c": "在...之後", + "sample_e": "Put the application form in the box after you have filled it out.", + "sample_c": "填好申請表後放入箱內。", + "sound": "/data/Lesson/c/sounds/After.mp3" + }, + { + "word": "While", + "word_c": "當...時候", + "sample_e": "While I am traveling, I enjoy taking photos.", + "sample_c": "旅行時我喜歡拍照。", + "sound": "/data/Lesson/c/sounds/While.mp3" + }, + { + "word": "Until", + "word_c": "直到", + "sample_e": "We will wait until he returns.", + "sample_c": "我們將等到他回來。", + "sound": "/data/Lesson/c/sounds/Until.mp3" + }, + { + "word": "Suddenly", + "word_c": "突然地", + "sample_e": "Suddenly, a car crashed into the shop.", + "sample_c": "突然,一輛汽車撞進了商店。", + "sound": "/data/Lesson/c/sounds/Suddenly.mp3" + } + ] + }, + { + "cat_name": "making conclusion", + "cat_image": "/data/Lesson/c/images/ci_making_conclusion.jpg", + "content": [ + { + "word": "All in all", + "word_c": "總的來說", + "sample_e": "All in all, the trip was a success.", + "sample_c": "整體來說,這次旅行很成功。", + "sound": "/data/Lesson/c/sounds/Allinall.mp3" + }, + { + "word": "On the whole", + "word_c": "整體而言", + "sample_e": "On the whole, all students did poorly in the test.", + "sample_c": "整體來說,所有學生的考試成績都很差。", + "sound": "/data/Lesson/c/sounds/Onthewhole.mp3" + }, + { + "word": "In conclusion", + "word_c": "總結", + "sample_e": "In conclusion, smoking should be prohibited in all areas.", + "sample_c": "總之,所有區域都應禁止吸煙。", + "sound": "/data/Lesson/c/sounds/Inconclusion.mp3" + }, + { + "word": "In short", + "word_c": "簡而言之", + "sample_e": "In short, we need more time to complete the task.", + "sample_c": "簡而言之,我們需要更多時間來完成任務。", + "sound": "/data/Lesson/c/sounds/Inshort.mp3" + }, + { + "word": "To sum up", + "word_c": "總結來說", + "sample_e": "To sum up, we must act now to save our Earth.", + "sample_c": "總而言之,我們必須立即採取行動來拯救我們的地球。", + "sound": "/data/Lesson/c/sounds/Tosumup.mp3" + } + ] + } + ] + } +] diff --git a/002_source/ionic_mobile/public/data/Lesson/images/.gitkeep b/002_source/ionic_mobile/public/data/Lesson/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/public/data/Lesson/images/quiz_connectives_revision.jpg b/002_source/ionic_mobile/public/data/Lesson/images/quiz_connectives_revision.jpg new file mode 100644 index 0000000..96fff48 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/images/quiz_connectives_revision.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/images/quiz_listening_practice.jpg b/002_source/ionic_mobile/public/data/Lesson/images/quiz_listening_practice.jpg new file mode 100644 index 0000000..7d72ff0 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/images/quiz_listening_practice.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/images/quiz_matching_frenzy.jpg b/002_source/ionic_mobile/public/data/Lesson/images/quiz_matching_frenzy.jpg new file mode 100644 index 0000000..c83104e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/images/quiz_matching_frenzy.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/.gitkeep b/002_source/ionic_mobile/public/data/Lesson/v/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/Friday.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/Friday.jpg new file mode 100644 index 0000000..55b6ed7 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/Friday.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/Monday.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/Monday.jpg new file mode 100644 index 0000000..2410524 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/Monday.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/Thursday.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/Thursday.jpg new file mode 100644 index 0000000..87a9de2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/Thursday.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/Tuesday.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/Tuesday.jpg new file mode 100644 index 0000000..c96f0d0 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/Tuesday.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/Wednesday.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/Wednesday.jpg new file mode 100644 index 0000000..ad8e80b Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/Wednesday.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/artist.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/artist.jpg new file mode 100644 index 0000000..b7a08e8 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/artist.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/athlete.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/athlete.jpg new file mode 100644 index 0000000..f248345 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/athlete.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/badminton.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/badminton.jpg new file mode 100644 index 0000000..a792e00 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/badminton.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/canvas.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/canvas.jpg new file mode 100644 index 0000000..1735f88 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/canvas.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/canyon.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/canyon.jpg new file mode 100644 index 0000000..f8f3e75 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/canyon.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_art.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_art.jpg new file mode 100644 index 0000000..e6e1af1 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_art.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_basic.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_basic.jpg new file mode 100644 index 0000000..e811ab2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_basic.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_nature.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_nature.jpg new file mode 100644 index 0000000..6a9c98f Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_nature.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_news.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_news.jpg new file mode 100644 index 0000000..0ef215b Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_news.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_sports.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_sports.jpg new file mode 100644 index 0000000..ab05062 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_sports.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_technology.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_technology.jpg new file mode 100644 index 0000000..e811ab2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_technology.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ci_workplace.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_workplace.jpg new file mode 100644 index 0000000..e811ab2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ci_workplace.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/coach.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/coach.jpg new file mode 100644 index 0000000..9deeb5b Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/coach.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/competitor.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/competitor.jpg new file mode 100644 index 0000000..d735a14 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/competitor.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/computer.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/computer.jpg new file mode 100644 index 0000000..a9b948b Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/computer.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/discrimination.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/discrimination.jpg new file mode 100644 index 0000000..bc4f21b Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/discrimination.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/flood.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/flood.jpg new file mode 100644 index 0000000..d02399c Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/flood.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/global_warming.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/global_warming.jpg new file mode 100644 index 0000000..88dd92e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/global_warming.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/inflation.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/inflation.jpg new file mode 100644 index 0000000..37ad1bc Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/inflation.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/intern.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/intern.jpg new file mode 100644 index 0000000..0c2146e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/intern.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/interview.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/interview.jpg new file mode 100644 index 0000000..7c02aa4 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/interview.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/kayaking.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/kayaking.jpg new file mode 100644 index 0000000..45e2778 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/kayaking.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/keyboard.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/keyboard.jpg new file mode 100644 index 0000000..bb16909 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/keyboard.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/mammal.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/mammal.jpg new file mode 100644 index 0000000..b40c45c Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/mammal.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/manager.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/manager.jpg new file mode 100644 index 0000000..77167a4 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/manager.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/mobile_phone.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/mobile_phone.jpg new file mode 100644 index 0000000..1d1a323 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/mobile_phone.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/mouse.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/mouse.jpg new file mode 100644 index 0000000..1b6a133 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/mouse.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/ocean.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/ocean.jpg new file mode 100644 index 0000000..627fd0f Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/ocean.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/palette.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/palette.jpg new file mode 100644 index 0000000..bb9825f Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/palette.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/photography.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/photography.jpg new file mode 100644 index 0000000..4a85a49 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/photography.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/poverty.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/poverty.jpg new file mode 100644 index 0000000..68482eb Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/poverty.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/president.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/president.jpg new file mode 100644 index 0000000..b80628d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/president.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/promotion.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/promotion.jpg new file mode 100644 index 0000000..1766409 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/promotion.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/socialmedia.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/socialmedia.jpg new file mode 100644 index 0000000..fe4474d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/socialmedia.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/suicide.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/suicide.jpg new file mode 100644 index 0000000..c340896 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/suicide.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/typhoon.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/typhoon.jpg new file mode 100644 index 0000000..253efd8 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/typhoon.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/images/watercolor.jpg b/002_source/ionic_mobile/public/data/Lesson/v/images/watercolor.jpg new file mode 100644 index 0000000..a0ac5d3 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/images/watercolor.jpg differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/.gitkeep b/002_source/ionic_mobile/public/data/Lesson/v/sounds/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/Friday.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Friday.mp3 new file mode 100644 index 0000000..49c1783 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Friday.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/Monday.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Monday.mp3 new file mode 100644 index 0000000..3ee5ce4 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Monday.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/Thursday.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Thursday.mp3 new file mode 100644 index 0000000..7955f2f Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Thursday.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/Tuesday.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Tuesday.mp3 new file mode 100644 index 0000000..8a9592a Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Tuesday.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/Wednesday.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Wednesday.mp3 new file mode 100644 index 0000000..3c1ebb2 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/Wednesday.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/artist.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/artist.mp3 new file mode 100644 index 0000000..dd91375 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/artist.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/athlete.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/athlete.mp3 new file mode 100644 index 0000000..226d029 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/athlete.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/badminton.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/badminton.mp3 new file mode 100644 index 0000000..5f01996 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/badminton.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/canvas.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/canvas.mp3 new file mode 100644 index 0000000..6c2ae6d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/canvas.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/canyon.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/canyon.mp3 new file mode 100644 index 0000000..24ed37d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/canyon.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/coach.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/coach.mp3 new file mode 100644 index 0000000..3a91878 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/coach.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/competitor.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/competitor.mp3 new file mode 100644 index 0000000..d996dde Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/competitor.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/computer.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/computer.mp3 new file mode 100644 index 0000000..766ad0d Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/computer.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/discrimination.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/discrimination.mp3 new file mode 100644 index 0000000..53dadf9 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/discrimination.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/flood.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/flood.mp3 new file mode 100644 index 0000000..edb3124 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/flood.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/global_warming.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/global_warming.mp3 new file mode 100644 index 0000000..784db3e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/global_warming.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/inflation.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/inflation.mp3 new file mode 100644 index 0000000..0ecd2db Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/inflation.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/intern.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/intern.mp3 new file mode 100644 index 0000000..29da824 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/intern.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/interview.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/interview.mp3 new file mode 100644 index 0000000..69ea837 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/interview.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/kayaking.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/kayaking.mp3 new file mode 100644 index 0000000..f1afe14 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/kayaking.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/keyboard.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/keyboard.mp3 new file mode 100644 index 0000000..f4ca8d0 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/keyboard.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/mammal.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mammal.mp3 new file mode 100644 index 0000000..24710a0 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mammal.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/manager.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/manager.mp3 new file mode 100644 index 0000000..9ca9f25 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/manager.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/mobile_phone.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mobile_phone.mp3 new file mode 100644 index 0000000..a884fa9 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mobile_phone.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/mouse.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mouse.mp3 new file mode 100644 index 0000000..05e381c Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/mouse.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/ocean.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/ocean.mp3 new file mode 100644 index 0000000..7bfe25a Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/ocean.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/palette.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/palette.mp3 new file mode 100644 index 0000000..29cc035 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/palette.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/photography.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/photography.mp3 new file mode 100644 index 0000000..3c5b393 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/photography.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/poverty.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/poverty.mp3 new file mode 100644 index 0000000..07803d1 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/poverty.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/president.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/president.mp3 new file mode 100644 index 0000000..9cca61e Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/president.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/promotion.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/promotion.mp3 new file mode 100644 index 0000000..45557b1 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/promotion.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/social media.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/social media.mp3 new file mode 100644 index 0000000..0e38781 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/social media.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/social_media.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/social_media.mp3 new file mode 100644 index 0000000..0e38781 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/social_media.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/suicide.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/suicide.mp3 new file mode 100644 index 0000000..7311c21 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/suicide.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/typhoon.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/typhoon.mp3 new file mode 100644 index 0000000..4526a78 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/typhoon.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Lesson/v/sounds/watercolor.mp3 b/002_source/ionic_mobile/public/data/Lesson/v/sounds/watercolor.mp3 new file mode 100644 index 0000000..994e121 Binary files /dev/null and b/002_source/ionic_mobile/public/data/Lesson/v/sounds/watercolor.mp3 differ diff --git a/002_source/ionic_mobile/public/data/Quiz/ConnectivesRevision/content.json b/002_source/ionic_mobile/public/data/Quiz/ConnectivesRevision/content.json new file mode 100644 index 0000000..b0b3161 --- /dev/null +++ b/002_source/ionic_mobile/public/data/Quiz/ConnectivesRevision/content.json @@ -0,0 +1,98 @@ +[ + { + "cat_name": "quiz 1", + "content": [ + { + "question_fh": "I enjoy swimming.", + "question_sh": ", I love hiking. ", + "modal_ans": "Moreover", + "options": ["To begin with", "Therefore", "Before"] + }, + { + "question_fh": "", + "question_sh": ", We need to think of a plan. Then, we can analyse the benefits and flaws. ", + "modal_ans": "To begin with", + "options": ["Due to", "Since", "Consequently"] + }, + { + "question_fh": "He forgot to turn off the water tap. ", + "question_sh": ", the basin overflowed. ", + "modal_ans": "Therefore", + "options": ["While", "Secondly", "On the other hand"] + }, + { + "question_fh": "", + "question_sh": " the forest fire, many animals are in danger.", + "modal_ans": "Due to", + "options": ["Because", "Secondly", "Alternatively"] + }, + { + "question_fh": "The restaurant is shut down ", + "question_sh": " the inspectors find rats in the kitchen. ", + "modal_ans": "since", + "options": ["Equally", "Therefore", "due to"] + } + ], + "init_ans": ["D", "E", "F"] + }, + { + "cat_name": "quiz 2", + "content": [ + { + "question_fh": "Mental illness is a serious problem for teenagers. ", + "question_sh": ", it ranks first among the leading causes of death for teenagers.", + "modal_ans": "In fact", + "options": ["Therefore", "On the contrary", "Especially"] + }, + { + "question_fh": "I will keep studying ", + "question_sh": " I fully understand the material.", + "modal_ans": "until", + "options": ["Before", "After", "While"] + }, + { + "question_fh": "", + "question_sh": ", the lights went out, and the room was in complete darkness.", + "modal_ans": "Suddenly", + "options": ["On the whole", "While", "Since"] + }, + { + "question_fh": "", + "question_sh": ", making rules and education are essential steps to combat mobile phone addiction. ", + "modal_ans": "To sum up", + "options": ["Alternatively", "Therefore", "Particularly"] + }, + { + "question_fh": "", + "question_sh": ", effective communication is essential for successful teamwork.", + "modal_ans": "Clearly", + "options": ["Suddenly", "To conclude", "In fact"] + } + ], + "init_ans": ["D", "E", "F"] + }, + { + "cat_name": "debug", + "content": [ + { + "question_fh": "Mental illness is a serious problem for teenagers. AAA", + "question_sh": ", it ranks first among the leading causes of death for teenagers.", + "modal_ans": "A", + "options": ["Therefore", "On the contrary", "Especially"] + }, + { + "question_fh": "I will keep studying B", + "question_sh": " I fully understand the material.", + "modal_ans": "B", + "options": ["Before", "After", "While"] + }, + { + "question_fh": "", + "question_sh": ", the lights went out, and the room was in complete darkness. C", + "modal_ans": "C", + "options": ["On the whole", "While", "Since"] + } + ], + "init_ans": ["D", "E", "F"] + } +] diff --git a/002_source/ionic_mobile/public/data/Quiz/ListeningPractice/content.json b/002_source/ionic_mobile/public/data/Quiz/ListeningPractice/content.json new file mode 100644 index 0000000..9b0b49f --- /dev/null +++ b/002_source/ionic_mobile/public/data/Quiz/ListeningPractice/content.json @@ -0,0 +1,242 @@ +[ + { + "cat_name": "Technology", + "cat_image": "/data/Lesson/v/images/ci_technology.jpg", + "content": [ + { + "word": "keyboard", + "sound": "/data/Lesson/v/sounds/keyboard.mp3" + }, + { + "word": "mouse", + "sound": "/data/Lesson/v/sounds/mouse.mp3" + }, + { + "word": "computer", + "sound": "/data/Lesson/v/sounds/computer.mp3" + }, + { + "word": "mobile phone", + "sound": "/data/Lesson/v/sounds/mobile_phone.mp3" + }, + { + "word": "social media", + "sound": "/data/Lesson/v/sounds/social media.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Art", + "cat_image": "/data/Lesson/v/images/ci_art.jpg", + "content": [ + { + "word": "watercolor", + "sound": "/data/Lesson/v/sounds/watercolor.mp3" + }, + { + "word": "photography", + "sound": "/data/Lesson/v/sounds/photography.mp3" + }, + { + "word": "palette", + "sound": "/data/Lesson/v/sounds/palette.mp3" + }, + { + "word": "artist", + "sound": "/data/Lesson/v/sounds/artist.mp3" + }, + { + "word": "canvas", + "sound": "/data/Lesson/v/sounds/canvas.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Nature", + "cat_image": "/data/Lesson/v/images/ci_nature.jpg", + "content": [ + { + "word": "flood", + "sound": "/data/Lesson/v/sounds/flood.mp3" + }, + { + "word": "typhoon", + "sound": "/data/Lesson/v/sounds/typhoon.mp3" + }, + { + "word": "ocean", + "sound": "/data/Lesson/v/sounds/ocean.mp3" + }, + { + "word": "canyon", + "sound": "/data/Lesson/v/sounds/canyon.mp3" + }, + { + "word": "mammal", + "sound": "/data/Lesson/v/sounds/mammal.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Workplace", + "cat_image": "/data/Lesson/v/images/ci_workplace.jpg", + "content": [ + { + "word": "interview", + "sound": "/data/Lesson/v/sounds/interview.mp3" + }, + { + "word": "president", + "sound": "/data/Lesson/v/sounds/president.mp3" + }, + { + "word": "manager", + "sound": "/data/Lesson/v/sounds/manager.mp3" + }, + { + "word": "intern", + "sound": "/data/Lesson/v/sounds/intern.mp3" + }, + { + "word": "promotion", + "sound": "/data/Lesson/v/sounds/promotion.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Sports", + "cat_image": "/data/Lesson/v/images/ci_sports.jpg", + "content": [ + { + "word": "athlete", + "sound": "/data/Lesson/v/sounds/athlete.mp3" + }, + { + "word": "coach", + "sound": "/data/Lesson/v/sounds/coach.mp3" + }, + { + "word": "competitor", + "sound": "/data/Lesson/v/sounds/competitor.mp3" + }, + { + "word": "kayaking", + "sound": "/data/Lesson/v/sounds/kayaking.mp3" + }, + { + "word": "badminton", + "sound": "/data/Lesson/v/sounds/badminton.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "News", + "cat_image": "/data/Lesson/v/images/ci_news.jpg", + "content": [ + { + "word": "inflation", + "sound": "/data/Lesson/v/sounds/inflation.mp3" + }, + { + "word": "poverty", + "sound": "/data/Lesson/v/sounds/poverty.mp3" + }, + { + "word": "global warming", + "sound": "/data/Lesson/v/sounds/global_warming.mp3" + }, + { + "word": "discrimination", + "sound": "/data/Lesson/v/sounds/discrimination.mp3" + }, + { + "word": "suicide", + "sound": "/data/Lesson/v/sounds/suicide.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "Basic", + "cat_image": "/data/Lesson/v/images/ci_basic.jpg", + "content": [ + { + "word": "Monday", + "sound": "/data/Lesson/v/sounds/Monday.mp3" + }, + { + "word": "Tuesday", + "sound": "/data/Lesson/v/sounds/Tuesday.mp3" + }, + { + "word": "Wednesday", + "sound": "/data/Lesson/v/sounds/Wednesday.mp3" + }, + { + "word": "Thursday", + "sound": "/data/Lesson/v/sounds/Thursday.mp3" + }, + { + "word": "Friday", + "sound": "/data/Lesson/v/sounds/Friday.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + }, + { + "cat_name": "DEBUG", + "cat_image": "/data/Lesson/v/images/ci_basic.jpg", + "content": [ + { + "word": "1", + "sound": "/data/Lesson/v/sounds/Monday.mp3" + }, + { + "word": "2", + "sound": "/data/Lesson/v/sounds/Tuesday.mp3" + }, + { + "word": "3", + "sound": "/data/Lesson/v/sounds/Wednesday.mp3" + } + ], + "init_answer": [ + "A", + "B", + "C" + ] + } +] diff --git a/002_source/ionic_mobile/public/data/Quiz/MatchingFrenzy/content.json b/002_source/ionic_mobile/public/data/Quiz/MatchingFrenzy/content.json new file mode 100644 index 0000000..3e5360d --- /dev/null +++ b/002_source/ionic_mobile/public/data/Quiz/MatchingFrenzy/content.json @@ -0,0 +1,218 @@ +[ + { + "cat_name": "Technology", + "cat_image": "/data/Lesson/v/images/ci_technology.jpg", + "content": [ + { + "word": "keyboard", + "word_c": "鍵盤" + }, + { + "word": "mouse", + "word_c": "滑鼠" + }, + { + "word": "computer", + "word_c": "電腦" + }, + { + "word": "mobile phone", + "word_c": "手機" + }, + { + "word": "social media", + "word_c": "社交媒體" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "Art", + "cat_image": "/data/Lesson/v/images/ci_art.jpg", + "content": [ + { + "word": "watercolor", + "word_c": "水彩" + }, + { + "word": "photography", + "word_c": "攝影" + }, + { + "word": "palette", + "word_c": "調色盤" + }, + { + "word": "artist", + "word_c": "藝術家" + }, + { + "word": "canvas", + "word_c": "畫布" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "Nature", + "cat_image": "/data/Lesson/v/images/ci_nature.jpg", + "content": [ + { + "word": "flood", + "word_c": "洪水" + }, + { + "word": "typhoon", + "word_c": "颱風" + }, + { + "word": "ocean", + "word_c": "海洋" + }, + { + "word": "canyon", + "word_c": "峽谷" + }, + { + "word": "mammal", + "word_c": "哺乳動物" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "Workplace", + "cat_image": "/data/Lesson/v/images/ci_workplace.jpg", + "content": [ + { + "word": "interview", + "word_c": "面試" + }, + { + "word": "president", + "word_c": "總統" + }, + { + "word": "manager", + "word_c": "經理" + }, + { + "word": "intern", + "word_c": "實習生" + }, + { + "word": "promotion", + "word_c": "升遷" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "Sports", + "cat_image": "/data/Lesson/v/images/ci_sports.jpg", + "content": [ + { + "word": "athlete", + "word_c": "運動員" + }, + { + "word": "coach", + "word_c": "教練" + }, + { + "word": "competitor", + "word_c": "競爭者" + }, + { + "word": "kayaking", + "word_c": "划皮艇" + }, + { + "word": "badminton", + "word_c": "羽毛球" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "News", + "cat_image": "/data/Lesson/v/images/ci_news.jpg", + "content": [ + { + "word": "inflation", + "word_c": "通貨膨脹" + }, + { + "word": "poverty", + "word_c": "貧窮" + }, + { + "word": "global warming", + "word_c": "全球暖化" + }, + { + "word": "discrimination", + "word_c": "歧視" + }, + { + "word": "suicide", + "word_c": "自殺" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "Basic", + "cat_image": "/data/Lesson/v/images/ci_basic.jpg", + "content": [ + { + "word": "Monday", + "word_c": "星期一" + }, + { + "word": "Tuesday", + "word_c": "星期二" + }, + { + "word": "Wednesday", + "word_c": "星期三" + }, + { + "word": "Thursday", + "word_c": "星期四" + }, + { + "word": "Friday", + "word_c": "星期五" + } + ], + "init_answer": ["A", "B", "C"] + }, + { + "cat_name": "DEBUG", + "cat_image": "/data/Lesson/v/images/ci_basic.jpg", + "content": [ + { + "word": "Monday", + "word_c": "星期一" + }, + { + "word": "Tuesday", + "word_c": "星期二" + }, + { + "word": "Wednesday", + "word_c": "星期三" + }, + { + "word": "Thursday", + "word_c": "星期四" + }, + { + "word": "Friday", + "word_c": "星期五" + } + ], + "init_answer": ["A", "B", "C"] + } +] diff --git a/002_source/ionic_mobile/public/data/index.ts b/002_source/ionic_mobile/public/data/index.ts new file mode 100644 index 0000000..cf4893c --- /dev/null +++ b/002_source/ionic_mobile/public/data/index.ts @@ -0,0 +1,11 @@ +import LessonCategoriesMeta from "./Lesson/meta.json"; + +function getLessonCategories(): any { + return LessonCategoriesMeta; +} + +function Helloworld(): string { + return getLessonCategories(); +} + +export { Helloworld }; diff --git a/002_source/ionic_mobile/public/data/user_config.json b/002_source/ionic_mobile/public/data/user_config.json new file mode 100644 index 0000000..823e914 --- /dev/null +++ b/002_source/ionic_mobile/public/data/user_config.json @@ -0,0 +1,8 @@ +{ + "matching_frenzy_count_down_s": 60, + "listening_practice_anwered_wait_s": 1, + "matching_frenzy_anwered_wait_s": 1, + "connectives_revision_anwered_wait_s": 1, + "WRONG_ANS_TOAST_APPEAR_TIMEOUT_S": 3, + "CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S": 3 +} diff --git a/002_source/ionic_mobile/public/favicon.png b/002_source/ionic_mobile/public/favicon.png new file mode 100644 index 0000000..8829de4 Binary files /dev/null and b/002_source/ionic_mobile/public/favicon.png differ diff --git a/002_source/ionic_mobile/public/helloworld.mp3 b/002_source/ionic_mobile/public/helloworld.mp3 new file mode 100644 index 0000000..f4ca8d0 Binary files /dev/null and b/002_source/ionic_mobile/public/helloworld.mp3 differ diff --git a/002_source/ionic_mobile/public/icon.png b/002_source/ionic_mobile/public/icon.png new file mode 100644 index 0000000..8829de4 Binary files /dev/null and b/002_source/ionic_mobile/public/icon.png differ diff --git a/002_source/ionic_mobile/public/manifest.json b/002_source/ionic_mobile/public/manifest.json new file mode 100644 index 0000000..cd7bbe7 --- /dev/null +++ b/002_source/ionic_mobile/public/manifest.json @@ -0,0 +1,53 @@ +{ + "short_name": "Letter card App", + "name": "My Letter card App", + "display": "standalone", + "orientation": "portrait", + "start_url": ".", + "theme_color": "#ffffff", + "background_color": "#eeeeee", + "icons": [ + { + "src": "assets/icons/icon-48.webp", + "type": "image/png", + "sizes": "48x48", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-72.webp", + "type": "image/png", + "sizes": "72x72", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-96.webp", + "type": "image/png", + "sizes": "96x96", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-128.webp", + "type": "image/png", + "sizes": "128x128", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-192.webp", + "type": "image/png", + "sizes": "192x192", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-256.webp", + "type": "image/png", + "sizes": "256x256", + "purpose": "any maskable" + }, + { + "src": "assets/icons/icon-512.webp", + "type": "image/png", + "sizes": "512x512", + "purpose": "any maskable" + } + ] +} diff --git a/002_source/ionic_mobile/scripts/docker/entrypoint.sh b/002_source/ionic_mobile/scripts/docker/entrypoint.sh new file mode 100755 index 0000000..36a8631 --- /dev/null +++ b/002_source/ionic_mobile/scripts/docker/entrypoint.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -ex + +nvm use 22 +node -v + +# sleep infinity +while true; do + if [ "$NODE_ENV" = "development" ]; then + npm i -D + npm run dev + else + # temp solution + npm run dev + fi + + sleep 1 +done diff --git a/002_source/ionic_mobile/scripts/mac/000_clean.sh b/002_source/ionic_mobile/scripts/mac/000_clean.sh new file mode 100755 index 0000000..e5b97a8 --- /dev/null +++ b/002_source/ionic_mobile/scripts/mac/000_clean.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -ex + +rm -rf **/node_modules + +echo "done" diff --git a/002_source/ionic_mobile/scripts/mac/001_start.sh b/002_source/ionic_mobile/scripts/mac/001_start.sh new file mode 100755 index 0000000..0c3dafa --- /dev/null +++ b/002_source/ionic_mobile/scripts/mac/001_start.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -ex + +npm i -D +npm run dev + +echo "done" diff --git a/002_source/ionic_mobile/scripts/mac/002_build_w.sh b/002_source/ionic_mobile/scripts/mac/002_build_w.sh new file mode 100755 index 0000000..5528c7c --- /dev/null +++ b/002_source/ionic_mobile/scripts/mac/002_build_w.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -ex + +npx nodemon \ + --ext ts,tsx \ + --ignore "dist" \ + --ignore "android" \ + --ignore "public" \ + --exec "npm run build" + diff --git a/002_source/ionic_mobile/scripts/mac/003_test_w.sh b/002_source/ionic_mobile/scripts/mac/003_test_w.sh new file mode 100755 index 0000000..f3ade64 --- /dev/null +++ b/002_source/ionic_mobile/scripts/mac/003_test_w.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -ex + +npx cap run android --target=8L5PT4S84HWKOB4H --no-build --no-sync + diff --git a/002_source/ionic_mobile/scripts/win/000_clean.bat b/002_source/ionic_mobile/scripts/win/000_clean.bat new file mode 100644 index 0000000..d1dd65a --- /dev/null +++ b/002_source/ionic_mobile/scripts/win/000_clean.bat @@ -0,0 +1 @@ +rmdir /s /q node_modules diff --git a/002_source/ionic_mobile/scripts/win/001_start.bat b/002_source/ionic_mobile/scripts/win/001_start.bat new file mode 100644 index 0000000..c1370e0 --- /dev/null +++ b/002_source/ionic_mobile/scripts/win/001_start.bat @@ -0,0 +1,5 @@ +cmd /c npm i -D + +cmd /c npm run dev + +echo "done" diff --git a/002_source/ionic_mobile/scripts/win/002_build_w.bat b/002_source/ionic_mobile/scripts/win/002_build_w.bat new file mode 100644 index 0000000..bcbeaa7 --- /dev/null +++ b/002_source/ionic_mobile/scripts/win/002_build_w.bat @@ -0,0 +1,12 @@ +@REM npx nodemon ^ +@REM --ext ts,tsx ^ +@REM --ignore "dist" ^ +@REM --exec "npm run build" + +npx nodemon ^ + --ext ts,tsx ^ + --ignore "dist" ^ + --ignore "android" ^ + --ignore "public" ^ + --exec "npm run build" + diff --git a/002_source/ionic_mobile/scripts/win/003_test_w.bat b/002_source/ionic_mobile/scripts/win/003_test_w.bat new file mode 100644 index 0000000..cd1894b --- /dev/null +++ b/002_source/ionic_mobile/scripts/win/003_test_w.bat @@ -0,0 +1,17 @@ +@REM npx nodemon ^ +@REM --ext ts,tsx ^ +@REM --ignore "dist" ^ +@REM --exec "npm run build" + +@REM adb pair 19216.10.108:41773 + +@REM npx nodemon ^ +@REM --ext ts,tsx ^ +@REM --delay 5 ^ +@REM --ignore "dist" ^ +@REM --ignore "android" ^ +@REM --ignore "public" ^ +@REM --exec "npm run run_android" + +npx cap run android --target=8L5PT4S84HWKOB4H --no-build --no-sync + diff --git a/002_source/ionic_mobile/scripts/win/sync_win.sh b/002_source/ionic_mobile/scripts/win/sync_win.sh new file mode 100755 index 0000000..8f33898 --- /dev/null +++ b/002_source/ionic_mobile/scripts/win/sync_win.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -ex + +rsync -avh --exclude="node_modules" \ + --exclude="android" \ + --exclude="dist" \ + . \ + /mnt/c/_workspace/004_comission/lettersoup_hk/source diff --git a/002_source/ionic_mobile/src/App.test.tsx b/002_source/ionic_mobile/src/App.test.tsx new file mode 100644 index 0000000..da88d65 --- /dev/null +++ b/002_source/ionic_mobile/src/App.test.tsx @@ -0,0 +1,7 @@ +import { render } from '@testing-library/react'; +import App from './App'; + +test('renders without crashing', () => { + const { baseElement } = render(); + expect(baseElement).toBeDefined(); +}); diff --git a/002_source/ionic_mobile/src/App.tsx b/002_source/ionic_mobile/src/App.tsx new file mode 100644 index 0000000..3c9f0af --- /dev/null +++ b/002_source/ionic_mobile/src/App.tsx @@ -0,0 +1,199 @@ +import { DEBUG, DEBUG_LINK, LESSON_LINK, QUIZ_MAIN_MENU_LINK, RECORD_LINK, SETTING_LINK } from './constants'; +/* Core CSS required for Ionic components to work properly */ + +import '@ionic/react/css/core.css'; +/* Basic CSS for apps built with Ionic */ +import '@ionic/react/css/normalize.css'; +import '@ionic/react/css/structure.css'; +/* Optional CSS utils that can be commented out */ +import '@ionic/react/css/padding.css'; +import '@ionic/react/css/float-elements.css'; +import '@ionic/react/css/text-alignment.css'; +import '@ionic/react/css/text-transformation.css'; +import '@ionic/react/css/flex-utils.css'; +import '@ionic/react/css/typography.css'; +import '@ionic/react/css/display.css'; +/** + * Ionic Dark Mode + * ----------------------------------------------------- + * For more info, please see: + * https://ionicframework.com/docs/theming/dark-mode + */ +/* import '@ionic/react/css/palettes/dark.always.css'; */ +/* import '@ionic/react/css/palettes/dark.class.css'; */ +// import '@ionic/react/css/palettes/dark.system.css'; +/* Theme variables */ +import './theme/variables.css'; +import './debug.css'; +import './style.css'; +import './google_fonts.css'; +import { App as CapacitorApp } from '@capacitor/app'; +import { + IonApp, + IonIcon, + IonLabel, + IonRouterOutlet, + IonTabBar, + IonTabButton, + IonTabs, + setupIonicReact, + useIonRouter, +} from '@ionic/react'; +import { IonReactRouter } from '@ionic/react-router'; +import { bookOutline, bug, heartOutline, newspaperOutline, settingsOutline } from 'ionicons/icons'; +import { useTranslation } from 'react-i18next'; +import ConfirmUserExit from './components/ConfirmUserExit'; +import { DisableUserTap } from './components/DisableUserTap'; +import ContextMeta from './contexts'; +import { useAppStateContext } from './contexts/AppState'; +import { useMyIonQuizContext } from './contexts/MyIonQuiz'; +import { RouteConfig } from './RouteConfig'; + +let active_color = 'tomato'; +let inactive_color = 'gray'; + +CapacitorApp.addListener('appStateChange', ({ isActive }) => { + console.log('App state changed. Is active?', isActive); +}); + +CapacitorApp.addListener('backButton', ({ canGoBack }) => { + if (!canGoBack) { + // CapacitorApp.minimizeApp(); + // alert('blablabla'); + } +}); + +setupIonicReact(); + +const TabButtons: React.FC = () => { + let router = useIonRouter(); + const { t } = useTranslation(); + + let { + url_push_after_user_confirm, + setURLPushAfterUserConfirm, + setShowConfirmUserExit, + listening_practice_in_progress, + setListeningPracticeInProgress, + matching_frenzy_in_progress, + connective_revision_in_progress, + tab_active, + setTabActive, + } = useAppStateContext(); + const { resetListeningPracticeCorrectionList } = useMyIonQuizContext(); + + function goSwitchPage(url: string) { + if (listening_practice_in_progress || matching_frenzy_in_progress || connective_revision_in_progress) { + if (url != QUIZ_MAIN_MENU_LINK) { + setURLPushAfterUserConfirm(url); + setShowConfirmUserExit(true); + } + } else { + setTabActive(url); + router.push(url, 'none', 'replace'); + } + } + + return ( + <> + + goSwitchPage(LESSON_LINK)} + style={{ color: tab_active == LESSON_LINK ? active_color : inactive_color }} + > + + {/* */} + goSwitchPage(QUIZ_MAIN_MENU_LINK)} + style={{ color: tab_active == QUIZ_MAIN_MENU_LINK ? active_color : inactive_color }} + > + + + goSwitchPage(QUIZ_MAIN_MENU_LINK)} + style={{ color: tab_active == QUIZ_MAIN_MENU_LINK ? active_color : inactive_color }} + > + + {/* */} + goSwitchPage(RECORD_LINK)} + style={{ color: tab_active == RECORD_LINK ? active_color : inactive_color }} + > + + {/* */} + + {/* 003_remove_setting_screen, hide setting on bottom tabs */} + goSwitchPage(SETTING_LINK)} + style={{ color: tab_active == SETTING_LINK ? active_color : inactive_color }} + > + + + {DEBUG ? ( + goSwitchPage(DEBUG_LINK)} + // href={DEBUG_LINK} + > + + ) : ( + <> + )} + + + ); +}; + +const App: React.FC = () => { + return ( + + + + + + + + + + +
+
AI
+
+ {/* */} + + {/* */} +
+
+
+
+ ); +}; + +export default App; diff --git a/002_source/ionic_mobile/src/RouteConfig.tsx b/002_source/ionic_mobile/src/RouteConfig.tsx new file mode 100644 index 0000000..ad8c4b5 --- /dev/null +++ b/002_source/ionic_mobile/src/RouteConfig.tsx @@ -0,0 +1,158 @@ +import { Redirect, Route } from 'react-router-dom'; +import { + CONNECTIVE_REVISION_LINK, + DEBUG_LINK, + FAVORITE_LINK, + LESSON_LINK, + LESSON_WORD_PAGE_LINK, + LISTENING_PRACTICE_LINK, + MATCHING_FRENZY_LINK, + QUIZ_MAIN_MENU_LINK, + RECORD_LINK, +} from './constants'; +import ConnectiveRevisionQuizRun from './pages/ConnectiveRevision/QuizRun'; +import ConnectiveRevisionQuizResult from './pages/ConnectiveRevision/Result'; +// import CorrectionRoute from './pages/MatchingFrenzy/Route/Correction'; +// import PracticeFinish from './pages/MatchingFrenzy/Finish'; +import ConnectiveRevisionSelectCategory from './pages/ConnectiveRevision/SelectCategory'; +import DebugPage from './pages/DebugPage'; +import FavConnectivesPage from './pages/Favorite/Connectives'; +import ConnectivesWordPage from './pages/Favorite/ConnectivesWordPage'; +import FavVocabularyPage from './pages/Favorite/Vocabulary'; +import FavoriteVocabularyPage from './pages/Favorite/WordPage'; +import ConnectivesPage from './pages/Lesson/ConnectivesPage'; +import Lesson from './pages/Lesson/index'; +import LessonWordPage from './pages/Lesson/WordPage'; +// +import ListeningPractice from './pages/ListeningPractice'; +import PracticeFinish from './pages/ListeningPractice/Finish'; +import PracticeResult from './pages/ListeningPractice/Result'; +import QuestionRoute from './pages/ListeningPractice/Route'; +import CorrectionRoute from './pages/ListeningPractice/Route/CorrectionRoute'; +import MatchingFrenzyMatchFinished from './pages/MatchingFrenzy/Finished'; +import MatchingFrenzyMatchRun from './pages/MatchingFrenzy/MatchRun'; +import MatchingFrenzyMatchResult from './pages/MatchingFrenzy/Result'; +// +import MatchingFrenzySelectCategory from './pages/MatchingFrenzy/SelectCategory'; +import Page from './pages/Page'; +import QuizzesMainMenu from './pages/QuizzesMainMenu'; +// +import MyAchievementPage from './pages/Record/index'; +import Setting from './pages/Setting/indx'; +import Tab1 from './pages/Tab1'; +import Tab2 from './pages/Tab2'; +import Tab3 from './pages/Tab3'; + +function RouteConfig() { + return ( + <> + {/* */} + + + + {/* */} + + + + {/* */} + + + + + + + + {/* */} + {/* http://localhost:5173/listening_practice/c/0 */} + + + + + {/* http://localhost:5173/listening_practice/r/0 */} + + + + + + + + + + + + + {/* */} + + + + + + + + + + {/* */} + + + + + + + + + + + + + + + + + + + + + + + {/* */} + {/* */} + + + + + + + + + + + + + + {/* TODO: remove below */} + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export { RouteConfig }; diff --git a/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/index.tsx b/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/index.tsx new file mode 100644 index 0000000..7cbdbb3 --- /dev/null +++ b/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/index.tsx @@ -0,0 +1,68 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + range_list: number[]; +} + +const AttentiveEarsProgressBar: FunctionComponent = ({ value, range_list }) => { + let test_value = value; + let scale = []; + + for (let i = 0; i < range_list.length; i++) { + let scale_full_range = range_list[i]; + let scale_range = i > 0 ? scale_full_range - range_list[i - 1] : scale_full_range; + + let fill = 0; + if (test_value > scale_full_range) { + fill = scale_full_range; + } else { + if (i > 0) { + fill = Math.max(0, test_value - range_list[i - 1]); + } else { + fill = test_value; + } + } + let fill_pct = Math.min(fill / scale_range, 1); + scale.push([fill_pct]); + } + + return ( + <> +
+ {scale.map((item: any, index: number) => { + return ( +
+
{range_list[index]}
+
+
+
+
+ ); + })} +
+ + ); +}; + +export default AttentiveEarsProgressBar; diff --git a/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/style.css b/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/AttentiveEarsProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/ConfirmUserExit/index.tsx b/002_source/ionic_mobile/src/components/ConfirmUserExit/index.tsx new file mode 100644 index 0000000..cc990d7 --- /dev/null +++ b/002_source/ionic_mobile/src/components/ConfirmUserExit/index.tsx @@ -0,0 +1,79 @@ +import { IonButton, IonContent, IonModal, useIonRouter } from '@ionic/react'; +import { useRef } from 'react'; +import { COLOR_TEXT } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; + +function ConfirmUserExit() { + let { + setTabActive, + show_confirm_user_exit, + setShowConfirmUserExit, + url_push_after_user_confirm, + setListeningPracticeInProgress, + setConnectiveRevisionInProgress, + setMatchingFrenzyInProgress, + } = useAppStateContext(); + const modal = useRef(null); + const router = useIonRouter(); + const { resetListeningPracticeCorrectionList } = useMyIonQuizContext(); + return ( + <> + setShowConfirmUserExit(false)} + > + +
+
Are you sure want to quit ?
+
+ setShowConfirmUserExit(false)} + > + No + + { + setShowConfirmUserExit(false); + setListeningPracticeInProgress(false); + setMatchingFrenzyInProgress(false); + setConnectiveRevisionInProgress(false); + // + resetListeningPracticeCorrectionList(); + // + setTabActive(url_push_after_user_confirm); + // + router.push(url_push_after_user_confirm, 'none', 'replace'); + }} + > + Yes + +
+
+
+
+ + ); +} + +export default ConfirmUserExit; diff --git a/002_source/ionic_mobile/src/components/ConfirmUserQuitQuiz/index.tsx b/002_source/ionic_mobile/src/components/ConfirmUserQuitQuiz/index.tsx new file mode 100644 index 0000000..3f3f2ba --- /dev/null +++ b/002_source/ionic_mobile/src/components/ConfirmUserQuitQuiz/index.tsx @@ -0,0 +1,86 @@ +import { IonButton, IonContent, IonModal, useIonRouter } from '@ionic/react'; +import { Dispatch, FunctionComponent, SetStateAction, useRef } from 'react'; +import { COLOR_TEXT } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; + +interface AudioSeekBarProps { + show_confirm_user_exit: boolean; + setShowConfirmUserExit: Dispatch>; + url_push_after_user_confirm: string; +} + +const ConfirmUserQuitQuiz: FunctionComponent = ({ + show_confirm_user_exit, + setShowConfirmUserExit, + // + url_push_after_user_confirm, +}) => { + let { setListeningPracticeInProgress, setConnectiveRevisionInProgress, setMatchingFrenzyInProgress } = + useAppStateContext(); + let { setTabActive } = useAppStateContext(); + + const modal = useRef(null); + const router = useIonRouter(); + const { resetListeningPracticeCorrectionList } = useMyIonQuizContext(); + + return ( + <> + setShowConfirmUserExit(false)} + > + +
+
Are you sure want to quit ?
+
+ setShowConfirmUserExit(false)} + > + No + + { + setShowConfirmUserExit(false); + setListeningPracticeInProgress(false); + setMatchingFrenzyInProgress(false); + setConnectiveRevisionInProgress(false); + // + resetListeningPracticeCorrectionList(); + // + setTabActive(url_push_after_user_confirm); + // + router.push(url_push_after_user_confirm, 'none', 'replace'); + }} + > + Yes + +
+
+
+
+ + ); +}; + +export default ConfirmUserQuitQuiz; diff --git a/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/index.tsx b/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/index.tsx new file mode 100644 index 0000000..b2a3ec8 --- /dev/null +++ b/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/index.tsx @@ -0,0 +1,68 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + range_list: number[]; +} + +const ConnectivesConquerorProgressBar: FunctionComponent = ({ value, range_list }) => { + let test_value = value; + let scale = []; + + for (let i = 0; i < range_list.length; i++) { + let scale_full_range = range_list[i]; + let scale_range = i > 0 ? scale_full_range - range_list[i - 1] : scale_full_range; + + let fill = 0; + if (test_value > scale_full_range) { + fill = scale_full_range; + } else { + if (i > 0) { + fill = Math.max(0, test_value - range_list[i - 1]); + } else { + fill = test_value; + } + } + let fill_pct = Math.min(fill / scale_range, 1); + scale.push([fill_pct]); + } + + return ( + <> +
+ {scale.map((item: any, index: number) => { + return ( +
+
{range_list[index]}
+
+
+
+
+ ); + })} +
+ + ); +}; + +export default ConnectivesConquerorProgressBar; diff --git a/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/style.css b/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/ConnectivesConquerorProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/CorrectAnswerToast/index.tsx b/002_source/ionic_mobile/src/components/CorrectAnswerToast/index.tsx new file mode 100644 index 0000000..c89dfaf --- /dev/null +++ b/002_source/ionic_mobile/src/components/CorrectAnswerToast/index.tsx @@ -0,0 +1,28 @@ +import { IonToast } from '@ionic/react'; +import './style.css'; +import { CORRECT_ANSWER_MESSAGE } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; + +interface QuestionCardProps { + isOpen: boolean; + dismiss: () => void; +} + +const CorrectAnswerToast: React.FC = ({ isOpen, dismiss }) => { + const { CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S } = useAppStateContext(); + + return ( + <> + dismiss()} + duration={CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S * 1000} + color="success" + > + + ); +}; + +export default CorrectAnswerToast; diff --git a/002_source/ionic_mobile/src/components/CorrectAnswerToast/style.css b/002_source/ionic_mobile/src/components/CorrectAnswerToast/style.css new file mode 100644 index 0000000..0f68797 --- /dev/null +++ b/002_source/ionic_mobile/src/components/CorrectAnswerToast/style.css @@ -0,0 +1,9 @@ +ion-toast.correct-answer-toast::part(message) { + text-align: center; + font-size: 1.5rem; + color: rgba(0, 0, 0, 0.9); +} + +ion-toast.correct-answer-toast::part(container) { + bottom: 100px; +} diff --git a/002_source/ionic_mobile/src/components/DisableUserTap/index.tsx b/002_source/ionic_mobile/src/components/DisableUserTap/index.tsx new file mode 100644 index 0000000..610d9dd --- /dev/null +++ b/002_source/ionic_mobile/src/components/DisableUserTap/index.tsx @@ -0,0 +1,12 @@ +import { IonBackdrop } from '@ionic/react'; +import { useAppStateContext } from '../../contexts/AppState'; + +export function DisableUserTap({ children }: { children: React.ReactNode }) { + const { disable_user_tap } = useAppStateContext(); + return ( + <> + {disable_user_tap ? : null} + {children} + + ); +} diff --git a/002_source/ionic_mobile/src/components/ExitButton/ExitButton.jfif b/002_source/ionic_mobile/src/components/ExitButton/ExitButton.jfif new file mode 100644 index 0000000..f47d34f Binary files /dev/null and b/002_source/ionic_mobile/src/components/ExitButton/ExitButton.jfif differ diff --git a/002_source/ionic_mobile/src/components/ExitButton/index.tsx b/002_source/ionic_mobile/src/components/ExitButton/index.tsx new file mode 100644 index 0000000..dd057ba --- /dev/null +++ b/002_source/ionic_mobile/src/components/ExitButton/index.tsx @@ -0,0 +1,21 @@ +import { App } from '@capacitor/app'; +import { IonButton, IonIcon } from '@ionic/react'; +import { FunctionComponent } from 'react'; +import './style.css'; +import { exitOutline } from 'ionicons/icons'; + +const ExitButton: FunctionComponent = () => { + const handleExitOnClick = () => { + App.exitApp(); + }; + + return ( + <> + + + + + ); +}; + +export default ExitButton; diff --git a/002_source/ionic_mobile/src/components/ExitButton/style.css b/002_source/ionic_mobile/src/components/ExitButton/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/ExitButton/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/ExploreContainer.css b/002_source/ionic_mobile/src/components/ExploreContainer.css new file mode 100644 index 0000000..11d2f90 --- /dev/null +++ b/002_source/ionic_mobile/src/components/ExploreContainer.css @@ -0,0 +1,24 @@ +.container { + text-align: center; + position: absolute; + left: 0; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.container strong { + font-size: 20px; + line-height: 26px; +} + +.container p { + font-size: 16px; + line-height: 22px; + color: #8c8c8c; + margin: 0; +} + +.container a { + text-decoration: none; +} diff --git a/002_source/ionic_mobile/src/components/ExploreContainer.tsx b/002_source/ionic_mobile/src/components/ExploreContainer.tsx new file mode 100644 index 0000000..c686e56 --- /dev/null +++ b/002_source/ionic_mobile/src/components/ExploreContainer.tsx @@ -0,0 +1,43 @@ +import './ExploreContainer.css'; +import React from 'react'; +import Markdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; + +interface ContainerProps { + name: string; +} + +const markdown = ` +Just a link: www.nasa.gov. +- [ ] helloworld +__bold__ +# h1 +## h2 +### h3 +#### h4 +##### h5 +###### h6 + +| test | test | test | +| --- | --- | --- | +| 1 | 1 | 1 | +`; + +const ExploreContainer: React.FC = ({ name }) => { + return ( +
+ {name} +

+ Explore{' '} + + UI Components + +

+
+ {markdown} +
+
+ ); +}; + +export default ExploreContainer; diff --git a/002_source/ionic_mobile/src/components/GeniusProgressBar/index.tsx b/002_source/ionic_mobile/src/components/GeniusProgressBar/index.tsx new file mode 100644 index 0000000..6cffccc --- /dev/null +++ b/002_source/ionic_mobile/src/components/GeniusProgressBar/index.tsx @@ -0,0 +1,109 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + range_list: number[]; +} + +const GeniusProgressBar: FunctionComponent = ({ value, range_list }) => { + let test_value = value; + let scale = []; + + for (let i = 0; i < range_list.length; i++) { + let scale_full_range = range_list[i]; + let scale_range = i > 0 ? scale_full_range - range_list[i - 1] : scale_full_range; + + let fill = 0; + if (test_value > scale_full_range) { + fill = scale_full_range; + } else { + if (i > 0) { + fill = Math.max(0, test_value - range_list[i - 1]); + } else { + fill = Math.max(0, test_value); + } + } + let fill_pct = Math.min(fill / scale_range, 1); + scale.push([fill_pct]); + } + + return ( + <> +
+
+ {scale.map((item: any, index: number) => { + return ( + <> +
+
{range_list[index]}
+
+
+
+
+ + ); + })} +
+
+ + ); + + return ( + <> +
+
helloworld
+
+ {scale.map((item, index) => { + return ( +
+
{range_list[index]}
+
+
+
+
+ ); + })} +
+
+ + ); +}; + +export default GeniusProgressBar; diff --git a/002_source/ionic_mobile/src/components/GeniusProgressBar/style.css b/002_source/ionic_mobile/src/components/GeniusProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/GeniusProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/HardWorkerProgressBar/index.tsx b/002_source/ionic_mobile/src/components/HardWorkerProgressBar/index.tsx new file mode 100644 index 0000000..d30de60 --- /dev/null +++ b/002_source/ionic_mobile/src/components/HardWorkerProgressBar/index.tsx @@ -0,0 +1,72 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + range_list: number[]; +} + +const HardWorkerProgressBar: FunctionComponent = ({ value, range_list }) => { + let test_value = value; + let scale = []; + + for (let i = 0; i < range_list.length; i++) { + let scale_full_range = range_list[i]; + let scale_range = i > 0 ? scale_full_range - range_list[i - 1] : scale_full_range; + + let fill = 0; + if (test_value > scale_full_range) { + fill = scale_full_range; + } else { + if (i > 0) { + fill = Math.max(0, test_value - range_list[i - 1]); + } else { + fill = test_value; + } + } + let fill_pct = Math.min(fill / scale_range, 1); + scale.push([fill_pct]); + } + + return ( + <> +
+
+ {scale.map((item: any, index: number) => { + return ( + <> +
+
{range_list[index]}
+
+
+
+
+ + ); + })} +
+
+ + ); +}; + +export default HardWorkerProgressBar; diff --git a/002_source/ionic_mobile/src/components/HardWorkerProgressBar/style.css b/002_source/ionic_mobile/src/components/HardWorkerProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/HardWorkerProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/HelloworldImage/image.jpg b/002_source/ionic_mobile/src/components/HelloworldImage/image.jpg new file mode 100644 index 0000000..c6a8bbd Binary files /dev/null and b/002_source/ionic_mobile/src/components/HelloworldImage/image.jpg differ diff --git a/002_source/ionic_mobile/src/components/HelloworldImage/index.tsx b/002_source/ionic_mobile/src/components/HelloworldImage/index.tsx new file mode 100644 index 0000000..e0b2af2 --- /dev/null +++ b/002_source/ionic_mobile/src/components/HelloworldImage/index.tsx @@ -0,0 +1,9 @@ +import ImageJpg from './image.jpg'; + +function HelloworldImage() { + return ( +
+ ); +} + +export { HelloworldImage }; diff --git a/002_source/ionic_mobile/src/components/LoadingScreen/index.tsx b/002_source/ionic_mobile/src/components/LoadingScreen/index.tsx new file mode 100644 index 0000000..53aa3c2 --- /dev/null +++ b/002_source/ionic_mobile/src/components/LoadingScreen/index.tsx @@ -0,0 +1,26 @@ +import { IonContent, IonPage, IonSpinner } from '@ionic/react'; +import { useTranslation } from 'react-i18next'; + +export function LoadingScreen() { + const { t, i18n } = useTranslation(); + + return ( + + +
+ +
{t('Loading')}
+
+
+
+ ); +} diff --git a/002_source/ionic_mobile/src/components/MarkRating/index.tsx b/002_source/ionic_mobile/src/components/MarkRating/index.tsx new file mode 100644 index 0000000..91b8fa3 --- /dev/null +++ b/002_source/ionic_mobile/src/components/MarkRating/index.tsx @@ -0,0 +1,34 @@ +import { IonIcon } from '@ionic/react'; +import './style.css'; +import { star, starOutline } from 'ionicons/icons'; + +interface ContainerProps { + num_rating: number; + max_rating?: number; +} + +const MarkRating: React.FC = ({ num_rating, max_rating = 3 }) => { + return ( + <> +
+ {Array.from({ length: max_rating }, (_, index) => { + if (index < num_rating) { + return ( +
+ +
+ ); + } else { + return ( +
+ +
+ ); + } + })} +
+ + ); +}; + +export default MarkRating; diff --git a/002_source/ionic_mobile/src/components/MarkRating/style.css b/002_source/ionic_mobile/src/components/MarkRating/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/components/MatchmakingProgressBar/index.tsx b/002_source/ionic_mobile/src/components/MatchmakingProgressBar/index.tsx new file mode 100644 index 0000000..7ad8a2f --- /dev/null +++ b/002_source/ionic_mobile/src/components/MatchmakingProgressBar/index.tsx @@ -0,0 +1,68 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + range_list: number[]; +} + +const MatchmakingProgressBar: FunctionComponent = ({ value, range_list }) => { + let test_value = value; + let scale = []; + + for (let i = 0; i < range_list.length; i++) { + let scale_full_range = range_list[i]; + let scale_range = i > 0 ? scale_full_range - range_list[i - 1] : scale_full_range; + + let fill = 0; + if (test_value > scale_full_range) { + fill = scale_full_range; + } else { + if (i > 0) { + fill = Math.max(0, test_value - range_list[i - 1]); + } else { + fill = test_value; + } + } + let fill_pct = Math.min(fill / scale_range, 1); + scale.push([fill_pct]); + } + + return ( + <> +
+ {scale.map((item: any, index: number) => { + return ( +
+
{range_list[index]}
+
+
+
+
+ ); + })} +
+ + ); +}; + +export default MatchmakingProgressBar; diff --git a/002_source/ionic_mobile/src/components/MatchmakingProgressBar/style.css b/002_source/ionic_mobile/src/components/MatchmakingProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/MatchmakingProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/index.tsx new file mode 100644 index 0000000..69da231 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/index.tsx @@ -0,0 +1,124 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { COLOR_TEXT, CONNECTIVE_CONQUEROR_STAGES, DEBUG } from '../../../../constants'; +import './style.css'; +import { useConnectivesRevisionCorrectCount } from '../../../../contexts/MyIonMetric/ConnectivesRevisionCorrectCount'; + +function CongratConnectiveConqueror({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [openCongratListeningProgress, setOpenCongratListeningProgress] = useState(false); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const { + myIonMetricGetConnectivesRevisionCorrectCount, + myIonMetricGetConnectivesRevisionCorrectCountIgnore, + myIonMetricSetConnectivesRevisionCorrectCountIgnore, + } = useConnectivesRevisionCorrectCount(); + + const dismiss_modal = () => { + myIonMetricSetConnectivesRevisionCorrectCountIgnore(count_to_prompt); + setOpened(false); + }; + + async function promptProgress(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetConnectivesRevisionCorrectCountIgnore()).count) return; + // setCountPrompted(count_to_prompt); + setMessage('You scored full marks ' + count_to_prompt + ' times.'); + // setOpenedCongraFullmarkTimes(true); + setOpened(true); + } + + useEffect(() => { + const prompt_list = CONNECTIVE_CONQUEROR_STAGES; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (progress > prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + setCountToPrompt(prompt_list[lastTrueIndex]); + promptProgress(prompt_list[lastTrueIndex]); + } + }, [progress]); + + useEffect(() => { + (async () => { + let temp = await myIonMetricGetConnectivesRevisionCorrectCount(); + setProgress(temp.count); + })(); + }, []); + + return ( + <> + dismiss_modal()} + // 008_remove_achievement_announcement, hide congratulation modal + isOpen={false} + > +
+ {DEBUG ? congratulation connectives conqueror : <>} + +
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratConnectiveConqueror; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/ConnectiveConqueror/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/index.tsx new file mode 100644 index 0000000..87afe8c --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/index.tsx @@ -0,0 +1,122 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { COLOR_TEXT, DEBUG, GENIUS_STAGES } from '../../../../constants'; +import './style.css'; +import { useAppStateContext } from '../../../../contexts/AppState'; +import { useFullmarkCount } from '../../../../contexts/MyIonMetric/FullmarkCount'; + +function CongratGenius({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const { myIonMetricGetFullMarkCount, myIonMetricGetFullMarkIgnore, myIonMetricSetFullMarkIgnore } = + useFullmarkCount(); + + const dismiss_modal = () => { + myIonMetricSetFullMarkIgnore(count_to_prompt); + setOpened(false); + }; + + async function promptGeniusProgress(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetFullMarkIgnore()).count) return; + // setCountPrompted(count_to_prompt); + setMessage('You scored full marks ' + count_to_prompt + ' times.'); + // setOpenedCongraFullmarkTimes(true); + setOpened(true); + } + + useEffect(() => { + const prompt_list = GENIUS_STAGES; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (progress >= prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + console.log({ progress }); + setCountToPrompt(prompt_list[lastTrueIndex]); + promptGeniusProgress(prompt_list[lastTrueIndex]); + } + }, [progress]); + + let { tab_active } = useAppStateContext(); + useEffect(() => { + (async () => { + let temp = await myIonMetricGetFullMarkCount(); + setProgress(temp.count); + })(); + }, []); + + return ( + <> + dismiss_modal()} + // 008_remove_achievement_announcement, hide congratulation modal + isOpen={false} + > +
+ {DEBUG ? congratulation genius : <>} +
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratGenius; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Genius/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/index.tsx new file mode 100644 index 0000000..c999cbc --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/index.tsx @@ -0,0 +1,125 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { COLOR_TEXT, DEBUG, HARDWORKER_STAGES } from '../../../../constants'; +import './style.css'; +import { useAppUseTime } from '../../../../contexts/MyIonMetric/AppUseTime'; + +function CongratHardworker({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const { + // + myIonMetricGetAppUseTime, + myIonMetricSetAppUseTimeIgnore, + myIonMetricGetAppUseTimeIgnore, + } = useAppUseTime(); + + const dismiss_modal = () => { + myIonMetricSetAppUseTimeIgnore(count_to_prompt); + setOpened(false); + }; + + async function promptHardworkerProgress(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetAppUseTimeIgnore()).time_spent_s) return; + // setCountPrompted(count_to_prompt); + setMessage('You scored full marks ' + count_to_prompt + ' times.'); + // setOpenedCongraFullmarkTimes(true); + setOpened(true); + } + + useEffect(() => { + const prompt_list = HARDWORKER_STAGES; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (progress >= prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + console.log({ progress }); + setCountToPrompt(prompt_list[lastTrueIndex]); + promptHardworkerProgress(prompt_list[lastTrueIndex]); + } + }, [progress]); + + useEffect(() => { + (async () => { + let temp = await myIonMetricGetAppUseTime(); + + setProgress(Math.floor(temp.time_spent_s / 60)); + })(); + }, []); + + return ( + <> + dismiss_modal()} + // 008_remove_achievement_announcement, hide congratulation modal + isOpen={false} + > +
+ {DEBUG ? congratulation hardworker : <>} +
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratHardworker; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Hardworker/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/index.tsx new file mode 100644 index 0000000..1439a6c --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/index.tsx @@ -0,0 +1,78 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { COLOR_TEXT } from '../../../../constants'; +import './style.css'; + +function CongratHelloworld({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [openCongratListeningProgress, setOpenCongratListeningProgress] = useState(false); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const dismiss_modal = () => { + setOpened(false); + }; + + useEffect(() => {}, [progress]); + + useEffect(() => { + (async () => {})(); + }, []); + + return ( + <> + dismiss_modal()} + isOpen={opened} + > +
+
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratHelloworld; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Helloworld/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/index.tsx new file mode 100644 index 0000000..0f9ba36 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/index.tsx @@ -0,0 +1,124 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { ATTENTIVE_EARS_STAGES, COLOR_TEXT, DEBUG } from '../../../../constants'; +import { useListeningPracticeTimeSpent } from '../../../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; +import './style.css'; + +function CongratListeningProgress({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [openCongratListeningProgress, setOpenCongratListeningProgress] = useState(false); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const { + myIonMetricGetListeningPracticeTimeSpent, + myIonMetricGetListeningPracticeProgressIgnore, + myIonMetricSetListeningPracticeProgressIgnore, + } = useListeningPracticeTimeSpent(); + + const dismiss_modal = () => { + myIonMetricSetListeningPracticeProgressIgnore(count_to_prompt); + setOpened(false); + }; + + async function promptListeningPracticeProgress(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetListeningPracticeProgressIgnore()).time_spent_s) return; + // setCountPrompted(count_to_prompt); + setMessage('You scored full marks ' + count_to_prompt + ' times.'); + // setOpenedCongraFullmarkTimes(true); + setOpened(true); + } + + useEffect(() => { + const prompt_list = ATTENTIVE_EARS_STAGES; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (progress > prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + setCountToPrompt(prompt_list[lastTrueIndex]); + promptListeningPracticeProgress(prompt_list[lastTrueIndex]); + } + }, [progress]); + + useEffect(() => { + (async () => { + let temp = await myIonMetricGetListeningPracticeTimeSpent(); + setProgress(temp.time_spent_s / 60); + })(); + }, []); + + return ( + <> + dismiss_modal()} + // 008_remove_achievement_announcement, hide congratulation modal + isOpen={false} + > +
+ {DEBUG ? congratulation listening progress : <>} + +
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratListeningProgress; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/ListeningProgress/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/index.tsx b/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/index.tsx new file mode 100644 index 0000000..a72aded --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/index.tsx @@ -0,0 +1,124 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { COLOR_TEXT, DEBUG, MATCHMAKING_STAGES } from '../../../../constants'; +import './style.css'; +import { useMatchingFrenzyCorrectCount } from '../../../../contexts/MyIonMetric/MatchingFrenzyCorrectCount'; + +function CongratMatchmaking({}: {}) { + const modal = useRef(null); + const [opened, setOpened] = useState(false); + // const message = ''; + const [message, setMessage] = useState(''); + const [openCongratListeningProgress, setOpenCongratListeningProgress] = useState(false); + const [progress, setProgress] = useState(0); + const [count_to_prompt, setCountToPrompt] = useState(0); + + const { + myIonMetricGetMatchingFrenzyCorrectCount, + myIonMetricGetMatchingFrenzyCorrectCountIgnore, + myIonMetricSetMatchingFrenzyCorrectCountIgnore, + } = useMatchingFrenzyCorrectCount(); + + const dismiss_modal = () => { + myIonMetricSetMatchingFrenzyCorrectCountIgnore(count_to_prompt); + setOpened(false); + }; + + async function promptProgress(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetMatchingFrenzyCorrectCountIgnore()).count) return; + // setCountPrompted(count_to_prompt); + setMessage('You scored full marks ' + count_to_prompt + ' times.'); + // setOpenedCongraFullmarkTimes(true); + setOpened(true); + } + + useEffect(() => { + const prompt_list = MATCHMAKING_STAGES; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (progress > prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + setCountToPrompt(prompt_list[lastTrueIndex]); + promptProgress(prompt_list[lastTrueIndex]); + } + }, [progress]); + + useEffect(() => { + (async () => { + let temp = await myIonMetricGetMatchingFrenzyCorrectCount(); + setProgress(temp.count); + })(); + }, []); + + return ( + <> + dismiss_modal()} + // 008_remove_achievement_announcement, hide congratulation modal + isOpen={false} + > +
+ {DEBUG ? congratulation matchmaking : <>} + +
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratMatchmaking; diff --git a/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/style.css b/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/style.css new file mode 100644 index 0000000..7a7d661 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Congratulation/Matchmaking/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#congratulation-listening-progress-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#congratulation-listening-progress-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#congratulation-listening-progress-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/Modal/CongratulationAchievement/index.tsx b/002_source/ionic_mobile/src/components/Modal/CongratulationAchievement/index.tsx new file mode 100644 index 0000000..c85b1e4 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/CongratulationAchievement/index.tsx @@ -0,0 +1,78 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useRef } from 'react'; +import { COLOR_TEXT } from '../../../constants'; +import { useFullmarkCount } from '../../../contexts/MyIonMetric/FullmarkCount'; + +function CongratulationAchievementModal({ + opened, + setOpened, + count_prompted, + message = 'hello message', +}: { + message?: string; + opened: boolean; + count_prompted: number; + setOpened: (opened: boolean) => void; +}) { + const modal = useRef(null); + + const { myIonMetricSetFullMarkIgnore } = useFullmarkCount(); + const dismiss_modal = () => { + myIonMetricSetFullMarkIgnore(count_prompted); + setOpened(false); + }; + + return ( + <> + dismiss_modal()} + isOpen={opened} + > +
+
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
{message}
+
+
+ + dismiss_modal()} + > + + +
+ + ); +} + +export default CongratulationAchievementModal; diff --git a/002_source/ionic_mobile/src/components/Modal/Helloworld/index.tsx b/002_source/ionic_mobile/src/components/Modal/Helloworld/index.tsx new file mode 100644 index 0000000..c5d00c3 --- /dev/null +++ b/002_source/ionic_mobile/src/components/Modal/Helloworld/index.tsx @@ -0,0 +1,58 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useRef, useState } from 'react'; +import { COLOR_TEXT } from '../../../constants'; + +function HelloworldModal() { + const modal = useRef(null); + const [opened, setOpened] = useState(true); + + return ( + <> + setOpened(true)}>Open + +
+
+

Congratulation!

+
+ +
{'Genius'}
+ +
+
You scored full
+
marks {'1000'} times!
+
+
+ + setOpened(false)} + > + + +
+ + ); +} + +export default HelloworldModal; diff --git a/002_source/ionic_mobile/src/components/MyProgressBar/index.tsx b/002_source/ionic_mobile/src/components/MyProgressBar/index.tsx new file mode 100644 index 0000000..7d814c2 --- /dev/null +++ b/002_source/ionic_mobile/src/components/MyProgressBar/index.tsx @@ -0,0 +1,87 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + full_range: number; +} + +const MyProgressBar: FunctionComponent = ({ value, full_range }) => { + let test_value = value; + + let first_scale_full_range = 10; + let first_scale = test_value > first_scale_full_range ? first_scale_full_range : test_value; + // + let second_scale_full_range = 50; + let second_scale_range = second_scale_full_range - first_scale_full_range; + let second_scale = + test_value >= second_scale_full_range ? second_scale_full_range : Math.max(0, test_value - first_scale_full_range); + + let third_scale_full_range = 100; + let third_scale_range = third_scale_full_range - second_scale_full_range; + let third_scale = + test_value >= third_scale_full_range ? third_scale_full_range : Math.max(0, test_value - second_scale_full_range); + let forth_scale_full_range = 300; + let forth_scale_range = forth_scale_full_range - third_scale_full_range; + let forth_scale = + test_value >= forth_scale_full_range ? forth_scale_full_range : Math.max(0, test_value - third_scale_full_range); + let fifth_scale_full_range = 700; + let fifth_scale_range = fifth_scale_full_range - forth_scale_full_range; + let fifth_scale = + test_value >= fifth_scale_full_range ? fifth_scale_full_range : Math.max(0, test_value - forth_scale_full_range); + + let sixth_scale_full_range = 1000; + let sixth_scale_range = sixth_scale_full_range - fifth_scale_full_range; + let sixth_scale = + test_value >= sixth_scale_full_range ? sixth_scale_full_range : Math.max(0, test_value - fifth_scale_full_range); + + return ( + <> +
+
+
{first_scale_full_range}
+
+
+
+
+ +
+
{second_scale_full_range}
+
+
+
+
+ +
+
{third_scale_full_range}
+
+
+
+
+ +
+
{forth_scale_full_range}
+
+
+
+
+ +
+
{fifth_scale_full_range}
+
+
+
+
+ +
+
{sixth_scale_full_range}
+
+
+
+
+
+ + ); +}; + +export default MyProgressBar; diff --git a/002_source/ionic_mobile/src/components/MyProgressBar/style.css b/002_source/ionic_mobile/src/components/MyProgressBar/style.css new file mode 100644 index 0000000..52dbefd --- /dev/null +++ b/002_source/ionic_mobile/src/components/MyProgressBar/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: rgb(56, 182, 255); + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 0px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + /* border-radius: 12px; */ + margin-right: 0px; +} diff --git a/002_source/ionic_mobile/src/components/MyProgressBarLogScale/index.tsx b/002_source/ionic_mobile/src/components/MyProgressBarLogScale/index.tsx new file mode 100644 index 0000000..1543fbf --- /dev/null +++ b/002_source/ionic_mobile/src/components/MyProgressBarLogScale/index.tsx @@ -0,0 +1,19 @@ +import { FunctionComponent } from 'react'; +import './style.css'; + +interface AudioSeekBarProps { + value: number; + full_range: number; +} + +const MyProgressBar: FunctionComponent = ({ value, full_range }) => { + return ( + <> +
+
+
+ + ); +}; + +export default MyProgressBar; diff --git a/002_source/ionic_mobile/src/components/MyProgressBarLogScale/style.css b/002_source/ionic_mobile/src/components/MyProgressBarLogScale/style.css new file mode 100644 index 0000000..b02024b --- /dev/null +++ b/002_source/ionic_mobile/src/components/MyProgressBarLogScale/style.css @@ -0,0 +1,29 @@ +.audioSeekBar { + cursor: pointer; + background-color: white; + overflow: hidden; +} + +.audioSeekBar__tick { + background-color: #999900; + height: 100%; +} + +.playBar_t { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 100px; + background-color: #1c192f; + display: flex; + align-items: flex-start; + padding: 25px 50px; +} + +.playBar_t__seek { + width: 100%; + height: 10px; + border-radius: 12px; + margin-right: 10px; +} diff --git a/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/image.svg b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/image.svg new file mode 100644 index 0000000..e567507 --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/image.svg @@ -0,0 +1,140 @@ + diff --git a/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/index.tsx b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/index.tsx new file mode 100644 index 0000000..19a1770 --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/index.tsx @@ -0,0 +1,94 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useRef } from 'react'; +import MissingSvg from './image.svg'; +import './style.css'; +import { COLOR_TEXT } from '../../constants'; + +export interface NoFavoriteVocabModalProps { + open: boolean; + setOpen: (open: boolean) => void; +} + +function NoFavoriteVocabModal({ open, setOpen }: NoFavoriteVocabModalProps) { + const modal = useRef(null); + + function dismiss() { + modal.current?.dismiss(); + } + + return ( + setOpen(false)} + > +
+
+
+
+
You have currently no favorite
+
Vocabulary
+
+
+ + setOpen(false)} + > + + +
+
+ ); +} + +export default NoFavoriteVocabModal; diff --git a/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/style.css b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/style.css new file mode 100644 index 0000000..6c36524 --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteConnectivesModal/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#no-favorite-connectives-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#no-favorite-connectives-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#no-favorite-connectives-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/image.svg b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/image.svg new file mode 100644 index 0000000..e567507 --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/image.svg @@ -0,0 +1,140 @@ + diff --git a/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/index.tsx b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/index.tsx new file mode 100644 index 0000000..24166bf --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/index.tsx @@ -0,0 +1,95 @@ +import { IonButton, IonIcon, IonModal } from '@ionic/react'; +import { closeOutline } from 'ionicons/icons'; +import { useRef } from 'react'; +import MissingSvg from './image.svg'; +import './style.css'; +import { COLOR_TEXT } from '../../constants'; + +export interface NoFavoriteVocabModalProps { + open: boolean; + setOpen: (open: boolean) => void; +} + +function NoFavoriteConnectivesModal({ open, setOpen }: NoFavoriteVocabModalProps) { + const modal = useRef(null); + + function dismiss() { + modal.current?.dismiss(); + } + + return ( + setOpen(false)} + onIonModalDidDismiss={() => setOpen(false)} + isOpen={open} + > +
+
+
+
+
You have currently no favorite
+
Connectives
+
+
+ + setOpen(false)} + > + + +
+
+ ); +} + +export default NoFavoriteConnectivesModal; diff --git a/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/style.css b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/style.css new file mode 100644 index 0000000..4e21a60 --- /dev/null +++ b/002_source/ionic_mobile/src/components/NoFavoriteVocabModal/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#no-favorite-vocalbulary-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#no-favorite-vocalbulary-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#no-favorite-vocalbulary-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/components/QuestionProgress/index.tsx b/002_source/ionic_mobile/src/components/QuestionProgress/index.tsx new file mode 100644 index 0000000..72d949d --- /dev/null +++ b/002_source/ionic_mobile/src/components/QuestionProgress/index.tsx @@ -0,0 +1,29 @@ +import { checkmarkOutline } from 'ionicons/icons'; +import './style.css'; +import { IonButton, IonIcon } from '@ionic/react'; + +interface ContainerProps { + num_rating: number; + num_full_rating: number; +} + +const QuestionProgress: React.FC = ({ num_rating = 0, num_full_rating = 2 }) => { + return ( + <> +
+ {Array.from({ length: num_rating }, (_, index) => ( + + + + ))} + {Array.from({ length: num_full_rating - num_rating }, (_, index) => ( + + + + ))} +
+ + ); +}; + +export default QuestionProgress; diff --git a/002_source/ionic_mobile/src/components/QuestionProgress/style.css b/002_source/ionic_mobile/src/components/QuestionProgress/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.css b/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.css new file mode 100644 index 0000000..d350021 --- /dev/null +++ b/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.css @@ -0,0 +1,3 @@ +.quizzes_main_menu_container { + text-align: center; +} diff --git a/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.tsx b/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.tsx new file mode 100644 index 0000000..6ac0024 --- /dev/null +++ b/002_source/ionic_mobile/src/components/QuizzesMainMenuContainer.tsx @@ -0,0 +1,95 @@ +import { IonButton, useIonRouter } from '@ionic/react'; +import './QuizzesMainMenuContainer.css'; +import { COLOR_TEXT, CONNECTIVE_REVISION_LINK, LISTENING_PRACTICE_LINK, MATCHING_FRENZY_LINK } from '../constants'; + +interface ContainerProps { + name: string; +} + +const QuizzesMainMenuContainer: React.FC = ({ name }) => { + const router = useIonRouter(); + + return ( +
+
+ { + router.push(LISTENING_PRACTICE_LINK, undefined, 'replace'); + }} + fill="clear" + > +
+
+
Listening Practice
+
+
+
+
+ { + router.push(MATCHING_FRENZY_LINK, undefined, 'replace'); + }} + fill="clear" + > +
+
+
Matching Frenzy
+
+
+
+
+ { + router.push(CONNECTIVE_REVISION_LINK, undefined, 'replace'); + }} + fill="clear" + > +
+
+
Connectives Revision
+
+
+
+
+ ); +}; + +export default QuizzesMainMenuContainer; diff --git a/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/index.tsx b/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/index.tsx new file mode 100644 index 0000000..f614261 --- /dev/null +++ b/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/index.tsx @@ -0,0 +1,24 @@ +import { IonToast } from '@ionic/react'; +import React from 'react'; +import './style.css'; +import { THE_WORD_REMOVED, THE_WORD_REMOVED_DISMISS_TIMEOUT } from '../../constants'; + +const RemoveFavoritePrompt: React.FC<{ open: boolean; setIsOpen: (isOpen: boolean) => void }> = ({ + open, + setIsOpen, +}) => { + return ( + <> + setIsOpen(false)} + color="success" + duration={THE_WORD_REMOVED_DISMISS_TIMEOUT} + /> + + ); +}; + +export default RemoveFavoritePrompt; diff --git a/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/style.css b/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/style.css new file mode 100644 index 0000000..28c9a2a --- /dev/null +++ b/002_source/ionic_mobile/src/components/RemoveFavoritePrompt/style.css @@ -0,0 +1,11 @@ +ion-toast.remove-favorite-prompt-toast::part(message) { + text-align: center; + font-size: 1.5rem; + color: rgba(0, 0, 0, 0.9); +} + +/* +ion-toast.remove-favorite-prompt-toast::part(container) { + bottom: 100px; +} +*/ diff --git a/002_source/ionic_mobile/src/components/SettingContainer.css b/002_source/ionic_mobile/src/components/SettingContainer.css new file mode 100644 index 0000000..11d2f90 --- /dev/null +++ b/002_source/ionic_mobile/src/components/SettingContainer.css @@ -0,0 +1,24 @@ +.container { + text-align: center; + position: absolute; + left: 0; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.container strong { + font-size: 20px; + line-height: 26px; +} + +.container p { + font-size: 16px; + line-height: 22px; + color: #8c8c8c; + margin: 0; +} + +.container a { + text-decoration: none; +} diff --git a/002_source/ionic_mobile/src/components/SettingContainer/image.svg b/002_source/ionic_mobile/src/components/SettingContainer/image.svg new file mode 100644 index 0000000..2eddaad --- /dev/null +++ b/002_source/ionic_mobile/src/components/SettingContainer/image.svg @@ -0,0 +1,135 @@ + diff --git a/002_source/ionic_mobile/src/components/SettingContainer/index.tsx b/002_source/ionic_mobile/src/components/SettingContainer/index.tsx new file mode 100644 index 0000000..26c7141 --- /dev/null +++ b/002_source/ionic_mobile/src/components/SettingContainer/index.tsx @@ -0,0 +1,50 @@ +import { IonButton, IonIcon, useIonRouter } from '@ionic/react'; +import { arrowBack } from 'ionicons/icons'; +import { LESSON_LINK, VERSIONS } from '../../constants'; +import SettingSvg from './image.svg'; + +interface ContainerProps { + name: string; +} + +const SettingContainer: React.FC = ({ name }) => { + const router = useIonRouter(); + return ( +
+
+
+

T.B.A.

+
+
{VERSIONS}
+ { + router.push(LESSON_LINK, undefined, 'replace'); + }} + style={{ marginTop: '1rem' }} + > + + Back + +
+ ); +}; + +export default SettingContainer; diff --git a/002_source/ionic_mobile/src/components/SpeakerImage/image.jpg b/002_source/ionic_mobile/src/components/SpeakerImage/image.jpg new file mode 100644 index 0000000..24a6ced Binary files /dev/null and b/002_source/ionic_mobile/src/components/SpeakerImage/image.jpg differ diff --git a/002_source/ionic_mobile/src/components/SpeakerImage/image.svg b/002_source/ionic_mobile/src/components/SpeakerImage/image.svg new file mode 100644 index 0000000..1c5c2cf --- /dev/null +++ b/002_source/ionic_mobile/src/components/SpeakerImage/image.svg @@ -0,0 +1,90 @@ + diff --git a/002_source/ionic_mobile/src/components/SpeakerImage/index.tsx b/002_source/ionic_mobile/src/components/SpeakerImage/index.tsx new file mode 100644 index 0000000..fa79496 --- /dev/null +++ b/002_source/ionic_mobile/src/components/SpeakerImage/index.tsx @@ -0,0 +1,18 @@ +import ImageSvg from './image.svg'; + +function SpeakerImage() { + return ( +
+ ); +} + +export { SpeakerImage }; diff --git a/002_source/ionic_mobile/src/components/WrongAnswerToast/index.tsx b/002_source/ionic_mobile/src/components/WrongAnswerToast/index.tsx new file mode 100644 index 0000000..8baa581 --- /dev/null +++ b/002_source/ionic_mobile/src/components/WrongAnswerToast/index.tsx @@ -0,0 +1,44 @@ +import { IonToast } from '@ionic/react'; +import { WRONG_ANSWER_MESSAGE } from '../../constants'; +import './style.css'; +import { useAppStateContext } from '../../contexts/AppState'; + +interface QuestionCardProps { + isOpen: boolean; + dismiss: () => void; + correct_answer?: string; +} + +const WrongAnswerToast: React.FC = ({ isOpen, dismiss, correct_answer = '' }) => { + const { WRONG_ANS_TOAST_APPEAR_TIMEOUT_S } = useAppStateContext(); + + if (correct_answer != '') { + return ( + <> + dismiss()} + duration={WRONG_ANS_TOAST_APPEAR_TIMEOUT_S * 1000} + color="danger" + > + + ); + } else { + return ( + <> + dismiss()} + duration={WRONG_ANS_TOAST_APPEAR_TIMEOUT_S * 1000} + color="danger" + > + + ); + } +}; + +export default WrongAnswerToast; diff --git a/002_source/ionic_mobile/src/components/WrongAnswerToast/style.css b/002_source/ionic_mobile/src/components/WrongAnswerToast/style.css new file mode 100644 index 0000000..9cb9b3a --- /dev/null +++ b/002_source/ionic_mobile/src/components/WrongAnswerToast/style.css @@ -0,0 +1,10 @@ +ion-toast.wrong-answer-toast::part(message) { + /* text-align: center; */ + font-size: 1.5rem; + color: rgba(0, 0, 0, 0.9); + line-height: 2rem; +} + +ion-toast.wrong-answer-toast::part(container) { + bottom: 100px; +} diff --git a/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/index.tsx b/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/index.tsx new file mode 100644 index 0000000..a2e9d3e --- /dev/null +++ b/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/index.tsx @@ -0,0 +1,48 @@ +import { IonToast } from '@ionic/react'; +import { WRONG_ANSWER_MESSAGE } from '../../constants'; +import './style.css'; +import { useAppStateContext } from '../../contexts/AppState'; + +interface QuestionCardProps { + isOpen: boolean; + dismiss: () => void; + correct_answer: string; +} + +const WrongAnswerToastWithoutCorrectAnswer: React.FC = ({ + isOpen, + dismiss, + correct_answer = '', +}) => { + const { WRONG_ANS_TOAST_APPEAR_TIMEOUT_S } = useAppStateContext(); + + if (correct_answer != '') { + return ( + <> + dismiss()} + duration={WRONG_ANS_TOAST_APPEAR_TIMEOUT_S * 1000} + color="danger" + > + + ); + } else { + return ( + <> + dismiss()} + duration={WRONG_ANS_TOAST_APPEAR_TIMEOUT_S * 1000} + color="danger" + > + + ); + } +}; + +export default WrongAnswerToastWithoutCorrectAnswer; diff --git a/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/style.css b/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/style.css new file mode 100644 index 0000000..9cb9b3a --- /dev/null +++ b/002_source/ionic_mobile/src/components/WrongAnswerToastWithoutCorrectAnswer/style.css @@ -0,0 +1,10 @@ +ion-toast.wrong-answer-toast::part(message) { + /* text-align: center; */ + font-size: 1.5rem; + color: rgba(0, 0, 0, 0.9); + line-height: 2rem; +} + +ion-toast.wrong-answer-toast::part(container) { + bottom: 100px; +} diff --git a/002_source/ionic_mobile/src/constants.tsx b/002_source/ionic_mobile/src/constants.tsx new file mode 100644 index 0000000..0776849 --- /dev/null +++ b/002_source/ionic_mobile/src/constants.tsx @@ -0,0 +1,138 @@ +// 0.0.1 - implement screen +// 0.0.2 - implement logic +// 0.0.3 - first demo +// 0.0.4 - bug fix +// 0.0.5 - misc update +// 0.0.6 - fix scroe board problem +// 0.0.7 - add back button for listening practice, matching frenzy, connective revision +// 0.0.8 - add back button for listening practice card, matching frenzy card, connective revision card +// 0.0.9 - fix ticket 26,27,28,29 +// 0.0.10 - remove debug symbol and re-route ending page +const VERSIONS = 'v0.0.10'; +const HELLOWORLD_MP3 = '/helloworld.mp3'; + +// api +const API_URL = 'http://localhost:8080'; + +// route +const LISTENING_PRACTICE_LINK = '/listening_practice'; +const MATCHING_FRENZY_LINK = '/matching_frenzy'; +const FAVORITE_LINK = '/fav'; +const LESSON_WORD_PAGE_LINK = '/lesson_word_page'; +const CONNECTIVE_REVISION_LINK = '/connective_revision'; +const LESSON_LINK = '/lesson'; +const QUIZ_MAIN_MENU_LINK = '/quizzes_main_menu'; +const RECORD_LINK = '/record'; +const SETTING_LINK = '/setting'; +const DEBUG_LINK = '/debug'; +const MY_ACHIEVEMENT_LINK = '/my_achievement'; + +// achievement +const FULLMARK_COUNT_KEY = 'full_mark_count'; +const APP_USE_TIME = 'app_use_time_s'; +const LISTENING_PRACTICE_TIME_SPENT = 'listening_practice_time_spent_s'; +const MATCHING_FRENZY_CORRECT_COUNT = 'matching_frenzy_correct_count'; +const CONNECTIVES_REVISION_CORRECT_COUNT = 'connectives_revision_correct_count'; +const CONNECTIVES_REVISION_IGNORE_COUNT = 'connectives_revision_ignore_count'; +const FULLMARK_IGNORE_COUNT = 'full_mark_ignore_count'; +const MATCH_FRENZY_SCOREBOARD_KEY = 'matching_frenzy_scoreboard'; + +const COLOR_TEXT = 'rgba(0,0,0,0.9)'; +const GOOD_JOB_BG_COLOR = 'rgba (0,255,0,1)'; +const WRONG_ANS_BG_COLOR = 'rgba (255,0,0,1)'; +const HELLOWORLD = 'HELLOWORLD'; + +// +const GENIUS_STAGES = [10, 50, 100, 300, 700, 1000]; +const HARDWORKER_STAGES = [5, 50, 100, 500, 1000, 1500, 3000]; +const ATTENTIVE_EARS_STAGES = [1, 10, 50, 100, 300, 700, 1000]; +const MATCHMAKING_STAGES = [30, 100, 250, 500, 1500, 3000, 8000]; +const CONNECTIVE_CONQUEROR_STAGES = [1, 5, 15, 35, 60]; + +// +const THE_WORD_REMOVED = 'The word removed'; +const THE_WORD_REMOVED_DISMISS_TIMEOUT = 1000; + +const CORRECT_ANSWER_MESSAGE = 'Good job!'; +const CORRECT_ANSWER_DISMISS_TIMEOUT = 3000; +// +const WRONG_ANSWER_MESSAGE = 'Wrong answer !'; +const WRONG_ANSWER_DISMISS_TIMEOUT = 3000; + +// +const PRESS_START_TO_BEGIN = 'Press start to begin'; +const PRESS_START_TO_BEGIN_MESSAGE = 'Relax and Prepare yourself'; + +// +const CORRECTION_PHASE = 'correction phase'; + +// +const hide_setting = true; +const DEBUG = false; +const TEST = process.env.NODE_ENV === 'test'; + +// +const MY_FAVORITE = 'My Favorite'; + +// + +export { + // + API_URL, + APP_USE_TIME, + ATTENTIVE_EARS_STAGES, + // + COLOR_TEXT, + CONNECTIVES_REVISION_CORRECT_COUNT, + CONNECTIVES_REVISION_IGNORE_COUNT, + CONNECTIVE_CONQUEROR_STAGES, + CONNECTIVE_REVISION_LINK, + // + CORRECTION_PHASE, + CORRECT_ANSWER_DISMISS_TIMEOUT, + // + CORRECT_ANSWER_MESSAGE, + DEBUG, + DEBUG_LINK, + FAVORITE_LINK, + // + FULLMARK_COUNT_KEY, + FULLMARK_IGNORE_COUNT, + // + GENIUS_STAGES, + // + GOOD_JOB_BG_COLOR, + HARDWORKER_STAGES, + // + HELLOWORLD, + HELLOWORLD_MP3, + LESSON_LINK, + LESSON_WORD_PAGE_LINK, + LISTENING_PRACTICE_LINK, + LISTENING_PRACTICE_TIME_SPENT, + MATCHING_FRENZY_CORRECT_COUNT, + MATCHING_FRENZY_LINK, + MATCHMAKING_STAGES, + MATCH_FRENZY_SCOREBOARD_KEY, + MY_ACHIEVEMENT_LINK, + // + MY_FAVORITE, + // + PRESS_START_TO_BEGIN, + PRESS_START_TO_BEGIN_MESSAGE, + QUIZ_MAIN_MENU_LINK, + RECORD_LINK, + SETTING_LINK, + TEST, + // + THE_WORD_REMOVED, + THE_WORD_REMOVED_DISMISS_TIMEOUT, + VERSIONS, + WRONG_ANSWER_DISMISS_TIMEOUT, + WRONG_ANSWER_MESSAGE, + WRONG_ANS_BG_COLOR, + // + hide_setting, +}; + +export const DEFAULT_FORWARD_TIMEOUT = 3000; diff --git a/002_source/ionic_mobile/src/contexts/AppOnRecorder.tsx b/002_source/ionic_mobile/src/contexts/AppOnRecorder.tsx new file mode 100644 index 0000000..5dcc2bc --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/AppOnRecorder.tsx @@ -0,0 +1,42 @@ +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { useIdle } from 'react-use'; +import { useAppUseTime } from './MyIonMetric/AppUseTime'; + +const AppOnRecorderContext = createContext(undefined); + +export const AppOnRecorderProvider: React.FC = () => { + const [my_context, setMyContext] = useState('initial value'); + const { myIonMetricIncAppUseTime } = useAppUseTime(); + + const isIdle = useIdle(3e3); + let getCurrentTimeInSec = () => Math.floor(Date.now() / 1000); + let [last_on_s, setLastOn_s] = useState(getCurrentTimeInSec()); + + useEffect(() => { + (async () => { + if (isIdle) { + // active -> inactive + let current_s = getCurrentTimeInSec(); + myIonMetricIncAppUseTime(current_s - last_on_s); + } else { + // inactive->active + setLastOn_s(getCurrentTimeInSec()); + } + })(); + }, [isIdle]); + + return {/* */}; +}; + +export const useMyContext = (): MyContextProps => { + const context = useContext(AppOnRecorderContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + my_context: string; + setMyContext: React.Dispatch>; +} diff --git a/002_source/ionic_mobile/src/contexts/AppState.tsx b/002_source/ionic_mobile/src/contexts/AppState.tsx new file mode 100644 index 0000000..c0c089a --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/AppState.tsx @@ -0,0 +1,145 @@ +import React, { createContext, ReactNode, useContext, useEffect, useState } from 'react'; +import RemoveFavoritePrompt from '../components/RemoveFavoritePrompt'; +import { LESSON_LINK } from '../constants'; + +const AppStateContext = createContext(undefined); + +export const AppStateProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [my_context, setMyContext] = useState('initial value'); + const [tab_active, setTabActive] = useState(LESSON_LINK); + const [show_confirm_user_exit, useShowConfirmUserExit] = useState(false); + const [url_push_after_user_confirm, setURLPushAfterUserConfirm] = useState(LESSON_LINK); + + const [matching_frenzy_in_progress, setMatchingFrenzyInProgress] = useState(false); + const [connective_revision_in_progress, setConnectiveRevisionInProgress] = useState(false); + const [listening_practice_in_progress, setListeningPracticeInProgress] = useState(false); + + const [disable_user_tap, setDisableUserTap] = useState(false); + + const [show_remove_fav_prompt, setShowRemoceFavPrompt] = useState(false); + + // 010_user_configurable_anwered_timeout + const [LISTENING_PRACTICE_ANWERED_WAIT_S, setListeningPracticeAnswerWait_s] = useState(1); + const [MATCHING_FRENZY_ANWERED_WAIT_S, setMatchingFrenzyAnswerWait_s] = useState(1); + + // + const [WRONG_ANS_TOAST_APPEAR_TIMEOUT_S, setWRONG_ANS_TOAST_APPEAR_TIMEOUT_S] = useState(3); + const [CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S, setCORRECT_ANS_TOAST_APPEAR_TIMEOUT_S] = useState(3); + const [CONNECTIVES_REVISION_ANWERED_WAIT_S, setCONNECTIVES_REVISION_ANWERED_WAIT_S] = useState(3); + + // user_config.json + // 012_put_matching_frenzy_count_down_time_to_config_file + const [user_config_json, setUserConfigJson] = useState({}); + const [MATCHING_FRENZY_COUNT_DOWN_S, setMATCHING_FRENZY_COUNT_DOWN_S] = useState(120); + useEffect(() => { + fetch('/data/user_config.json') + .then((res) => res.json()) + .then((res_json) => { + setUserConfigJson(res_json); + + setMATCHING_FRENZY_COUNT_DOWN_S(res_json['matching_frenzy_count_down_s']); + + setListeningPracticeAnswerWait_s(res_json['listening_practice_anwered_wait_s']); + setMatchingFrenzyAnswerWait_s(res_json['matching_frenzy_anwered_wait_s']); + setCONNECTIVES_REVISION_ANWERED_WAIT_S(res_json['connectives_revision_anwered_wait_s']); + // console.log({ res_json }); + + setWRONG_ANS_TOAST_APPEAR_TIMEOUT_S(res_json['WRONG_ANS_TOAST_APPEAR_TIMEOUT_S']); + setCORRECT_ANS_TOAST_APPEAR_TIMEOUT_S(res_json['CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S']); + }); + }, []); + + return ( + + {children} + + + + ); +}; + +export const useAppStateContext = (): AppStateContextProps => { + const context = useContext(AppStateContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface AppStateContextProps { + my_context: string; + setMyContext: React.Dispatch>; + // + listening_practice_in_progress: boolean; + setListeningPracticeInProgress: React.Dispatch>; + // + // + matching_frenzy_in_progress: boolean; + setMatchingFrenzyInProgress: React.Dispatch>; + // + connective_revision_in_progress: boolean; + setConnectiveRevisionInProgress: React.Dispatch>; + // + tab_active: string; + setTabActive: React.Dispatch>; + // + show_confirm_user_exit: boolean; + setShowConfirmUserExit: React.Dispatch>; + // + url_push_after_user_confirm: string; + setURLPushAfterUserConfirm: React.Dispatch>; + // + disable_user_tap: boolean; + setDisableUserTap: React.Dispatch>; + // + show_remove_fav_prompt: boolean; + setShowRemoceFavPrompt: React.Dispatch>; + // + MATCHING_FRENZY_COUNT_DOWN_S: number; + // + LISTENING_PRACTICE_ANWERED_WAIT_S: number; + MATCHING_FRENZY_ANWERED_WAIT_S: number; + CONNECTIVES_REVISION_ANWERED_WAIT_S: number; + // + WRONG_ANS_TOAST_APPEAR_TIMEOUT_S: number; + CORRECT_ANS_TOAST_APPEAR_TIMEOUT_S: number; +} diff --git a/002_source/ionic_mobile/src/contexts/ConnectiveRevisionRanking.tsx b/002_source/ionic_mobile/src/contexts/ConnectiveRevisionRanking.tsx new file mode 100644 index 0000000..1d56879 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/ConnectiveRevisionRanking.tsx @@ -0,0 +1,8 @@ +export interface ConnectiveRevisionAllResult { + [quiz_name: string]: number; +} + +export interface ConnectiveRevisionResult { + date: string; + progress: number; +} diff --git a/002_source/ionic_mobile/src/contexts/Haptics.tsx b/002_source/ionic_mobile/src/contexts/Haptics.tsx new file mode 100644 index 0000000..e309e97 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/Haptics.tsx @@ -0,0 +1,91 @@ +import { Haptics, ImpactStyle } from '@capacitor/haptics'; +import React, { createContext, ReactNode, useContext, useState } from 'react'; + +const MyContext = createContext(undefined); + +const hapticsImpactMedium = async () => { + await Haptics.impact({ style: ImpactStyle.Medium }); +}; + +const hapticsImpactLight = async () => { + await Haptics.impact({ style: ImpactStyle.Light }); +}; + +const hapticsVibrate = async () => { + await Haptics.vibrate(); +}; + +const hapticsSelectionStart = async () => { + await Haptics.selectionStart(); +}; + +const hapticsSelectionChanged = async () => { + await Haptics.selectionChanged(); +}; + +const hapticsSelectionEnd = async () => { + await Haptics.selectionEnd(); +}; + +export const MyProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [my_context, setMyContext] = useState('initial value'); + + const [test_first, setTestFirst] = useState(undefined); + const [test_second, setTestSecond] = useState(undefined); + const [test_third, setTestThird] = useState(undefined); + + return ( + + {children} + + ); +}; + +export const useMyContext = (): MyContextProps => { + const context = useContext(MyContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + my_context: string; + setMyContext: React.Dispatch>; + // + test_first: IFirst | undefined; + setTestFirst: React.Dispatch>; + test_second: ISecond | undefined; + setTestSecond: React.Dispatch>; + test_third: IThird | undefined; + setTestThird: React.Dispatch>; +} + +interface IFirst { + test_s: string; + test_i: number; +} + +interface ISecond { + test_s: string; + test_i: number; + content: IFirst[] | []; +} + +interface IThird { + test_s: string; + test_i: number; + content: ISecond[] | []; +} diff --git a/002_source/ionic_mobile/src/contexts/Helloworld.tsx b/002_source/ionic_mobile/src/contexts/Helloworld.tsx new file mode 100644 index 0000000..a941b90 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/Helloworld.tsx @@ -0,0 +1,66 @@ +import React, { createContext, ReactNode, useContext, useState } from 'react'; + +const MyContext = createContext(undefined); + +export const MyProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [my_context, setMyContext] = useState('initial value'); + + const [test_first, setTestFirst] = useState(undefined); + const [test_second, setTestSecond] = useState(undefined); + const [test_third, setTestThird] = useState(undefined); + + return ( + + {children} + + ); +}; + +export const useMyContext = (): MyContextProps => { + const context = useContext(MyContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + my_context: string; + setMyContext: React.Dispatch>; + // + test_first: IFirst | undefined; + setTestFirst: React.Dispatch>; + test_second: ISecond | undefined; + setTestSecond: React.Dispatch>; + test_third: IThird | undefined; + setTestThird: React.Dispatch>; +} + +interface IFirst { + test_s: string; + test_i: number; +} + +interface ISecond { + test_s: string; + test_i: number; + content: IFirst[] | []; +} + +interface IThird { + test_s: string; + test_i: number; + content: ISecond[] | []; +} diff --git a/002_source/ionic_mobile/src/contexts/MatchingFrezyRanking.tsx b/002_source/ionic_mobile/src/contexts/MatchingFrezyRanking.tsx new file mode 100644 index 0000000..77e2b0e --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MatchingFrezyRanking.tsx @@ -0,0 +1,7 @@ +export interface MatchingFrezyRanking { + ranking: MatchingFrenzyResult[] | []; +} +export interface MatchingFrenzyResult { + date: string; + result: number; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonFavorite.tsx b/002_source/ionic_mobile/src/contexts/MyIonFavorite.tsx new file mode 100644 index 0000000..6f35a0c --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonFavorite.tsx @@ -0,0 +1,138 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonStore } from './MyIonStore'; + +const MyIonFavoriteContext = createContext(undefined); + +export const MyIonFavoriteProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const { myIonStoreRead, myIonStoreWrite, user_store } = useMyIonStore(); + + async function myIonStoreAddFavorite(address_to_add: string) { + console.log('myIonStoreAddFavorite', address_to_add); + let current_fav = await JSON.parse(await myIonStoreRead('lesson_favorite_word')); + if (JSON.stringify(current_fav) == '{}') current_fav = []; + current_fav = [...current_fav, address_to_add]; + await myIonStoreWrite('lesson_favorite_word', JSON.stringify(current_fav)); + } + + async function myIonStoreRemoveFavorite(address_to_remove: string) { + let current_fav = await JSON.parse(await myIonStoreRead('lesson_favorite_word')); + current_fav = current_fav.filter((address: string) => address !== address_to_remove); + await myIonStoreWrite('lesson_favorite_word', JSON.stringify(current_fav)); + } + + async function myIonStoreLoadFavorite() { + let current_fav = await JSON.parse(await myIonStoreRead('lesson_favorite_word')); + return current_fav ? current_fav : []; + } + + async function myIonStoreFindInFavorite(string_to_search: string) { + const current_fav = await myIonStoreLoadFavorite(); + return current_fav.includes(string_to_search); + } + + // + const KEY_FAV_VOCBULARY = 'lesson_favorite_vocabulary'; + async function myIonStoreAddFavoriteVocabulary(address_to_add: string) { + console.log('myIonStoreAddFavorite', address_to_add); + let current_fav = await JSON.parse(await myIonStoreRead(KEY_FAV_VOCBULARY)); + if (JSON.stringify(current_fav) == '{}') current_fav = []; + current_fav = [...current_fav, address_to_add]; + await myIonStoreWrite(KEY_FAV_VOCBULARY, JSON.stringify(current_fav)); + } + + async function myIonStoreRemoveFavoriteVocabulary(address_to_remove: string) { + let current_fav = await JSON.parse(await myIonStoreRead(KEY_FAV_VOCBULARY)); + current_fav = current_fav.filter((address: string) => address !== address_to_remove); + await myIonStoreWrite(KEY_FAV_VOCBULARY, JSON.stringify(current_fav)); + } + + async function myIonStoreLoadFavoriteVocabulary(): Promise { + let result = await myIonStoreRead(KEY_FAV_VOCBULARY); + + if (result == '{}') return []; + let current_fav = JSON.parse(result); + return current_fav; + } + + async function myIonStoreFindInFavoriteVocabulary(string_to_search: string): Promise { + const current_fav = await myIonStoreLoadFavoriteVocabulary(); + console.log({ current_fav }); + return current_fav.includes(string_to_search); + } + + // + const KEY_FAV_CONNECTIVES = 'lesson_favorite_connectives'; + + async function myIonStoreAddFavoriteConnectives(address_to_add: string) { + console.log('myIonStoreAddFavorite', address_to_add); + let current_fav = await JSON.parse(await myIonStoreRead(KEY_FAV_CONNECTIVES)); + if (JSON.stringify(current_fav) == '{}') current_fav = []; + current_fav = [...current_fav, address_to_add]; + await myIonStoreWrite(KEY_FAV_CONNECTIVES, JSON.stringify(current_fav)); + } + + async function myIonStoreRemoveFavoriteConnectives(address_to_remove: string) { + let current_fav = await JSON.parse(await myIonStoreRead(KEY_FAV_CONNECTIVES)); + current_fav = current_fav.filter((address: string) => address !== address_to_remove); + await myIonStoreWrite(KEY_FAV_CONNECTIVES, JSON.stringify(current_fav)); + } + + async function myIonStoreLoadFavoriteConnectives(): Promise { + let temp = await myIonStoreRead(KEY_FAV_CONNECTIVES); + let current_fav = await JSON.parse(temp); + return current_fav ? current_fav : []; + } + + async function myIonStoreFindInFavoriteConnectives(string_to_search: string) { + const current_fav = await myIonStoreLoadFavoriteConnectives(); + return current_fav.includes(string_to_search); + } + + return ( + + {children} + + ); +}; + +export const useMyIonFavorite = (): MyContextProps => { + const context = useContext(MyIonFavoriteContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + myIonStoreAddFavorite: (address_to_add: string) => Promise; + myIonStoreRemoveFavorite: (address_to_add: string) => Promise; + myIonStoreLoadFavorite: () => Promise<[]>; + myIonStoreFindInFavorite: (string_to_search: string) => Promise; + // + myIonStoreAddFavoriteVocabulary: (address_to_add: string) => Promise; + myIonStoreRemoveFavoriteVocabulary: (address_to_add: string) => Promise; + myIonStoreLoadFavoriteVocabulary: () => Promise; + myIonStoreFindInFavoriteVocabulary: (string_to_search: string) => Promise; + // + myIonStoreAddFavoriteConnectives: (address_to_add: string) => Promise; + myIonStoreRemoveFavoriteConnectives: (address_to_add: string) => Promise; + myIonStoreLoadFavoriteConnectives: () => Promise; + myIonStoreFindInFavoriteConnectives: (string_to_search: string) => Promise; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/AppUseTime.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/AppUseTime.tsx new file mode 100644 index 0000000..7e7ec6e --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/AppUseTime.tsx @@ -0,0 +1,78 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonMetric } from '.'; +import { APP_USE_TIME } from '../../constants'; + +const AppUseTimeContext = createContext(undefined); + +export const AppUseTimeProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const { myIonStoreRead, myIonStoreWrite } = useMyIonMetric(); + + function Helloworld() { + console.log('helloworld'); + } + + async function myIonMetricGetAppUseTime() { + let result = JSON.parse(await myIonStoreRead(APP_USE_TIME, { time_spent_s: 0 })); + return result; + } + + async function myIonMetricResetAppUseTime() { + await myIonStoreWrite(APP_USE_TIME, JSON.stringify({ time_spent_s: 0 })); + } + + async function myIonMetricIncAppUseTime(time_spent_s: number) { + let result = await myIonMetricGetAppUseTime(); + await myIonStoreWrite(APP_USE_TIME, JSON.stringify({ time_spent_s: result.time_spent_s + time_spent_s })); + } + + async function myIonMetricSetAppUseTime(time_spent_s: number) { + await myIonStoreWrite(APP_USE_TIME, JSON.stringify({ time_spent_s: time_spent_s })); + } + + async function myIonMetricGetAppUseTimeIgnore() { + let result = JSON.parse(await myIonStoreRead(APP_USE_TIME + '_ignore', { time_spent_s: 0 })); + return result; + } + + async function myIonMetricSetAppUseTimeIgnore(time_spent_s: number) { + await myIonStoreWrite(APP_USE_TIME + '_ignore', JSON.stringify({ time_spent_s: time_spent_s })); + } + + return ( + + {/* */} + {children} + + ); +}; + +export const useAppUseTime = (): AppUseTimeContextProps => { + const context = useContext(AppUseTimeContext); + if (!context) { + throw new Error('useAppUseTime must be used within a AppUseTimeProvider'); + } + return context; +}; + +interface AppUseTimeContextProps { + Helloworld: () => void; + myIonMetricGetAppUseTime: () => Promise<{ time_spent_s: number }>; + myIonMetricIncAppUseTime: (time_spent_s: number) => Promise; + myIonMetricResetAppUseTime: () => Promise; + // + myIonMetricSetAppUseTime: (time_spent_s: number) => Promise; + myIonMetricGetAppUseTimeIgnore: () => Promise<{ time_spent_s: number }>; + myIonMetricSetAppUseTimeIgnore: (time_spent_s: number) => Promise; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/ConnectivesRevisionCorrectCount.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/ConnectivesRevisionCorrectCount.tsx new file mode 100644 index 0000000..182873d --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/ConnectivesRevisionCorrectCount.tsx @@ -0,0 +1,81 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonMetric } from '.'; +import { CONNECTIVES_REVISION_CORRECT_COUNT } from '../../constants'; + +const ConnectivesRevisionCorrectCount = createContext(undefined); + +export const ConnectivesRevisionCorrectCountProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const NS_KEY_IGNORE = `${CONNECTIVES_REVISION_CORRECT_COUNT}_ignore`; + + const { myIonStoreRead, myIonStoreWrite } = useMyIonMetric(); + + function Helloworld() { + console.log('helloworld ConnectivesRevisionCorrectCountProvider'); + } + + async function myIonMetricGetConnectivesRevisionCorrectCount() { + let result = JSON.parse(await myIonStoreRead(CONNECTIVES_REVISION_CORRECT_COUNT, { count: 0 })); + return result; + } + + async function myIonMetricResetConnectivesRevisionCorrectCount() { + await myIonStoreWrite(CONNECTIVES_REVISION_CORRECT_COUNT, JSON.stringify({ count: 0 })); + } + + async function myIonMetricIncConnectivesRevisionCorrectCount() { + let result = await myIonMetricGetConnectivesRevisionCorrectCount(); + await myIonStoreWrite(CONNECTIVES_REVISION_CORRECT_COUNT, JSON.stringify({ count: result.count + 1 })); + } + + async function myIonMetricSetConnectivesRevisionCorrectCount(count: number) { + await myIonStoreWrite(CONNECTIVES_REVISION_CORRECT_COUNT, JSON.stringify({ count: count })); + } + + async function myIonMetricGetConnectivesRevisionCorrectCountIgnore() { + let result = JSON.parse(await myIonStoreRead(NS_KEY_IGNORE, { count: 0 })); + return result; + } + + async function myIonMetricSetConnectivesRevisionCorrectCountIgnore(count: number) { + await myIonStoreWrite(NS_KEY_IGNORE, JSON.stringify({ count: count })); + } + + return ( + + {children} + + ); +}; + +export const useConnectivesRevisionCorrectCount = (): ConnectivesRevisionCorrectCountProps => { + const context = useContext(ConnectivesRevisionCorrectCount); + if (!context) { + throw new Error('useConnectivesRevisionCorrectCount must be used within a MyProvider'); + } + return context; +}; + +interface ConnectivesRevisionCorrectCountProps { + Helloworld: () => void; + // ConnectivesRevision + myIonMetricGetConnectivesRevisionCorrectCount: () => Promise<{ count: number }>; + myIonMetricResetConnectivesRevisionCorrectCount: () => Promise; + myIonMetricIncConnectivesRevisionCorrectCount: () => Promise; + // + myIonMetricSetConnectivesRevisionCorrectCount: (count: number) => Promise; + myIonMetricGetConnectivesRevisionCorrectCountIgnore: () => Promise<{ count: number }>; + myIonMetricSetConnectivesRevisionCorrectCountIgnore: (count: number) => Promise; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/FullmarkCount.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/FullmarkCount.tsx new file mode 100644 index 0000000..cdbc55e --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/FullmarkCount.tsx @@ -0,0 +1,77 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonMetric } from '.'; +import { FULLMARK_COUNT_KEY, FULLMARK_IGNORE_COUNT } from '../../constants'; + +const FullmarkCountContext = createContext(undefined); + +export const FullmarkCountProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const { myIonStoreRead, myIonStoreWrite } = useMyIonMetric(); + function Helloworld() { + console.log('helloworld'); + } + + async function myIonMetricGetFullMarkCount() { + let result = JSON.parse(await myIonStoreRead(FULLMARK_COUNT_KEY, { count: 0 })); + return result; + } + + async function myIonMetricResetFullMarkCount() { + await myIonStoreWrite(FULLMARK_COUNT_KEY, JSON.stringify({ count: 0 })); + } + + async function myIonMetricIncFullMarkCount() { + let result = await myIonMetricGetFullMarkCount(); + await myIonStoreWrite(FULLMARK_COUNT_KEY, JSON.stringify({ count: result.count + 1 })); + } + + async function myIonMetricSetFullMarkCount(num: number) { + await myIonStoreWrite(FULLMARK_COUNT_KEY, JSON.stringify({ count: num })); + } + + async function myIonMetricSetFullMarkIgnore(num: number) { + await myIonStoreWrite(FULLMARK_IGNORE_COUNT, JSON.stringify({ count: num })); + } + async function myIonMetricGetFullMarkIgnore() { + let result = JSON.parse(await myIonStoreRead(FULLMARK_IGNORE_COUNT, { count: 0 })); + return result; + } + + return ( + + {/* */} + {children} + + ); +}; + +export const useFullmarkCount = (): FullmarkCountContextProps => { + const context = useContext(FullmarkCountContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface FullmarkCountContextProps { + Helloworld: () => void; + // + // FullMark + myIonMetricGetFullMarkCount: () => Promise<{ count: number }>; + myIonMetricResetFullMarkCount: () => Promise; + myIonMetricIncFullMarkCount: () => Promise; + // + myIonMetricSetFullMarkCount: (num: number) => Promise; + myIonMetricSetFullMarkIgnore: (num: number) => Promise; + myIonMetricGetFullMarkIgnore: () => Promise<{ count: number }>; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/Helloworld.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/Helloworld.tsx new file mode 100644 index 0000000..5c5216f --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/Helloworld.tsx @@ -0,0 +1,5 @@ +function Helloworld() { + console.log('helloworld'); +} + +export { Helloworld }; diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/ListeningPracticeTimeSpent.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/ListeningPracticeTimeSpent.tsx new file mode 100644 index 0000000..b746529 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/ListeningPracticeTimeSpent.tsx @@ -0,0 +1,88 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonMetric } from '.'; +import { LISTENING_PRACTICE_TIME_SPENT } from '../../constants'; + +const ListenPracticeTimeSpent = createContext(undefined); + +export const ListeningPracticeTimeSpentProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + // TODO create namespace for LISTENING_PRACTICE_TIME_SPENT ignore + + const { myIonStoreRead, myIonStoreWrite } = useMyIonMetric(); + + function Helloworld() { + console.log('helloworld ListeningPracticeTimeSpentProvider'); + } + + async function myIonMetricGetListeningPracticeTimeSpent() { + let result = JSON.parse(await myIonStoreRead(LISTENING_PRACTICE_TIME_SPENT, { time_spent_s: 0 })); + return result; + } + + async function myIonMetricResetListeningPracticeTimeSpent() { + await myIonStoreWrite(LISTENING_PRACTICE_TIME_SPENT, JSON.stringify({ time_spent_s: 0 })); + } + + async function myIonMetricIncListeningPracticeTimeSpent(time_spent_s: number) { + let result = await myIonMetricGetListeningPracticeTimeSpent(); + await myIonStoreWrite( + LISTENING_PRACTICE_TIME_SPENT, + JSON.stringify({ time_spent_s: result.time_spent_s + time_spent_s }), + ); + } + + async function myIonMetricSetListeningPracticeProgress(num: number) { + await myIonStoreWrite( + // + LISTENING_PRACTICE_TIME_SPENT, + JSON.stringify({ time_spent_s: num }), + ); + } + + async function myIonMetricGetListeningPracticeProgressIgnore() { + let result = JSON.parse(await myIonStoreRead(LISTENING_PRACTICE_TIME_SPENT + '_ignore', { time_spent_s: 0 })); + return result; + } + + async function myIonMetricSetListeningPracticeProgressIgnore(time_spent_s: number) { + await myIonStoreWrite(LISTENING_PRACTICE_TIME_SPENT + '_ignore', JSON.stringify({ time_spent_s: time_spent_s })); + } + + return ( + + {/* */} + {children} + + ); +}; + +export const useListeningPracticeTimeSpent = (): ListenPracticeTimeSpentProps => { + const context = useContext(ListenPracticeTimeSpent); + if (!context) { + throw new Error('useListenPracticeTimeSpent must be used within a MyProvider'); + } + return context; +}; + +interface ListenPracticeTimeSpentProps { + Helloworld: () => void; + // + // ListeningPractice + myIonMetricGetListeningPracticeTimeSpent: () => Promise<{ time_spent_s: number }>; + myIonMetricIncListeningPracticeTimeSpent: (time_spent_s: number) => Promise; + myIonMetricResetListeningPracticeTimeSpent: () => Promise; + // + myIonMetricSetListeningPracticeProgress: (time_spent_s: number) => Promise; + myIonMetricGetListeningPracticeProgressIgnore: () => Promise<{ time_spent_s: number }>; + myIonMetricSetListeningPracticeProgressIgnore: (time_spent_s: number) => Promise; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/MatchingFrenzyCorrectCount.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/MatchingFrenzyCorrectCount.tsx new file mode 100644 index 0000000..c9d5da2 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/MatchingFrenzyCorrectCount.tsx @@ -0,0 +1,79 @@ +import React, { createContext, ReactNode, useContext } from 'react'; +import { useMyIonMetric } from '.'; +import { MATCHING_FRENZY_CORRECT_COUNT } from '../../constants'; + +const MatchingFrenzyCorrectCountContext = createContext(undefined); + +export const MatchingFrenzyCorrectCountProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const { myIonStoreRead, myIonStoreWrite } = useMyIonMetric(); + + function Helloworld() { + console.log('helloworld MatchingFrenzyCorrectCountProvider'); + } + + async function myIonMetricGetMatchingFrenzyCorrectCount() { + let result = JSON.parse(await myIonStoreRead(MATCHING_FRENZY_CORRECT_COUNT, { count: 0 })); + return result; + } + + async function myIonMetricResetMatchingFrenzyCorrectCount() { + await myIonStoreWrite(MATCHING_FRENZY_CORRECT_COUNT, JSON.stringify({ count: 0 })); + } + + async function myIonMetricIncMatchingFrenzyCorrectCount() { + let result = await myIonMetricGetMatchingFrenzyCorrectCount(); + await myIonStoreWrite(MATCHING_FRENZY_CORRECT_COUNT, JSON.stringify({ count: result.count + 1 })); + } + + async function myIonMetricSetMatchingFrenzyCorrectCount(count: number) { + await myIonStoreWrite(MATCHING_FRENZY_CORRECT_COUNT, JSON.stringify({ count: count })); + } + + async function myIonMetricGetMatchingFrenzyCorrectCountIgnore() { + let result = JSON.parse(await myIonStoreRead(`${MATCHING_FRENZY_CORRECT_COUNT}_ignore`, { count: 0 })); + return result; + } + + async function myIonMetricSetMatchingFrenzyCorrectCountIgnore(count: number) { + await myIonStoreWrite(`${MATCHING_FRENZY_CORRECT_COUNT}_ignore`, JSON.stringify({ count: count })); + } + + return ( + + {children} + + ); +}; + +export const useMatchingFrenzyCorrectCount = (): MatchingFrenzyCorrectCountContextProps => { + const context = useContext(MatchingFrenzyCorrectCountContext); + if (!context) { + throw new Error('useMatchingFrenzyCorrectCountContext must be used within a MyProvider'); + } + return context; +}; + +interface MatchingFrenzyCorrectCountContextProps { + Helloworld: () => void; + // MatchingFrenzyCorrect + myIonMetricGetMatchingFrenzyCorrectCount: () => Promise<{ count: number }>; + myIonMetricResetMatchingFrenzyCorrectCount: () => Promise; + myIonMetricIncMatchingFrenzyCorrectCount: () => Promise; + // + myIonMetricSetMatchingFrenzyCorrectCount: (count: number) => Promise; + myIonMetricGetMatchingFrenzyCorrectCountIgnore: () => Promise<{ count: number }>; + myIonMetricSetMatchingFrenzyCorrectCountIgnore: (count: number) => Promise; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonMetric/index.tsx b/002_source/ionic_mobile/src/contexts/MyIonMetric/index.tsx new file mode 100644 index 0000000..ead08a8 --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonMetric/index.tsx @@ -0,0 +1,75 @@ +import { Drivers, Storage } from '@ionic/storage'; +import React, { createContext, ReactNode, useContext, useEffect } from 'react'; +import { AppOnRecorderProvider } from '../AppOnRecorder'; +import { AppUseTimeProvider } from './AppUseTime'; +import { ConnectivesRevisionCorrectCountProvider } from './ConnectivesRevisionCorrectCount'; +import { FullmarkCountProvider } from './FullmarkCount'; +import { Helloworld } from './Helloworld'; +import { ListeningPracticeTimeSpentProvider } from './ListeningPracticeTimeSpent'; +import { MatchingFrenzyCorrectCountProvider } from './MatchingFrenzyCorrectCount'; + +const metric_store = new Storage({ + name: 'app_metrics', + driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage], +}); + +const MyContext = createContext(undefined); + +export const MyIonMetricProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + async function myIonStoreRead(key: string, not_found_output: any = {}) { + const output = (await metric_store.get(key)) || JSON.stringify(not_found_output); + return output; + } + + async function myIonStoreWrite(key: string, value: string) { + await metric_store.set(key, value); + } + + useEffect(() => { + (async () => { + await metric_store.create(); + })(); + }, []); + + return ( + + + + + + + + {/* */} + {children} + + + + + + + ); +}; + +export const useMyIonMetric = (): MyContextProps => { + const context = useContext(MyContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + myIonStoreRead: (key: string, not_found_output: any) => Promise; + myIonStoreWrite: (key: string, value: string) => Promise; + // + + // + Helloworld: () => void; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonQuiz.tsx b/002_source/ionic_mobile/src/contexts/MyIonQuiz.tsx new file mode 100644 index 0000000..d77527a --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonQuiz.tsx @@ -0,0 +1,156 @@ +import React, { createContext, ReactNode, useContext, useState } from 'react'; +import { MATCH_FRENZY_SCOREBOARD_KEY } from '../constants'; +import IListeningPracticeQuestion from '../interfaces/IListeningPracticeQuestion'; +import { ConnectiveRevisionAllResult } from './ConnectiveRevisionRanking'; +import { MatchingFrenzyResult, MatchingFrezyRanking } from './MatchingFrezyRanking'; +import { useMyIonStore } from './MyIonStore'; + +const MyIonQuizContext = createContext(undefined); + +export const MyIonQuizProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [my_context, setMyContext] = useState('initial value'); + const { myIonStoreRead, myIonStoreWrite } = useMyIonStore(); + + function Helloworld() { + listening_practice_correction_list; + } + const [listening_practice_result, setListeningPracticeResult] = useState(0); + const [listening_practice_current_test, setListeningPracticeCurrentTest] = useState(0); + const [listening_practice_correction_list, setListeningPracticeCorrectionList] = useState([]); + // + function appendToListeningPracticeCorrectionList(question: IListeningPracticeQuestion) { + setListeningPracticeCorrectionList([...listening_practice_correction_list, question]); + } + // + function resetListeningPracticeCorrectionList() { + setListeningPracticeCorrectionList([]); + } + // + const [matching_frenzy_result, setMatchingFrenzyResult] = useState(0); + const [matching_frenzy_current_test, setMatchingFrenzyCurrentTest] = useState(0); + // + const getCategoryKey = (category: string) => `${MATCH_FRENZY_SCOREBOARD_KEY}/${category}`; + // + async function loadMatchingFrenzyScoreBoard(cat_name: string): Promise { + let category_key = getCategoryKey(cat_name); + + let current_result = JSON.parse(await myIonStoreRead(category_key)); + if (!current_result || JSON.stringify(current_result) == '{}') { + current_result = { ranking: [] }; + } + return current_result; + } + + async function saveMatchingFrenzyResultToScoreBoard(cat_name: string, result: MatchingFrenzyResult) { + let category_key = getCategoryKey(cat_name); + let current_result: MatchingFrezyRanking = await loadMatchingFrenzyScoreBoard(cat_name); + current_result['ranking'] = [...current_result['ranking'], result]; + current_result['ranking'].sort((a: MatchingFrenzyResult, b: MatchingFrenzyResult) => b.result - a.result).splice(3); + myIonStoreWrite(category_key, JSON.stringify(current_result)); + } + // + const [connective_revision_progress, setConnectiveRevisionProgress] = useState(0); + const [connective_revision_current_test, setConnectiveRevisionCurrentTest] = useState(0); + // + const CONNECT_REVISION_SCOREBOARD_KEY = 'connective_revision_scoreboard'; + async function loadConnectiveRevisionScoreBoard(): Promise { + let current_result = JSON.parse(await myIonStoreRead(CONNECT_REVISION_SCOREBOARD_KEY)); + if (!current_result || JSON.stringify(current_result) == '{}') { + current_result = {}; + } + return current_result; + } + + const [connective_revision_score, setConnectiveRevisionScore] = useState(0); + + async function saveConnectiveRevisionResultToScoreBoard(quiz_index: string, progress: number) { + let current_result: ConnectiveRevisionAllResult = await loadConnectiveRevisionScoreBoard(); + current_result = { ...current_result, [quiz_index]: progress }; + myIonStoreWrite(CONNECT_REVISION_SCOREBOARD_KEY, JSON.stringify(current_result)); + } + + return ( + + {children} + + ); +}; + +export const useMyIonQuizContext = (): MyContextProps => { + const context = useContext(MyIonQuizContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + my_context: string; + setMyContext: React.Dispatch>; + // + // + listening_practice_result: number; + setListeningPracticeResult: React.Dispatch>; + // + listening_practice_current_test: number; + setListeningPracticeCurrentTest: React.Dispatch>; + // + listening_practice_correction_list: IListeningPracticeQuestion[]; + setListeningPracticeCorrectionList: React.Dispatch>; + appendToListeningPracticeCorrectionList: (question: IListeningPracticeQuestion) => void; + resetListeningPracticeCorrectionList: () => void; + // + matching_frenzy_result: number; + setMatchingFrenzyResult: React.Dispatch>; + matching_frenzy_current_test: number; + setMatchingFrenzyCurrentTest: React.Dispatch>; + loadMatchingFrenzyScoreBoard: (cat_name: string) => Promise; + saveMatchingFrenzyResultToScoreBoard: (cat_name: string, result: MatchingFrenzyResult) => Promise; + // + connective_revision_progress: number; + setConnectiveRevisionProgress: React.Dispatch>; + // + connective_revision_score: number; + setConnectiveRevisionScore: React.Dispatch>; + connective_revision_current_test: number; + setConnectiveRevisionCurrentTest: React.Dispatch>; + loadConnectiveRevisionScoreBoard: () => Promise; + saveConnectiveRevisionResultToScoreBoard: (quiz_index: string, progress: number) => Promise; + // + Helloworld: () => void; +} diff --git a/002_source/ionic_mobile/src/contexts/MyIonStore.tsx b/002_source/ionic_mobile/src/contexts/MyIonStore.tsx new file mode 100644 index 0000000..709ce3c --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/MyIonStore.tsx @@ -0,0 +1,113 @@ +import { Drivers, Storage } from '@ionic/storage'; +import React, { createContext, ReactNode, useContext, useEffect, useState } from 'react'; +import ILesson from '../interfaces/ILesson'; +import { listLessonCategories } from '../public_data/listLessonCategories'; + +const user_store = new Storage({ + name: '__mydb', + driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage], +}); + +const MyContext = createContext(undefined); + +export const MyIonStoreProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [db, setDB] = useState<[]>([]); + const [lesson_content, setLessonContent] = useState([]); + + const [my_context, setMyContext] = useState('initial value'); + const [test_first, setTestFirst] = useState(undefined); + const [test_second, setTestSecond] = useState(undefined); + const [test_third, setTestThird] = useState(undefined); + + async function myIonStoreRead(key: string, not_found_output: string = '{}'): Promise { + const output = (await user_store.get(key)) || not_found_output; + return output; + } + + async function myIonStoreWrite(key: string, value: string): Promise { + await user_store.set(key, value); + } + + useEffect(() => { + (async () => { + let cats = await listLessonCategories(); + setLessonContent(cats); + })(); + + (async () => { + await user_store.create(); + })(); + }, []); + + return ( + + {children} + + ); +}; + +export const useMyIonStore = (): MyContextProps => { + const context = useContext(MyContext); + if (!context) { + throw new Error('useMyContext must be used within a MyProvider'); + } + return context; +}; + +interface MyContextProps { + // + db: []; + setDB: React.Dispatch>; + lesson_contents: ILesson[] | []; + setLessonContent: React.Dispatch>; + user_store: Storage; + // + myIonStoreRead: (key: string, not_found_output?: any) => Promise; + myIonStoreWrite: (key: string, value: string) => Promise; + // + my_context: string; + setMyContext: React.Dispatch>; + test_first: IFirst | undefined; + setTestFirst: React.Dispatch>; + test_second: ISecond | undefined; + setTestSecond: React.Dispatch>; + test_third: IThird | undefined; + setTestThird: React.Dispatch>; +} + +interface IFirst { + test_s: string; + test_i: number; +} + +interface ISecond { + test_s: string; + test_i: number; + content: IFirst[] | []; +} + +interface IThird { + test_s: string; + test_i: number; + content: ISecond[] | []; +} diff --git a/002_source/ionic_mobile/src/contexts/index.tsx b/002_source/ionic_mobile/src/contexts/index.tsx new file mode 100644 index 0000000..6d19c9b --- /dev/null +++ b/002_source/ionic_mobile/src/contexts/index.tsx @@ -0,0 +1,26 @@ +import { AppStateProvider } from './AppState'; +import { MyIonFavoriteProvider } from './MyIonFavorite'; +import { MyIonMetricProvider } from './MyIonMetric'; +import { MyIonQuizProvider } from './MyIonQuiz'; +import { MyIonStoreProvider } from './MyIonStore'; + +const ContextMeta = ({ children }: { children: React.ReactNode }) => { + return ( + <> + + + + + + {/* */} + {children} + + + + + + + ); +}; + +export default ContextMeta; diff --git a/002_source/ionic_mobile/src/debug.css b/002_source/ionic_mobile/src/debug.css new file mode 100644 index 0000000..3398412 --- /dev/null +++ b/002_source/ionic_mobile/src/debug.css @@ -0,0 +1,3 @@ +.debug { + background-color: gold; +} diff --git a/002_source/ionic_mobile/src/google_fonts.css b/002_source/ionic_mobile/src/google_fonts.css new file mode 100644 index 0000000..0935ee2 --- /dev/null +++ b/002_source/ionic_mobile/src/google_fonts.css @@ -0,0 +1,7 @@ +@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100..900&family=Noto+Sans+TC:wght@100..900&display=swap'); + +* { + font-family: 'Noto Sans TC', sans-serif; + font-optical-sizing: auto; + font-style: normal; +} diff --git a/002_source/ionic_mobile/src/i18n.ts b/002_source/ionic_mobile/src/i18n.ts new file mode 100644 index 0000000..a7a73fe --- /dev/null +++ b/002_source/ionic_mobile/src/i18n.ts @@ -0,0 +1,106 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; + +// the translations +// (tip move them in a JSON file and import them) +const resources = { + en: { + translation: { + 'Lesson': 'Lesson', + 'Quiz': 'Quiz', + 'Favorite': 'Favorite', + 'Loading': 'Loading', + 'menu.link-home': 'Home', + 'menu.link-stats': 'Stats', + 'home.title': 'Remove duplicate songs from your Spotify library.', + 'home.description': + "Spotify Dedup cleans up your playlists and liked songs from your Spotify account. It's easy and fast.", + 'home.review': + 'Read what {{-supportersCount}} supporters think about Spotify Dedup on {{- linkOpen}}Buy Me a Coffee{{- linkClose}}', + 'home.login-button': 'Log in with Spotify', + 'meta.title': 'Spotify Dedup - Remove duplicate songs from your Spotify library', + 'meta.description': + 'Delete repeated songs from your Spotify playlists and liked songs automatically. Fix your music library. Quickly and easy.', + 'features.find-remove.header': 'Find & remove', + 'features.find-remove.body': + 'Dedup checks your playlists and liked songs in {{- strongOpen}}your Spotify library{{- strongClose}}. Once Dedup finds duplicates you can remove them on a per-playlist basis.', + 'features.safer.header': 'Safer', + 'features.safer.body': + 'Dedup will only remove {{- strongOpen}}duplicate songs{{- strongClose}}, leaving the rest of the playlist and liked songs untouched.', + 'features.open-source.header': 'Open Source', + 'features.open-source.body': + "You might want to have a look at the {{- linkGithubOpen}}source code on GitHub{{- linkGithubClose}}. This web app uses the {{- linkWebApiOpen}}Spotify Web API{{- linkWebApiClose}} to manage user's playlists and liked songs.", + 'reviews.title': 'This is what users are saying', + 'footer.author': 'Made with ♥ by {{- linkOpen}}JMPerez 👨‍💻{{- linkClose}}', + 'footer.github': 'Check out the {{- linkOpen}}code on GitHub 📃{{- linkClose}}', + 'footer.bmc': 'Support the project {{- linkOpen}}buying a coffee ☕{{- linkClose}}', + 'bmc.button': 'Would you buy me a coffee?', + 'result.duplicate.reason-same-id': 'Duplicate', + 'result.duplicate.reason-same-data': 'Duplicate (same name, artist and duration)', + 'result.duplicate.track': '<0>{{trackName}} <2>by <4>{{trackArtistName}}', + 'process.status.finding': 'Finding duplicates in your playlists and liked songs…', + 'process.status.complete': 'Processing complete!', + 'process.status.complete.body': 'Your playlists and liked songs have been processed!', + 'process.status.complete.dups.body': + 'Click on the {{- strongOpen}}Remove duplicates{{- strongClose}} button to get rid of duplicates in that playlist or liked songs collection.', + 'process.status.complete.nodups.body': "Congrats! You don't have duplicates in your playlists nor liked songs.", + 'process.reading-library': 'Going through your library, finding the playlists you own and your liked songs…', + 'process.processing_one': 'Searching for duplicate songs, wait a sec. Still to process {{count}} playlist…', + 'process.processing_other': 'Searching for duplicate songs, wait a sec. Still to process {{count}} playlists…', + 'process.saved.title': 'liked songs in your library', + 'process.saved.duplicates_one': 'This collection has {{count}} duplicate song', + 'process.saved.duplicates_other': 'This collection has {{count}} duplicate songs', + 'process.saved.remove-button': 'Remove duplicates from your liked songs', + 'process.playlist.duplicates_one': 'This playlist has {{count}} duplicate song', + 'process.playlist.duplicates_other': 'This playlist has {{count}} duplicate songs', + 'process.playlist.remove-button': 'Remove duplicates from this playlist', + 'process.items.removed': 'Duplicates removed', + 'faq.section-title': 'Frequently asked questions', + 'faq.question-1': 'What does this web application do?', + 'faq.answer-1': + 'Spotify Dedup helps you clean up your music libraries on Spotify by identifying and deleting duplicate songs across playlists and liked songs.', + 'faq.question-2': 'How does it find duplicates?', + 'faq.answer-2': + "Dedup finds duplicates based on the songs identifier, title, artist, and duration similarity. It identifies duplicates that Spotify's application does not catch.", + 'faq.question-3': "How is Dedup better than Spotify's built-in duplicate detection?", + 'faq.answer-3': + "Spotify's applications only warn about duplicates when adding a song to a playlit or liked songs with the exact same song identifier. However, the same song can have multiple identifiers on Spotify that both in the same release or in several ones. Dedup detects duplicates based on title, artist, and duration similarity.", + 'faq.question-4': 'When duplicates are found, which songs are removed?', + 'faq.answer-4': 'Dedup will keep the first song within a group of duplicate songs, and will remove the rest.', + 'faq.question-5': 'Is my data safe with this web application?', + 'faq.answer-5': + 'Yes, this web application does not store any user data on its servers. It only requests the minimum set of permissions necessary to process your library.', + 'faq.question-6': 'What permissions does this web application require?', + 'faq.answer-6': + "This web application uses Spotify's authentication service to access your liked songs and playlists in your library.", + 'faq.question-7': 'How has this tool been tested?', + 'faq.answer-7': + 'This tool has been battle-tested by thousands of users who have used it to identify duplicates in millions of playlists since 2014.', + 'faq.question-8': 'Can this tool delete duplicates across multiple playlists?', + 'faq.answer-8': + "This tool can identify and delete duplicates on all playlists in a library, but doesn't detect duplicates of a song across multiple playlists.", + 'faq.question-9': 'How can I revoke the permissions granted to this web application?', + 'faq.answer-9': + "You can revoke the permissions granted to this web application at any time on your Spotify account, under the 'Apps' section.", + 'faq.question-10': 'Does this tool work with other music streaming services?', + 'faq.answer-10': "No, this tool only works with Spotify through Spotify's Web API.", + }, + }, +}; + +i18n + .use(initReactI18next) // passes i18n down to react-i18next + .init({ + // the translations + // (tip move them in a JSON file and import them, + // or even better, manage them via a UI: https://react.i18next.com/guides/multiple-translation-files#manage-your-translations-with-a-management-gui) + resources, + lng: 'en', // if you're using a language detector, do not define the lng option + fallbackLng: 'en', + + interpolation: { + escapeValue: false, // react already safes from xss => https://www.i18next.com/translation-function/interpolation#unescape + }, + }); + +export default i18n; diff --git a/002_source/ionic_mobile/src/interfaces/Helloworld.tsx b/002_source/ionic_mobile/src/interfaces/Helloworld.tsx new file mode 100644 index 0000000..d47b24a --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/Helloworld.tsx @@ -0,0 +1,5 @@ +interface ContainerProps { + name: string; +} + +export default ContainerProps; diff --git a/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionCategory.tsx b/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionCategory.tsx new file mode 100644 index 0000000..4f893cc --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionCategory.tsx @@ -0,0 +1,11 @@ +import IConnectivesRevisionQuestion from './IConnectivesRevisionQuestion'; + +interface IConnectivesRevisionCategory { + test_s: string; + test_i: number; + cat_info: string; + cat_name: string; + content: IConnectivesRevisionQuestion[] | []; +} + +export default IConnectivesRevisionCategory; diff --git a/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionQuestion.tsx b/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionQuestion.tsx new file mode 100644 index 0000000..f1cdec6 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IConnectivesRevisionQuestion.tsx @@ -0,0 +1,12 @@ +interface IConnectivesRevisionQuestion { + test_s: string; + test_i: number; + image: string; + sound: string; + word_c: string; + word: string; + sample_e: string; + sample_c: string; +} + +export default IConnectivesRevisionQuestion; diff --git a/002_source/ionic_mobile/src/interfaces/ILesson.tsx b/002_source/ionic_mobile/src/interfaces/ILesson.tsx new file mode 100644 index 0000000..bc81c06 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/ILesson.tsx @@ -0,0 +1,11 @@ +import ILessonCategory from './ILessonCategory'; + +interface ILesson { + test_s: string; + test_i: number; + name: string; + path: string; + content: ILessonCategory[] | []; +} + +export default ILesson; diff --git a/002_source/ionic_mobile/src/interfaces/ILessonCategory.tsx b/002_source/ionic_mobile/src/interfaces/ILessonCategory.tsx new file mode 100644 index 0000000..d0f283a --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/ILessonCategory.tsx @@ -0,0 +1,11 @@ +import IWordCard from './IWordCard'; + +interface ILessonCategory { + test_s: string; + test_i: number; + cat_info: string; + cat_name: string; + content: IWordCard[] | []; +} + +export default ILessonCategory; diff --git a/002_source/ionic_mobile/src/interfaces/IListeningPracticeCategory.tsx b/002_source/ionic_mobile/src/interfaces/IListeningPracticeCategory.tsx new file mode 100644 index 0000000..d0ada38 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IListeningPracticeCategory.tsx @@ -0,0 +1,11 @@ +import IListeningPracticeQuestion from './IListeningPracticeQuestion'; + +interface IListeningPracticeCategory { + test_s: string; + test_i: number; + cat_info: string; + cat_name: string; + content: IListeningPracticeQuestion[] | []; +} + +export default IListeningPracticeCategory; diff --git a/002_source/ionic_mobile/src/interfaces/IListeningPracticeQuestion.tsx b/002_source/ionic_mobile/src/interfaces/IListeningPracticeQuestion.tsx new file mode 100644 index 0000000..ec2f230 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IListeningPracticeQuestion.tsx @@ -0,0 +1,12 @@ +interface IListeningPracticeQuestion { + test_s: string; + test_i: number; + image: string; + sound: string; + word_c: string; + word: string; + sample_e: string; + sample_c: string; +} + +export default IListeningPracticeQuestion; diff --git a/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyCategory.tsx b/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyCategory.tsx new file mode 100644 index 0000000..868eac2 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyCategory.tsx @@ -0,0 +1,11 @@ +import IMatchingFrenzyQuestion from './IMatchingFrenzyQuestion'; + +interface IMatchingFrenzyCategory { + test_s: string; + test_i: number; + cat_info: string; + cat_name: string; + content: IMatchingFrenzyQuestion[] | []; +} + +export default IMatchingFrenzyCategory; diff --git a/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyQuestion.tsx b/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyQuestion.tsx new file mode 100644 index 0000000..d439e38 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IMatchingFrenzyQuestion.tsx @@ -0,0 +1,12 @@ +interface IMatchingFrenzyQuestion { + test_s: string; + test_i: number; + image: string; + sound: string; + word_c: string; + word: string; + sample_e: string; + sample_c: string; +} + +export default IMatchingFrenzyQuestion; diff --git a/002_source/ionic_mobile/src/interfaces/IWordCard.tsx b/002_source/ionic_mobile/src/interfaces/IWordCard.tsx new file mode 100644 index 0000000..9091c80 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/IWordCard.tsx @@ -0,0 +1,14 @@ +interface IWordCard { + test_s: string; + test_i: number; + image: string; + sound: string; + word_c: string; + word: string; + sample_e: string; + sample_c: string; + image_url: string; + sound_url: string; +} + +export default IWordCard; diff --git a/002_source/ionic_mobile/src/interfaces/LessonCategoriesProps.tsx b/002_source/ionic_mobile/src/interfaces/LessonCategoriesProps.tsx new file mode 100644 index 0000000..15d8128 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/LessonCategoriesProps.tsx @@ -0,0 +1,5 @@ +interface LessonCategoriesProps { + name: string; +} + +export default LessonCategoriesProps; diff --git a/002_source/ionic_mobile/src/interfaces/LessonContentProps.tsx b/002_source/ionic_mobile/src/interfaces/LessonContentProps.tsx new file mode 100644 index 0000000..2602c67 --- /dev/null +++ b/002_source/ionic_mobile/src/interfaces/LessonContentProps.tsx @@ -0,0 +1,5 @@ +interface LessonContentProps { + name: string; +} + +export default LessonContentProps; diff --git a/002_source/ionic_mobile/src/ionic_fs.ts b/002_source/ionic_mobile/src/ionic_fs.ts new file mode 100644 index 0000000..389060d --- /dev/null +++ b/002_source/ionic_mobile/src/ionic_fs.ts @@ -0,0 +1,41 @@ +import { Directory, Encoding, Filesystem } from '@capacitor/filesystem'; + +const writeSecretFile = async () => { + await Filesystem.writeFile({ + path: 'secrets/text.txt', + data: 'This is a test', + directory: Directory.Documents, + encoding: Encoding.UTF8, + }); +}; + +const readSecretFile = async (): Promise => { + const contents = await Filesystem.readFile({ + path: 'secrets/text.txt', + directory: Directory.Documents, + encoding: Encoding.UTF8, + }); + + console.log('secrets:', contents); + return JSON.stringify(contents.data); +}; + +const deleteSecretFile = async () => { + await Filesystem.deleteFile({ + path: 'secrets/text.txt', + directory: Directory.Documents, + }); +}; + +const readFilePath = async () => { + // Here's an example of reading a file with a full file path. Use this to + // read binary data (base64 encoded) from plugins that return File URIs, such as + // the Camera. + const contents = await Filesystem.readFile({ + path: 'file:///var/mobile/Containers/Data/Application/22A433FD-D82D-4989-8BE6-9FC49DEA20BB/Documents/text.txt', + }); + + console.log('data:', contents); +}; + +export { deleteSecretFile, readFilePath, readSecretFile, writeSecretFile }; diff --git a/002_source/ionic_mobile/src/main.tsx b/002_source/ionic_mobile/src/main.tsx new file mode 100644 index 0000000..c99e55a --- /dev/null +++ b/002_source/ionic_mobile/src/main.tsx @@ -0,0 +1,13 @@ +import './i18n'; +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root'); +const root = createRoot(container!); + +root.render( + + + , +); diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/IQuestionCard.tsx b/002_source/ionic_mobile/src/pages/ConnectiveRevision/IQuestionCard.tsx new file mode 100644 index 0000000..70052ca --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ConnectiveRevision/IQuestionCard.tsx @@ -0,0 +1,14 @@ +interface IQuestionMeta { + question_idx: number; + question_fh: string; + question_sh: string; + modal_ans: string; + options: string[]; +} + +interface IQuestionJson { + question_fh: string; + question_sh: string; + modal_ans: string; + options: string[]; +} diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizContent.tsx b/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizContent.tsx new file mode 100644 index 0000000..83606de --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizContent.tsx @@ -0,0 +1,195 @@ +import { IonButton, IonIcon } from '@ionic/react'; +import { arrowBackCircleOutline } from 'ionicons/icons'; +import React, { useEffect, useRef, useState } from 'react'; +import ConfirmUserQuitQuiz from '../../components/ConfirmUserQuitQuiz'; +import CorrectAnswerToast from '../../components/CorrectAnswerToast'; +import QuestionProgress from '../../components/QuestionProgress'; +import WrongAnswerToast from '../../components/WrongAnswerToast'; +import { CONNECTIVE_REVISION_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useConnectivesRevisionCorrectCount } from '../../contexts/MyIonMetric/ConnectivesRevisionCorrectCount'; + +interface IQuestionCard { + num_correct: number; + total_questions_num: number; + incNumCorrect: () => void; + // openCorrectToast: () => void; + // openWrongToast: () => void; + // + nextQuestion: () => void; + question_meta: IQuestionMeta; + // + answer_list: string[]; + quiz_idx: number; +} + +const QuizContent: React.FC = ({ + num_correct, + total_questions_num, + nextQuestion, + question_meta, + // openCorrectToast, + // openWrongToast, + incNumCorrect, + answer_list, + quiz_idx, +}) => { + let { question_idx, question_fh, question_sh, modal_ans } = question_meta; + const [ignore_user_tap, setIgnoreUserTap] = useState(false); + + const [isOpenCorrectAnswer, setIsOpenCorrectAnswer] = useState(false); + const [isOpenWrongAnswer, setIsOpenWrongAnswer] = useState(false); + const [user_answer, setUserAnswer] = useState(undefined); + + let ref1 = useRef(null); + let ref2 = useRef(null); + let ref3 = useRef(null); + let ref4 = useRef(null); + let button_refs = [ref1, ref2, ref3, ref4]; + + const { myIonMetricIncConnectivesRevisionCorrectCount } = useConnectivesRevisionCorrectCount(); + + const { CONNECTIVES_REVISION_ANWERED_WAIT_S } = useAppStateContext(); + + function handleUserAnswer(answer: string, ref_button: React.RefObject) { + if (ignore_user_tap) return; + + setUserAnswer(answer); + + if (answer.toLowerCase() === modal_ans.toLowerCase()) { + incNumCorrect(); + // openCorrectToast(); + setIsOpenCorrectAnswer(true); + + myIonMetricIncConnectivesRevisionCorrectCount(); + + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'green'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + } else { + // openWrongToast(); + setIsOpenWrongAnswer(true); + + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'red'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + } + + // setTimeout(() => { + // nextQuestion(); + // ResetButtonsStyle(); + // setIgnoreUserTap(false); + // }, CONNECTIVES_REVISION_ANWERED_WAIT_S * 1000); + } + + useEffect(() => { + if (user_answer) { + if (!isOpenCorrectAnswer && !isOpenWrongAnswer) { + // assume all toast closed + + setTimeout(() => { + nextQuestion(); + ResetButtonsStyle(); + setIgnoreUserTap(false); + }, 500); + } + } + }, [user_answer, isOpenCorrectAnswer, isOpenWrongAnswer]); + + function ResetButtonsStyle() { + button_refs.forEach((ref) => { + if (ref && ref.current) ref.current.style.backgroundColor = 'unset'; + if (ref && ref.current) ref.current.style.color = 'unset'; + }); + } + + const [show_confirm_user_exit, setShowConfirmUserExit] = useState(false); + + return ( + <> +
+
+ setShowConfirmUserExit(true)}> + + +
+
+
+
+ {/* */} +
+ + +
+ Quiz {quiz_idx} Q.{question_idx + 1}/{total_questions_num} +
+
+ Read the text below and choose the best connective. +
+
+ {question_fh} _____ {question_sh} +
+
+ {answer_list.map((connective, idx) => { + return ( +
+ { + setIgnoreUserTap(true); + handleUserAnswer(connective, button_refs[idx]); + }} + > + {connective} + +
+ ); + })} +
+
+ + + + setIsOpenCorrectAnswer(false)} /> + + setIsOpenWrongAnswer(false)} + /> + + ); +}; + +export default QuizContent; diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizRun.tsx b/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizRun.tsx new file mode 100644 index 0000000..7252d16 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ConnectiveRevision/QuizRun.tsx @@ -0,0 +1,147 @@ +import { IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { CONNECTIVE_REVISION_LINK, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; +import { listConectivesRevisionContent } from '../../public_data/listConectivesRevisionContent'; +import { shuffleArray } from '../../utils/shuffleArray'; +import QuizContent from './QuizContent'; + +function ConnectiveRevisionQuizRun() { + const router = useIonRouter(); + const { p_route } = useParams<{ p_route: string }>(); + const i_p_route = parseInt(p_route); + + const { setTabActive } = useAppStateContext(); + const [question_list, setQuestionList] = useState([]); + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + const [current_question_idx, setCurrentQuestionIdx] = useState(0); + const [num_correct, setNumCorrect] = useState(0); + const [isOpenCorrectAnswer, setIsOpenCorrectAnswer] = useState(false); + const [isOpenWrongAnswer, setIsOpenWrongAnswer] = useState(false); + const [answer_list, setAnswerList] = useState(['but', 'and', 'or', 'of', 'with']); + const { + setConnectiveRevisionCurrentTest, + setConnectiveRevisionProgress, + setConnectiveRevisionScore, + // + } = useMyIonQuizContext(); + const { setConnectiveRevisionInProgress } = useAppStateContext(); + + function openCorrectToast() { + setIsOpenCorrectAnswer(true); + } + + function openWrongToast() { + setIsOpenWrongAnswer(true); + } + + const nextQuestion = () => { + let next_question_num = current_question_idx + 1; + + setCurrentQuestionIdx(next_question_num); + // setCurrentQuestionMeta(question_list[next_question_num]); + let question_meta_current = question_list[next_question_num]; + setCurrentQuestionMeta({ + question_idx: next_question_num, + ...question_meta_current, + }); + + if (next_question_num >= question_list.length) { + setConnectiveRevisionCurrentTest(i_p_route); + + // setConnectiveRevisionProgress(Math.ceil(((num_correct + 1) / question_list.length) * 100)); + setConnectiveRevisionScore(Math.ceil((num_correct / question_list.length) * 100)); + + router.push(`${CONNECTIVE_REVISION_LINK}/finished`, 'none', 'replace'); + } + }; + + const incNumCorrect = () => { + setNumCorrect(num_correct + 1); + }; + + const [init_answer, setInitAnswer] = useState([]); + + useEffect(() => { + if (!current_question_meta) return; + + // let all_answers = [...new Set([...question_list.map(q => q.modal_ans), ...current_question_meta.options])]; + let all_answers = [current_question_meta.modal_ans, ...current_question_meta.options]; + + let wrong_ans_list = all_answers.filter((a) => a !== current_question_meta.modal_ans); + let sliced_shuffle_array = shuffleArray(wrong_ans_list).slice(0, 2); + let full_array = [...sliced_shuffle_array, current_question_meta.modal_ans]; + setAnswerList(shuffleArray(full_array)); + }, [current_question_meta]); + + useEffect(() => { + (async () => { + const res_json = await listConectivesRevisionContent(); + let temp_init_ans = res_json[i_p_route].init_ans; + + setInitAnswer(temp_init_ans); + let temp = res_json[i_p_route].content; + let shuffled_temp = shuffleArray(temp); + // let shuffled_temp = temp; + setQuestionList(shuffled_temp); + + let question_meta_current = res_json[i_p_route].content[0]; + setCurrentQuestionMeta({ + question_idx: current_question_idx, + ...question_meta_current, + }); + })(); + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + if (!current_question_meta) return ; + + return ( + <> + + + + {/* */} + {/* setIsOpenCorrectAnswer(false)} /> */} + {/* */} + {/* setIsOpenWrongAnswer(false)} + /> */} + {/* + setIsOpenCorrectAnswer(false)} + duration={1000 - 100} + color='success' + > + setIsOpenWrongAnswer(false)} + duration={1000 - 100} + color='danger' + > */} + + + + ); +} + +export default ConnectiveRevisionQuizRun; diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/Result/index.tsx b/002_source/ionic_mobile/src/pages/ConnectiveRevision/Result/index.tsx new file mode 100644 index 0000000..4f11ca2 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ConnectiveRevision/Result/index.tsx @@ -0,0 +1,72 @@ +import { IonButton, IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect } from 'react'; +import { CONNECTIVE_REVISION_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; + +function ConnectiveRevisionQuizRun() { + const router = useIonRouter(); + const { + loadConnectiveRevisionScoreBoard, + saveConnectiveRevisionResultToScoreBoard, + connective_revision_current_test, + connective_revision_progress, + connective_revision_score, + } = useMyIonQuizContext(); + + const { setConnectiveRevisionInProgress } = useAppStateContext(); + + useEffect(() => { + setConnectiveRevisionInProgress(false); + (async () => { + let all_old_highest_scores = await loadConnectiveRevisionScoreBoard(); + let old_highest_score = all_old_highest_scores[connective_revision_current_test.toString()] || 0; + saveConnectiveRevisionResultToScoreBoard( + connective_revision_current_test.toString(), + Math.max(old_highest_score, connective_revision_score), + ); + })(); + }, []); + + return ( + <> + + +
+
+
{'Quiz Result'}
+
+
🎉🎉🎉
+
{'Congraulations !!!'}
+
{'Quiz over'}
+
+
+ router.push(`${CONNECTIVE_REVISION_LINK}/`)}> + {'back to main menu'} + +
+
+
+
+
+ + ); +} + +export default ConnectiveRevisionQuizRun; diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/SelectCategory.tsx b/002_source/ionic_mobile/src/pages/ConnectiveRevision/SelectCategory.tsx new file mode 100644 index 0000000..089b159 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ConnectiveRevision/SelectCategory.tsx @@ -0,0 +1,128 @@ +import { IonButton, IonContent, IonHeader, IonIcon, IonPage, IonTitle, IonToolbar, useIonRouter } from '@ionic/react'; +import { arrowBackCircleOutline } from 'ionicons/icons'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { CONNECTIVE_REVISION_LINK, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { ConnectiveRevisionAllResult } from '../../contexts/ConnectiveRevisionRanking'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; +import IConnectivesRevisionCategory from '../../interfaces/IConnectivesRevisionCategory'; +import { listConectivesRevisionContent } from '../../public_data/listConectivesRevisionContent'; + +function ConnectiveRevisionSelectCategory() { + const PAGE_TITLE = 'Connective Revision'; + const router = useIonRouter(); + + let [loading, setLoading] = useState(true); + let [categories, setCategories] = useState([]); + let { setTabActive, setConnectiveRevisionInProgress } = useAppStateContext(); + + useEffect(() => { + listConectivesRevisionContent().then((res_json) => { + setCategories(res_json); + setLoading(false); + }); + }, []); + + let { loadConnectiveRevisionScoreBoard } = useMyIonQuizContext(); + let [scoreboard_meta, setScoreboardMeta] = useState(); + + useEffect(() => { + (async () => { + let temp = await loadConnectiveRevisionScoreBoard(); + setScoreboardMeta(temp); + })(); + + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + if (loading) return ; + if (!scoreboard_meta) return ; + + return ( + <> + + + +
+
+ router.push(QUIZ_MAIN_MENU_LINK)}> + + +
+ +
{PAGE_TITLE}
+
+
+
+
+
+ + + + +
{PAGE_TITLE}
+
+
+
+ +
+
+
+
+
{'Question Bank'}
+
+ {categories + .map((item) => item.cat_name) + .map((item_name, idx) => ( +
+ { + setConnectiveRevisionInProgress(true); + router.push(`${CONNECTIVE_REVISION_LINK}/r/${idx}`, 'none', 'replace'); + }} + > +
+
{item_name}
+
+ {scoreboard_meta[idx.toString()] || 0} + {'%'} +
+
+
+
+ ))} +
+
+
+
+ + ); +} + +export default ConnectiveRevisionSelectCategory; diff --git a/002_source/ionic_mobile/src/pages/ConnectiveRevision/style.css b/002_source/ionic_mobile/src/pages/ConnectiveRevision/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/DebugPage/deleteUserConfig.tsx b/002_source/ionic_mobile/src/pages/DebugPage/deleteUserConfig.tsx new file mode 100644 index 0000000..9746b71 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/deleteUserConfig.tsx @@ -0,0 +1,7 @@ +// clear config by key +export function deleteUserConfig(key: string): void { + let current_config_string = localStorage.getItem('user_config') || '{}'; + let current_config = JSON.parse(current_config_string); + delete current_config[key]; + localStorage.setItem('user_config', JSON.stringify(current_config)); +} diff --git a/002_source/ionic_mobile/src/pages/DebugPage/index.tsx b/002_source/ionic_mobile/src/pages/DebugPage/index.tsx new file mode 100644 index 0000000..09d83d8 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/index.tsx @@ -0,0 +1,155 @@ +import { IonButton, IonContent, IonPage, useIonRouter } from '@ionic/react'; +import './style.css'; +import Markdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { useAppUseTime } from '../../contexts/MyIonMetric/AppUseTime'; +import { useConnectivesRevisionCorrectCount } from '../../contexts/MyIonMetric/ConnectivesRevisionCorrectCount'; +import { useFullmarkCount } from '../../contexts/MyIonMetric/FullmarkCount'; +import { useListeningPracticeTimeSpent } from '../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; +import { useMatchingFrenzyCorrectCount } from '../../contexts/MyIonMetric/MatchingFrenzyCorrectCount'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; + +const markdown = ` +Just a link: www.nasa.gov. +- [ ] helloworld +__bold__ +# h1 +## h2 +### h3 +#### h4 +##### h5 +###### h6 + +| test | test | test | +| --- | --- | --- | +| 1 | 1 | 1 | +`; + +const DebugPage: React.FC = () => { + // Genius + const { myIonMetricSetFullMarkCount } = useFullmarkCount(); + + // hardworker + const { myIonMetricSetAppUseTime } = useAppUseTime(); + + // Attentive ears + const { myIonMetricSetListeningPracticeProgress } = useListeningPracticeTimeSpent(); + + // matchmaking + const { myIonMetricSetMatchingFrenzyCorrectCount } = useMatchingFrenzyCorrectCount(); + + // connecives conqueror + const { myIonMetricSetConnectivesRevisionCorrectCount } = useConnectivesRevisionCorrectCount(); + + // + const { appendToListeningPracticeCorrectionList, setListeningPracticeCorrectionList } = useMyIonQuizContext(); + const router = useIonRouter(); + return ( + + +
debug page
+
+ {markdown} +
+
+ { + setListeningPracticeCorrectionList([ + { + test_s: 'test_s', + test_i: 1, + image: 'https://docs-demo.ionic.io/assets/madison.jpg', + sound: '/helloworld.mp3', + word: 'mouse', + word_c: 'T_鍵盤 00', + sample_e: 'T_I buy a keyboard to type 00', + sample_c: "T_我買了一個鍵盤來打字", + }, + { + test_s: 'test_s', + test_i: 1, + image: 'https://docs-demo.ionic.io/assets/madison.jpg', + sound: '/helloworld.mp3', + word: 'keyboard', + word_c: 'T_鍵盤 00', + sample_e: 'T_I buy a keyboard to type 00', + sample_c: "T_我買了一個鍵盤來打字", + }, + { + test_s: 'test_s', + test_i: 1, + image: 'https://docs-demo.ionic.io/assets/madison.jpg', + sound: '/helloworld.mp3', + word: 'monitor', + word_c: 'T_鍵盤 00', + sample_e: 'T_I buy a keyboard to type 00', + sample_c: "T_我買了一個鍵盤來打字", + }, + ]); + }} + > + appendToListeningPracticeCorrectionList() + +
+ { + router.push('/listening_practice/c/0'); + }} + > + go to correction + +
+ { + myIonMetricSetFullMarkCount(1001); + }} + > + set count (Genius) + +
+ +
+ { + myIonMetricSetAppUseTime(600); + }} + > + set count (hardworker) + +
+ +
+ { + myIonMetricSetListeningPracticeProgress(610); + }} + > + set count (attentive ears) + +
+ +
+ { + myIonMetricSetMatchingFrenzyCorrectCount(40); + }} + > + set count (matchmaking) + +
+ +
+ { + myIonMetricSetConnectivesRevisionCorrectCount(40); + }} + > + set count (connectives) + +
+
+
+ ); +}; + +export default DebugPage; diff --git a/002_source/ionic_mobile/src/pages/DebugPage/initUserConfig.tsx b/002_source/ionic_mobile/src/pages/DebugPage/initUserConfig.tsx new file mode 100644 index 0000000..4f11c27 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/initUserConfig.tsx @@ -0,0 +1,3 @@ +export function initUserConfig() { + return localStorage.setItem('user_config', JSON.stringify({ version: '0.1' })); +} diff --git a/002_source/ionic_mobile/src/pages/DebugPage/listAllUserConfig.tsx b/002_source/ionic_mobile/src/pages/DebugPage/listAllUserConfig.tsx new file mode 100644 index 0000000..0ab4edd --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/listAllUserConfig.tsx @@ -0,0 +1,4 @@ +export function listAllUserConfig(): { [key: string]: any } { + let current_config_string = localStorage.getItem('user_config') || '{}'; + return JSON.parse(current_config_string); +} diff --git a/002_source/ionic_mobile/src/pages/DebugPage/readUserConfig.tsx b/002_source/ionic_mobile/src/pages/DebugPage/readUserConfig.tsx new file mode 100644 index 0000000..63ad79c --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/readUserConfig.tsx @@ -0,0 +1,5 @@ +export function readUserConfig(key: string) { + let current_config_string = localStorage.getItem('user_config') || '{}'; + let current_config = JSON.parse(current_config_string); + return current_config[key]; +} diff --git a/002_source/ionic_mobile/src/pages/DebugPage/style.css b/002_source/ionic_mobile/src/pages/DebugPage/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/DebugPage/writeUserConfig.tsx b/002_source/ionic_mobile/src/pages/DebugPage/writeUserConfig.tsx new file mode 100644 index 0000000..4bd3d64 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/DebugPage/writeUserConfig.tsx @@ -0,0 +1,6 @@ +export function writeUserConfig(key: string, value: any) { + let current_config_string = localStorage.getItem('user_config') || '{}'; + let current_config = JSON.parse(current_config_string); + let updated_config = { ...current_config, [key]: value }; + return localStorage.setItem('user_config', JSON.stringify(updated_config)); +} diff --git a/002_source/ionic_mobile/src/pages/Favorite/Connectives/index.tsx b/002_source/ionic_mobile/src/pages/Favorite/Connectives/index.tsx new file mode 100644 index 0000000..2ee2cf1 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/Connectives/index.tsx @@ -0,0 +1,21 @@ +import { useIonRouter } from '@ionic/react'; +import { useEffect } from 'react'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; + +const FavoriteConnectivesPage: React.FC = () => { + let router = useIonRouter(); + let { myIonStoreLoadFavoriteConnectives } = useMyIonFavorite(); + + useEffect(() => { + (async () => { + let fav_list = await myIonStoreLoadFavoriteConnectives(); + let fav_link = fav_list.length > 0 ? fav_list[0] : ''; + router.push(fav_link); + })(); + }, []); + + return ; +}; + +export default FavoriteConnectivesPage; diff --git a/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/AudioControls.tsx b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/AudioControls.tsx new file mode 100644 index 0000000..759294a --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/AudioControls.tsx @@ -0,0 +1,23 @@ +import { FunctionComponent, useEffect } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import { useListeningPracticeTimeSpent } from '../../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; + +export const AudioControls: FunctionComponent<{ audio_src: string }> = ({ audio_src }) => { + const { play, pause, playing, duration } = useGlobalAudioPlayer(); + const { load, src: loadedSrc } = useGlobalAudioPlayer(); + let { myIonMetricIncListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + + useEffect(() => { + load(audio_src); + }, []); + + useEffect(() => { + if (loadedSrc) { + // TODO: delete this ? + // play(); + myIonMetricIncListeningPracticeTimeSpent(duration); + } + }, [loadedSrc]); + + return <>; +}; diff --git a/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/index.tsx b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/index.tsx new file mode 100644 index 0000000..d65e356 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/index.tsx @@ -0,0 +1,369 @@ +import { IonButton, IonButtons, IonContent, IonIcon, IonModal, IonPage, IonToolbar, useIonRouter } from '@ionic/react'; +import './style.css'; +import { + arrowBackCircleOutline, + chevronBack, + chevronForward, + closeOutline, + heart, + heartOutline, + play, + volumeHighOutline, +} from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import Markdown from 'react-markdown'; +import { useParams } from 'react-router'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import remarkGfm from 'remark-gfm'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import RemoveFavoritePrompt from '../../../components/RemoveFavoritePrompt'; +import { RECORD_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +// +import { useMyIonStore } from '../../../contexts/MyIonStore'; +import ILesson from '../../../interfaces/ILesson'; +import ILessonCategory from '../../../interfaces/ILessonCategory'; +import IWordCard from '../../../interfaces/IWordCard'; +import { getFavLessonConnectivesLink } from '../getFavLessonConnectivesLink'; + +// import { StoreContext, useMyIonStore } from '../../contexts/store'; +// + +const ConnectivesWordPage: React.FC = () => { + const [loading, setLoading] = useState(true); + const router = useIonRouter(); + let [fav_cursor, setFavCursor] = useState(0); + const [open_remove_modal, setOpenRemoveModal] = useState(false); + + const modal = useRef(null); + const { lesson_idx, cat_idx, word_idx } = useParams<{ lesson_idx: string; cat_idx: string; word_idx: string }>(); + + const [lesson_info, setLessonInfo] = useState(undefined); + const [cat_info, setCatInfo] = useState(undefined); + const [word_info, setWordInfo] = useState(undefined); + + const { play: play_word, playing } = useGlobalAudioPlayer(); + const { + myIonStoreAddFavoriteConnectives, + myIonStoreRemoveFavoriteConnectives, + myIonStoreFindInFavoriteConnectives, + myIonStoreLoadFavoriteConnectives, + } = useMyIonFavorite(); + + let [favorite_address, setFavoriteAddress] = useState(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + + function dismiss() { + setOpenRemoveModal(false); + } + const [isOpen, setIsOpen] = useState(false); + // const { setShowRemoceFavPrompt } = useAppStateContext(); + + let { lesson_contents } = useMyIonStore(); + + useEffect(() => { + // NOTES: lesson_content == [] during loading + if (lesson_contents.length > 0) { + let lesson_content: ILesson = lesson_contents[parseInt(lesson_idx)]; + let category_content: ILessonCategory = lesson_content.content[parseInt(cat_idx)]; + let word_content: IWordCard = category_content.content[parseInt(word_idx)]; + + setLessonInfo(lesson_content); + setCatInfo(category_content); + setWordInfo(word_content); + + setLoading(false); + } + }, [lesson_contents, cat_idx, word_idx]); + + let [in_fav, setInFav] = useState(false); + const isInFavorite = async (string_to_search: string) => { + let result = await myIonStoreFindInFavoriteConnectives(string_to_search); + setInFav(result); + }; + + const addToFavorite = async (string_to_add: string) => { + await myIonStoreAddFavoriteConnectives(string_to_add); + await isInFavorite(string_to_add); + }; + + function handleUserRemoveFavorite() { + setOpenRemoveModal(true); + } + + const { setDisableUserTap } = useAppStateContext(); + + const removeFromFavorite = async (string_to_remove: string) => { + let list_before_remove = await myIonStoreLoadFavoriteConnectives(); + + await myIonStoreRemoveFavoriteConnectives(string_to_remove); + + let temp_list = await myIonStoreLoadFavoriteConnectives(); + setFavList(temp_list); + + const deleteFirstElement = () => fav_cursor == 0; + const deleteLastElement = () => fav_cursor == list_before_remove.length - 1; + const lastElementNewList = temp_list[temp_list.length - 1]; + const firstElementNewList = temp_list[0]; + const samePosElementNewList = temp_list[fav_cursor]; + + if (deleteFirstElement()) { + if (!firstElementNewList) { + setDisableUserTap(true); + setTimeout(() => { + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${firstElementNewList}`, undefined, 'replace'); + } + } else if (deleteLastElement()) { + if (!lastElementNewList) { + setDisableUserTap(true); + setTimeout(() => { + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${lastElementNewList}`, undefined, 'replace'); + } + } else { + if (!samePosElementNewList) { + setDisableUserTap(true); + setTimeout(() => { + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${samePosElementNewList}`, undefined, 'replace'); + } + } + + await isInFavorite(string_to_remove); + }; + + let [fav_list, setFavList] = useState([]); + + const locateInFavCursor = (string_to_search: string) => setFavCursor(fav_list.indexOf(string_to_search) ?? 0); + + useEffect(() => { + if (JSON.stringify(fav_list) === '[]') return; + let temp = getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx); + if (fav_list.length === 0) { + } else { + locateInFavCursor(temp); + } + }, [fav_list]); + + async function handleNextClick() { + let next_fav_link = fav_cursor < fav_list.length - 1 ? fav_list[fav_cursor + 1] : fav_list[fav_cursor]; + + let temp_fav_list = await myIonStoreLoadFavoriteConnectives(); + setFavList(temp_fav_list); + + router.push(next_fav_link, undefined, 'replace'); + } + + async function handlePrevClick() { + let prev_fav_link = fav_cursor > 0 ? fav_list[fav_cursor - 1] : fav_list[fav_cursor]; + + let temp_fav_list = await myIonStoreLoadFavoriteConnectives(); + setFavList(temp_fav_list); + + router.push(prev_fav_link, undefined, 'replace'); + } + + useEffect(() => { + let temp_fav_address = getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx); + setFavoriteAddress(temp_fav_address); + isInFavorite(temp_fav_address); + }, [lesson_idx, cat_idx, word_idx]); + + useEffect(() => { + (async () => { + let temp_fav_list = await myIonStoreLoadFavoriteConnectives(); + setFavList(temp_fav_list); + })(); + }, []); + + // if (loading) return <>loading; + // if (!word_info) return <>loading; + if (!cat_info || !word_info) return ; + + return ( + <> + + +
+ router.push(RECORD_LINK)}> + + +
+
+
+
+ Part {fav_cursor + 1}/{fav_list.length} +
+
+ {/* */} +
+
+
+ {/* */} +
+ { + in_fav ? handleUserRemoveFavorite() : addToFavorite(favorite_address); + }} + > + + +
+ {/* */} +
+
+ + + +
+
+ {word_info.word} + {word_info.word_c} +
+
+ = fav_list.length - 1 ? 'medium' : 'dark'} + disabled={fav_cursor >= fav_list.length - 1} + onClick={handleNextClick} + > + + +
+
+ {/* */} +
+
+
+ play_word()}> + + +
+ {word_info.sample_e} +
+ +
+ {word_info.sample_c} +
+
+ {/* */} +
+
+
+ {/* */} + + + + + + dismiss()} shape="round" fill="clear"> + + + + +
+
+
Are you sure to remove favorite ?
+ +
+
+ dismiss()} fill="outline"> + Cancel + +
+
+ { + removeFromFavorite(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + setIsOpen(true); + dismiss(); + }} + fill="solid" + color="danger" + > + Remove + +
+
+
+
+
+
+ + {/* */} + + + ); +}; + +export default ConnectivesWordPage; diff --git a/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/style.css b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/style.css new file mode 100644 index 0000000..4e899e8 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/ConnectivesWordPage/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#example-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#example-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#example-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/Card.tsx b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/Card.tsx new file mode 100644 index 0000000..798269f --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/Card.tsx @@ -0,0 +1,58 @@ +import { IonButton } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +import { useMyIonStore } from '../../../contexts/MyIonStore'; +import { listLessonCategories } from '../../../public_data/listLessonCategories'; + +interface ICardProps { + current_vocab: any; + current_fav_idx: number; + nextFavVocab: () => void; + prevFavVocab: () => void; +} + +const Card: React.FC = ({ current_vocab, current_fav_idx, nextFavVocab, prevFavVocab }) => { + let [loading, setLoading] = useState(true); + let { lesson_contents: lesson_content, setLessonContent } = useMyIonStore(); + let [active_lesson_idx, setActiveLessonIdx] = useState(0); + let [selected_content, setSelectedContent] = useState([]); + + useEffect(() => { + listLessonCategories().then((cats: any) => { + console.log({ cats }); + setLessonContent(cats); + setActiveLessonIdx(0); + setLoading(false); + }); + }, []); + + useEffect(() => { + if (loading) return; + console.log('active_category changed', active_lesson_idx); + let selected_category = lesson_content[active_lesson_idx]; + setSelectedContent(selected_category['content']); + }, [active_lesson_idx, loading]); + + let { myIonStoreLoadFavoriteVocabulary } = useMyIonFavorite(); + + let [fav_list, setFavList] = useState(undefined); + useEffect(() => { + (async () => { + let temp = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp); + })(); + }, []); + + if (loading) return ; + + return ( +
+ {current_fav_idx} + Prev + Next +
+ ); +}; + +export default Card; diff --git a/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/ListEmpty.tsx b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/ListEmpty.tsx new file mode 100644 index 0000000..18587f1 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/ListEmpty.tsx @@ -0,0 +1,78 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +import { useMyIonStore } from '../../../contexts/MyIonStore'; +import { listLessonCategories } from '../../../public_data/listLessonCategories'; +const ListEmpty: React.FC = () => { + let [loading, setLoading] = useState(true); + let { lesson_contents: lesson_content, setLessonContent } = useMyIonStore(); + let [active_lesson_idx, setActiveLessonIdx] = useState(0); + let [selected_content, setSelectedContent] = useState([]); + + useEffect(() => { + listLessonCategories().then((cats: any) => { + console.log({ cats }); + setLessonContent(cats); + setActiveLessonIdx(0); + setLoading(false); + }); + }, []); + + useEffect(() => { + if (loading) return; + console.log('active_category changed', active_lesson_idx); + let selected_category = lesson_content[active_lesson_idx]; + setSelectedContent(selected_category['content']); + }, [active_lesson_idx, loading]); + + let { myIonStoreLoadFavoriteVocabulary } = useMyIonFavorite(); + + let [fav_list_len, setFavListLen] = useState(0); + let [fav_list, setFavList] = useState([]); + + const [current_vocab, setCurrentVocab] = useState({}); + const [current_fav_idx, setCurrentFavIdx] = useState(0); + function nextFavVocab() { + setCurrentFavIdx(Math.min(current_fav_idx + 1, fav_list_len - 1)); + } + function prevFavVocab() { + setCurrentFavIdx(Math.max(current_fav_idx - 1, 0)); + } + + useEffect(() => { + if (!fav_list) return; + setCurrentVocab(fav_list[current_fav_idx]); + }, [current_fav_idx]); + + useEffect(() => { + setFavListLen(fav_list.length); + }, [fav_list]); + + useEffect(() => { + (async () => { + let temp = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp); + })(); + }, []); + + if (loading) return ; + if (!fav_list || fav_list.length === 0) return ; + + return ( + + + + +
{'Favorite Vocabulary'}
+
+
+
+ +
list is empty
+
+
+ ); +}; + +export default ListEmpty; diff --git a/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/index.tsx b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/index.tsx new file mode 100644 index 0000000..2a7b51d --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/Vocabulary/index.tsx @@ -0,0 +1,21 @@ +import { useIonRouter } from '@ionic/react'; +import { useEffect } from 'react'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; + +const FavVocabularyPage: React.FC = () => { + let router = useIonRouter(); + let { myIonStoreLoadFavoriteVocabulary } = useMyIonFavorite(); + + useEffect(() => { + (async () => { + let fav_list = await myIonStoreLoadFavoriteVocabulary(); + let fav_link = fav_list.length > 0 ? fav_list[0] : ''; + router.push(fav_link); + })(); + }, []); + + return ; +}; + +export default FavVocabularyPage; diff --git a/002_source/ionic_mobile/src/pages/Favorite/WordPage/AudioControls.tsx b/002_source/ionic_mobile/src/pages/Favorite/WordPage/AudioControls.tsx new file mode 100644 index 0000000..8fe3e79 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/WordPage/AudioControls.tsx @@ -0,0 +1,28 @@ +import { FunctionComponent, useEffect } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import { useListeningPracticeTimeSpent } from '../../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; + +export const AudioControls: FunctionComponent<{ audio_src: string }> = ({ audio_src }) => { + const { play, pause, playing, duration } = useGlobalAudioPlayer(); + const { load, src: loadedSrc } = useGlobalAudioPlayer(); + let { myIonMetricIncListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + + useEffect(() => { + if (audio_src) { + load(audio_src); + } + }, [audio_src]); + + useEffect(() => { + if (loadedSrc) { + } + }, [loadedSrc]); + + useEffect(() => { + if (playing) { + myIonMetricIncListeningPracticeTimeSpent(duration); + } + }, [playing]); + + return <>; +}; diff --git a/002_source/ionic_mobile/src/pages/Favorite/WordPage/index.tsx b/002_source/ionic_mobile/src/pages/Favorite/WordPage/index.tsx new file mode 100644 index 0000000..3957d77 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/WordPage/index.tsx @@ -0,0 +1,369 @@ +import { IonButton, IonButtons, IonContent, IonIcon, IonModal, IonPage, IonToolbar, useIonRouter } from '@ionic/react'; +import './style.css'; +import { + arrowBackCircleOutline, + chevronBack, + chevronForward, + closeOutline, + heart, + heartOutline, + play, + volumeHighOutline, +} from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import Markdown from 'react-markdown'; +import { useParams } from 'react-router'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import remarkGfm from 'remark-gfm'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import RemoveFavoritePrompt from '../../../components/RemoveFavoritePrompt'; +import { RECORD_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +// +import { useMyIonStore } from '../../../contexts/MyIonStore'; +import ILesson from '../../../interfaces/ILesson'; +import ILessonCategory from '../../../interfaces/ILessonCategory'; +import IWordCard from '../../../interfaces/IWordCard'; +import { getFavLessonVocabularyLink } from '../../Lesson/getLessonWordLink'; +import { AudioControls } from './AudioControls'; + +const FavoriteVocabularyPage: React.FC = () => { + const [loading, setLoading] = useState(true); + + const router = useIonRouter(); + + let [fav_cursor, setFavCursor] = useState(0); + const [open_remove_modal, setOpenRemoveModal] = useState(false); + + const modal = useRef(null); + const { lesson_idx, cat_idx, word_idx } = useParams<{ lesson_idx: string; cat_idx: string; word_idx: string }>(); + + const [lesson_info, setLessonInfo] = useState(undefined); + const [cat_info, setCatInfo] = useState(undefined); + const [word_info, setWordInfo] = useState(undefined); + + const { play: play_word, playing } = useGlobalAudioPlayer(); + const { + myIonStoreAddFavoriteVocabulary, + myIonStoreRemoveFavoriteVocabulary, + myIonStoreFindInFavoriteVocabulary, + myIonStoreLoadFavoriteVocabulary, + } = useMyIonFavorite(); + + let [favorite_address, setFavoriteAddress] = useState(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + const { setDisableUserTap } = useAppStateContext(); + + function dismiss() { + setOpenRemoveModal(false); + } + const [isOpen, setIsOpen] = useState(false); + + let { lesson_contents } = useMyIonStore(); + + useEffect(() => { + // NOTES: lesson_content == [] during loading + if (lesson_contents.length > 0) { + let lesson_content: ILesson = lesson_contents[parseInt(lesson_idx)]; + let category_content: ILessonCategory = lesson_content.content[parseInt(cat_idx)]; + let word_content: IWordCard = category_content.content[parseInt(word_idx)]; + + setLessonInfo(lesson_content); + setCatInfo(category_content); + setWordInfo(word_content); + + setLoading(false); + } + }, [lesson_contents, cat_idx, word_idx]); + + let [in_fav, setInFav] = useState(false); + const isInFavorite = async (string_to_search: string) => { + let result = await myIonStoreFindInFavoriteVocabulary(string_to_search); + setInFav(result); + }; + + const addToFavorite = async (string_to_add: string) => { + await myIonStoreAddFavoriteVocabulary(string_to_add); + await isInFavorite(string_to_add); + }; + + function handleUserRemoveFavorite() { + setOpenRemoveModal(true); + } + + const removeFromFavorite = async (string_to_remove: string) => { + let list_before_remove = await myIonStoreLoadFavoriteVocabulary(); + + await myIonStoreRemoveFavoriteVocabulary(string_to_remove); + + let temp_list = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp_list); + + const deleteFirstElement = () => fav_cursor == 0; + const deleteLastElement = () => fav_cursor == list_before_remove.length - 1; + const lastElementNewList = temp_list[temp_list.length - 1]; + const firstElementNewList = temp_list[0]; + const samePosElementNewList = temp_list[fav_cursor]; + + if (deleteFirstElement()) { + if (!firstElementNewList) { + setTimeout(() => { + setDisableUserTap(true); + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${firstElementNewList}`, undefined, 'replace'); + } + } else if (deleteLastElement()) { + if (!lastElementNewList) { + setTimeout(() => { + setDisableUserTap(true); + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${lastElementNewList}`, undefined, 'replace'); + } + } else { + if (!samePosElementNewList) { + setDisableUserTap(true); + setTimeout(() => { + router.push(RECORD_LINK, undefined, 'replace'); + }, 1000); + } else { + router.push(`${samePosElementNewList}`, undefined, 'replace'); + } + } + + await isInFavorite(string_to_remove); + }; + + let [fav_list, setFavList] = useState([]); + + const locateInFavCursor = (string_to_search: string) => { + console.log({ t: fav_list.indexOf(string_to_search) ?? 0, t1: string_to_search }); + setFavCursor(fav_list.indexOf(string_to_search) ?? 0); + }; + + useEffect(() => { + if (JSON.stringify(fav_list) === '[]') return; + let temp = getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx); + if (fav_list.length === 0) { + } else { + locateInFavCursor(temp); + } + }, [fav_list]); + + async function handleNextClick() { + let next_fav_link = fav_cursor < fav_list.length - 1 ? fav_list[fav_cursor + 1] : fav_list[fav_cursor]; + + let temp_fav_list = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp_fav_list); + + router.push(next_fav_link, undefined, 'replace'); + } + + async function handlePrevClick() { + let prev_fav_link = fav_cursor > 0 ? fav_list[fav_cursor - 1] : fav_list[fav_cursor]; + + let temp_fav_list = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp_fav_list); + + router.push(prev_fav_link, undefined, 'replace'); + } + + useEffect(() => { + let temp_fav_address = getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx); + setFavoriteAddress(temp_fav_address); + isInFavorite(temp_fav_address); + }, [lesson_idx, cat_idx, word_idx]); + + useEffect(() => { + (async () => { + let temp_fav_list = await myIonStoreLoadFavoriteVocabulary(); + setFavList(temp_fav_list); + })(); + }, []); + + // if (loading) return <>loading; + // if (!word_info) return <>loading; + if (!cat_info || !word_info) return ; + + return ( + <> + + +
+ router.push(RECORD_LINK)}> + + +
+
+
{cat_info.cat_name}
+
+
+ {/* */} +
+
+ + + +
+
+
+ + + +
+
+ +
+
+ {fav_cursor + 1} +
+
+ +
+
+
+ + (playing ? null : play_word())} + > + + +
+
{word_info.word}
+
+ { + in_fav ? handleUserRemoveFavorite() : addToFavorite(favorite_address); + }} + > + + +
+
+ +
+
{word_info.word_c}
+
+
+ +
+ {word_info.sample_e} + {word_info.sample_c} +
+
+
+
+ {/* */} + + + + + + dismiss()} shape="round" fill="clear"> + + + + +
+
+
Are you sure to remove favorite ?
+ +
+
+ dismiss()} fill="outline"> + {'Cancel'} + +
+
+ { + removeFromFavorite(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + setIsOpen(true); + dismiss(); + }} + fill="solid" + color="danger" + > + {'Remove'} + +
+
+
+
+
+
+ + {/* */} + + + ); +}; + +export default FavoriteVocabularyPage; diff --git a/002_source/ionic_mobile/src/pages/Favorite/WordPage/style.css b/002_source/ionic_mobile/src/pages/Favorite/WordPage/style.css new file mode 100644 index 0000000..4e899e8 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/WordPage/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#example-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#example-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#example-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/pages/Favorite/getFavLessonConnectivesLink.tsx b/002_source/ionic_mobile/src/pages/Favorite/getFavLessonConnectivesLink.tsx new file mode 100644 index 0000000..a90dfb7 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/getFavLessonConnectivesLink.tsx @@ -0,0 +1,10 @@ +export function getFavLessonConnectivesLink( + i_active_lesson_idx: string, + i_cat_idx: string, + i_word_idx: string, +): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `/fav/c/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} diff --git a/002_source/ionic_mobile/src/pages/Favorite/getLessonConnectivesLink.tsx b/002_source/ionic_mobile/src/pages/Favorite/getLessonConnectivesLink.tsx new file mode 100644 index 0000000..ccf04ff --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Favorite/getLessonConnectivesLink.tsx @@ -0,0 +1,6 @@ +export function getLessonConnectivesLink(i_active_lesson_idx: string, i_cat_idx: string, i_word_idx: string): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `/lesson_word_page/c/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} diff --git a/002_source/ionic_mobile/src/pages/Lesson/ConnectivesContainer.tsx b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesContainer.tsx new file mode 100644 index 0000000..87ca0c4 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesContainer.tsx @@ -0,0 +1,75 @@ +import { IonButton, useIonRouter } from '@ionic/react'; +import './Lesson.css'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { useMyIonStore } from '../../contexts/MyIonStore'; +import { listLessonCategories } from '../../public_data/listLessonCategories'; +import { getLessonVocabularyLink } from './getLessonWordLink'; + +const ConnectivesContainer: React.FC = () => { + const router = useIonRouter(); + const [loading, setLoading] = useState(true); + const { lesson_contents, setLessonContent } = useMyIonStore(); + const [active_lesson_idx, setActiveLessonIdx] = useState(0); + const [selected_content, setSelectedContent] = useState([]); + + useEffect(() => { + listLessonCategories().then((cats: any) => { + console.log({ cats }); + setLessonContent(cats); + setActiveLessonIdx(0); + setLoading(false); + }); + }, []); + + useEffect(() => { + if (loading) return; + + let selected_category = lesson_contents[active_lesson_idx]; + setSelectedContent(selected_category['content']); + }, [active_lesson_idx, loading]); + + if (loading) return ; + + return ( + <> +
Connectives ?
+
+ {selected_content.map((content: any, cat_idx: number) => ( + <> + { + router.push( + getLessonVocabularyLink(active_lesson_idx.toString(), cat_idx.toString(), '0'), + undefined, + 'replace', + ); + }} + > +
+
+ {content.cat_name} +
+
+ + ))} +
+ {/* */} + + ); +}; + +export default ConnectivesContainer; diff --git a/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/index.tsx b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/index.tsx new file mode 100644 index 0000000..5878dda --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/index.tsx @@ -0,0 +1,319 @@ +import { IonButton, IonButtons, IonContent, IonIcon, IonModal, IonPage, IonToolbar, useIonRouter } from '@ionic/react'; +import './style.css'; +import { + arrowBackCircleOutline, + chevronBack, + chevronForward, + closeOutline, + heart, + heartOutline, + playOutline, + volumeHighOutline, +} from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +// +import Markdown from 'react-markdown'; +import { useParams } from 'react-router'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import remarkGfm from 'remark-gfm'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import RemoveFavoritePrompt from '../../../components/RemoveFavoritePrompt'; +import { LESSON_LINK } from '../../../constants'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +import ILesson from '../../../interfaces/ILesson'; +import { listLessonContent } from '../../../public_data/listLessonContent'; +// import { listLessonContent } from '../../../public_data/index.ts.del'; +import { AudioControls } from '../../LessonWord/AudioControls'; +import { getFavLessonConnectivesLink, getLessonConnectivesLink } from '../getLessonConnectivesLink'; + +const ConnectivesPage: React.FC = () => { + let [loading, setLoading] = useState(true); + let [all_words_length, setAllWordsLength] = useState(0); + let [show_word, setShowWord] = useState({ word: '', word_c: '', sample_e: '', sample_c: '', sound: '' }); + let [cat_name, setCatName] = useState(''); + let [fav_active, setFavActive] = useState(false); + let { playing, play: sound_play } = useGlobalAudioPlayer(); + + const router = useIonRouter(); + + const [lesson_info, setLessonInfo] = useState(undefined); + + let { lesson_idx, cat_idx, word_idx } = useParams<{ lesson_idx: string; cat_idx: string; word_idx: string }>(); + let i_lesson_idx = parseInt(lesson_idx); + let i_cat_idx = parseInt(cat_idx); + let i_word_idx = parseInt(word_idx); + const [isOpen, setIsOpen] = useState(false); + + const [open_remove_modal, setOpenRemoveModal] = useState(false); + const modal = useRef(null); + + // const lesson_vocab_address = `/lesson_word_page/v/${lesson_idx}/${cat_idx}/${word_idx}`; + let [favorite_address, setFavoriteAddress] = useState(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + + function dismiss() { + setOpenRemoveModal(false); + } + + function handleUserClickPrev() { + if (i_word_idx > 0) { + router.push(getLessonConnectivesLink(lesson_idx, cat_idx, (i_word_idx - 1).toString())); + } + } + + function handleUserClickNext() { + if (i_word_idx < all_words_length - 1) { + router.push(getLessonConnectivesLink(lesson_idx, cat_idx, (i_word_idx + 1).toString())); + } + } + + const { myIonStoreAddFavoriteConnectives, myIonStoreRemoveFavoriteConnectives, myIonStoreFindInFavoriteConnectives } = + useMyIonFavorite(); + + let [in_fav, setInFav] = useState(false); + const isInFavorite = async (string_to_search: string) => { + let result = await myIonStoreFindInFavoriteConnectives(string_to_search); + + setInFav(result); + }; + + const addToFavorite = async (string_to_add: string) => { + await myIonStoreAddFavoriteConnectives(string_to_add); + await isInFavorite(string_to_add); + }; + + const removeFromFavorite = async (string_to_remove: string) => { + await myIonStoreRemoveFavoriteConnectives(string_to_remove); + await isInFavorite(string_to_remove); + }; + + function handleUserRemoveFavorite() { + setOpenRemoveModal(true); + } + + useEffect(() => { + (async () => { + let lesson_content = await listLessonContent(); + let word_cat = lesson_content[i_lesson_idx].content[i_cat_idx]; + setCatName(word_cat['cat_name']); + let all_words = lesson_content[i_lesson_idx].content[i_cat_idx].content; + setAllWordsLength(all_words.length); + let show_word = lesson_content[i_lesson_idx].content[i_cat_idx].content[i_word_idx]; + setShowWord(show_word); + + console.log({ t: lesson_content[i_lesson_idx].content[i_cat_idx].content[i_word_idx] }); + + setFavoriteAddress(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + + isInFavorite(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + // console.log({ in_fav, favorite_address }); + + setLessonInfo(lesson_content[i_lesson_idx]); + + setLoading(false); + })(); + }, [i_lesson_idx, i_cat_idx, i_word_idx]); + + if (lesson_info === undefined) return ; + + if (loading) return ; + + return ( + <> + + +
+ router.push(`${LESSON_LINK}/a/${lesson_info.name}`)} + > + + +
+
+
+
+ Part {i_word_idx + 1}/{all_words_length} +
+
+ {/* */} +
+
+
+
+ { + in_fav ? handleUserRemoveFavorite() : addToFavorite(favorite_address); + }} + > + + +
+ +
+
+ + + +
+ {/* */} +
+
+
+
+ {/* */} +
+ = all_words_length} + > + + +
+
+ {/* */} +
+
+
+ sound_play()}> + + +
+ {/*
*/} +
+ {show_word.sample_e} +
+
+ +
+
+ {show_word.sample_c} +
+
+
+
+
+
+ {/* */} + + + + + + dismiss()} shape="round" fill="clear"> + + + + +
+
+
Are you sure to remove favorite ?
+ +
+
+ dismiss()} fill="outline"> + Cancel + +
+
+ { + removeFromFavorite(getFavLessonConnectivesLink(lesson_idx, cat_idx, word_idx)); + setIsOpen(true); + dismiss(); + }} + fill="solid" + color="danger" + > + Remove + +
+
+
+
+
+
+ + {/* */} + + + {/* */} + + + ); +}; + +export default ConnectivesPage; diff --git a/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/style.css b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/style.css new file mode 100644 index 0000000..81d40c0 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/ConnectivesPage/style.css @@ -0,0 +1,3 @@ +.bold { + font-weight: bold; +} diff --git a/002_source/ionic_mobile/src/pages/Lesson/EndOfList.tsx b/002_source/ionic_mobile/src/pages/Lesson/EndOfList.tsx new file mode 100644 index 0000000..575bb20 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/EndOfList.tsx @@ -0,0 +1,9 @@ +function EndOfList() { + return ( +
+

end of list

+
+ ); +} + +export default EndOfList; diff --git a/002_source/ionic_mobile/src/pages/Lesson/Lesson.css b/002_source/ionic_mobile/src/pages/Lesson/Lesson.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Lesson/LessonContainer.tsx b/002_source/ionic_mobile/src/pages/Lesson/LessonContainer.tsx new file mode 100644 index 0000000..21ddcbc --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/LessonContainer.tsx @@ -0,0 +1,82 @@ +import { IonButton, useIonRouter } from '@ionic/react'; +import './Lesson.css'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { COLOR_TEXT } from '../../constants'; +import { useMyIonStore } from '../../contexts/MyIonStore'; +import { listLessonCategories } from '../../public_data/listLessonCategories'; +import { getLessonConnectivesLink } from './getLessonConnectivesLink'; +import { getLessonVocabularyLink } from './getLessonWordLink'; + +let lessonLinkProxy = [getLessonVocabularyLink, getLessonConnectivesLink]; + +interface ContainerProps { + test_active_lesson_idx: number; +} + +const LessonContainer: React.FC = ({ test_active_lesson_idx = 1 }) => { + const router = useIonRouter(); + const [loading, setLoading] = useState(true); + const { lesson_contents, setLessonContent } = useMyIonStore(); + const [active_lesson_idx, setActiveLessonIdx] = useState(0); + const [selected_content, setSelectedContent] = useState([]); + + useEffect(() => { + listLessonCategories().then((cats: any) => { + console.log({ cats }); + setLessonContent(cats); + setActiveLessonIdx(test_active_lesson_idx); + setLoading(false); + }); + }, []); + + useEffect(() => { + if (loading) return; + console.log('active_category changed', active_lesson_idx); + let selected_category = lesson_contents[test_active_lesson_idx]; + setSelectedContent(selected_category['content']); + }, [active_lesson_idx, loading, test_active_lesson_idx]); + + if (loading) return ; + + return ( + <> +
+ {selected_content.map((content: any, cat_idx: number) => ( + { + router.push( + lessonLinkProxy[test_active_lesson_idx](test_active_lesson_idx.toString(), cat_idx.toString(), '0'), + undefined, + 'replace', + ); + }} + > +
+
+ {content.cat_name} +
+
+ ))} +
+ {/* */} + + ); +}; + +export default LessonContainer; diff --git a/002_source/ionic_mobile/src/pages/Lesson/WordPage/AudioControls.tsx b/002_source/ionic_mobile/src/pages/Lesson/WordPage/AudioControls.tsx new file mode 100644 index 0000000..8fe3e79 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/WordPage/AudioControls.tsx @@ -0,0 +1,28 @@ +import { FunctionComponent, useEffect } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import { useListeningPracticeTimeSpent } from '../../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; + +export const AudioControls: FunctionComponent<{ audio_src: string }> = ({ audio_src }) => { + const { play, pause, playing, duration } = useGlobalAudioPlayer(); + const { load, src: loadedSrc } = useGlobalAudioPlayer(); + let { myIonMetricIncListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + + useEffect(() => { + if (audio_src) { + load(audio_src); + } + }, [audio_src]); + + useEffect(() => { + if (loadedSrc) { + } + }, [loadedSrc]); + + useEffect(() => { + if (playing) { + myIonMetricIncListeningPracticeTimeSpent(duration); + } + }, [playing]); + + return <>; +}; diff --git a/002_source/ionic_mobile/src/pages/Lesson/WordPage/index.tsx b/002_source/ionic_mobile/src/pages/Lesson/WordPage/index.tsx new file mode 100644 index 0000000..21a3552 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/WordPage/index.tsx @@ -0,0 +1,326 @@ +import { IonButton, IonButtons, IonContent, IonIcon, IonModal, IonPage, IonToolbar, useIonRouter } from '@ionic/react'; +import './style.css'; +import { + arrowBackCircleOutline, + chevronBack, + chevronForward, + close, + heart, + heartOutline, + play, + volumeHighOutline, +} from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +// import { StoreContext, useMyIonStore } from '../../contexts/store'; +// +import Markdown from 'react-markdown'; +import { useParams } from 'react-router'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import remarkGfm from 'remark-gfm'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import RemoveFavoritePrompt from '../../../components/RemoveFavoritePrompt'; +import { LESSON_LINK } from '../../../constants'; +import { useMyIonFavorite } from '../../../contexts/MyIonFavorite'; +// +import { useMyIonStore } from '../../../contexts/MyIonStore'; +import ILesson from '../../../interfaces/ILesson'; +import ILessonCategory from '../../../interfaces/ILessonCategory'; +import IWordCard from '../../../interfaces/IWordCard'; +import { getFavLessonVocabularyLink, getLessonVocabularyLink } from '../../Lesson/getLessonWordLink'; +import { AudioControls } from './AudioControls'; + +// + +const LessonWordPage: React.FC = () => { + const router = useIonRouter(); + const [loading, setLoading] = useState(true); + const [open_remove_modal, setOpenRemoveModal] = useState(false); + + const modal = useRef(null); + const { lesson_idx, cat_idx, word_idx } = useParams<{ lesson_idx: string; cat_idx: string; word_idx: string }>(); + + const [lesson_info, setLessonInfo] = useState(undefined); + const [cat_info, setCatInfo] = useState(undefined); + const [word_info, setWordInfo] = useState(undefined); + + const { play: play_word, playing } = useGlobalAudioPlayer(); + const { myIonStoreAddFavoriteVocabulary, myIonStoreRemoveFavoriteVocabulary, myIonStoreFindInFavoriteVocabulary } = + useMyIonFavorite(); + // + // const lesson_vocab_address = `/lesson_word_page/v/${lesson_idx}/${cat_idx}/${word_idx}`; + let [favorite_address, setFavoriteAddress] = useState(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + useEffect(() => { + setFavoriteAddress(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + + if (lesson_contents.length > 0) { + let lesson_content: ILesson = lesson_contents[parseInt(lesson_idx)]; + let category_content: ILessonCategory = lesson_content.content[parseInt(cat_idx)]; + let word_content: IWordCard = category_content.content[parseInt(word_idx)]; + setWordInfo(word_content); + } + }, [lesson_idx, cat_idx, word_idx]); + // + + function dismiss() { + setOpenRemoveModal(false); + } + const [isOpen, setIsOpen] = useState(false); + + let { lesson_contents } = useMyIonStore(); + + useEffect(() => { + // NOTES: lesson_content == [] during loading + if (lesson_contents.length > 0) { + let lesson_content: ILesson = lesson_contents[parseInt(lesson_idx)]; + let category_content: ILessonCategory = lesson_content.content[parseInt(cat_idx)]; + let word_content: IWordCard = category_content.content[parseInt(word_idx)]; + + setLessonInfo(lesson_content); + setCatInfo(category_content); + setWordInfo(word_content); + + setLoading(false); + } + }, [lesson_contents]); + + let [in_fav, setInFav] = useState(false); + const isInFavorite = async (string_to_search: string) => { + let result = await myIonStoreFindInFavoriteVocabulary(string_to_search); + setInFav(result); + }; + + const addToFavorite = async (string_to_add: string) => { + await myIonStoreAddFavoriteVocabulary(string_to_add); + + await isInFavorite(string_to_add); + setInFav(!in_fav); + }; + + function handleUserRemoveFavorite() { + setOpenRemoveModal(true); + } + + const removeFromFavorite = async (string_to_remove: string) => { + await myIonStoreRemoveFavoriteVocabulary(string_to_remove); + await isInFavorite(string_to_remove); + }; + + useEffect(() => { + (async () => { + await isInFavorite(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + })(); + }, [lesson_idx, cat_idx, word_idx]); + + // if (loading) return <>loading; + // if (!word_info) return <>loading; + + if (lesson_info == undefined) return ; + + if (!cat_info || !word_info) return ; + + return ( + <> + + +
+ { + router.push(`${LESSON_LINK}/a/${lesson_info.name}`); + }} + > + + +
+
+
{cat_info.cat_name}
+
+
+ {/* */} +
+
+ { + router.push( + getLessonVocabularyLink(lesson_idx, cat_idx, Math.max(0, parseInt(word_idx) - 1).toString()), + ); + }} + > + + +
+
+
+ { + router.push( + getLessonVocabularyLink( + lesson_idx, + cat_idx, + Math.min(cat_info.content.length - 1, parseInt(word_idx) + 1).toString(), + ), + ); + }} + > + + +
+
+ +
+
+ {parseInt(word_idx) + 1} +
+
+ +
+
+
+ + (playing ? null : play_word())} + > + + +
+
{word_info.word}
+
+ { + in_fav ? handleUserRemoveFavorite() : addToFavorite(favorite_address); + }} + > + + +
+
+ +
+
{word_info.word_c}
+
+
+ +
+ {word_info.sample_e} + {word_info.sample_c} +
+
+
+
+ {/* */} + + + + + + dismiss()} shape="round" fill="clear"> + + + + +
+
+
Are you sure to remove favorite ?
+ +
+
+ dismiss()} fill="outline"> + Cancel + +
+
+ { + removeFromFavorite(getFavLessonVocabularyLink(lesson_idx, cat_idx, word_idx)); + setIsOpen(true); + dismiss(); + }} + fill="solid" + color="danger" + > + Remove + +
+
+
+
+
+
+ + + + ); +}; + +export default LessonWordPage; diff --git a/002_source/ionic_mobile/src/pages/Lesson/WordPage/style.css b/002_source/ionic_mobile/src/pages/Lesson/WordPage/style.css new file mode 100644 index 0000000..a76cae3 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/WordPage/style.css @@ -0,0 +1,31 @@ +.bold { + font-weight: bold; +} + +ion-modal#example-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#example-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#example-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} + +ion-toast.custom-toast::part(message) { + text-align: center; + font-size: 1.5rem; + color: rgba(0, 0, 0, 0.9); +} + +ion-toast.custom-toast::part(container) { + bottom: 100px; +} diff --git a/002_source/ionic_mobile/src/pages/Lesson/getLessonConnectivesLink.tsx b/002_source/ionic_mobile/src/pages/Lesson/getLessonConnectivesLink.tsx new file mode 100644 index 0000000..90cedcb --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/getLessonConnectivesLink.tsx @@ -0,0 +1,17 @@ +export function getLessonConnectivesLink(i_active_lesson_idx: string, i_cat_idx: string, i_word_idx: string): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `/lesson_word_page/c/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} + +export function getFavLessonConnectivesLink( + i_active_lesson_idx: string, + i_cat_idx: string, + i_word_idx: string, +): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `/fav/c/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} diff --git a/002_source/ionic_mobile/src/pages/Lesson/getLessonWordLink.tsx b/002_source/ionic_mobile/src/pages/Lesson/getLessonWordLink.tsx new file mode 100644 index 0000000..fb169f5 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/getLessonWordLink.tsx @@ -0,0 +1,34 @@ +import { FAVORITE_LINK } from '../../constants'; + +export function getLessonVocabularyLink(i_active_lesson_idx: string, i_cat_idx: string, i_word_idx: string): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `/lesson_word_page/v/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} + +export function getFavLessonVocabularyLink(i_active_lesson_idx: string, i_cat_idx: string, i_word_idx: string): string { + let s_active_lesson_idx = parseInt(i_active_lesson_idx); + let s_cat_idx = parseInt(i_cat_idx); + let s_word_idx = parseInt(i_word_idx); + return `${FAVORITE_LINK}/v/${s_active_lesson_idx}/${s_cat_idx}/${s_word_idx}`; +} + +export function parseLessonVocabularyLink(s: string): + | { + active_lesson_idx: number; + cat_idx: number; + word_idx: number; + } + | undefined { + const reg = /^\/lesson_word_page\/v\/(\d+)\/(\d+)\/(\d+)$/; + const match = s.match(reg); + if (match) { + return { + active_lesson_idx: parseInt(match[1]), + cat_idx: parseInt(match[2]), + word_idx: parseInt(match[3]), + }; + } + return undefined; +} diff --git a/002_source/ionic_mobile/src/pages/Lesson/index.tsx b/002_source/ionic_mobile/src/pages/Lesson/index.tsx new file mode 100644 index 0000000..63281a7 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Lesson/index.tsx @@ -0,0 +1,134 @@ +import { + IonContent, + IonHeader, + IonItem, + IonList, + IonPage, + IonSelect, + IonSelectOption, + IonTitle, + IonToolbar, + useIonRouter, +} from '@ionic/react'; +import './Lesson.css'; +import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useParams } from 'react-router'; +import ExitButton from '../../components/ExitButton'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import CongratConnectiveConqueror from '../../components/Modal/Congratulation/ConnectiveConqueror'; +import CongratGenius from '../../components/Modal/Congratulation/Genius'; +import CongratHardworker from '../../components/Modal/Congratulation/Hardworker'; +import CongratListeningProgress from '../../components/Modal/Congratulation/ListeningProgress'; +import CongratMatchmaking from '../../components/Modal/Congratulation/Matchmaking'; +import { LESSON_LINK } from '../../constants'; +import { useMyIonStore } from '../../contexts/MyIonStore'; +import { listLessonCategories } from '../../public_data/listLessonCategories'; +import LessonContainer from './LessonContainer'; + +const Lesson: React.FC = () => { + const { act_category } = useParams<{ act_category: string }>(); + const { t, i18n } = useTranslation(); // not passing any namespace will use the defaultNS (by default set to 'translation') + + let [loading, setLoading] = useState(true); + let { lesson_contents: lesson_content, setLessonContent } = useMyIonStore(); + let [active_lesson_idx, setActiveLessonIdx] = useState(0); + let [selected_content, setSelectedContent] = useState([]); + + useEffect(() => { + listLessonCategories().then((cats: any) => { + console.log({ cats }); + setLessonContent(cats); + setActiveLessonIdx(0); + setLoading(false); + }); + }, []); + + useEffect(() => { + if (loading) return; + console.log('active_category changed', active_lesson_idx); + let selected_category = lesson_content[active_lesson_idx]; + setSelectedContent(selected_category['content']); + }, [active_lesson_idx, loading]); + + let router = useIonRouter(); + useEffect(() => { + if (lesson_content.length > 0) { + if (act_category == undefined) { + router.push(`${LESSON_LINK}/a/${lesson_content[0].name}`, undefined, 'replace'); + } else { + setActiveLessonIdx( + lesson_content.findIndex((cat: any) => cat.name.toLowerCase() === act_category?.toLowerCase()), + ); + } + } else { + } + }, [act_category, lesson_content]); + + if (loading) return ; + + return ( + + + +
+ + {t('Lesson')} + +
+ +
+
+
+
+ + + + +
{'Lesson'}
+
+
+
+
+ + + setActiveLessonIdx(e.detail.value)}> + {lesson_content.map((category: any, idx: number) => ( + + {category.name} + + ))} + + + +
+ {/* */} + + {/* */} + + + + + +
+
+ ); +}; + +export default Lesson; diff --git a/002_source/ionic_mobile/src/pages/LessonWord/AudioControls.tsx b/002_source/ionic_mobile/src/pages/LessonWord/AudioControls.tsx new file mode 100644 index 0000000..89b291b --- /dev/null +++ b/002_source/ionic_mobile/src/pages/LessonWord/AudioControls.tsx @@ -0,0 +1,28 @@ +import { FunctionComponent, useEffect } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import { useListeningPracticeTimeSpent } from '../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; + +export const AudioControls: FunctionComponent<{ audio_src: string }> = ({ audio_src }) => { + const { play, pause, playing, duration } = useGlobalAudioPlayer(); + const { load, src: loadedSrc } = useGlobalAudioPlayer(); + let { myIonMetricIncListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + + useEffect(() => { + if (audio_src) { + load(audio_src); + } + }, [audio_src]); + + useEffect(() => { + if (loadedSrc) { + } + }, [loadedSrc]); + + useEffect(() => { + if (playing) { + myIonMetricIncListeningPracticeTimeSpent(duration); + } + }, [playing]); + + return <>; +}; diff --git a/002_source/ionic_mobile/src/pages/LessonWord/style.css b/002_source/ionic_mobile/src/pages/LessonWord/style.css new file mode 100644 index 0000000..4e899e8 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/LessonWord/style.css @@ -0,0 +1,21 @@ +.bold { + font-weight: bold; +} + +ion-modal#example-modal { + --height: 33%; + --width: 80%; + --border-radius: 16px; + --box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +ion-modal#example-modal::part(backdrop) { + /* background: rgba(209, 213, 219); */ + opacity: 1; +} + +ion-modal#example-modal ion-toolbar { + /* --background: rgb(14 116 144); */ + /* --color: white; */ + --color: black; +} diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Finish/index.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Finish/index.tsx new file mode 100644 index 0000000..9201149 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Finish/index.tsx @@ -0,0 +1,59 @@ +import { IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect } from 'react'; +import { DEFAULT_FORWARD_TIMEOUT, LISTENING_PRACTICE_LINK, QUIZ_MAIN_MENU_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import './style.css'; + +const PracticeFinish: React.FC = () => { + const router = useIonRouter(); + const { setListeningPracticeInProgress } = useAppStateContext(); + const { setDisableUserTap, setTabActive } = useAppStateContext(); + + useEffect(() => { + setDisableUserTap(true); + setListeningPracticeInProgress(false); + + setTimeout(() => { + router.push(`${LISTENING_PRACTICE_LINK}/result`, 'none', 'replace'); + }, DEFAULT_FORWARD_TIMEOUT); + + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + return ( + <> + + +
+
🎉🎉🎉
+
+
Quiz finished
+
Please take a rest
+ 😊 +
+
redirecting you in 3 seconds
+
+
+
+ + ); +}; + +export default PracticeFinish; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Finish/style.css b/002_source/ionic_mobile/src/pages/ListeningPractice/Finish/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Result/index.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Result/index.tsx new file mode 100644 index 0000000..7272c70 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Result/index.tsx @@ -0,0 +1,98 @@ +import { IonButton, IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import MarkRating from '../../../components/MarkRating'; +import { DEBUG, LISTENING_PRACTICE_LINK, QUIZ_MAIN_MENU_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import { listQuizListeningPracticeContent } from '../../../public_data/listQuizListeningPracticeContent'; +import './style.css'; + +const PracticeResult: React.FC = () => { + let router = useIonRouter(); + let [loading, setLoading] = useState(true); + const { p_route } = useParams<{ p_route: string }>(); + const i_p_route = parseInt(p_route); + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + const { listening_practice_result, listening_practice_current_test } = useMyIonQuizContext(); + const [num_rating, setNumRating] = useState(0); + const { setTabActive, setDisableUserTap } = useAppStateContext(); + + useEffect(() => { + (async () => { + const res_json = await listQuizListeningPracticeContent(); + + setCurrentQuestionMeta(res_json[0]); + + // 一颗星: 答对率 1-49% + // 两颗星: 答对率 50-79% + // 三颗星: 答对率 80-100% + if (listening_practice_result < 50) { + setNumRating(1); + } else if (listening_practice_result < 80) { + setNumRating(2); + } else { + setNumRating(3); + } + + setLoading(false); + })(); + setTabActive(QUIZ_MAIN_MENU_LINK); + setDisableUserTap(false); + }, []); + + if (loading) return ; + + return ( + + +
+
+
+ Technology +
+
{'Well Done'}
+ + {DEBUG ? <>{JSON.stringify({ listening_practice_result })} : <>} +
Accuracy {listening_practice_result}%
+ +
+ {DEBUG ? <>{num_rating} : <>} + +
+
+ router.push(`${LISTENING_PRACTICE_LINK}/`)}> + {'back to Main Menu'} + +
+
+
+
+ ); +}; + +export default PracticeResult; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Result/style.css b/002_source/ionic_mobile/src/pages/ListeningPractice/Result/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/AudioControls.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/AudioControls.tsx new file mode 100644 index 0000000..e8920cc --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/AudioControls.tsx @@ -0,0 +1,30 @@ +import { FunctionComponent, useEffect } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import { useListeningPracticeTimeSpent } from '../../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; + +// import { useMyIonMetric } from '../../contexts/MyIonMetric'; + +export const AudioControls: FunctionComponent<{ audio_src: string }> = ({ audio_src }) => { + const { play, pause, playing, duration } = useGlobalAudioPlayer(); + const { load, src: loadedSrc } = useGlobalAudioPlayer(); + let { myIonMetricIncListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + + useEffect(() => { + if (audio_src) { + load(audio_src); + } + }, [audio_src]); + + useEffect(() => { + if (loadedSrc) { + } + }, [loadedSrc]); + + useEffect(() => { + if (playing) { + myIonMetricIncListeningPracticeTimeSpent(duration); + } + }, [playing]); + + return <>; +}; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionCard.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionCard.tsx new file mode 100644 index 0000000..bb323cb --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionCard.tsx @@ -0,0 +1,284 @@ +import { IonButton, IonIcon } from '@ionic/react'; +import { play, volumeHighOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import CorrectAnswerToast from '../../../components/CorrectAnswerToast'; +// import { AudioControls } from '../../LessonWord/AudioControls'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +// import QuestionProgress from './QuestionProgress'; +import QuestionProgress from '../../../components/QuestionProgress'; +import { SpeakerImage } from '../../../components/SpeakerImage'; +import WrongAnswerToast from '../../../components/WrongAnswerToast'; +import { COLOR_TEXT, DEBUG } from '../../../constants'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import { AudioControls } from './AudioControls'; +import './style.css'; +import { useAppStateContext } from '../../../contexts/AppState'; +import IListeningPracticeQuestion from '../../../interfaces/IListeningPracticeQuestion'; + +interface QuestionCardProps { + question_num: number; + nextQuestion: () => void; + num_correct: number; + incNumCorrect: () => void; + question_meta: any; + total_questions: number; + answer_list: string[]; + question: IListeningPracticeQuestion; +} + +const CorrectionCard: React.FC = ({ + num_correct, + question_num, + nextQuestion, + incNumCorrect, + total_questions, + question_meta, + answer_list, + question, +}) => { + const [loading, setLoading] = useState(true); + // + const [isOpenCorrectAnswer, setIsOpenCorrectAnswer] = useState(false); + const [isOpenWrongAnswer, setIsOpenWrongAnswer] = useState(false); + + const [user_answer, setUserAnswer] = useState(undefined); + const [modal_answer, setModalAnswer] = useState(question_meta.modal_answer); + const { play: play_word, playing } = useGlobalAudioPlayer(); + const [playing_audio, setPlayingAudio] = useState(true); + let [disable_user_answer, setDisableUserAnswer] = useState(true); + let { listening_practice_correction_list, appendToListeningPracticeCorrectionList } = useMyIonQuizContext(); + + const [ignore_answer_button, setIgnoreAnswerButton] = useState(false); + + function handleUserAnswer(answer: string, e: React.MouseEvent, ref_button: React.RefObject) { + setUserAnswer(answer); + + if (!ignore_answer_button) { + if (answer.toLowerCase() === modal_answer.toLowerCase()) { + // answer is correct + incNumCorrect(); + setIsOpenCorrectAnswer(true); + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'green'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + } else { + // answer is wrong + if (DEBUG) { + console.log('user answer is wrong'); + } + + setIsOpenWrongAnswer(true); + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'red'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + + appendToListeningPracticeCorrectionList(question); + console.log({ listening_practice_correction_list }); + } + } + } + + useEffect(() => { + if (user_answer) { + if (!isOpenCorrectAnswer && !isOpenWrongAnswer) { + // assume all toast closed + + setTimeout(() => { + nextQuestion(); + setPlayingAudio(true); + }, 500); + } + } + }, [user_answer, isOpenCorrectAnswer, isOpenWrongAnswer]); + + // useEffect(() => { + // if (user_answer) { + // setTimeout(() => { + // console.log({ listening_practice_correction_list }); + // nextQuestion(); + // setPlayingAudio(true); + // }, 1000); + // } + // }, [user_answer]); + + useEffect(() => { + if (playing_audio) { + setDisableUserAnswer(true); + setIgnoreAnswerButton(true); + } else { + setDisableUserAnswer(false); + setIgnoreAnswerButton(false); + } + }, [playing_audio]); + + function playAudio() { + setPlayingAudio(true); + play_word(); + setTimeout(() => { + setPlayingAudio(false); + }, 1000); + } + + let { LISTENING_PRACTICE_ANWERED_WAIT_S } = useAppStateContext(); + + if (DEBUG) { + console.log({ LISTENING_PRACTICE_ANWERED_WAIT_S }); + } + + function delayedPlayAudio() { + setPlayingAudio(true); + setTimeout(() => { + playAudio(); + }, LISTENING_PRACTICE_ANWERED_WAIT_S * 1000); + } + + let ref1 = useRef(null); + let ref2 = useRef(null); + let ref3 = useRef(null); + let ref4 = useRef(null); + let button_refs = [ref1, ref2, ref3, ref4]; + + function resetButtonFace(ref_button: React.RefObject) { + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'unset'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'unset'; + } + + useEffect(() => { + resetButtonFace(ref1); + resetButtonFace(ref2); + resetButtonFace(ref3); + resetButtonFace(ref4); + }, [question_num, ref1, ref2, ref3, ref4]); + + function getAnswerList(modal_answer: string) { + let wrong_answer_list = answer_list.filter((a) => a !== modal_answer); + let sliced_shuffle_array = shuffleArray(wrong_answer_list).slice(0, 2); + let full_array = [...sliced_shuffle_array, modal_answer]; + return shuffleArray(full_array); + } + + let [last_shuffle, setLastShuffle] = useState([]); + let [shuffled_answer, setShuffledAnswer] = useState([]); + + useEffect(() => { + setDisableUserAnswer(true); + + let { modal_answer } = question_meta; + let temp: string[] = getAnswerList(modal_answer); + if (last_shuffle.length == 0) { + setLastShuffle(temp); + setShuffledAnswer(temp); + } else { + for (let i = 0; i < 99; i++) { + let temp: string[] = getAnswerList(modal_answer); + + if (JSON.stringify(last_shuffle) !== JSON.stringify(temp)) { + setLastShuffle(temp); + setShuffledAnswer(temp); + break; + } + } + } + + delayedPlayAudio(); + + setModalAnswer(modal_answer); + }, [question_num]); + + useEffect(() => { + setLoading(false); + }, []); + + if (loading) return ; + if (!question_meta) return ; + + return ( + <> +
+
+ +
+
+ {'Correction card'} {question_num + 1} +
+
+ +
+ playAudio()}> +
+ +
{playing_audio ? 'playing' : 'repeat'}
+
+
+
+ {DEBUG ?
{JSON.stringify(modal_answer)}
: <>} + + {playing_audio ? ( +
Listen
+ ) : ( +
Select the word you heard
+ )} +
+ {shuffled_answer.map((word, index) => { + return ( +
+ { + setIgnoreAnswerButton(true); + handleUserAnswer(word, e, button_refs[index]); + }} + > + {word} + +
+ ); + })} +
+
+
+ {/* */} + setIsOpenCorrectAnswer(false)} /> + {/* */} + setIsOpenWrongAnswer(false)} + correct_answer={modal_answer} + /> + {/* */} + + + ); +}; + +function shuffleArray(in_array: string[]) { + for (let i = in_array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = in_array[i]; + in_array[i] = in_array[j]; + in_array[j] = temp; + } + return in_array; +} + +export default CorrectionCard; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionRoute.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionRoute.tsx new file mode 100644 index 0000000..b6a46f3 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/CorrectionRoute.tsx @@ -0,0 +1,123 @@ +import { IonButton, IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { + CORRECTION_PHASE, + DEBUG, + LISTENING_PRACTICE_LINK, + PRESS_START_TO_BEGIN, + QUIZ_MAIN_MENU_LINK, +} from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import IListeningPracticeQuestion from '../../../interfaces/IListeningPracticeQuestion'; +import { listQuizListeningPracticeContent } from '../../../public_data/listQuizListeningPracticeContent'; +import CorrectionCard from './CorrectionCard'; +import './style.css'; + +const CorrectionRoute: React.FC = () => { + const router = useIonRouter(); + const { p_route } = useParams<{ p_route: string }>(); + const i_p_route = parseInt(p_route); + const { listening_practice_correction_list, Helloworld, appendToListeningPracticeCorrectionList } = + useMyIonQuizContext(); + const { setTabActive } = useAppStateContext(); + + const [current_question_idx, setCurrentQuestionIdx] = useState(0); + const [question_list, setQuestionList] = useState([]); + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + const [answer_list, setAnswerList] = useState([]); + const [num_correct, setNumCorrect] = useState(0); + const [num_correct_correction, setNumCorrectCorrection] = useState(0); + + const nextQuestion = () => { + if (current_question_idx >= listening_practice_correction_list.length - 1) { + router.push(`${LISTENING_PRACTICE_LINK}/finished`, 'none', 'replace'); + } + + let next_question_idx = current_question_idx + 1; + + setCurrentQuestionIdx(next_question_idx); + setCurrentQuestionMeta(listening_practice_correction_list[next_question_idx]); + }; + + const incNumCorrectForCorrection = () => { + setNumCorrectCorrection(num_correct_correction + 1); + }; + + useEffect(() => { + (async () => { + const res_json = await listQuizListeningPracticeContent(); + let init_answer = res_json[i_p_route].init_answer; + let temp = res_json[i_p_route].content; + + // let shuffled_temp = shuffleArray(temp); + setQuestionList(listening_practice_correction_list); + setAnswerList([...new Set([...init_answer, ...temp.map((t: IListeningPracticeQuestion) => t.word)])]); + // setCurrentQuestionMeta(res_json[i_p_route].content[current_question_idx]); + setCurrentQuestionMeta(listening_practice_correction_list[current_question_idx]); + })(); + setTabActive(QUIZ_MAIN_MENU_LINK); + + if (listening_practice_correction_list.length < 1) { + router.push(`${LISTENING_PRACTICE_LINK}`, 'none', 'replace'); + } + }, []); + + let [show_press_start, setShowPressStart] = useState(true); + if (show_press_start) + return ( + <> + + + {DEBUG ?
{JSON.stringify({ listening_practice_correction_list })}
: <>} +
+
📝
+
{CORRECTION_PHASE}
+
+ setShowPressStart(false)}> + {PRESS_START_TO_BEGIN} + +
+
+
+
+ + ); + + return ( + + + {DEBUG ?
{JSON.stringify({ current_question_meta })}
: <>} + +
+
+ ); +}; + +export default CorrectionRoute; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/ListeningPracticeQuestionCard.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/ListeningPracticeQuestionCard.tsx new file mode 100644 index 0000000..4fd82df --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/ListeningPracticeQuestionCard.tsx @@ -0,0 +1,315 @@ +import { IonButton, IonIcon } from '@ionic/react'; +import { arrowBackCircleOutline, play, volumeHighOutline } from 'ionicons/icons'; +import { useEffect, useRef, useState } from 'react'; +import { useGlobalAudioPlayer } from 'react-use-audio-player'; +import CorrectAnswerToast from '../../../components/CorrectAnswerToast'; +// import { AudioControls } from '../../LessonWord/AudioControls'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +// import QuestionProgress from './QuestionProgress'; +import QuestionProgress from '../../../components/QuestionProgress'; +import { SpeakerImage } from '../../../components/SpeakerImage'; +import WrongAnswerToast from '../../../components/WrongAnswerToast'; +import { COLOR_TEXT, DEBUG, LISTENING_PRACTICE_LINK } from '../../../constants'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import IListeningPracticeQuestion from '../../../interfaces/IListeningPracticeQuestion'; +import { AudioControls } from './AudioControls'; +import './style.css'; +import ConfirmUserQuitQuiz from '../../../components/ConfirmUserQuitQuiz'; +import { useAppStateContext } from '../../../contexts/AppState'; + +interface QuestionCardProps { + question_num: number; + nextQuestion: () => void; + num_correct: number; + incNumCorrect: () => void; + question_meta: any; + total_questions: number; + answer_list: string[]; + question: IListeningPracticeQuestion; +} + +const ListeningPracticeQuestionCard: React.FC = ({ + num_correct, + question_num, + nextQuestion, + incNumCorrect, + total_questions, + question_meta, + answer_list, + question, +}) => { + const [loading, setLoading] = useState(true); + // + const [isOpenCorrectAnswer, setIsOpenCorrectAnswer] = useState(false); + const [isOpenWrongAnswer, setIsOpenWrongAnswer] = useState(false); + // + const [ignore_answer_button, setIgnoreAnswerButton] = useState(false); + + const [user_answer, setUserAnswer] = useState(undefined); + const [modal_answer, setModalAnswer] = useState(question_meta.modal_answer); + const { play: play_word, playing } = useGlobalAudioPlayer(); + const [playing_audio, setPlayingAudio] = useState(true); + let [disable_user_answer, setDisableUserAnswer] = useState(true); + let { appendToListeningPracticeCorrectionList } = useMyIonQuizContext(); + + // + let { LISTENING_PRACTICE_ANWERED_WAIT_S } = useAppStateContext(); + + if (DEBUG) { + console.log({ LISTENING_PRACTICE_ANWERED_WAIT_S }); + } + + function handleUserAnswer(answer: string, e: React.MouseEvent, ref_button: React.RefObject) { + setUserAnswer(answer); + + if (!ignore_answer_button) { + if (answer.toLowerCase() === modal_answer.toLowerCase()) { + incNumCorrect(); + setIsOpenCorrectAnswer(true); + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'green'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + } else { + console.log('wrong answer checked'); + setIsOpenWrongAnswer(true); + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'red'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + + appendToListeningPracticeCorrectionList(question); + } + } + } + + useEffect(() => { + if (user_answer) { + if (!isOpenCorrectAnswer && !isOpenWrongAnswer) { + // assume all toast closed + + setTimeout(() => { + nextQuestion(); + setPlayingAudio(true); + }, 500); + } + } + }, [user_answer, isOpenCorrectAnswer, isOpenWrongAnswer]); + + useEffect(() => { + if (playing_audio) { + setDisableUserAnswer(true); + setIgnoreAnswerButton(true); + } else { + setDisableUserAnswer(false); + setIgnoreAnswerButton(false); + } + }, [playing_audio]); + + function playAudio() { + setPlayingAudio(true); + play_word(); + setTimeout(() => { + setPlayingAudio(false); + }, 1000); + } + + function delayedPlayAudio() { + setPlayingAudio(true); + setTimeout(() => { + playAudio(); + }, 1000); + } + + let ref1 = useRef(null); + let ref2 = useRef(null); + let ref3 = useRef(null); + let ref4 = useRef(null); + let button_refs = [ref1, ref2, ref3, ref4]; + + function resetButtonFace(ref_button: React.RefObject) { + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'unset'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'unset'; + } + + useEffect(() => { + resetButtonFace(ref1); + resetButtonFace(ref2); + resetButtonFace(ref3); + resetButtonFace(ref4); + }, [question_num, ref1, ref2, ref3, ref4]); + + function getAnswerList(modal_answer: string) { + let wrong_answer_list = answer_list.filter((a) => a !== modal_answer); + let sliced_shuffle_array = shuffleArray(wrong_answer_list).slice(0, 2); + let full_array = [...sliced_shuffle_array, modal_answer]; + return shuffleArray(full_array); + } + + let [last_shuffle, setLastShuffle] = useState([]); + let [shuffled_answer, setShuffledAnswer] = useState([]); + + useEffect(() => { + setDisableUserAnswer(true); + + let { modal_answer } = question_meta; + let temp: string[] = getAnswerList(modal_answer); + if (last_shuffle.length == 0) { + setLastShuffle(temp); + setShuffledAnswer(temp); + } else { + for (let i = 0; i < 99; i++) { + let temp: string[] = getAnswerList(modal_answer); + + if (JSON.stringify(last_shuffle) !== JSON.stringify(temp)) { + setLastShuffle(temp); + setShuffledAnswer(temp); + break; + } + } + } + + delayedPlayAudio(); + + setModalAnswer(modal_answer); + }, [question_num]); + + const { resetListeningPracticeCorrectionList } = useMyIonQuizContext(); + useEffect(() => { + setLoading(false); + + resetListeningPracticeCorrectionList(); + }, []); + + const [show_confirm_user_exit, setShowConfirmUserExit] = useState(false); + + if (loading) return ; + if (!question_meta) return ; + + return ( + <> +
+
+ setShowConfirmUserExit(true)}> + + +
+
+
+
+
+
+ +
+
Question card {question_num + 1}
+
+ +
+ + {DEBUG ? ( +
+ {JSON.stringify(question_meta)} + {JSON.stringify(question.word)} +
+ ) : ( + <> + )} + + playAudio()}> +
+ +
{playing_audio ? 'playing' : 'repeat'}
+
+
+ +
+ {DEBUG ?
{JSON.stringify(modal_answer)}
: <>} + + {playing_audio ? ( +
Listen
+ ) : ( +
Select the word you heard
+ )} +
+ {shuffled_answer.map((word, index) => { + return ( +
+ { + setIgnoreAnswerButton(true); + handleUserAnswer(word, e, button_refs[index]); + }} + > + {word} + +
+ ); + })} +
+
+
+ + + {/* */} + setIsOpenCorrectAnswer(false)} /> + {/* */} + setIsOpenWrongAnswer(false)} + correct_answer={modal_answer} + /> + {/* */} + + + ); +}; + +function shuffleArray(in_array: string[]) { + for (let i = in_array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = in_array[i]; + in_array[i] = in_array[j]; + in_array[j] = temp; + } + return in_array; +} + +export default ListeningPracticeQuestionCard; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/index.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/index.tsx new file mode 100644 index 0000000..ed3c47a --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/index.tsx @@ -0,0 +1,112 @@ +import { IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { LISTENING_PRACTICE_LINK } from '../../../constants'; +import './style.css'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { useFullmarkCount } from '../../../contexts/MyIonMetric/FullmarkCount'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import IListeningPracticeQuestion from '../../../interfaces/IListeningPracticeQuestion'; +import { listQuizListeningPracticeContent } from '../../../public_data/listQuizListeningPracticeContent'; +import { shuffleArray } from '../../../utils/shuffleArray'; +import ListeningPracticeQuestionCard from './ListeningPracticeQuestionCard'; + +const QuestionRoute: React.FC = () => { + const { p_route } = useParams<{ p_route: string }>(); + const i_p_route = parseInt(p_route); + const [question_list, setQuestionList] = useState([]); + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + + const [current_question_idx, setCurrentQuestionIdx] = useState(0); + const [num_correct, setNumCorrect] = useState(0); + const { myIonMetricIncFullMarkCount } = useFullmarkCount(); + const { listening_practice_result, setListeningPracticeResult, setListeningPracticeCurrentTest } = + useMyIonQuizContext(); + + const { listening_practice_correction_list, setListeningPracticeCorrectionList } = useMyIonQuizContext(); + const [question_finished, setQuestionFinished] = useState(false); + + const router = useIonRouter(); + const nextQuestion = () => { + if (current_question_idx >= question_list.length - 1) { + setQuestionFinished(true); + + // if (isCorrectionNeeded()) { + // // run correction phase + // router.push(`${LISTENING_PRACTICE_LINK}/c/0`, 'none', 'replace'); + // } else { + // router.push(`${LISTENING_PRACTICE_LINK}/finished`, 'none', 'replace'); + // } + } else { + setCurrentQuestionIdx(current_question_idx + 1); + setCurrentQuestionMeta(question_list[current_question_idx + 1]); + } + }; + + useEffect(() => { + let isCorrectionNeeded = () => listening_practice_correction_list.length > 0; + + if (question_finished) { + if (isCorrectionNeeded()) { + // run correction phase + router.push(`${LISTENING_PRACTICE_LINK}/c/0`, 'none', 'replace'); + } else { + router.push(`${LISTENING_PRACTICE_LINK}/finished`, 'none', 'replace'); + } + } + }, [question_finished]); + + const incNumCorrect = () => { + setNumCorrect(num_correct + 1); + let temp: number = Math.ceil(((num_correct + 1) / question_list.length) * 100); + setListeningPracticeResult(temp); + setListeningPracticeCurrentTest(i_p_route); + myIonMetricIncFullMarkCount(); + }; + + let [answer_list, setAnswerList] = useState([]); + + useEffect(() => { + (async () => { + const res_json = await listQuizListeningPracticeContent(); + + let init_answer = res_json[i_p_route].init_answer; + let temp = res_json[i_p_route].content; + let shuffled_temp = shuffleArray(temp); + + setQuestionList(shuffled_temp); + setAnswerList([...new Set([...init_answer, ...temp.map((t: IListeningPracticeQuestion) => t.word)])]); + setCurrentQuestionMeta(res_json[i_p_route].content[current_question_idx]); + })(); + }, []); + + if (!current_question_meta) return ; + + return ( + + + + + + ); +}; + +export default QuestionRoute; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/style.css b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/Route/test.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/test.tsx new file mode 100644 index 0000000..0f6f2a2 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/Route/test.tsx @@ -0,0 +1,79 @@ +import { OverlayEventDetail } from '@ionic/core/components'; +import { + IonButton, + IonButtons, + IonContent, + IonHeader, + IonInput, + IonItem, + IonModal, + IonPage, + IonTitle, + IonToolbar, +} from '@ionic/react'; +import { useRef, useState } from 'react'; + +function Example() { + const modal = useRef(null); + const input = useRef(null); + + const [message, setMessage] = useState( + 'This modal example uses triggers to automatically open a modal when the button is clicked.', + ); + + function confirm() { + modal.current?.dismiss(input.current?.value, 'confirm'); + } + + function onWillDismiss(event: CustomEvent) { + if (event.detail.role === 'confirm') { + setMessage(`Hello, ${event.detail.data}!`); + } + } + + return <>; + + return ( + + + + Inline Modal + + + + + Open + +

{message}

+ onWillDismiss(event)}> + + + + modal.current?.dismiss()}>Cancel + + Welcome + + confirm()}> + Confirm + + + + + + + + + + +
+
+ ); +} + +export default Example; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/index.tsx b/002_source/ionic_mobile/src/pages/ListeningPractice/index.tsx new file mode 100644 index 0000000..8c90371 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/ListeningPractice/index.tsx @@ -0,0 +1,110 @@ +import { IonButton, IonContent, IonHeader, IonIcon, IonPage, IonTitle, IonToolbar, useIonRouter } from '@ionic/react'; +import './style.css'; +import { arrowBackCircleOutline } from 'ionicons/icons'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { COLOR_TEXT, DEBUG, LISTENING_PRACTICE_LINK, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import IListeningPracticeCategory from '../../interfaces/IListeningPracticeCategory'; +import { listQuizListeningPracticeContent } from '../../public_data/listQuizListeningPracticeContent'; +import { useTranslation } from 'react-i18next'; + +// import { listQuizListeningPracticeContent } from '../../public_data/listQuizListeningPracticeContent'; + +const ListeningPractice: React.FC = () => { + const { t } = useTranslation(); + let [loading, setLoading] = useState(true); + let [categories, setCategories] = useState([]); + let { show_confirm_user_exit, setShowConfirmUserExit, setTabActive } = useAppStateContext(); + + useEffect(() => { + listQuizListeningPracticeContent().then((res_json: any) => { + setCategories(res_json); + DEBUG ? console.log({ res_json }) : ''; + setLoading(false); + }); + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + let { setListeningPracticeInProgress } = useAppStateContext(); + let router = useIonRouter(); + function startListeningPractice(idx: number) { + let url = `${LISTENING_PRACTICE_LINK}/r/${idx}`; + setListeningPracticeInProgress(true); + router.push(url, 'none', 'replace'); + } + + let PAGE_TITLE = 'Listening Practice'; + + if (loading) return ; + + return ( + + + +
+
+ router.push(QUIZ_MAIN_MENU_LINK)}> + + +
+ +
{PAGE_TITLE}
+
+
+
+
+
+ + + + +
{PAGE_TITLE}
+
+
+
+
+
+
+
+
{t('Choose the Chapter you want to revise')}
+
+ {categories + .map((item) => item.cat_name) + .map((item_name, idx) => ( +
+ startListeningPractice(idx)} + > + {item_name} + +
+ ))} +
+
+ {/* */} +
+
+ ); +}; + +export default ListeningPractice; diff --git a/002_source/ionic_mobile/src/pages/ListeningPractice/style.css b/002_source/ionic_mobile/src/pages/ListeningPractice/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/CountDown.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/CountDown.tsx new file mode 100644 index 0000000..be15faa --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/CountDown.tsx @@ -0,0 +1,33 @@ +import { useEffect } from 'react'; +// import Helloworld from './Helloworld'; +import './style.css'; + +function CountDown({ + start_match, + init_time_left_s, + setCountDown_s, +}: { + start_match: boolean; + init_time_left_s: number; + setCountDown_s: (count_down_s: number) => void; +}) { + useEffect(() => { + let time_left = init_time_left_s; + let int_timer: NodeJS.Timeout | undefined = undefined; + + if (start_match) { + int_timer = setInterval(() => { + time_left = time_left - 1; + setCountDown_s(Math.max(time_left - 1, 0)); + }, 1000); + } + + return () => { + clearInterval(int_timer); + }; + }, [start_match]); + + return <>; +} + +export default CountDown; diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/Finished/index.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/Finished/index.tsx new file mode 100644 index 0000000..9a8f32d --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/Finished/index.tsx @@ -0,0 +1,48 @@ +import { IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect } from 'react'; +import { DEFAULT_FORWARD_TIMEOUT, MATCHING_FRENZY_LINK, QUIZ_MAIN_MENU_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; + +function MatchingFrenzyMatchFinished() { + const router = useIonRouter(); + + const { setDisableUserTap, setTabActive, setMatchingFrenzyInProgress } = useAppStateContext(); + + useEffect(() => { + setDisableUserTap(true); + setMatchingFrenzyInProgress(false); + + setTimeout(() => { + router.push(`${MATCHING_FRENZY_LINK}/result`, 'none', 'replace'); + }, DEFAULT_FORWARD_TIMEOUT); + + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + return ( + <> + + +
+
😜
+
Congratulations,
+
Match finished
+
+
+
+ + ); +} + +export default MatchingFrenzyMatchFinished; diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchRun.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchRun.tsx new file mode 100644 index 0000000..0c79662 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchRun.tsx @@ -0,0 +1,215 @@ +import { IonButton, IonContent, IonIcon, IonPage, useIonRouter } from '@ionic/react'; +import { alarmOutline, arrowBackCircleOutline } from 'ionicons/icons'; +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { MATCHING_FRENZY_LINK, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMyIonQuizContext } from '../../contexts/MyIonQuiz'; +import IMatchingFrenzyQuestion from '../../interfaces/IMatchingFrenzyQuestion'; +import { listMatchingFrenzyContent } from '../../public_data/listMatchingFrenzyContent'; +import { shuffleArray } from '../../utils/shuffleArray'; +import CountDown from './CountDown'; +import MatchingFrenzyCard from './MatchingFrenzyCard'; +import PressStartToBegin from './PressStartToBegin'; +import './style.css'; +import ConfirmUserQuitQuiz from '../../components/ConfirmUserQuitQuiz'; + +function MatchingFrenzyMatchRun() { + const [loading, setLoading] = useState(true); + + const router = useIonRouter(); + const { p_route } = useParams<{ p_route: string }>(); + const i_p_route = parseInt(p_route); + + const [question_list, setQuestionList] = useState([]); + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + + const [current_question, setCurrentQuestion] = useState(0); + const [num_correct, setNumCorrect] = useState(0); + + const { setTabActive } = useAppStateContext(); + + const [answer_list, setAnswerList] = useState([]); + + const { MATCHING_FRENZY_COUNT_DOWN_S } = useAppStateContext(); + const [countdown_s, setCountDown_s] = useState(MATCHING_FRENZY_COUNT_DOWN_S); + const [show_time_left_s, setShowTimeLeft] = useState('0:00'); + const { setMatchingFrenzyInProgress } = useAppStateContext(); + const { setMatchingFrenzyCurrentTest, setMatchingFrenzyResult, saveMatchingFrenzyResultToScoreBoard } = + useMyIonQuizContext(); + + let [start_match, setStartMatch] = useState(false); + let [test_random, setTestRandom] = useState(0); + + const formatTimeDisplay = (s: number) => { + return `${Math.floor(s / 60)}:${(s % 60).toString().padStart(2, '0')}`; + }; + + const nextQuestion = () => { + if (isEndOfQuestionList(current_question, question_list)) { + // consider last question sceranio + + let num_correct_result = num_correct; + + setMatchingFrenzyCurrentTest(i_p_route); + setMatchingFrenzyResult(num_correct_result); + + saveMatchingFrenzyResultToScoreBoard(p_route, { + // + date: new Date().toISOString().slice(0, 10), + result: num_correct_result, + }); + // + // reset num_correct for next game + setNumCorrect(0); + + router.push(`${MATCHING_FRENZY_LINK}/finished`, 'none', 'replace'); + } else { + let next_question_num = current_question + 1; + setCurrentQuestion(next_question_num); + setCurrentQuestionMeta(question_list[next_question_num]); + } + }; + + const incNumCorrect = () => { + setNumCorrect(num_correct + 1); + }; + + function processStartMatch() { + setMatchingFrenzyInProgress(true); + setStartMatch(true); + } + + useEffect(() => { + setShowTimeLeft(formatTimeDisplay(countdown_s)); + + if (countdown_s <= 0) { + setMatchingFrenzyCurrentTest(i_p_route); + setMatchingFrenzyResult(num_correct); + + saveMatchingFrenzyResultToScoreBoard(p_route, { + // + date: new Date().toISOString().slice(0, 10), + result: num_correct, + }); + // + // reset num_correct for next game + setNumCorrect(0); + + router.push(`${MATCHING_FRENZY_LINK}/finished`, 'none', 'replace'); + } + }, [countdown_s]); + + const [init_ans, setInitAns] = useState([]); + + useEffect(() => { + if (!current_question_meta) return; + let init_options = [...question_list.map((q) => q.word), ...answer_list, ...init_ans]; + + let all_answer_list = [...new Set(init_options)]; + let wrong_answer_list = all_answer_list.filter((a) => a !== current_question_meta.word); + let answer_list_shuffle = shuffleArray(wrong_answer_list); + let sliced_shuffle_array = shuffleArray(answer_list_shuffle).slice(0, 2 + 1); + + setAnswerList(shuffleArray([...sliced_shuffle_array, current_question_meta.word])); + }, [current_question_meta]); + + useEffect(() => { + (async () => { + const res_json = await listMatchingFrenzyContent(); + const cat_json = res_json[i_p_route]; + const init_answer = cat_json.init_answer; + setInitAns(cat_json.init_answer); + + let temp = res_json[i_p_route].content; + let shuffled_temp = shuffleArray(temp); + + setQuestionList(shuffled_temp); + setCurrentQuestionMeta(cat_json.content[current_question]); + })(); + + setTabActive(QUIZ_MAIN_MENU_LINK); + setTestRandom(Math.random()); + }, []); + + const [show_confirm_user_exit, setShowConfirmUserExit] = useState(false); + + if (!current_question_meta) return ; + + return ( + <> + + + {start_match ? ( + <> +
+
+
+ setShowConfirmUserExit(true)}> + + +
+
+ + {countdown_s > 0 ? show_time_left_s : 'times up'} +
+
+ Matches:{num_correct} +
+
+
+ {/* */} + {/* +
+
+ + {countdown_s > 0 ? show_time_left_s : 'times up'} +
+
Matches:{num_correct}
+
+ */} + + +
+ + ) : ( + + )} + + + + +
+
+ + ); +} + +export default MatchingFrenzyMatchRun; +function isEndOfQuestionList(current_question: number, question_list: [] | IMatchingFrenzyQuestion[]) { + return current_question >= question_list.length - 1; +} diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchingFrenzyCard.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchingFrenzyCard.tsx new file mode 100644 index 0000000..2266f95 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/MatchingFrenzyCard.tsx @@ -0,0 +1,148 @@ +import { IonButton } from '@ionic/react'; +import React, { useEffect, useRef, useState } from 'react'; +import { DEBUG } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMatchingFrenzyCorrectCount } from '../../contexts/MyIonMetric/MatchingFrenzyCorrectCount'; + +interface QuestionCardProps { + num_correct: number; + incNumCorrect: () => void; + // + nextQuestion: () => void; + question_meta: { word_c: string; modal_answer: string }; + shuffle_word_list: string[]; +} + +const MatchingFrenzyCard: React.FC = ({ + nextQuestion, + question_meta, + incNumCorrect, + num_correct, + shuffle_word_list, +}) => { + const [ignore_user_tap, setIgnoreUserTap] = React.useState(false); + let { word_c, modal_answer } = question_meta; + let { myIonMetricIncMatchingFrenzyCorrectCount } = useMatchingFrenzyCorrectCount(); + + let ref1 = useRef(null); + let ref2 = useRef(null); + let ref3 = useRef(null); + let ref4 = useRef(null); + let button_refs = [ref1, ref2, ref3, ref4]; + + let [user_answered, setUserAnswered] = useState(undefined); + + const { MATCHING_FRENZY_ANWERED_WAIT_S } = useAppStateContext(); + + function handleUserAnswer(answer: string, ref_button: React.RefObject) { + if (ignore_user_tap) return; + + if (answer.toLowerCase() === modal_answer.toLowerCase()) { + myIonMetricIncMatchingFrenzyCorrectCount(); + incNumCorrect(); + // + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'green'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + // + setUserAnswered(answer); + + // + } else { + if (ref_button && ref_button.current) ref_button.current.style.backgroundColor = 'red'; + if (ref_button && ref_button.current) ref_button.current.style.color = 'white'; + // + setUserAnswered(answer); + } + } + + useEffect(() => { + DEBUG ? console.log({ 'user_answered is ': user_answered }) : ''; + + if (user_answered) { + DEBUG ? console.log('setup timer') : ''; + setTimeout(() => { + ResetButtonsStyle(); + setIgnoreUserTap(false); + nextQuestion(); + + // 027, fix reset for next question + setUserAnswered(undefined); + }, 500); + } else { + } + }, [user_answered]); + + function ResetButtonsStyle() { + button_refs.forEach((ref) => { + if (ref && ref.current) ref.current.style.backgroundColor = 'unset'; + if (ref && ref.current) ref.current.style.color = 'unset'; + }); + } + + return ( + <> +
+
{'Match the correct meaning'}
+
+
{word_c}
+
+
+
+ {shuffle_word_list.map((word: string, index: number) => { + return ( +
+ { + setIgnoreUserTap(true); + handleUserAnswer(word, button_refs[index]); + }} + className={'answer_button'} + fill="outline" + > +
10 ? '0.75rem' : '1rem', + }} + > + {word} +
+
+
+ ); + })} +
+ + ); +}; + +export default React.memo(MatchingFrenzyCard); diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/PressStartToBegin.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/PressStartToBegin.tsx new file mode 100644 index 0000000..d03d525 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/PressStartToBegin.tsx @@ -0,0 +1,35 @@ +import { IonButton } from '@ionic/react'; +import { PRESS_START_TO_BEGIN, PRESS_START_TO_BEGIN_MESSAGE } from '../../constants'; + +interface ContainerProps { + processStartMatch: () => void; +} + +function PressStartToBegin({ processStartMatch }: ContainerProps) { + return ( + <> +
+
🎬
+
{PRESS_START_TO_BEGIN_MESSAGE}
+
{PRESS_START_TO_BEGIN}
+
+ processStartMatch()} size="large"> + {'start'} + +
+
+ + ); +} + +export default PressStartToBegin; diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/Result/index.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/Result/index.tsx new file mode 100644 index 0000000..1bdca12 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/Result/index.tsx @@ -0,0 +1,125 @@ +import { IonButton, IonContent, IonPage, useIonRouter } from '@ionic/react'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../../components/LoadingScreen'; +import { MATCHING_FRENZY_LINK, QUIZ_MAIN_MENU_LINK } from '../../../constants'; +import { useAppStateContext } from '../../../contexts/AppState'; +import { MatchingFrenzyResult, MatchingFrezyRanking } from '../../../contexts/MatchingFrezyRanking'; +import { useMyIonQuizContext } from '../../../contexts/MyIonQuiz'; +import { listMatchingFrenzyContent } from '../../../public_data/listMatchingFrenzyContent'; + +function MatchingFrenzyMatchResult() { + let router = useIonRouter(); + + let { matching_frenzy_result, matching_frenzy_current_test, loadMatchingFrenzyScoreBoard } = useMyIonQuizContext(); + let [ranking, setRanking] = useState([]); + const { setTabActive, setDisableUserTap } = useAppStateContext(); + + const [current_question_meta, setCurrentQuestionMeta] = useState(undefined); + + useEffect(() => { + (async () => { + const res_json: any = await listMatchingFrenzyContent(); + setCurrentQuestionMeta(res_json[matching_frenzy_current_test]); + + let temp: MatchingFrezyRanking = await loadMatchingFrenzyScoreBoard(matching_frenzy_current_test.toString()); + + let ranking: MatchingFrenzyResult[] = temp['ranking']; + setRanking(ranking); + })(); + + setTabActive(QUIZ_MAIN_MENU_LINK); + setDisableUserTap(false); + }, []); + + if (!current_question_meta) return ; + // if (ranking.length == 0) return <>list is empty; + + return ( + <> + + +
+
+
+
+
{current_question_meta.cat_name}
+
+
+
{'Well Done'}
+
+
+
+ {'Matches made:'} + {matching_frenzy_result} +
+
+
+
+
+ Scoreboard +
+ {ranking.map((r, i) => ( +
+
{`${r.date}`}
+
{`${r.result}`}
+
+ ))} +
+
+
+ router.push(`${MATCHING_FRENZY_LINK}/`)}> + {'back to Main Menu'} + +
+
+
+
+
+ + ); +} + +export default MatchingFrenzyMatchResult; diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/SelectCategory.tsx b/002_source/ionic_mobile/src/pages/MatchingFrenzy/SelectCategory.tsx new file mode 100644 index 0000000..6a61477 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/SelectCategory.tsx @@ -0,0 +1,103 @@ +import { IonButton, IonContent, IonHeader, IonIcon, IonPage, IonTitle, IonToolbar, useIonRouter } from '@ionic/react'; +import { arrowBackCircleOutline } from 'ionicons/icons'; +import { useEffect, useState } from 'react'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import { DEBUG, MATCHING_FRENZY_LINK, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import IMatchingFrenzyCategory from '../../interfaces/IMatchingFrenzyCategory'; +import { listMatchingFrenzyContent } from '../../public_data/listMatchingFrenzyContent'; + +function MatchingFrenzySelectCategory() { + const PAGE_TITLE = 'Matching Frenzy'; + const router = useIonRouter(); + const [loading, setLoading] = useState(true); + const [categories, setCategories] = useState([]); + const { setTabActive } = useAppStateContext(); + + useEffect(() => { + listMatchingFrenzyContent().then((res_json: any) => { + setCategories(res_json); + DEBUG ? console.log({ res_json }) : ''; + setLoading(false); + }); + + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + if (loading) return ; + + return ( + <> + + + +
+
+ router.push(QUIZ_MAIN_MENU_LINK)}> + + +
+ +
{PAGE_TITLE}
+
+
+
+
+
+ + + + + +
{PAGE_TITLE}
+
+
+
+ +
+
+
+
+
Choose the Chapter you want to revise
+
+ {categories + .map((item) => item.cat_name) + .map((item_name, idx) => ( +
+ { + router.push(`${MATCHING_FRENZY_LINK}/r/${idx}`); + }} + > + {item_name} + +
+ ))} +
+
+
+
+ + ); +} + +export default MatchingFrenzySelectCategory; diff --git a/002_source/ionic_mobile/src/pages/MatchingFrenzy/style.css b/002_source/ionic_mobile/src/pages/MatchingFrenzy/style.css new file mode 100644 index 0000000..94f52e8 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/MatchingFrenzy/style.css @@ -0,0 +1,4 @@ +ion-button.answer_button::part(native) { + /* background-color: gold; */ + padding: 1px; +} diff --git a/002_source/ionic_mobile/src/pages/Page.tsx b/002_source/ionic_mobile/src/pages/Page.tsx new file mode 100644 index 0000000..54ce471 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Page.tsx @@ -0,0 +1,10 @@ +import { IonPage } from '@ionic/react'; +import { useParams } from 'react-router'; + +const Page: React.FC = () => { + const { name } = useParams<{ name: string }>(); + + return {JSON.stringify(name)}; +}; + +export default Page; diff --git a/002_source/ionic_mobile/src/pages/QuizzesMainMenu/index.tsx b/002_source/ionic_mobile/src/pages/QuizzesMainMenu/index.tsx new file mode 100644 index 0000000..241ecd4 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/QuizzesMainMenu/index.tsx @@ -0,0 +1,55 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import { useEffect } from 'react'; +import QuizzesMainMenuContainer from '../../components/QuizzesMainMenuContainer'; +import { COLOR_TEXT, QUIZ_MAIN_MENU_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import './style.css'; +import ExitButton from '../../components/ExitButton'; + +const QuizzesMainMenu: React.FC = () => { + let { setTabActive } = useAppStateContext(); + useEffect(() => { + setTabActive(QUIZ_MAIN_MENU_LINK); + }, []); + + return ( + + + +
+
+
+ +
{'Revision Time !'}
+
+
+
+ +
+
+
+
+ + + + +
{'Revision Time !'}
+
+
+
+ +
+
+ ); +}; + +export default QuizzesMainMenu; diff --git a/002_source/ionic_mobile/src/pages/QuizzesMainMenu/style.css b/002_source/ionic_mobile/src/pages/QuizzesMainMenu/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Record/index.tsx b/002_source/ionic_mobile/src/pages/Record/index.tsx new file mode 100644 index 0000000..ee77da2 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Record/index.tsx @@ -0,0 +1,435 @@ +import { IonButton, IonContent, IonHeader, IonIcon, IonPage, IonTitle, IonToolbar, useIonRouter } from '@ionic/react'; +import { heart } from 'ionicons/icons'; +import { useEffect, useState } from 'react'; +import AttentiveEarsProgressBar from '../../components/AttentiveEarsProgressBar'; +import ConnectivesConquerorProgressBar from '../../components/ConnectivesConquerorProgressBar'; +import GeniusProgressBar from '../../components/GeniusProgressBar'; +import HardWorkerProgressBar from '../../components/HardWorkerProgressBar'; +import { LoadingScreen } from '../../components/LoadingScreen'; +import MatchmakingProgressBar from '../../components/MatchmakingProgressBar'; +import NoFavoriteVocabModal from '../../components/NoFavoriteConnectivesModal'; +import NoFavoriteConnectivesModal from '../../components/NoFavoriteVocabModal'; +import { + ATTENTIVE_EARS_STAGES as ATTENTIVE_EAR_STAGES, + COLOR_TEXT, + CONNECTIVE_CONQUEROR_STAGES, + DEBUG, + FAVORITE_LINK, + GENIUS_STAGES, + HARDWORKER_STAGES, + MATCHMAKING_STAGES, + MY_FAVORITE, + RECORD_LINK, +} from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; +import { useMyIonFavorite } from '../../contexts/MyIonFavorite'; +import './style.css'; +import ExitButton from '../../components/ExitButton'; +import CongratConnectiveConqueror from '../../components/Modal/Congratulation/ConnectiveConqueror'; +import CongratGenius from '../../components/Modal/Congratulation/Genius'; +import CongratHardworker from '../../components/Modal/Congratulation/Hardworker'; +import CongratListeningProgress from '../../components/Modal/Congratulation/ListeningProgress'; +import CongratMatchmaking from '../../components/Modal/Congratulation/Matchmaking'; +import { useAppUseTime } from '../../contexts/MyIonMetric/AppUseTime'; +import { useConnectivesRevisionCorrectCount } from '../../contexts/MyIonMetric/ConnectivesRevisionCorrectCount'; +import { useFullmarkCount } from '../../contexts/MyIonMetric/FullmarkCount'; +import { useListeningPracticeTimeSpent } from '../../contexts/MyIonMetric/ListeningPracticeTimeSpent'; +import { useMatchingFrenzyCorrectCount } from '../../contexts/MyIonMetric/MatchingFrenzyCorrectCount'; + +const MyAchievementPage: React.FC = () => { + const [loading, setLoading] = useState(true); + + // + const router = useIonRouter(); + const [full_mark_count, setFullMarkCount] = useState(0); + const [hard_worker_progress, setHardWorkerProgress] = useState(0); + const [listening_practice_progress, setListeningPracticeProgress] = useState(0); + const [matching_frenzy_progress, setMatchingFrenzyProgress] = useState(0); + const [app_use_time, setAppUseTime] = useState(0); + const [connectives_revision_progress, setConnectivesRevisionProgress] = useState(0); + const [num_fav_vocab, setnumFavVocab] = useState(0); + const [num_fav_connectives, setnumFavConnectives] = useState(0); + const [openNoFavVocab, setOpenNoFavVocab] = useState(false); + const [openNoFavConnectives, setOpenNoFavConnectives] = useState(false); + const { myIonStoreLoadFavoriteVocabulary, myIonStoreLoadFavoriteConnectives } = useMyIonFavorite(); + + const [openedCongraFullmarkTimes, setOpenedCongraFullmarkTimes] = useState(false); + const [congra_msg, setCongraMsg] = useState(''); + const [openCongratListeningProgress, setOpenCongratListeningProgress] = useState(false); + + const { myIonMetricGetAppUseTime } = useAppUseTime(); + + const { myIonMetricGetListeningPracticeTimeSpent } = useListeningPracticeTimeSpent(); + const { myIonMetricGetConnectivesRevisionCorrectCount } = useConnectivesRevisionCorrectCount(); + const { myIonMetricGetMatchingFrenzyCorrectCount } = useMatchingFrenzyCorrectCount(); + + const { + // + myIonMetricGetFullMarkCount, + myIonMetricGetFullMarkIgnore, + } = useFullmarkCount(); + + const { + // + Helloworld, + myIonMetricGetListeningPracticeProgressIgnore, + myIonMetricSetListeningPracticeProgressIgnore, + } = useListeningPracticeTimeSpent(); + + const [count_prompted, setCountPrompted] = useState(0); + + // + async function promptFullmark(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetFullMarkIgnore()).count) return; + setCountPrompted(count_to_prompt); + setCongraMsg('You scored full marks ' + count_to_prompt + ' times.'); + setOpenedCongraFullmarkTimes(true); + } + + function checkPromptCongratulationFullMark(full_mark_count: number) { + const prompt_list = [10, 50, 100, 200, 700, 1000]; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (full_mark_count > prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + promptFullmark(prompt_list[lastTrueIndex]); + } + } + + // + function dismissListeningPracticeCongratulation() { + myIonMetricSetListeningPracticeProgressIgnore(count_prompted); + } + + // + async function promptMatchmaking(count_to_prompt: number) { + if (count_to_prompt == (await myIonMetricGetFullMarkIgnore()).count) return; + setCountPrompted(count_to_prompt); + setCongraMsg('You scored match making ' + count_to_prompt + ' times.'); + setOpenedCongraFullmarkTimes(true); + } + + function checkPromptMatchmaking(full_mark_count: number) { + const prompt_list = [10, 50, 100, 200, 700, 1000]; + const b_prompt_list = Array(prompt_list.length).fill(false); + + for (let i = 0; i < prompt_list.length; i++) { + if (full_mark_count > prompt_list[i]) { + b_prompt_list[i] = true; + } + } + + let lastTrueIndex = -1; + for (let i = b_prompt_list.length - 1; i >= 0; i--) { + if (b_prompt_list[i]) { + lastTrueIndex = i; + break; + } + } + + if (lastTrueIndex == -1) { + DEBUG ? console.log('prompt ignored') : ''; + } else { + promptMatchmaking(prompt_list[lastTrueIndex]); + } + } + + let { tab_active, setTabActive } = useAppStateContext(); + useEffect(() => { + if (full_mark_count > 0) { + checkPromptCongratulationFullMark(full_mark_count); + } + }, [tab_active, full_mark_count]); + + useEffect(() => {}, [tab_active, matching_frenzy_progress]); + useEffect(() => { + if (connectives_revision_progress > 0) checkPromptMatchmaking(connectives_revision_progress); + }, [tab_active, connectives_revision_progress]); + useEffect(() => {}, [tab_active, app_use_time]); + + const { setDisableUserTap } = useAppStateContext(); + + useEffect(() => { + (async () => { + let { time_spent_s } = await myIonMetricGetAppUseTime(); + setHardWorkerProgress(time_spent_s); + + const { count: full_mark_count } = await myIonMetricGetFullMarkCount(); + setFullMarkCount(full_mark_count); + + const { count: matching_frenzy_correct_count } = await myIonMetricGetMatchingFrenzyCorrectCount(); + setMatchingFrenzyProgress(matching_frenzy_correct_count); + + const { count: connectives_revision_correct_count } = await myIonMetricGetConnectivesRevisionCorrectCount(); + setConnectivesRevisionProgress(connectives_revision_correct_count); + + setLoading(false); + })(); + + (async () => { + let temp_fav_list = await myIonStoreLoadFavoriteVocabulary(); + setnumFavVocab(temp_fav_list.length); + + let temp_fav_c_list = await myIonStoreLoadFavoriteConnectives(); + setnumFavConnectives(temp_fav_c_list.length); + })(); + + setTabActive(RECORD_LINK); + + (async () => { + let temp = await myIonMetricGetListeningPracticeTimeSpent(); + setListeningPracticeProgress(temp.time_spent_s); + })(); + + setDisableUserTap(false); + }, []); + + if (loading) return ; + + return ( + <> + + + +
+ {MY_FAVORITE} +
+ +
+
+
+
+ + + + +
{'My Achievement'}
+
+
+
+
+
+
+
Genius
+
No of times getting the perfect score
+
+ {GENIUS_STAGES.join(' / ')} {DEBUG ? ({full_mark_count}) : ''} +
+ +
+
+
+ +
+
+
+
+
Hard worker
+
Overall Practice duration (In mint.res)
+
+ {HARDWORKER_STAGES.join(' / ')} min{' '} + {DEBUG ? ({(hard_worker_progress / 60).toFixed(3)}) : ''} +
+ +
+
+
+ +
+
+
+
+
Attentive Ears
+
Duration of listening Track completed
+
+ {ATTENTIVE_EAR_STAGES.join(' / ')} min + {DEBUG ? ({(listening_practice_progress / 60).toFixed(3)}) : ''} +
+ +
+
+
+ +
+
+
+
+
Matchmaking
+
No of correct matches mode
+
+ {MATCHMAKING_STAGES.join(' / ')} + {DEBUG ? ({(matching_frenzy_progress / 60).toFixed(3)}) : ''} +
+ +
+
+
+ +
+
+
+
+
Connectives Conqueror
+
No of completed connective exercises
+
+ {CONNECTIVE_CONQUEROR_STAGES.join(' / ')}{' '} + {DEBUG ? ({connectives_revision_progress}) : ''} +
+ +
+
+
+ +
+
+
+
+ +
+
+ {/* */} + (num_fav_vocab > 0 ? router.push(`${FAVORITE_LINK}/v`) : setOpenNoFavVocab(true))} + > +
+ +
+ {'Liked Vocabulary'} ({num_fav_vocab || 0}) +
+
+
+ {/* */} + + num_fav_connectives > 0 ? router.push(`${FAVORITE_LINK}/c`) : setOpenNoFavConnectives(true) + } + > +
+ +
+ {'Liked Connectives'} ({num_fav_connectives || 0}) +
+
+
+ {/* */} +
+
+
+
+ {/* */} + + + {/* */} + {/* + + */} + {/* */} + {/* */} + + + + + + + ); +}; + +export default MyAchievementPage; diff --git a/002_source/ionic_mobile/src/pages/Record/style.css b/002_source/ionic_mobile/src/pages/Record/style.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Setting/indx.tsx b/002_source/ionic_mobile/src/pages/Setting/indx.tsx new file mode 100644 index 0000000..368c593 --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Setting/indx.tsx @@ -0,0 +1,37 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import { useEffect } from 'react'; +import SettingContainer from '../../components/SettingContainer'; +import { SETTING_LINK } from '../../constants'; +import { useAppStateContext } from '../../contexts/AppState'; + +const Setting: React.FC = () => { + const { setTabActive } = useAppStateContext(); + + useEffect(() => { + setTabActive(SETTING_LINK); + }, []); + + return ( + + + + +
{'Setting'}
+
+
+
+ + + + +
{'Setting'}
+
+
+
+ +
+
+ ); +}; + +export default Setting; diff --git a/002_source/ionic_mobile/src/pages/Tab1.css b/002_source/ionic_mobile/src/pages/Tab1.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Tab1.tsx b/002_source/ionic_mobile/src/pages/Tab1.tsx new file mode 100644 index 0000000..97aa72d --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Tab1.tsx @@ -0,0 +1,25 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import ExploreContainer from '../components/ExploreContainer'; +import './Tab1.css'; + +const Tab1: React.FC = () => { + return ( + + + + Tab 1 + + + + + + Tab 1 + + + + + + ); +}; + +export default Tab1; diff --git a/002_source/ionic_mobile/src/pages/Tab2.css b/002_source/ionic_mobile/src/pages/Tab2.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Tab2.tsx b/002_source/ionic_mobile/src/pages/Tab2.tsx new file mode 100644 index 0000000..05458aa --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Tab2.tsx @@ -0,0 +1,25 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import ExploreContainer from '../components/ExploreContainer'; +import './Tab2.css'; + +const Tab2: React.FC = () => { + return ( + + + + Tab 2 + + + + + + Tab 2 + + + + + + ); +}; + +export default Tab2; diff --git a/002_source/ionic_mobile/src/pages/Tab3.css b/002_source/ionic_mobile/src/pages/Tab3.css new file mode 100644 index 0000000..e69de29 diff --git a/002_source/ionic_mobile/src/pages/Tab3.tsx b/002_source/ionic_mobile/src/pages/Tab3.tsx new file mode 100644 index 0000000..3a29b8a --- /dev/null +++ b/002_source/ionic_mobile/src/pages/Tab3.tsx @@ -0,0 +1,25 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; +import ExploreContainer from '../components/ExploreContainer'; +import './Tab3.css'; + +const Tab3: React.FC = () => { + return ( + + + + Tab 3 + + + + + + Tab 3 + + + + + + ); +}; + +export default Tab3; diff --git a/002_source/ionic_mobile/src/public_data/Helloworld.ts b/002_source/ionic_mobile/src/public_data/Helloworld.ts new file mode 100644 index 0000000..d583117 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/Helloworld.ts @@ -0,0 +1,5 @@ +import { listLessonContent } from './listLessonContent'; + +function Helloworld(): Promise { + return listLessonContent(); +} diff --git a/002_source/ionic_mobile/src/public_data/listConectivesRevisionContent.ts b/002_source/ionic_mobile/src/public_data/listConectivesRevisionContent.ts new file mode 100644 index 0000000..8e639b1 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/listConectivesRevisionContent.ts @@ -0,0 +1,15 @@ +import { retry } from '@lifeomic/attempt'; +import axios from 'axios'; + +export async function listConectivesRevisionContent(): Promise { + return new Promise((res, rej) => { + retry(async (context) => { + try { + const response = await axios.get('/data/Quiz/ConnectivesRevision/content.json'); + res(response.data); + } catch (error) { + rej(error); + } + }); + }); +} diff --git a/002_source/ionic_mobile/src/public_data/listLessonCategories.ts b/002_source/ionic_mobile/src/public_data/listLessonCategories.ts new file mode 100644 index 0000000..7cfb200 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/listLessonCategories.ts @@ -0,0 +1,9 @@ +import { listLessonContent } from './listLessonContent'; + +export function listLessonCategories(): Promise { + return listLessonContent().then((res_json: any) => { + return res_json.map((lesson: any) => { + return { name: lesson.name, path: lesson.path, content: lesson.content }; + }); + }); +} diff --git a/002_source/ionic_mobile/src/public_data/listLessonContent.ts b/002_source/ionic_mobile/src/public_data/listLessonContent.ts new file mode 100644 index 0000000..d622ad7 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/listLessonContent.ts @@ -0,0 +1,18 @@ +// http://localhost:8080/data/Lesson/getLessonContent + +import { retry } from '@lifeomic/attempt'; +import axios from 'axios'; +import { API_URL } from '../constants'; + +export async function listLessonContent(): Promise { + return new Promise((res, rej) => { + retry(async (context) => { + try { + const temp = await axios.get(API_URL + '/data/Lesson/getLessonContent'); + res(temp.data); + } catch (error) { + rej(error); + } + }); + }); +} diff --git a/002_source/ionic_mobile/src/public_data/listMatchingFrenzyContent.ts b/002_source/ionic_mobile/src/public_data/listMatchingFrenzyContent.ts new file mode 100644 index 0000000..cf01071 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/listMatchingFrenzyContent.ts @@ -0,0 +1,21 @@ +// export async function listMatchingFrenzyContent(): Promise { +// return fetch('/data/Quiz/MatchingFrenzy/content.json').then((res) => { +// return res.json(); +// }); +// } +import { retry } from '@lifeomic/attempt'; +import axios from 'axios'; +import { API_URL } from '../constants'; + +export async function listMatchingFrenzyContent(): Promise { + return new Promise((res, rej) => { + retry(async (context) => { + try { + const temp = await axios.get(API_URL + '/data/Quiz/MatchingFrenzy/getContent'); + res(temp.data); + } catch (error) { + rej(error); + } + }); + }); +} diff --git a/002_source/ionic_mobile/src/public_data/listQuizListeningPracticeContent.ts b/002_source/ionic_mobile/src/public_data/listQuizListeningPracticeContent.ts new file mode 100644 index 0000000..fe4bea5 --- /dev/null +++ b/002_source/ionic_mobile/src/public_data/listQuizListeningPracticeContent.ts @@ -0,0 +1,20 @@ +// http://localhost:8080/data/Quiz/ListeningPractice/getContent + +import { retry } from '@lifeomic/attempt'; +import axios from 'axios'; +import { API_URL } from '../constants'; + +export async function listQuizListeningPracticeContent(): Promise { + return new Promise((res, rej) => { + retry(async (context) => { + try { + // const temp = await axios.get('/data/Quiz/ListeningPractice/content.json'); + const temp = await axios.get(API_URL + '/data/Quiz/ListeningPractice/getContent'); + + res(temp.data); + } catch (error) { + rej(error); + } + }); + }); +} diff --git a/002_source/ionic_mobile/src/setupTests.ts b/002_source/ionic_mobile/src/setupTests.ts new file mode 100644 index 0000000..049dc0e --- /dev/null +++ b/002_source/ionic_mobile/src/setupTests.ts @@ -0,0 +1,17 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom + +import '@testing-library/jest-dom/extend-expect'; + +// Mock matchmedia +window.matchMedia = + window.matchMedia || + function () { + return { + matches: false, + addListener: function () {}, + removeListener: function () {}, + }; + }; diff --git a/002_source/ionic_mobile/src/style.css b/002_source/ionic_mobile/src/style.css new file mode 100644 index 0000000..62132dc --- /dev/null +++ b/002_source/ionic_mobile/src/style.css @@ -0,0 +1,3 @@ +ion-toast { + height: calc(100vh - 100px); +} diff --git a/002_source/ionic_mobile/src/theme/variables.css b/002_source/ionic_mobile/src/theme/variables.css new file mode 100644 index 0000000..131c419 --- /dev/null +++ b/002_source/ionic_mobile/src/theme/variables.css @@ -0,0 +1,2 @@ +/* For information on how to create your own theme, please see: +http://ionicframework.com/docs/theming/ */ diff --git a/002_source/ionic_mobile/src/utils/shuffleArray.ts b/002_source/ionic_mobile/src/utils/shuffleArray.ts new file mode 100644 index 0000000..7d372d8 --- /dev/null +++ b/002_source/ionic_mobile/src/utils/shuffleArray.ts @@ -0,0 +1,9 @@ +export function shuffleArray(in_array: any) { + for (let i = in_array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = in_array[i]; + in_array[i] = in_array[j]; + in_array[j] = temp; + } + return in_array; +} diff --git a/002_source/ionic_mobile/src/vite-env.d.ts b/002_source/ionic_mobile/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/002_source/ionic_mobile/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/002_source/ionic_mobile/test.tsx b/002_source/ionic_mobile/test.tsx new file mode 100644 index 0000000..c52f711 --- /dev/null +++ b/002_source/ionic_mobile/test.tsx @@ -0,0 +1,13 @@ +import { debounce, reduce } from 'lodash'; +import React, { ChangeEvent, FC, KeyboardEvent, useEffect, useRef } from 'react'; +import { initializeApp } from '@core/app'; +import { logger } from '@core/logger'; + +import { createConnection } from '@server/database'; +import { createServer } from '@server/node'; + +import { Alert } from '@ui/Alert'; +import { Popup } from '@ui/Popup'; + +import { Message } from '../Message'; +import { add, filter, repeat } from '../utils'; diff --git a/002_source/ionic_mobile/tsconfig.json b/002_source/ionic_mobile/tsconfig.json new file mode 100644 index 0000000..2c9cef3 --- /dev/null +++ b/002_source/ionic_mobile/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": [ + "src" + ], + "exclude": [ + "**/*.del", + "**/*copy.*", + "**/*copy*.*", + "**/*.bak", + "**/*.fix", + "node_modules", + "./dist" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/002_source/ionic_mobile/tsconfig.node.json b/002_source/ionic_mobile/tsconfig.node.json new file mode 100644 index 0000000..b8afcc8 --- /dev/null +++ b/002_source/ionic_mobile/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/002_source/ionic_mobile/vite.config.ts b/002_source/ionic_mobile/vite.config.ts new file mode 100644 index 0000000..92e8eea --- /dev/null +++ b/002_source/ionic_mobile/vite.config.ts @@ -0,0 +1,15 @@ +/// + +import legacy from '@vitejs/plugin-legacy'; +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), legacy()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: './src/setupTests.ts' + } +});