diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index f621106e..00000000 --- a/.appveyor.yml +++ /dev/null @@ -1,17 +0,0 @@ -environment: - matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - -install: - - java -version - - mvn --version - -before_build: - - cd hub-backend - -build_script: - - mvn clean install spring-boot:repackage - -cache: - - C:\maven\ - - C:\Users\appveyor\.m2 diff --git a/.github/workflows/maven.yml b/.github/workflows/gradle.yml similarity index 50% rename from .github/workflows/maven.yml rename to .github/workflows/gradle.yml index 6d142a18..d9fe83e0 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/gradle.yml @@ -15,10 +15,12 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 14 - uses: actions/setup-java@v1 - with: - java-version: 14 - - name: Build with Maven - run: mvn -B package --file pom.xml + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Grant execute permission for gradlew + run: cd hub-backend && chmod +x gradlew + - name: Build with Gradle + run: cd hub-backend && ./gradlew build diff --git a/.gitignore b/.gitignore index 8ce56112..32e86e19 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,263 @@ -### Maven ### -target/ -pom.xml.tag -pom.xml.releaseBackup -pom.xml.versionsBackup -pom.xml.next -release.properties -dependency-reduced-pom.xml -buildNumber.properties -.mvn/timing.properties -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio +# Created by https://www.toptal.com/developers/gitignore/api/java,kotlin,gradle,git,node,react +# Edit at https://www.toptal.com/developers/gitignore?templates=java,kotlin,gradle,git,node,react -## Directory-based project format: -.idea/ -*.css.map +### Git ### +# Created by git for backups. To disable backups in Git: +# $ git config --global mergetool.keepBackup false +*.orig -## File-based project format: -*.ipr -*.iws -*.iml +# Created by git when using merge tools for conflicts +*.BACKUP.* +*.BASE.* +*.LOCAL.* +*.REMOTE.* +*_BACKUP_*.txt +*_BASE_*.txt +*_LOCAL_*.txt +*_REMOTE_*.txt + +### Java ### +# Compiled class file +*.class + +# Log file *.log -## Plugin-specific files: +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files + +# Mobile Tools for Java (J2ME) + +# Package Files # + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Node ### +# Logs +logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env*.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +### react ### +.DS_* +**/*.backup.* +**/*.back.* + +node_modules + +*.sublime* + +psd +thumb +sketch + +### Gradle ### +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +### Gradle Patch ### +**/build/ + +# End of https://www.toptal.com/developers/gitignore/api/java,kotlin,gradle,git,node,react + + +# Created by https://www.toptal.com/developers/gitignore/api/intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 +.idea + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws # IntelliJ -/out/ -/bin/ -/notes +out/ # mpeltonen/sbt-idea plugin .idea_modules/ @@ -35,79 +265,49 @@ buildNumber.properties # JIRA plugin atlassian-ide-plugin.xml +# Cursive Clojure plugin +.idea/replstate.xml + # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties +fabric.properties -### Eclipse ### -*.pydevproject -.metadata -.gradle -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath - -# Eclipse Core -.project - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# JDT-specific (Eclipse Java Development Tools) -.classpath - -# Java annotation processor (APT) -.factorypath - -# PDT-specific -.buildpath +# Editor-based Rest Client +.idea/httpRequests -# sbteclipse plugin -.target +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser -# TeXlipse plugin -.texlipse +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 -### Java ### -*.class +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr -# Mobile Tools for Java (J2ME) -.mtj.tmp/ +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ -# Package Files # -*.war -*.ear +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ -# Vue & NodeJS -.DS_Store -node_modules/ -dist/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -/test/e2e/reports -selenium-debug.log +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ -# Lockfiles -yarn.lock -package-lock.json -.nuxt/ +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml -### Custom -hub-backend/workspace/application.yml +# End of https://www.toptal.com/developers/gitignore/api/intellij diff --git a/.travis.yml b/.travis.yml index f43ef5d7..900d6435 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,10 @@ notifications: email: false jdk: -- openjdk14 - +- openjdk15 script: - - mvn install + - cd hub-backend && chmod +x gradlew && ./gradlew build after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/hub-backend/build.gradle.kts b/hub-backend/build.gradle.kts new file mode 100644 index 00000000..9aeecc79 --- /dev/null +++ b/hub-backend/build.gradle.kts @@ -0,0 +1,59 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.4.21" + kotlin("plugin.serialization") version "1.4.21" + application +} + +group = "org.panda_lang" +version = "1.0.0" + +repositories { + jcenter() + mavenCentral() + maven { url = uri("https://dl.bintray.com/kotlin/kotlinx") } + maven { url = uri("https://dl.bintray.com/kotlin/ktor") } +} + +dependencies { + implementation("org.litote.kmongo:kmongo:4.2.4") + implementation("org.litote.kmongo:kmongo-coroutine:4.2.4") + implementation("org.litote.kmongo:kmongo-async:4.2.4") + implementation("org.litote.kmongo:kmongo-reactor:4.2.4") + + implementation("io.jsonwebtoken:jjwt:0.9.1") + implementation("io.ktor:ktor-auth-jwt:1.4.0") + implementation("io.ktor:ktor-auth:1.4.0") + implementation("io.ktor:ktor-locations:1.4.0") + implementation("io.ktor:ktor-client-apache:1.4.0") + implementation("io.ktor:ktor-server-netty:1.4.0") + implementation("io.ktor:ktor-html-builder:1.4.0") + implementation("io.ktor:ktor-client-gson:1.4.0") + implementation("io.ktor:ktor-gson:1.4.0") + implementation("io.ktor:ktor-serialization:1.4.0") + implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.7.2") + + implementation("org.tinylog:tinylog-api-kotlin:2.2.1") + implementation("org.tinylog:tinylog-impl:2.2.1") + implementation("org.tinylog:slf4j-tinylog:2.2.1") + + testImplementation(kotlin("test-junit5")) + testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.6.0") +} + +tasks.test { + useJUnitPlatform() +} + +tasks.withType() { + kotlinOptions.jvmTarget = "11" + kotlinOptions.freeCompilerArgs += "-Xmx1G" + kotlinOptions.freeCompilerArgs += "-Xopt-in=io.ktor.util.KtorExperimentalAPI" + kotlinOptions.freeCompilerArgs += "-Xopt-in=io.ktor.locations.KtorExperimentalLocationsAPI" +} + +application { + mainClassName = "org.panda_lang.hub.HubApplicationKt" +} \ No newline at end of file diff --git a/hub-backend/gradle.properties b/hub-backend/gradle.properties new file mode 100644 index 00000000..7fc6f1ff --- /dev/null +++ b/hub-backend/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official diff --git a/hub-backend/gradle/wrapper/gradle-wrapper.jar b/hub-backend/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e708b1c0 Binary files /dev/null and b/hub-backend/gradle/wrapper/gradle-wrapper.jar differ diff --git a/hub-backend/gradle/wrapper/gradle-wrapper.properties b/hub-backend/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..12d38de6 --- /dev/null +++ b/hub-backend/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/hub-backend/gradlew b/hub-backend/gradlew new file mode 100644 index 00000000..4f906e0c --- /dev/null +++ b/hub-backend/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or 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 UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" + which java >/dev/null 2>&1 || 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 + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/hub-backend/gradlew.bat b/hub-backend/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/hub-backend/gradlew.bat @@ -0,0 +1,89 @@ +@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=. +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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/hub-backend/pom.xml b/hub-backend/pom.xml deleted file mode 100644 index d0d43461..00000000 --- a/hub-backend/pom.xml +++ /dev/null @@ -1,500 +0,0 @@ - - - - - 4.0.0 - - org.panda-lang - hub-parent - indev-2020.7.16 - - - hub-backend - indev-2020.7.16 - - - 1.3.72 - - ${java.version} - ${java.version} - - ${project.encoding} - ${project.encoding} - - - - - - org.springframework.boot - spring-boot-dependencies - 2.4.2 - pom - import - - - - - - - - org.springframework.boot - spring-boot-starter-web - 2.4.2 - - - org.springframework.boot - spring-boot-starter-webflux - 2.4.2 - - - org.springframework - spring-context - 5.3.3 - - - org.springframework.boot - spring-boot-configuration-processor - 2.4.2 - - - org.springframework.boot - spring-boot-starter-validation - 2.4.2 - - - org.springframework.boot - spring-boot-starter-security - 2.4.2 - - - org.springframework.security - spring-security-oauth2-client - 5.4.4 - - - org.springframework.security - spring-security-oauth2-jose - 5.4.4 - - - org.springframework.boot - spring-boot-starter-data-mongodb - 2.4.2 - - - org.springframework.boot - spring-boot-starter-actuator - 2.4.2 - - - org.springframework.boot - spring-boot-devtools - 2.4.2 - runtime - - - org.springframework.shell - spring-shell-starter - 2.0.1.RELEASE - - - com.fasterxml.jackson.module - jackson-module-kotlin - 2.12.1 - - - javax.xml.bind - jaxb-api - 2.3.1 - - - com.sun.xml.bind - jaxb-core - 3.0.0 - - - com.sun.xml.bind - jaxb-impl - 3.0.0 - - - org.springframework.metrics - spring-metrics - 0.5.1.RELEASE - - - io.jsonwebtoken - jjwt - 0.9.1 - - - org.hibernate.validator - hibernate-validator - 7.0.1.Final - - - org.hibernate.validator - hibernate-validator-annotation-processor - 7.0.1.Final - - - - - io.springfox - springfox-swagger2 - 2.9.2 - - - io.springfox - springfox-swagger-ui - 2.9.2 - - - - - org.panda-lang - panda - 0.3.0-alpha - - - commons-beanutils - commons-beanutils - 1.9.4 - - - - - org.spockframework - spock-core - 2.0-M4-groovy-3.0 - test - - - org.codehaus.groovy - groovy - 3.0.7 - test - - - io.projectreactor - reactor-test - 3.4.2 - test - - - io.rest-assured - spring-mock-mvc - 4.3.3 - test - - - io.rest-assured - json-path - 4.3.3 - test - - - io.rest-assured - json-schema-validator - 4.3.3 - test - - - io.rest-assured - xml-path - 4.3.3 - test - - - org.junit.jupiter - junit-jupiter-api - 5.7.1 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.7.1 - test - - - org.mockito - mockito-junit-jupiter - 3.7.7 - test - - - org.mockito - mockito-core - 3.7.7 - test - - - org.junit.platform - junit-platform-runner - 1.7.1 - test - - - org.springframework.boot - spring-boot-starter-test - 2.4.2 - test - - - org.mockito - mockito-core - - - - - org.springframework.security - spring-security-test - 5.4.4 - test - - - de.flapdoodle.embed - de.flapdoodle.embed.mongo - 3.0.0 - test - - - - - - panda-repository - Panda Repository - https://repo.panda-lang.org/ - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - clean install - - - - - org.eluder.coveralls - coveralls-maven-plugin - 4.3.0 - - - org.jacoco - jacoco-maven-plugin - 0.8.6 - - - - prepare-agent - - - - report - test - - report - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - 2.4.2 - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - - compile - - - - test-compile - - test-compile - - - - - 13 - - -Xjvm-default=enable - - - spring - - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - - org.codehaus.gmavenplus - gmavenplus-plugin - 1.12.1 - - - - compile - compileTests - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.2.0 - - true - protected - ${basedir}/src/main/java - org.panda_lang.hub - true - - http://download.java.net/java/jdk8/docs/api/ - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - ${java.version} - ${java.version} - -parameters - - - - - default-compile - none - - - - default-testCompile - none - - - java-compile - compile - - compile - - - - java-test-compile - test-compile - - testCompile - - - - - - - - - org.apache.maven.plugins - maven-install-plugin - 2.5.2 - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.2 - - - - - org.apache.maven.plugins - maven-antrun-plugin - 3.0.0 - - - ktlint - verify - - - - - - - - run - - - ktlint-format - - - - - - - - - run - - - - - com.pinterest - ktlint - 0.40.0 - - - - - - - diff --git a/hub-backend/settings.gradle.kts b/hub-backend/settings.gradle.kts new file mode 100644 index 00000000..b0a8a57c --- /dev/null +++ b/hub-backend/settings.gradle.kts @@ -0,0 +1,3 @@ + +rootProject.name = "hub-backend3" + diff --git a/hub-backend/src/main/java/org/panda_lang/hub/HubApplication.kt b/hub-backend/src/main/java/org/panda_lang/hub/HubApplication.kt deleted file mode 100644 index 1510b9bc..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/HubApplication.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import org.panda_lang.utilities.commons.UnsafeUtils -import org.springframework.boot.SpringApplication -import org.springframework.boot.autoconfigure.SpringBootApplication - -@SpringBootApplication -open class HubApplication - -fun main(args: Array) { - UnsafeUtils.disableIllegalAccessMessage() - SpringApplication.run(HubApplication::class.java, *args) -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/HubConfiguration.kt b/hub-backend/src/main/java/org/panda_lang/hub/HubConfiguration.kt deleted file mode 100644 index 2dcd4b5e..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/HubConfiguration.kt +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import org.jline.utils.AttributedString -import org.jline.utils.AttributedStyle -import org.panda_lang.utilities.commons.StringUtils -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.beans.factory.annotation.Value -import org.springframework.context.MessageSource -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.Primary -import org.springframework.context.support.ReloadableResourceBundleMessageSource -import org.springframework.data.mongodb.repository.config.EnableMongoRepositories -import org.springframework.shell.jline.PromptProvider -import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean -import org.springframework.web.servlet.config.annotation.CorsRegistry -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer -import java.io.File - -@Configuration -@EnableMongoRepositories -internal class HubConfiguration : WebMvcConfigurer { - - @Bean - fun workspaceDirectory(@Value("\${hub.workspace}") workspace: String?): File { - return File(StringUtils.replace(workspace, "/", File.separator)) - } - - @Bean - fun resourcesDirectory(@Qualifier("workspaceDirectory") workspace: File?): File { - return File(workspace, "resources") - } - - @Bean - fun shellPrompt(): PromptProvider { - return PromptProvider { AttributedString("hub:> ", AttributedStyle.DEFAULT.foreground(AttributedStyle.CYAN)) } - } - - @Bean - fun messageSource(): MessageSource { - return ReloadableResourceBundleMessageSource().also { - it.setBasename("classpath:message") - it.setDefaultEncoding("UTF-8") - } - } - - @Bean - @Primary - fun localValidatorFactoryBean(): LocalValidatorFactoryBean { - return LocalValidatorFactoryBean().also { - it.setValidationMessageSource(messageSource()) - } - } - - override fun addCorsMappings(registry: CorsRegistry) { - registry.addMapping("/**") - .allowedOrigins("*") - .allowedMethods("GET", "POST", "HEAD", "OPTIONS", "PUT", "PATCH", "DELETE") - .allowedHeaders("*") - .allowCredentials(true) - .maxAge(3600) - } - - override fun addResourceHandlers(registry: ResourceHandlerRegistry) { - registry.addResourceHandler("/resources/**") - .addResourceLocations("classpath:/resources/") - .resourceChain(false) - } - - @Bean - fun objectMapper(): ObjectMapper { - return ObjectMapper().also { - it.registerModule(JavaTimeModule()) - it.registerModule(Jdk8Module()) - it.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) - } - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/HubRouter.kt b/hub-backend/src/main/java/org/panda_lang/hub/HubRouter.kt deleted file mode 100644 index e60569db..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/HubRouter.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -internal class HubRouter diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationConfiguration.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationConfiguration.kt deleted file mode 100644 index 824b5e34..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationConfiguration.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.converter.ObjectToMapConverter -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration - -@Configuration -internal open class AuthenticationConfiguration { - - @Bean - open fun authenticationTokenCreator(authenticationProperties: AuthenticationProperties): AuthenticationTokenCreator { - return AuthenticationTokenCreator(authenticationProperties, ObjectToMapConverter()) - } - - @Bean - open fun authorizationRequestRepository(): OAuth2AuthorizationRequestRepository { - return OAuth2AuthorizationRequestRepository() - } - - @Bean - open fun authenticationTokenFilter(tokenProperties: AuthenticationProperties, userDetailsService: AuthenticationUserDetailsService): AuthenticationTokenFilter { - val tokenValidator = AuthenticationTokenValidator() - val tokenProvider = AuthenticationTokenProvider() - return AuthenticationTokenFilter(tokenProperties, tokenValidator, tokenProvider, userDetailsService) - } - - @Bean - open fun oAuth2AuthenticationSuccessHandler(authenticationProperties: AuthenticationProperties): OAuth2AuthenticationSuccessHandler { - return OAuth2AuthenticationSuccessHandler(authenticationTokenCreator(authenticationProperties), authenticationProperties, authorizationRequestRepository()) - } - - @Bean - open fun oAuth2AuthenticationFailureHandler(): OAuth2AuthenticationFailureHandler { - return OAuth2AuthenticationFailureHandler(authorizationRequestRepository()) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEndpointsController.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEndpointsController.kt deleted file mode 100644 index 030f8e06..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEndpointsController.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.user.UserFacade -import org.springframework.http.ResponseEntity -import org.springframework.security.authentication.AuthenticationManager -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken -import org.springframework.security.core.context.SecurityContextHolder -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController - -@RequestMapping("/api/users") -@RestController -internal class AuthenticationEndpointsController( - private val authenticationManager: AuthenticationManager, - private val authenticationTokenCreator: AuthenticationTokenCreator, - private val userFacade: UserFacade -) { - - @PostMapping("/signup") - fun registerUser(@RequestBody dto: SignUpDto): ResponseEntity<*> { - return ResponseEntity.created(userFacade.register(dto)).build() - } - - @PostMapping("/signin") - fun authenticateUser(@RequestBody dto: SignInDto): ResponseEntity> { - val authentication = authenticationManager.authenticate(UsernamePasswordAuthenticationToken(dto.name, dto.password)) - SecurityContextHolder.getContext().authentication = authentication - - return ResponseEntity.ok(mapOf("access_token" to authenticationTokenCreator.create(authentication))) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEntryPoint.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEntryPoint.kt deleted file mode 100644 index 34ea61dc..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationEntryPoint.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.security.core.AuthenticationException -import org.springframework.security.web.AuthenticationEntryPoint -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -internal class AuthenticationEntryPoint : AuthenticationEntryPoint { - - override fun commence(request: HttpServletRequest, response: HttpServletResponse, authenticationException: AuthenticationException) { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.message) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationProperties.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationProperties.kt deleted file mode 100644 index c298d3ce..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationProperties.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.boot.context.properties.ConfigurationProperties -import org.springframework.context.annotation.PropertySource -import org.springframework.stereotype.Component - -@Component -@ConfigurationProperties(prefix = "auth") -@PropertySource("classpath:auth.properties") -internal class AuthenticationProperties { - val oauth = OAuth() - val token = Token() - - data class OAuth( - var redirectUrls: List = ArrayList() - ) - - data class Token( - var secret: String? = null, - var expiration: Long = 0 - ) -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenCreator.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenCreator.kt deleted file mode 100644 index ff4bc5df..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenCreator.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import io.jsonwebtoken.Jwts -import io.jsonwebtoken.SignatureAlgorithm -import org.panda_lang.hub.utils.converter.ObjectToMapConverter -import org.springframework.security.core.Authentication -import java.sql.Date -import java.time.LocalDate - -internal class AuthenticationTokenCreator( - private val authenticationProperties: AuthenticationProperties, - private val objectToMapConverter: ObjectToMapConverter -) { - - fun create(authentication: Authentication): String { - val principal = objectToMapConverter.convert(authentication.principal) - val expirationDate = LocalDate.now().plusDays(authenticationProperties.token.expiration) - - return Jwts.builder() - .setExpiration(Date.valueOf(expirationDate)) - .setIssuedAt(Date.valueOf(LocalDate.now())) - .setSubject(principal["name"].toString()) - .signWith(SignatureAlgorithm.HS512, authenticationProperties.token.secret) - .compact() - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenFilter.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenFilter.kt deleted file mode 100644 index 0225e7b0..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenFilter.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken -import org.springframework.security.core.context.SecurityContextHolder -import org.springframework.web.filter.OncePerRequestFilter -import javax.servlet.FilterChain -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -internal class AuthenticationTokenFilter( - private val tokenProperties: AuthenticationProperties, - private val tokenValidator: AuthenticationTokenValidator, - private val tokenProvider: AuthenticationTokenProvider, - private val userDetailsService: AuthenticationUserDetailsService -) : OncePerRequestFilter() { - - override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) { - val jwtToken = obtainJwtTokenFromRequest(request) - val secretToken = tokenProperties.token.secret - - if (jwtToken != null && tokenValidator.validate(jwtToken, secretToken)) { - val userId = tokenProvider.obtainUserId(jwtToken, secretToken) - val userDetails = userDetailsService.loadUserById(userId) - val authentication = UsernamePasswordAuthenticationToken(userDetails, null, userDetails.authorities) - authentication.details = userDetails - SecurityContextHolder.getContext().authentication = authentication - } - - filterChain.doFilter(request, response) - } - - private fun obtainJwtTokenFromRequest(servletRequest: HttpServletRequest): String? { - val authorizationHeaderContent = servletRequest.getHeader("Authorization") - val bearer = "Bearer " - - return if (authorizationHeaderContent != null && authorizationHeaderContent.startsWith(bearer)) { - authorizationHeaderContent.substring(bearer.length) - } else { - null - } - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenProvider.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenProvider.kt deleted file mode 100644 index 7d1db963..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenProvider.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import io.jsonwebtoken.Jwts -import org.bson.types.ObjectId - -internal class AuthenticationTokenProvider { - - fun obtainUserId(token: String?, secretToken: String?): ObjectId { - val claims = Jwts.parser() - .setSigningKey(secretToken) - .parseClaimsJws(token) - .body - - return ObjectId(claims.subject) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenValidator.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenValidator.kt deleted file mode 100644 index e0031a8c..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationTokenValidator.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import io.jsonwebtoken.ExpiredJwtException -import io.jsonwebtoken.Jwts -import io.jsonwebtoken.MalformedJwtException -import io.jsonwebtoken.SignatureException -import io.jsonwebtoken.UnsupportedJwtException -import org.panda_lang.utilities.commons.StringUtils -import org.slf4j.LoggerFactory -import org.springframework.lang.Nullable - -internal class AuthenticationTokenValidator { - - companion object { - private val LOGGER = LoggerFactory.getLogger(AuthenticationTokenValidator::class.java) - } - - fun validate(@Nullable token: String?, @Nullable secretToken: String?): Boolean { - if (StringUtils.isEmpty(token) || StringUtils.isEmpty(secretToken)) { - return false - } - try { - Jwts.parser().setSigningKey(secretToken).parseClaimsJws(token) - return true - } catch (ex: SignatureException) { - LOGGER.error("Invalid signature") - } catch (ex: MalformedJwtException) { - LOGGER.error("Invalid token: { token: $token, secret: $secretToken }") - } catch (ex: ExpiredJwtException) { - LOGGER.error("Expired token") - } catch (ex: UnsupportedJwtException) { - LOGGER.error("Unsupported token") - } catch (ex: IllegalArgumentException) { - LOGGER.error("String cannot be empty") - } - return false - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationUserDetailsService.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationUserDetailsService.kt deleted file mode 100644 index 6521937c..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/AuthenticationUserDetailsService.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.bson.types.ObjectId -import org.springframework.security.core.userdetails.UserDetails -import org.springframework.security.core.userdetails.UserDetailsService - -interface AuthenticationUserDetailsService : UserDetailsService { - - fun loadUserById(id: ObjectId): UserDetails -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/GithubOAuth2UserDetails.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/GithubOAuth2UserDetails.kt deleted file mode 100644 index cafdcbb7..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/GithubOAuth2UserDetails.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -internal data class GithubOAuth2UserDetails(private val attributes: Map) : OAuth2UserDetails { - override val providerId: String - get() = (attributes["id"] as Int?).toString() - - override val name: String - get() = attributes["login"] as String - - override val displayName: String? - get() = attributes["name"] as String? - - override val email: String - get() = attributes["email"] as String - - override val avatar: String? - get() = attributes["avatar_url"] as String? -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationFailureHandler.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationFailureHandler.kt deleted file mode 100644 index 2a1e78de..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationFailureHandler.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.helper.CookieHelper -import org.springframework.security.core.AuthenticationException -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler -import org.springframework.web.util.UriComponentsBuilder -import javax.servlet.http.Cookie -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -internal class OAuth2AuthenticationFailureHandler( - private val authorizationRequestRepository: OAuth2AuthorizationRequestRepository -) : SimpleUrlAuthenticationFailureHandler() { - - override fun onAuthenticationFailure(servletRequest: HttpServletRequest, servletResponse: HttpServletResponse, authenticationException: AuthenticationException) { - var redirectUri = CookieHelper.obtainCookie(OAuth2AuthorizationRequestRepository.REDIRECT_URI_COOKIE_NAME, servletRequest.cookies) - .map { obj: Cookie? -> obj!!.value } - .orElse("/") - - redirectUri = UriComponentsBuilder.fromUriString(redirectUri) - .queryParam("error", authenticationException.localizedMessage) - .build() - .toUriString() - - authorizationRequestRepository.removeAuthorizationRequestCookies(servletResponse, servletRequest) - redirectStrategy.sendRedirect(servletRequest, servletResponse, redirectUri) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationSuccessHandler.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationSuccessHandler.kt deleted file mode 100644 index 507d04b4..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthenticationSuccessHandler.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.helper.CookieHelper -import org.springframework.http.HttpStatus -import org.springframework.security.core.Authentication -import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler -import org.springframework.web.server.ResponseStatusException -import org.springframework.web.util.UriComponentsBuilder -import java.net.URI -import javax.servlet.http.Cookie -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -internal class OAuth2AuthenticationSuccessHandler( - private val tokenCreator: AuthenticationTokenCreator, - private val tokenProperties: AuthenticationProperties, - private val requestRepository: OAuth2AuthorizationRequestRepository -) : SimpleUrlAuthenticationSuccessHandler() { - - override fun onAuthenticationSuccess(servletRequest: HttpServletRequest, servletResponse: HttpServletResponse, authentication: Authentication) { - if (!servletResponse.isCommitted) { - val redirectUrl = obtainRedirectUri(authentication, servletRequest) - this.clearAuthenticationAttributes(servletRequest, servletResponse) - redirectStrategy.sendRedirect(servletRequest, servletResponse, redirectUrl) - } - } - - private fun obtainRedirectUri(authentication: Authentication, servletRequest: HttpServletRequest): String { - val optionalRedirectUrl = CookieHelper.obtainCookie(OAuth2AuthorizationRequestRepository.REDIRECT_URI_COOKIE_NAME, servletRequest.cookies) - .map { obj: Cookie? -> obj!!.value } - - if (optionalRedirectUrl.isPresent && !isAuthorizedRedirectUri(optionalRedirectUrl.get())) { - throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Sorry! We've got an Unauthorized Redirect URI and can't proceed with the authentication") - } - - val redirectUrl = optionalRedirectUrl.orElse(defaultTargetUrl) - val token = tokenCreator.create(authentication) - - return UriComponentsBuilder.fromUriString(redirectUrl).queryParam("token", token).build().toUriString() - } - - private fun isAuthorizedRedirectUri(uri: String): Boolean { - val clientRedirectUri = URI.create(uri) - - return tokenProperties.oauth.redirectUrls.stream() - .anyMatch { redirectUri: String? -> - val authorizedUri = URI.create(redirectUri) - clientRedirectUri.host.equals(authorizedUri.host, ignoreCase = true) && authorizedUri.port == clientRedirectUri.port - } - } - - private fun clearAuthenticationAttributes(servletRequest: HttpServletRequest, servletResponse: HttpServletResponse) { - super.clearAuthenticationAttributes(servletRequest) - requestRepository.removeAuthorizationRequestCookies(servletResponse, servletRequest) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthorizationRequestRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthorizationRequestRepository.kt deleted file mode 100644 index 3fc8fb6f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2AuthorizationRequestRepository.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.helper.CookieHelper -import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository -import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest -import javax.servlet.http.Cookie -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -private const val COOKIE_EXPIRATION_TIME = 180 -private const val OAUTH_2_AUTHORIZATION_REQUEST_COOKIE_NAME = "oauth2_auth_request" - -internal class OAuth2AuthorizationRequestRepository : AuthorizationRequestRepository { - - companion object { - const val REDIRECT_URI_COOKIE_NAME = "redirect_uri" - } - - override fun loadAuthorizationRequest(request: HttpServletRequest): OAuth2AuthorizationRequest? { - return CookieHelper.obtainCookie(OAUTH_2_AUTHORIZATION_REQUEST_COOKIE_NAME, request.cookies) - .map { cookie: Cookie? -> CookieHelper.deserialize(cookie, OAuth2AuthorizationRequest::class.java) } - .orElse(null) - } - - override fun removeAuthorizationRequest(request: HttpServletRequest): OAuth2AuthorizationRequest? { - return loadAuthorizationRequest(request) - } - - override fun saveAuthorizationRequest(authorizationRequest: OAuth2AuthorizationRequest?, servletRequest: HttpServletRequest, servletResponse: HttpServletResponse) { - if (authorizationRequest == null) { - removeAuthorizationRequestCookies(servletResponse, servletRequest) - return - } - - val serializedCookie = CookieHelper.serialize(authorizationRequest) - CookieHelper.appendCookie(OAUTH_2_AUTHORIZATION_REQUEST_COOKIE_NAME, serializedCookie, COOKIE_EXPIRATION_TIME, servletResponse) - val redirectUri = servletRequest.getParameter(REDIRECT_URI_COOKIE_NAME) - - if (redirectUri.isNotEmpty()) { - CookieHelper.appendCookie(REDIRECT_URI_COOKIE_NAME, redirectUri, COOKIE_EXPIRATION_TIME, servletResponse) - } - } - - fun removeAuthorizationRequestCookies(httpServletResponse: HttpServletResponse, httpServletRequest: HttpServletRequest) { - CookieHelper.removeCookie(OAUTH_2_AUTHORIZATION_REQUEST_COOKIE_NAME, httpServletRequest, httpServletResponse) - CookieHelper.removeCookie(REDIRECT_URI_COOKIE_NAME, httpServletRequest, httpServletResponse) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetails.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetails.kt deleted file mode 100644 index 111fb230..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetails.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -interface OAuth2UserDetails { - val providerId: String - val name: String - val email: String - val displayName: String? - val avatar: String? -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsFactory.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsFactory.kt deleted file mode 100644 index 5403b74f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -object OAuth2UserDetailsFactory { - - fun obtainOAuth2UserDetails(providerName: String?, attributes: Map): OAuth2UserDetails { - return if ("github".equals(providerName, ignoreCase = true)) { - GithubOAuth2UserDetails(attributes) - } else { - throw UnsupportedOperationException() - } - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsService.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsService.kt deleted file mode 100644 index 890015bd..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/OAuth2UserDetailsService.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest -import org.springframework.security.oauth2.client.userinfo.OAuth2UserService -import org.springframework.security.oauth2.core.user.OAuth2User - -interface OAuth2UserDetailsService : OAuth2UserService diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/RegistrationController.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/RegistrationController.kt deleted file mode 100644 index 5b2623c5..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/RegistrationController.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import org.panda_lang.hub.user.User -import org.panda_lang.hub.user.UserRegistrationDto -import org.panda_lang.hub.user.UserService -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import org.springframework.validation.BindingResult -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import javax.validation.Valid - -@ApiOperation("Operations pertaining to registration") -@RestController -@RequestMapping("api/register") -internal class RegistrationController @Autowired constructor(private val userService: UserService) { - - @ApiOperation(value = "Register a user account") - @ApiResponses( - ApiResponse(code = 409, message = "User with that username already exists"), - ApiResponse(code = 400, message = "Bad Request"), - ApiResponse(code = 201, message = "Successfully created user", response = User::class) - ) - @PostMapping - fun register(@RequestBody dto: @Valid UserRegistrationDto, result: BindingResult): ResponseEntity<*> { - var user: User? = userService.findByName(dto.name) - - user?.let { - return ResponseEntity.status(HttpStatus.CONFLICT).build() - } - - if (result.hasErrors()) { - return ResponseEntity.badRequest().build() - } - - user = userService.initializeUser(dto.toEntity()) - - return ResponseEntity - .status(HttpStatus.CREATED) - .body(user) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/RequiresAuthenticated.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/RequiresAuthenticated.kt deleted file mode 100644 index eacc7c3f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/RequiresAuthenticated.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.security.access.prepost.PreAuthorize - -@Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) -@PreAuthorize("isAuthenticated()") -annotation class RequiresAuthenticated diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignInDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignInDto.kt deleted file mode 100644 index 7d8bc3b4..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignInDto.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.entity.JsonDto - -data class SignInDto( - val name: String, - val password: String -) : JsonDto() diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignUpDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignUpDto.kt deleted file mode 100644 index 301aa579..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/SignUpDto.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.utils.entity.JsonDto - -data class SignUpDto( - val name: String, - val displayName: String, - val email: String, - val password: String -) : JsonDto() diff --git a/hub-backend/src/main/java/org/panda_lang/hub/authentication/WebSecurityConfiguration.kt b/hub-backend/src/main/java/org/panda_lang/hub/authentication/WebSecurityConfiguration.kt deleted file mode 100644 index 439ee7b1..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/authentication/WebSecurityConfiguration.kt +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.panda_lang.hub.user.UserDetailsService -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.security.authentication.AuthenticationManager -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity -import org.springframework.security.config.annotation.web.builders.HttpSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter -import org.springframework.security.config.http.SessionCreationPolicy -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider -import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - -@Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true) -internal class WebSecurityConfiguration( - @param:Qualifier("authenticationUserDetailsService") - private val userDetailsService: UserDetailsService, - private val authenticationTokenFilter: AuthenticationTokenFilter, - private val authorizationRequestRepository: OAuth2AuthorizationRequestRepository, - private val authenticationFailureHandler: OAuth2AuthenticationFailureHandler, - private val authenticationSuccessHandler: OAuth2AuthenticationSuccessHandler, - private val oAuth2UserService: OAuth2UserDetailsService -) : WebSecurityConfigurerAdapter() { - - override fun configure(http: HttpSecurity) { - http.cors() - .and().csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and().authorizeRequests().antMatchers("/auth/**", "/oauth2/**", "/api/tests/**").permitAll() - .and().oauth2Login().authorizationEndpoint().baseUri("/oauth2/authorize").authorizationRequestRepository(authorizationRequestRepository) - .and().redirectionEndpoint().baseUri("/login/oauth2/code/*") - .and().userInfoEndpoint().userService(oAuth2UserService) - .and().successHandler(authenticationSuccessHandler).failureHandler(authenticationFailureHandler) - - http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter::class.java) - } - - override fun configure(auth: AuthenticationManagerBuilder) { - auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()) - auth.authenticationProvider(OAuth2LoginAuthenticationProvider(DefaultAuthorizationCodeTokenResponseClient(), oAuth2UserService)) - } - - @Bean - override fun authenticationManagerBean(): AuthenticationManager { - return super.authenticationManagerBean() - } - - @Bean - open fun passwordEncoder(): PasswordEncoder { - return BCryptPasswordEncoder() - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/error/CustomErrorController.kt b/hub-backend/src/main/java/org/panda_lang/hub/error/CustomErrorController.kt deleted file mode 100644 index f91e8f14..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/error/CustomErrorController.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.error - -import org.springframework.boot.web.servlet.error.ErrorAttributes -import org.springframework.boot.web.servlet.error.ErrorController -import org.springframework.context.MessageSource -import org.springframework.context.MessageSourceResolvable -import org.springframework.validation.FieldError -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import org.springframework.web.context.request.WebRequest -import java.util.Locale -import javax.servlet.http.HttpServletResponse - -private const val ERROR_PATH = "/error" - -@RestController -internal class CustomErrorController( - private val errorAttributes: ErrorAttributes, - private val messageSource: MessageSource -) : ErrorController { - - @RequestMapping(ERROR_PATH) // For all HTTP methods - fun error(webRequest: WebRequest?, httpServletResponse: HttpServletResponse): ErrorDto { - val errorAttributes = errorAttributes.getErrorAttributes(webRequest, false) - - if (httpServletResponse.status == 400 && errorAttributes["errors"] != null) { - val errors = errorAttributes["errors"] as Collection? - return ErrorDto( - 400, - errors!!.stream() - .map { fieldError: MessageSourceResolvable? -> messageSource.getMessage(fieldError, Locale.getDefault()) } - .findFirst() - .get() - ) - } - - return ErrorDto(httpServletResponse.status, errorAttributes["error"].toString()) - } - - override fun getErrorPath(): String = ERROR_PATH -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/error/ErrorDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/error/ErrorDto.kt deleted file mode 100644 index 68492992..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/error/ErrorDto.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.error - -internal data class ErrorDto( - val code: Int, - val message: String -) diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/Organization.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/Organization.kt deleted file mode 100644 index 6cecdd8b..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/Organization.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer -import org.bson.types.ObjectId -import org.panda_lang.hub.user.Owner -import org.panda_lang.hub.user.User -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document - -@Document("organizations") -data class Organization constructor( - override var name: String, - override var displayName: String?, - override var description: String?, - override var email: String, - override var avatar: String, - override var site: String?, - var owner: User -) : Owner { - - @field:Id - @field:JsonSerialize(using = ToStringSerializer::class) - override var identifier: ObjectId? = null -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationController.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationController.kt deleted file mode 100644 index 504d0e29..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationController.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import io.swagger.annotations.ApiOperation -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudController -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController - -@ApiOperation("Operations pertaining to organization") -@RestController -@RequestMapping("/api/organizations") -internal open class OrganizationController( - service: OrganizationService -) : AbstractCrudController(service) diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationRepository.kt deleted file mode 100644 index a4863f2e..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationRepository.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.NameableMongoRepository -import org.springframework.stereotype.Repository - -@Repository -internal interface OrganizationRepository : NameableMongoRepository diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationService.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationService.kt deleted file mode 100644 index a4c2118f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationService.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.CrudOperationsService - -interface OrganizationService : CrudOperationsService diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationServiceImpl.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationServiceImpl.kt deleted file mode 100644 index 7831730d..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationServiceImpl.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudOperationService -import org.springframework.stereotype.Service - -@Service -internal class OrganizationServiceImpl( - organizationRepository: OrganizationRepository -) : AbstractCrudOperationService(organizationRepository), OrganizationService diff --git a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationUpdateDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationUpdateDto.kt deleted file mode 100644 index 9bace1a0..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/organization/OrganizationUpdateDto.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.hibernate.validator.constraints.Length -import org.hibernate.validator.constraints.URL -import org.panda_lang.hub.utils.entity.AbstractDto -import javax.validation.constraints.Email -import javax.validation.constraints.NotEmpty -import javax.validation.constraints.NotNull - -data class OrganizationUpdateDto( - @field:NotNull(message = "{name.notNull}") - @field:NotEmpty(message = "{name.notEmpty}") - @field:Length(min = 3, max = 32, message = "{name.length}") - override val name: String, - @field:NotNull(message = "{displayName.notNull}") - @field:NotEmpty(message = "{displayName.notEmpty}") - @field:Length(min = 3, max = 32, message = "{displayName.length}") - val displayName: String, - @field:NotEmpty(message = "{description.notEmpty}") - @field:NotNull(message = "{description.notNull}") - @Length(max = 200, message = "{description.length}") - val description: String, - @field:NotEmpty(message = "{email.notEmpty}") - @field:NotNull(message = "{email.notNull}") - @field:Email(message = "{email.format}") - val email: String, - @field:URL(message = "{site.format}") - @field:NotEmpty(message = "{site.notEmpty}") - @field:NotNull(message = "{site.notNull}") - val site: String -) : AbstractDto() { - - /* - override fun toEntity(): Organization { - return Organization( - null, - name, - displayName, - description, - email, - "", - site, - null - ) - } - */ -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/project/Project.kt b/hub-backend/src/main/java/org/panda_lang/hub/project/Project.kt deleted file mode 100644 index 89da9084..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/project/Project.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import com.fasterxml.jackson.annotation.JsonManagedReference -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer -import org.bson.types.ObjectId -import org.panda_lang.hub.user.Owner -import org.panda_lang.hub.utils.entity.IdentifiableEntity -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.DBRef -import org.springframework.data.mongodb.core.mapping.Document -import java.io.Serializable - -@Document("projects") -data class Project( - val name: String, - @field:DBRef - @field:JsonManagedReference - val owner: Owner, - val platformUri: String, - val website: String -) : IdentifiableEntity, Serializable { - - @Id - @JsonSerialize(using = ToStringSerializer::class) - override var identifier: ObjectId? = null -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectController.kt b/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectController.kt deleted file mode 100644 index 5f529054..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectController.kt +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import io.swagger.annotations.ApiOperation -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudController -import org.springframework.data.domain.PageRequest -import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import kotlin.math.ceil - -private const val PAGE_SIZE = 10 - -@ApiOperation("Operations pertaining to projects") -@RestController -@RequestMapping("/api/projects") -internal class ProjectController( - service: ProjectService -) : AbstractCrudController(service) { - - @ApiOperation("Always returns empty list") - @GetMapping - override fun readAll(): ResponseEntity> { - return ResponseEntity.noContent().build() - } - - @ApiOperation("Returns amount of projects") - @GetMapping("/count") - fun count(): ResponseEntity { - return ResponseEntity.ok(service.count()) - } - - @ApiOperation("Returns amount of pages") - @GetMapping("/page") - fun pages(): ResponseEntity { - return ResponseEntity.ok(ceil(service.count().toDouble() / PAGE_SIZE).toInt()) - } - - @ApiOperation("Returns page with up to $PAGE_SIZE projects") - @GetMapping("/page/{number}") - fun page(@PathVariable number: Int?): ResponseEntity> { - return ResponseEntity.ok( - service - .findAll(PageRequest.of(number!!, PAGE_SIZE)) - .content - ) - } - - @ApiOperation("Returns all repositories that belongs to the requested user") - @GetMapping("/user/{user}") - fun userProjects(@PathVariable user: String?): ResponseEntity?> { - val projects = service.findAllByOwnerName(user) ?: emptyList() - return ResponseEntity.ok(projects) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectRepository.kt deleted file mode 100644 index 636b0720..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectRepository.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.NameableMongoRepository -import org.springframework.stereotype.Repository - -@Repository -internal interface ProjectRepository : NameableMongoRepository { - - fun findAllByOwnerName(name: String?): List? -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectService.kt b/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectService.kt deleted file mode 100644 index 3fa13acc..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectService.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudOperationService -import org.panda_lang.hub.utils.entity.CrudOperationsService -import org.springframework.data.domain.Page -import org.springframework.data.domain.Pageable -import org.springframework.stereotype.Service - -@Service -internal open class ProjectService( - projectRepository: ProjectRepository -) : AbstractCrudOperationService(projectRepository), CrudOperationsService { - - fun findAllByOwnerName(name: String?): List? { - return repository.findAllByOwnerName(name) - } - - fun findAll(pageable: Pageable): Page { - return repository.findAll(pageable) - } - - fun count(): Long { - return repository.count() - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectUpdateDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectUpdateDto.kt deleted file mode 100644 index ba294901..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/project/ProjectUpdateDto.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import org.hibernate.validator.constraints.Length -import org.hibernate.validator.constraints.URL -import org.panda_lang.hub.user.Owner -import org.panda_lang.hub.utils.entity.AbstractDto -import javax.validation.constraints.NotEmpty -import javax.validation.constraints.NotNull - -internal class ProjectUpdateDto( - @field:NotNull(message = "{name.notNull}") - @field:NotEmpty(message = "{name.notEmpty}") - @field:Length(min = 3, max = 32, message = "{name.length}") - override val name: String, - @field:NotNull(message = "{owner.notNull}") - val owner: Owner, - @field:URL(message = "{source.format}") - @field:NotEmpty(message = "{source.notEmpty}") - @field:NotNull(message = "{source.notNull}") - val platformUri: String, - @field:URL(message = "{website.format}") - @field:NotEmpty(message = "{website.notEmpty}") - @field:NotNull(message = "{website.notNull}") - val website: String -) : AbstractDto() { - - override fun toEntity(): Project { - return Project(name, owner, platformUri, website) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/swagger/SwaggerConfiguration.kt b/hub-backend/src/main/java/org/panda_lang/hub/swagger/SwaggerConfiguration.kt deleted file mode 100644 index dfe64783..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/swagger/SwaggerConfiguration.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.swagger - -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import springfox.documentation.builders.ApiInfoBuilder -import springfox.documentation.builders.PathSelectors -import springfox.documentation.service.Contact -import springfox.documentation.spi.DocumentationType -import springfox.documentation.spring.web.plugins.Docket -import springfox.documentation.swagger2.annotations.EnableSwagger2 - -private const val PATH_REGEX = "(?!.*error).*$" - -@Configuration -@EnableSwagger2 -internal open class SwaggerConfiguration { - - @Bean - open fun api(): Docket { - return Docket(DocumentationType.SWAGGER_2) - .select() - .paths(PathSelectors.regex(PATH_REGEX)) - .build() - .apiInfo( - ApiInfoBuilder() - .title("Hub API Documentation") - .version("1.0") - .contact(Contact("Panda", "https://panda-lang.org/", "panda@panda-lang.org")) - .build() - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/AuthenticatedUser.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/AuthenticatedUser.kt deleted file mode 100644 index 5691fb30..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/AuthenticatedUser.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.springframework.security.core.annotation.AuthenticationPrincipal - -@Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.VALUE_PARAMETER) -@AuthenticationPrincipal -@MustBeDocumented -annotation class AuthenticatedUser diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/Owner.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/Owner.kt deleted file mode 100644 index 45924db4..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/Owner.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.IdentifiableEntity -import java.io.Serializable - -interface Owner : IdentifiableEntity, Serializable { - var name: String - var email: String - var displayName: String? - var description: String? - var site: String? - var avatar: String -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/User.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/User.kt deleted file mode 100644 index 619b0c63..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/User.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import com.fasterxml.jackson.annotation.JsonIgnore -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer -import org.bson.types.ObjectId -import org.panda_lang.hub.user.role.Role -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document - -@Document("users") -data class User internal constructor( - override var name: String, - override var displayName: String?, - @field:JsonIgnore - var password: String, - override var description: String?, - override var email: String, - var provider: String, - var providerId: String, - override var avatar: String, - override var site: String?, - private var roles: MutableSet -) : Owner { - - @Id - @JsonSerialize(using = ToStringSerializer::class) - override var identifier: ObjectId? = null - - fun getRoles(): Set { - return roles - } - - fun addRole(role: Role) { - roles.add(role) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserAuthenticationDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserAuthenticationDto.kt deleted file mode 100644 index f5b40b81..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserAuthenticationDto.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.panda_lang.hub.utils.entity.AbstractDto -import javax.validation.constraints.NotEmpty -import javax.validation.constraints.NotNull - -internal class UserAuthenticationDto( - @NotNull - @NotEmpty - override val name: String, - @NotNull - @NotEmpty - val password: String -) : AbstractDto() diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserCommands.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserCommands.kt deleted file mode 100644 index 1bf5769f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserCommands.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.shell.standard.ShellComponent -import org.springframework.shell.standard.ShellMethod - -@ShellComponent -internal class UserCommands( - private val userRepository: UserRepository, - private val passwordEncoder: PasswordEncoder -) { - - @ShellMethod(value = "Adds user", key = ["useradd"]) - fun addUserCommand(name: String): String { - if (userRepository.existsByName(name)) { - return "User already exists" - } - - val user: User = userRepository.save( - User( - name, - name, - "", - "", - "", - "", - "", - "", - "", - HashSet() - ) - ) - - return "Created user: " + user.name - } - - @ShellMethod(value = "Sets user's password", key = ["passwd"]) - fun setPasswordCommand(name: String, password: String): String { - val user = userRepository.findByName(name) ?: return "User not found!" - - user.password = passwordEncoder.encode(password) - userRepository.save(user) - - return "Set password for user: $name" - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserConfiguration.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserConfiguration.kt deleted file mode 100644 index e5f069a5..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserConfiguration.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.panda_lang.hub.authentication.OAuth2UserDetailsService -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.security.crypto.password.PasswordEncoder - -@Configuration -internal open class UserConfiguration { - - @Bean - open fun authenticationUserDetailsService(userRepository: UserRepository): UserDetailsService { - return UserDetailsService(userRepository) - } - - @Bean - open fun defaultOAuth2UserService(userRepository: UserRepository): OAuth2UserDetailsService { - return UserOAuth2DetailsService(userRepository) - } - - @Bean - open fun userFacade(passwordEncoder: PasswordEncoder, userRepository: UserRepository): UserFacade { - return UserFacade(passwordEncoder, userRepository) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserController.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserController.kt deleted file mode 100644 index e9870a16..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserController.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import io.swagger.annotations.ApiOperation -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudController -import org.springframework.http.ResponseEntity -import org.springframework.security.access.prepost.PreAuthorize -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController - -@ApiOperation("Operations pertaining to user") -@RestController -@RequestMapping("/api/users") -internal open class UserController( - service: UserService -) : AbstractCrudController(service) { - - @PreAuthorize("isAuthenticated()") - @GetMapping("/me") - fun me(@AuthenticatedUser user: UserDetails): ResponseEntity { - return ResponseEntity.ok(user.user) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetails.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetails.kt deleted file mode 100644 index 649b03d7..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetails.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.springframework.security.core.GrantedAuthority -import org.springframework.security.core.authority.SimpleGrantedAuthority -import org.springframework.security.oauth2.core.user.OAuth2User - -class UserDetails : org.springframework.security.core.userdetails.User, OAuth2User { - val user: User - private var attributes: Map? = null - - constructor(user: User, username: String?, password: String?, enabled: Boolean, accountNonExpired: Boolean, credentialsNonExpired: Boolean, accountNonLocked: Boolean, authorities: Collection?) : super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities) { - this.user = user - } - - constructor(user: User, username: String?, password: String?, authorities: Collection?) : super(username, password, authorities) { - this.user = user - } - - fun setAttributes(attributes: Map?) { - this.attributes = attributes - } - - override fun getAttributes(): Map { - return attributes!! - } - - override fun getName(): String { - return user.identifier!!.toHexString() - } - - companion object { - fun of(user: User): UserDetails { - return UserDetails(user, user.name, user.password, listOf(SimpleGrantedAuthority("ROLE_USER"))) - } - - fun of(user: User, attributes: Map?): UserDetails { - val userDetails = of(user) - userDetails.setAttributes(attributes) - return userDetails - } - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetailsService.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetailsService.kt deleted file mode 100644 index cc7671c6..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserDetailsService.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.panda_lang.hub.authentication.AuthenticationUserDetailsService -import org.panda_lang.hub.user.role.Role -import org.springframework.lang.Nullable -import org.springframework.security.core.GrantedAuthority -import org.springframework.security.core.authority.SimpleGrantedAuthority -import org.springframework.security.core.userdetails.UsernameNotFoundException -import org.springframework.stereotype.Service - -@Service -class UserDetailsService( - private val userRepository: UserRepository -) : AuthenticationUserDetailsService { - - override fun loadUserByUsername(name: String): UserDetails { - val user = userRepository.findByName(name) ?: throw UsernameNotFoundException("No user found with that username.") - return toUserDetails(user) - } - - override fun loadUserById(id: ObjectId): UserDetails { - val user = userRepository.findByIdentifier(id) ?: throw UsernameNotFoundException("No user found with that id.") - return toUserDetails(user) - } - - private fun getAuthoritiesByRoles(@Nullable roles: Set?): Set { - return roles - ?.filterNotNull() - ?.map { role: Role -> SimpleGrantedAuthority(role.name) } - ?.toSet() - ?: emptySet() - } - - private fun toUserDetails(user: User): UserDetails { - return UserDetails(user, user.name, user.password, getAuthoritiesByRoles(user.getRoles())) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserFacade.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserFacade.kt deleted file mode 100644 index 2aad7d7c..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserFacade.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.panda_lang.hub.authentication.SignUpDto -import org.springframework.http.HttpStatus -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.web.server.ResponseStatusException -import org.springframework.web.servlet.support.ServletUriComponentsBuilder -import java.net.URI - -class UserFacade internal constructor( - private val passwordEncoder: PasswordEncoder, - private val userRepository: UserRepository -) { - - fun register(dto: SignUpDto): URI { - if (userRepository.existsByName(dto.name) || userRepository.existsByEmail(dto.email)) { - throw ResponseStatusException(HttpStatus.CONFLICT) - } - - val user = userRepository.save( - User( - dto.name, - dto.displayName, - passwordEncoder.encode(dto.password), - "", - dto.email, - "local", - "", - "", - "", - HashSet() - ) - ) - - return ServletUriComponentsBuilder - .fromCurrentContextPath() - .path("/api/user/{id}") - .buildAndExpand(user.identifier) - .toUri() - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserOAuth2DetailsService.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserOAuth2DetailsService.kt deleted file mode 100644 index d32fb370..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserOAuth2DetailsService.kt +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.panda_lang.hub.authentication.OAuth2UserDetails -import org.panda_lang.hub.authentication.OAuth2UserDetailsFactory -import org.panda_lang.hub.authentication.OAuth2UserDetailsService -import org.panda_lang.utilities.commons.StringUtils -import org.springframework.security.authentication.InternalAuthenticationServiceException -import org.springframework.security.core.AuthenticationException -import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService -import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest -import org.springframework.security.oauth2.core.user.OAuth2User - -internal class UserOAuth2DetailsService( - private val userRepository: UserRepository -) : DefaultOAuth2UserService(), OAuth2UserDetailsService { - - override fun loadUser(userRequest: OAuth2UserRequest?): OAuth2User { - val user = super.loadUser(userRequest) - - return try { - this.loadUser(userRequest!!, user) - } catch (exception: AuthenticationException) { - throw exception - } catch (exception: Exception) { - throw InternalAuthenticationServiceException(exception.message, exception.cause) - } - } - - private fun loadUser(userRequest: OAuth2UserRequest, oAuth2User: OAuth2User): OAuth2User { - val providerName: String = userRequest.clientRegistration.registrationId - val userDetails: OAuth2UserDetails = OAuth2UserDetailsFactory.obtainOAuth2UserDetails(providerName, oAuth2User.attributes) - - if (StringUtils.isEmpty(userDetails.email)) { - throw RuntimeException("There is no user with that email in provider's system") - } - - var user: User? = userRepository.findByName(userDetails.name) - - user = if (user != null) { - if (providerName != user.provider) { - throw RuntimeException("Looks like you're already signed up with " + user.provider + " account.") - } - - updateExistingUser(user, userDetails) - } else { - createNewUser(userRequest, userDetails) - } - - return UserDetails.of(user, oAuth2User.attributes) - } - - private fun createNewUser(userRequest: OAuth2UserRequest, userDetails: OAuth2UserDetails): User { - val user = User( - userDetails.name, - userDetails.displayName ?: StringUtils.EMPTY, - StringUtils.EMPTY, - StringUtils.EMPTY, - userDetails.email, - userRequest.clientRegistration.registrationId, - userDetails.providerId, - userDetails.avatar ?: StringUtils.EMPTY, - StringUtils.EMPTY, - HashSet() - ) - - return userRepository.save(user) - } - - private fun updateExistingUser(user: User, userDetails: OAuth2UserDetails): User { - return userRepository.save( - user.apply { - name = userDetails.name - displayName = userDetails.displayName ?: StringUtils.EMPTY - avatar = userDetails.avatar ?: StringUtils.EMPTY - } - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserRegistrationDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserRegistrationDto.kt deleted file mode 100644 index c78a3cad..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserRegistrationDto.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.hibernate.validator.constraints.Length -import org.panda_lang.hub.utils.entity.AbstractDto -import org.panda_lang.hub.utils.validation.FieldMatch -import javax.validation.constraints.Email -import javax.validation.constraints.NotEmpty -import javax.validation.constraints.NotNull - -@FieldMatch.AsList( - FieldMatch(first = "password", second = "confirmPassword", message = "{match.password}"), - FieldMatch(first = "email", second = "confirmEmail", message = "{match.email}") -) -data class UserRegistrationDto( - @field:NotEmpty(message = "{username.notEmpty}") - @field:NotNull(message = "{username.notNull}") - @field:Length(min = 3, max = 32, message = "{username.length}") - override val name: String, - @field:NotEmpty(message = "{displayName.notEmpty}") - @field:NotNull(message = "{displayName.notNull}") - @field:Length(min = 3, max = 32, message = "{displayName.length}") - val displayName: String, - @NotEmpty(message = "{password.notEmpty}") - @NotNull(message = "{password.notNull}") - @Length(min = 6, message = "{password.length}") - val password: String, - val confirmPassword: String, - @NotEmpty(message = "{email.notEmpty}") - @NotNull(message = "{email.notNull}") - @Email(message = "{email.format}") - val email: String, - val confirmEmail: String -) : AbstractDto() { - - override fun toEntity(): User { - return User( - name, - displayName, - password, - email, - "", - "", - "", - "", - "", - HashSet() - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserRepository.kt deleted file mode 100644 index 835bca03..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserRepository.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.NameableMongoRepository -import org.springframework.stereotype.Repository - -@Repository -interface UserRepository : NameableMongoRepository { - - fun existsByEmail(email: String?): Boolean -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserService.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserService.kt deleted file mode 100644 index c7823d6b..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserService.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.CrudOperationsService - -interface UserService : CrudOperationsService { - - fun initializeUser(user: User): User -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserServiceImpl.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserServiceImpl.kt deleted file mode 100644 index 75fff99a..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserServiceImpl.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.panda_lang.hub.user.role.RoleFactory -import org.panda_lang.hub.utils.entity.AbstractCrudOperationService -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.stereotype.Service - -@Service -internal class UserServiceImpl( - userRepository: UserRepository, - private val passwordEncoder: PasswordEncoder, - private val roleFactory: RoleFactory -) : AbstractCrudOperationService(userRepository), UserService { - - override fun initializeUser(user: User): User { - return save( - user.apply { - password = passwordEncoder.encode(user.password) - addRole(roleFactory.obtainRole("USER")) - } - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/UserUpdateDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/UserUpdateDto.kt deleted file mode 100644 index da2d182d..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/UserUpdateDto.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.hibernate.validator.constraints.Length -import org.hibernate.validator.constraints.URL -import org.panda_lang.hub.utils.entity.AbstractDto -import javax.validation.constraints.Email -import javax.validation.constraints.NotEmpty -import javax.validation.constraints.NotNull - -internal class UserUpdateDto( - @field:NotEmpty(message = "{username.notEmpty}") - @field:NotNull(message = "{username.notNull}") - @field:Length(min = 3, max = 32, message = "{username.length}") - override val name: String, - @field:NotEmpty(message = "{displayName.notEmpty}") - @field:NotNull(message = "{displayName.notNull}") - @field:Length(min = 3, max = 32, message = "{displayName.length}") - val displayName: String, - @field:NotEmpty(message = "{password.notEmpty}") - @field:NotNull(message = "{password.notNull}") - @field:Length(min = 6, message = "{password.length}") - val password: String, - @field:NotEmpty(message = "{description.notEmpty}") - @field:NotNull(message = "{description.notNull}") - @field:Length(max = 200, message = "{description.length}") - val description: String, - @field:NotEmpty(message = "{email.notEmpty}") - @field:NotNull(message = "{email.notNull}") - @field:Email(message = "{email.format}") - val email: String, - @field:URL(message = "{site.format}") - @field:NotEmpty(message = "{site.notEmpty}") - @field:NotNull(message = "{site.notNull}") - val site: String -) : AbstractDto() { - - override fun toEntity(): User { - return User( - name, - displayName, - password, - description, - email, - "", - "", - "", - site, - HashSet() - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsAdmin.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsAdmin.kt deleted file mode 100644 index 3d428c62..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsAdmin.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.springframework.security.access.prepost.PreAuthorize - -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) -@MustBeDocumented -@Retention(AnnotationRetention.RUNTIME) -@PreAuthorize("hasAuthority('ADMIN')") -annotation class IsAdmin diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsUser.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsUser.kt deleted file mode 100644 index 88e4d964..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/IsUser.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.springframework.security.access.prepost.PreAuthorize - -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) -@MustBeDocumented -@Retention(AnnotationRetention.RUNTIME) -@PreAuthorize("hasAuthority('USER')") -annotation class IsUser diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/Role.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/Role.kt deleted file mode 100644 index f3b7b1dd..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/Role.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document - -@Document("roles") -data class Role( - @field:Id var name: String -) diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleCommands.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleCommands.kt deleted file mode 100644 index e3a0a3b8..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleCommands.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.panda_lang.hub.user.UserRepository -import org.springframework.shell.standard.ShellComponent -import org.springframework.shell.standard.ShellMethod - -@ShellComponent -internal class RoleCommands( - private val roleRepository: RoleRepository, - private val userRepository: UserRepository -) { - - @ShellMethod(value = "Lists all roles", key = ["roles"]) - fun roles(): String { - return roleRepository.findAll() - .filterNotNull() - .joinToString { obj: Role -> obj.name } - } - - @ShellMethod(value = "Sets role for the specified user", key = ["chrole"]) - fun setRole(username: String, role: String): String { - val roleValue = roleRepository.findById(role) - - if (!roleValue.isPresent) { - return "Role '$role' does not exist" - } - - val user = userRepository.findByName(username) ?: return "User not found" - - user.addRole(roleValue.get()) - userRepository.save(user) - - return "Set role `$role` for user: $username" - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleFactory.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleFactory.kt deleted file mode 100644 index 1e9ac728..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleFactory.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.springframework.stereotype.Component - -@Component -class RoleFactory( - private val roleRepository: RoleRepository -) { - - fun obtainRole(roleName: String): Role { - return roleRepository - .findById(roleName) - .orElseGet { roleRepository.save(Role(roleName)) }!! - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleInitializer.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleInitializer.kt deleted file mode 100644 index 70c9188e..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleInitializer.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.panda_lang.utilities.commons.collection.Sets -import org.springframework.context.ApplicationListener -import org.springframework.context.event.ContextRefreshedEvent -import org.springframework.stereotype.Component - -@Component -internal class RoleInitializer( - private val roleRepository: RoleRepository -) : ApplicationListener { - - override fun onApplicationEvent(contextRefreshedEvent: ContextRefreshedEvent) { - roleRepository.saveAll( - Sets.newHashSet( - Role("USER"), - Role("ADMIN"), - Role("MOD"), - Role("BOT") - ) - ) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleRepository.kt deleted file mode 100644 index 41b8f5de..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/user/role/RoleRepository.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.springframework.data.mongodb.repository.MongoRepository - -interface RoleRepository : MongoRepository diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/BeanUtil.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/BeanUtil.kt deleted file mode 100644 index b2b2a910..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/BeanUtil.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils - -import org.springframework.beans.BeanUtils -import org.springframework.beans.BeanWrapper -import org.springframework.beans.BeanWrapperImpl -import java.beans.PropertyDescriptor - -object BeanUtil { - - private fun getNullPropertyNames(source: T): Array { - val src: BeanWrapper = BeanWrapperImpl(source) - val propertyDescriptors: Array = src.propertyDescriptors - - return propertyDescriptors - .filter { propertyDescriptor: PropertyDescriptor -> src.getPropertyValue(propertyDescriptor.name) == null } - .map { obj: PropertyDescriptor -> obj.name } - .distinct() - .toTypedArray() - } - - fun copyNonNullProperties(source: T?, target: T?) { - if (source == null || target == null) { - return - } - - BeanUtils.copyProperties(source, target, *getNullPropertyNames(source)) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/Buildable.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/Buildable.kt deleted file mode 100644 index efdbb7b4..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/Buildable.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils - -import java.io.Serializable - -@FunctionalInterface -interface Buildable { - - fun build(): T -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/Converter.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/Converter.kt deleted file mode 100644 index 382356eb..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/Converter.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.converter - -@FunctionalInterface -internal interface Converter { - - fun convert(value: T): R -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/ObjectToMapConverter.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/ObjectToMapConverter.kt deleted file mode 100644 index eeb55945..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/converter/ObjectToMapConverter.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.converter - -import com.fasterxml.jackson.core.type.TypeReference -import com.fasterxml.jackson.databind.ObjectMapper - -private val OBJECT_MAPPER = ObjectMapper() - -class ObjectToMapConverter : Converter, Any?> { - - override fun convert(value: Any?): Map { - return OBJECT_MAPPER.convertValue>(value!!, object : TypeReference>() {}) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudController.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudController.kt deleted file mode 100644 index c6761159..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudController.kt +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -import io.swagger.annotations.ApiOperation -import io.swagger.annotations.ApiParam -import io.swagger.annotations.ApiResponse -import io.swagger.annotations.ApiResponses -import org.panda_lang.hub.utils.BeanUtil -import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity -import org.springframework.security.access.prepost.PreAuthorize -import org.springframework.validation.BindingResult -import org.springframework.web.bind.annotation.DeleteMapping -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PatchMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.PutMapping -import org.springframework.web.bind.annotation.RequestBody -import java.util.Optional -import javax.validation.Valid - -private const val SPEL_EXPRESSION = "(isAuthenticated() && principal.user.identifier.equals(#id)) || hasAuthority('ADMIN')" - -/** - * Default implementation of crud controller - * - * @param type of entity - * @param type of id - * @param type of update dto - * @param type of create dto - */ -abstract class AbstractCrudController( - protected open val service: S -) where -S : CrudOperationsService, - T : IdentifiableEntity, - U : AbstractDto, - C : AbstractDto { - - @ApiOperation("Displays all entities") - @GetMapping - protected open fun readAll(): ResponseEntity> { - return ResponseEntity.ok(service.findAll()) - } - - @ApiOperation("Displays specified entity by it's identifier") - @ApiResponses( - ApiResponse(code = 404, message = "Entity could not be found"), - ApiResponse(code = 200, message = "Entity found and displayed") - ) - @GetMapping("/{id}") - fun read(@PathVariable @ApiParam("Entity identifier") id: ID): ResponseEntity { - return Optional.ofNullable(service.findById(id)) - .map { body: T -> ResponseEntity.ok(body) } - .orElseGet { ResponseEntity.notFound().build() } - } - - @ApiOperation("Creates entity") - @ApiResponses( - ApiResponse(code = 409, message = "Entity already exists"), - ApiResponse(code = 400, message = "Validation error occurred"), - ApiResponse(code = 201, message = "Entity created") - ) - @PostMapping - protected fun create(@RequestBody @ApiParam("Entity data transfer object") dto: @Valid C, result: BindingResult): ResponseEntity<*> { - return createEntity(dto, result) - } - - @ApiOperation("Updates entity") - @ApiResponses( - ApiResponse(code = 201, message = "Entity created"), - ApiResponse(code = 400, message = "Validation error occurred"), - ApiResponse(code = 204, message = "Entity updated") - ) - @PreAuthorize(SPEL_EXPRESSION) - @PutMapping("/{id}") - protected fun update(@RequestBody @ApiParam("Entity data transfer object") dto: @Valid U, @PathVariable @ApiParam("Entity identifier") id: ID, result: BindingResult): ResponseEntity<*> { - val entity: T = service.findById(id) ?: return createEntity(dto, result) - - if (result.hasErrors()) { - return ResponseEntity.badRequest().build() - } - - BeanUtil.copyNonNullProperties(dto.toEntity(), entity) - service.save(entity) - - return ResponseEntity - .status(HttpStatus.NO_CONTENT) - .build() - } - - @ApiOperation("Partial updates entity") - @ApiResponses( - ApiResponse(code = 404, message = "Entity could not be found"), - ApiResponse(code = 204, message = "Entity updated") - ) - @PreAuthorize(SPEL_EXPRESSION) - @PatchMapping("/{id}") - protected fun partialUpdate(@RequestBody @ApiParam("Entity data transfer object") dto: U, @PathVariable @ApiParam("Entity identifier") id: ID): ResponseEntity { - val optionalEntity: T = service.findById(id) ?: return ResponseEntity.notFound().build() - - BeanUtil.copyNonNullProperties(dto.toEntity(), optionalEntity) - service.save(optionalEntity) - - return ResponseEntity.noContent().build() - } - - @ApiOperation("Deletes entity") - @ApiResponses( - ApiResponse(code = 404, message = "Entity could not be found"), - ApiResponse(code = 204, message = "Entity deleted") - ) - @PreAuthorize(SPEL_EXPRESSION) - @DeleteMapping("/{id}") - protected fun remove(@PathVariable @ApiParam("Entity identifier") id: ID): ResponseEntity { - if (!service.existsById(id)) { - return ResponseEntity.notFound().build() - } - - service.deleteById(id) - return ResponseEntity.noContent().build() - } - - private fun > createEntity(dto: X, result: BindingResult): ResponseEntity<*> { - val entity: T = dto.toEntity() - - service.findByName(dto.name) ?: run { - return ResponseEntity - .status(HttpStatus.CONFLICT) - .build() - } - - if (result.hasErrors()) { - return ResponseEntity - .badRequest() - .build() - } - - return ResponseEntity - .status(HttpStatus.CREATED) - .body(service.save(entity)) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudOperationService.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudOperationService.kt deleted file mode 100644 index 2e4cf81f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractCrudOperationService.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -abstract class AbstractCrudOperationService, E : IdentifiableEntity, ID>( - protected val repository: R -) : CrudOperationsService { - - override fun findByName(name: String): E? { - return repository.findByName(name) - } - - override fun findById(id: ID): E? { - return repository.findByIdentifier(id) - } - - override fun findAll(): List { - return repository.findAll() - } - - override fun save(entity: S): S { - return repository.save(entity) - } - - override fun deleteById(id: ID) { - repository.deleteById(id) - } - - override fun existsById(id: ID): Boolean { - return repository.existsById(id) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractDto.kt deleted file mode 100644 index 7ff77e97..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/AbstractDto.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -import com.fasterxml.jackson.annotation.JsonIgnore - -abstract class AbstractDto?> : JsonDto() { - - @get:JsonIgnore - abstract val name: String - - open fun toEntity(): T { - throw UnsupportedOperationException() - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/CrudOperationsService.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/CrudOperationsService.kt deleted file mode 100644 index ca67069f..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/CrudOperationsService.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -interface CrudOperationsService, ID> { - - fun findByName(name: String): T? - - fun findById(id: ID): T? - - fun findAll(): List - - fun save(entity: S): S - - fun deleteById(id: ID) - - fun existsById(id: ID): Boolean -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/IdentifiableEntity.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/IdentifiableEntity.kt deleted file mode 100644 index c7844875..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/IdentifiableEntity.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -@FunctionalInterface -interface IdentifiableEntity { - - val identifier: ID? -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/JsonDto.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/JsonDto.kt deleted file mode 100644 index b8cd1809..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/JsonDto.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -import com.fasterxml.jackson.core.JsonProcessingException -import com.fasterxml.jackson.databind.ObjectMapper - -open class JsonDto { - - fun toJson(): String? { - return try { - return ObjectMapper().writer().writeValueAsString(this) - } catch (e: JsonProcessingException) { - e.printStackTrace() - null - } - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/NameableMongoRepository.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/NameableMongoRepository.kt deleted file mode 100644 index 7bc76c02..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/entity/NameableMongoRepository.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -import org.springframework.data.mongodb.repository.MongoRepository -import org.springframework.data.repository.NoRepositoryBean - -@NoRepositoryBean -interface NameableMongoRepository, ID> : MongoRepository { - - fun findByName(name: String): T? - - fun findByIdentifier(id: ID): T? - - fun existsByName(name: String): Boolean -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/Buildable.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/Buildable.kt deleted file mode 100644 index 4f264f8b..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/Buildable.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.helper - -interface Buildable { - - fun build(): T -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/CookieHelper.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/CookieHelper.kt deleted file mode 100644 index ae1dd406..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/helper/CookieHelper.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.helper - -import org.springframework.util.SerializationUtils -import java.util.Base64 -import java.util.Optional -import javax.servlet.http.Cookie -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -object CookieHelper { - - fun removeCookie(cookieName: String, servletRequest: HttpServletRequest, servletResponse: HttpServletResponse) { - obtainCookie(cookieName, servletRequest.cookies).ifPresent { appendCookie(cookieName, "", 0, servletResponse) } - } - - fun appendCookie(cookieName: String?, cookieValue: String?, maxAge: Int, servletResponse: HttpServletResponse) { - val cookie = Cookie(cookieName, cookieValue).also { - it.path = "/" - it.isHttpOnly = true - it.maxAge = maxAge - } - servletResponse.addCookie(cookie) - } - - fun obtainCookie(cookieName: String, cookies: Array?): Optional { - val foundCookie = cookies?.let { cookie -> - cookie.firstOrNull { it.name == cookieName } - } - - return foundCookie?.let { Optional.of(it) } - ?: Optional.empty() - } - - fun serialize(value: Any?): String { - return Base64.getUrlEncoder().encodeToString(SerializationUtils.serialize(value)) - } - - fun deserialize(cookie: Cookie?, clazz: Class): T { - return clazz.cast(SerializationUtils.deserialize(Base64.getUrlDecoder().decode(cookie!!.value))) - } -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatch.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatch.kt deleted file mode 100644 index fae232c3..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatch.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.validation - -import javax.validation.Constraint -import javax.validation.Payload -import kotlin.reflect.KClass - -@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS) -@Retention(AnnotationRetention.RUNTIME) -@Constraint(validatedBy = [FieldMatchValidator::class]) -annotation class FieldMatch( - val message: String = "", - val first: String, - val second: String, - val groups: Array> = [], - val payload: Array> = [] -) { - - @Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS) - @Retention(AnnotationRetention.RUNTIME) - annotation class AsList( - vararg val value: FieldMatch - ) -} diff --git a/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatchValidator.kt b/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatchValidator.kt deleted file mode 100644 index d49d56d6..00000000 --- a/hub-backend/src/main/java/org/panda_lang/hub/utils/validation/FieldMatchValidator.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.validation - -import org.apache.commons.beanutils.BeanUtils -import java.lang.reflect.InvocationTargetException -import javax.validation.ConstraintValidator -import javax.validation.ConstraintValidatorContext - -class FieldMatchValidator : ConstraintValidator { - - private var firstFieldName: String? = null - private var secondFieldName: String? = null - - override fun initialize(constraintAnnotation: FieldMatch) { - firstFieldName = constraintAnnotation.first - secondFieldName = constraintAnnotation.second - } - - override fun isValid(value: Any?, context: ConstraintValidatorContext): Boolean { - try { - val firstObj: Any? = BeanUtils.getProperty(value, firstFieldName) - val secondObj: Any? = BeanUtils.getProperty(value, secondFieldName) - return firstObj == null && secondObj == null || firstObj != null && firstObj == secondObj - } catch (ex: IllegalAccessException) { - ex.printStackTrace() - } catch (ex: InvocationTargetException) { - ex.printStackTrace() - } catch (ex: NoSuchMethodException) { - ex.printStackTrace() - } - - return true - } -} diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/ApplicationConfiguration.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/ApplicationConfiguration.kt new file mode 100644 index 00000000..d260c24a --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/ApplicationConfiguration.kt @@ -0,0 +1,77 @@ +package org.panda_lang.hub + +import com.typesafe.config.ConfigFactory +import io.ktor.application.* +import io.ktor.config.* +import io.ktor.features.* +import io.ktor.http.* +import io.ktor.locations.* +import io.ktor.routing.* +import io.ktor.serialization.* +import io.ktor.server.engine.* +import io.ktor.server.netty.* +import kotlinx.serialization.json.Json +import org.panda_lang.hub.auth.* +import org.litote.kmongo.reactivestreams.* +import org.litote.kmongo.coroutine.* +import org.panda_lang.hub.user.configureUsers +import org.panda_lang.hub.user.installUserRouting + +const val SERVER_PORT = 8080 + +val config = HoconApplicationConfig(ConfigFactory.load()) + +val frontendConfiguration = FrontendConfiguration( + config.property("frontend.url").getString(), + config.property("frontend.authUrl").getString(), +) + +@EngineAPI +fun setup(): BaseApplicationEngine { + return server(Netty) +} + +@EngineAPI +private fun server( + engine: ApplicationEngineFactory +): BaseApplicationEngine { + return embeddedServer( + engine, + port = SERVER_PORT, + module = Application::module, + watchPaths = listOf("classes") + ) +} + +fun Application.module() { + install(DefaultHeaders) + install(CallLogging) + install(Locations) + install(ContentNegotiation) { + json(Json { + prettyPrint = true + }) + } + install(CORS) { + method(HttpMethod.Options) + method(HttpMethod.Put) + method(HttpMethod.Delete) + method(HttpMethod.Patch) + header(HttpHeaders.Authorization) + allowCredentials = true + allowNonSimpleContentTypes = true + anyHost() + } + + + val mongoClient = KMongo.createClient(config.property("mongo.url").getString()).coroutine + val database = mongoClient.getDatabase("hub") + + val userFacade = configureUsers(this, database) + val authFacade = configureAuthentication(this, userFacade) + + install(Routing) { + installUserRouting(this, userFacade) + installAuthRouting(this, authFacade) + } +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/ErrorResponse.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/ErrorResponse.kt new file mode 100644 index 00000000..80a30e80 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/ErrorResponse.kt @@ -0,0 +1,8 @@ +package org.panda_lang.hub + +import kotlinx.serialization.Serializable + +@Serializable +data class ErrorResponse( + val message: String +) \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/FrontendConfiguration.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/FrontendConfiguration.kt new file mode 100644 index 00000000..ec37710a --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/FrontendConfiguration.kt @@ -0,0 +1,6 @@ +package org.panda_lang.hub + +data class FrontendConfiguration( + val url: String, + val authUrl: String +) diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/HubApplication.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/HubApplication.kt new file mode 100644 index 00000000..ea40a644 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/HubApplication.kt @@ -0,0 +1,14 @@ +package org.panda_lang.hub + +import io.ktor.locations.* +import io.ktor.server.engine.* +import io.ktor.util.* +import java.security.Security + +@EngineAPI +fun main() { + System.setProperty("io.ktor.random.secure.random.provider", "DRBG") + Security.setProperty("securerandom.drbg.config", "HMAC_DRBG,SHA-512,256,pr_and_reseed") + + setup().start(wait = true) +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthConfiguration.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthConfiguration.kt new file mode 100644 index 00000000..550976bf --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthConfiguration.kt @@ -0,0 +1,78 @@ +package org.panda_lang.hub.auth + +import com.auth0.jwt.JWT +import com.auth0.jwt.algorithms.Algorithm +import io.ktor.application.* +import io.ktor.auth.* +import io.ktor.auth.jwt.* +import io.ktor.client.* +import io.ktor.client.engine.apache.* +import io.ktor.locations.* +import io.ktor.routing.* +import org.panda_lang.hub.config +import org.panda_lang.hub.frontendConfiguration +import org.panda_lang.hub.user.UserFacade +import java.security.SecureRandom +import java.util.concurrent.TimeUnit + +internal val loginProviders = listOf( + OAuthServerSettings.OAuth2ServerSettings( + name = "github", + authorizeUrl = "https://github.com/login/oauth/authorize", + accessTokenUrl = "https://github.com/login/oauth/access_token", + clientId = config.property("github.clientId").getString(), + clientSecret = config.property("github.clientSecret").getString(), + passParamsInURL = false + ) +).associateBy { it.name } + +fun configureAuthentication(app: Application, userFacade: UserFacade): AuthFacade { + val secureRandom = SecureRandom() + val jwtSecret = ByteArray(512) + secureRandom.nextBytes(jwtSecret) + + val jwtConfiguration = JwtConfiguration( + config.property("jwt.issuer").getString(), + config.property("jwt.audience").getString(), + config.property("jwt.realm").getString(), + TimeUnit.DAYS.toMillis(config.property("jwt.ttl").getString().toLong()), + Algorithm.HMAC512("2137") + ) + + val authService = AuthFacade(jwtConfiguration, userFacade) + + app.install(Authentication) { + oauth("oauth") { + client = HttpClient(Apache).apply { + app.environment.monitor.subscribe(ApplicationStopping) { + close() + } + } + providerLookup = { + loginProviders[application.locations.resolve(AuthorizeLocation::class, this).type] + } + urlProvider = { url(AuthorizeLocation(it.name)) } + } + jwt("jwt") { + realm = jwtConfiguration.realm + verifier( + JWT.require(jwtConfiguration.algorithm) + .withIssuer(jwtConfiguration.issuer) + .withAudience(jwtConfiguration.audience) + .build() + ) + validate { jwtCredential -> + if (authService.isAuthenticated(jwtCredential)) + JWTPrincipal(jwtCredential.payload) + else null + } + } + } + + return authService +} + +fun installAuthRouting(routing: Routing, authFacade: AuthFacade) { + val authEndpoint = AuthEndpoint(frontendConfiguration, authFacade) + routing.routes(authEndpoint) +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthEndpoint.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthEndpoint.kt new file mode 100644 index 00000000..dbfed8fd --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthEndpoint.kt @@ -0,0 +1,27 @@ +package org.panda_lang.hub.auth + +import io.ktor.application.* +import io.ktor.auth.* +import io.ktor.http.* +import io.ktor.response.* +import org.panda_lang.hub.ErrorResponse +import org.panda_lang.hub.FrontendConfiguration + +internal class AuthEndpoint( + private val frontendConfiguration: FrontendConfiguration, + private val authFacade: AuthFacade +) { + + suspend fun authorize(ctx: ApplicationCall, oauthResponse: OAuthAccessTokenResponse) { + when (oauthResponse) { + is OAuthAccessTokenResponse.OAuth2 -> { + val response = authFacade.authenticate(oauthResponse.accessToken) + println(response.jwt) + ctx.respondRedirect("${frontendConfiguration.authUrl}/?token=${response.jwt}") + } + is OAuthAccessTokenResponse.OAuth1a -> + ctx.respond(HttpStatusCode.Unauthorized, ErrorResponse("OAuth1 is not supported")) + } + } + +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthFacade.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthFacade.kt new file mode 100644 index 00000000..fbeb3ff7 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthFacade.kt @@ -0,0 +1,64 @@ +package org.panda_lang.hub.auth + +import com.auth0.jwt.JWT +import io.ktor.auth.jwt.* +import io.ktor.client.* +import io.ktor.client.features.json.* +import io.ktor.client.request.* +import io.ktor.http.* +import org.panda_lang.hub.github.GitHubUser +import org.panda_lang.hub.github.USER_INFO_URL +import org.panda_lang.hub.user.UserFacade +import java.util.* +import kotlin.collections.HashSet + +class AuthFacade internal constructor( + private val jwtConfiguration: JwtConfiguration, + private val userFacade: UserFacade +) { + + private val authenticated = HashSet() + + private val githubClient = HttpClient { + install(JsonFeature) { + accept(ContentType.Application.Json) + } + } + + suspend fun authenticate(oauthToken: String): AuthResponse { + val userInfo = requestGitHubApi(USER_INFO_URL, oauthToken) + val user = userFacade.fetchUser(userInfo) + + val jwtToken = JWT.create() + .withSubject("Authentication") + .withIssuer(jwtConfiguration.issuer) + .withAudience(jwtConfiguration.audience) + .withClaim(OAUTH2_CLAIM, oauthToken) + .withClaim(ID_CLAIM, userInfo.id) + .withClaim(NAME_CLAIM, userInfo.login) + .withExpiresAt(Date(System.currentTimeMillis() + jwtConfiguration.ttl)) + .sign(jwtConfiguration.algorithm) + + authenticated.add(oauthToken) + return AuthResponse(jwtToken, user) + } + + private fun fetchOAuth2(jwt: JWTCredential): String = + jwt.payload.getClaim(OAUTH2_CLAIM).asString() + + fun invalidateToken(jwt: JWTCredential) = + authenticated.remove(fetchOAuth2(jwt)) + + fun isAuthenticated(jwt: JWTCredential): Boolean = + authenticated.contains(fetchOAuth2(jwt)) + + private suspend inline fun requestGitHubApi(request: String, accessToken: String): T { + return githubClient.get(request) { + headers { + header("Authorization", "token $accessToken") + header("Accept", "application/vnd.github.v3+json") + } + } + } + +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthResponse.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthResponse.kt new file mode 100644 index 00000000..fea5c457 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthResponse.kt @@ -0,0 +1,10 @@ +package org.panda_lang.hub.auth + +import kotlinx.serialization.Serializable +import org.panda_lang.hub.user.User + +@Serializable +data class AuthResponse( + val jwt: String, + val user: User +) \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthRouter.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthRouter.kt new file mode 100644 index 00000000..af7f132c --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/AuthRouter.kt @@ -0,0 +1,28 @@ +package org.panda_lang.hub.auth + +import io.ktor.application.* +import io.ktor.auth.* +import io.ktor.locations.* +import io.ktor.routing.* + +internal const val ERROR_PARAMETER = "error" + +@Location("/authorize/{type?}") +internal class AuthorizeLocation(val type: String = "") + +internal fun Routing.routes(authEndpoint: AuthEndpoint) { + authenticate("oauth") { + location { + param(ERROR_PARAMETER) { + handle { + call.parameters.getAll(ERROR_PARAMETER).orEmpty() + } + } + handle { + call.authentication.principal()?.let { + authEndpoint.authorize(this.context, it) + } + } + } + } +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtClaims.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtClaims.kt new file mode 100644 index 00000000..fdcb0b06 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtClaims.kt @@ -0,0 +1,5 @@ +package org.panda_lang.hub.auth + +const val OAUTH2_CLAIM = "oauth2" +const val ID_CLAIM = "id" +const val NAME_CLAIM = "name" \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtConfiguration.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtConfiguration.kt new file mode 100644 index 00000000..74210b80 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/auth/JwtConfiguration.kt @@ -0,0 +1,11 @@ +package org.panda_lang.hub.auth + +import com.auth0.jwt.algorithms.Algorithm + +internal data class JwtConfiguration( + val issuer: String, + val audience: String, + val realm: String, + val ttl: Long, + val algorithm: Algorithm +) \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/github/GitHubUser.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/github/GitHubUser.kt new file mode 100644 index 00000000..318e5d32 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/github/GitHubUser.kt @@ -0,0 +1,34 @@ +package org.panda_lang.hub.github + +import kotlinx.serialization.Serializable + +const val USER_INFO_URL = "https://api.github.com/user" + +/* +{ +"login":"dzikoysk", +"id":4235722, +"node_id":"MDQ6VXNlcjQyMzU3MjI=", +"avatar_url":"https://avatars.githubusercontent.com/u/4235722?v=4", +"gravatar_id":"","url":"https://api.github.com/users/dzikoysk", +"html_url":"https://github.com/dzikoysk", +"followers_url":"https://api.github.com/users/dzikoysk/followers","following_url":"https://api.github.com/users/dzikoysk/following{/other_user}", +"gists_url":"https://api.github.com/users/dzikoysk/gists{/gist_id}","starred_url":"https://api.github.com/users/dzikoysk/starred{/owner}{/repo}", +"subscriptions_url":"https://api.github.com/users/dzikoysk/subscriptions","organizations_url":"https://api.github.com/users/dzikoysk/orgs", +"repos_url":"https://api.github.com/users/dzikoysk/repos","events_url":"https://api.github.com/users/dzikoysk/events{/privacy}", +"received_events_url":"https://api.github.com/users/dzikoysk/received_events","type":"User","site_admin":false,"name":"Dzikoysk","company":"@panda-lang ", +"blog":"dzikoysk.net","location":"Poland, Warsaw","email":"dzikoysk@dzikoysk.net","hireable":true,"bio":"#onlypanda ? \r\n\r\n// @cyaffle - second account","twitter_username":"dzikoysk", +"public_repos":11,"public_gists":3,"followers":156,"following":5,"created_at":"2013-04-23T14:16:42Z","updated_at":"2021-02-18T12:54:59Z","private_gists":5,"total_private_repos":2," +owned_private_repos":2,"disk_usage":288089,"collaborators":2,"two_factor_authentication":true,"plan":{"name":"pro","space":976562499,"collaborators":0, +"private_repos":9999}} +GitHubUser(login=dzikoysk) + */ +@Serializable +data class GitHubUser( + val id: String, + val login: String, + val avatarUrl: String, + val type: String, + val name: String, + val email: String +) \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/project/Package.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/project/Package.kt new file mode 100644 index 00000000..cb7b66f6 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/project/Package.kt @@ -0,0 +1,8 @@ +package org.panda_lang.hub.project + +import kotlinx.serialization.Serializable + +@Serializable +data class Package( + val name: String +) diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/User.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/User.kt new file mode 100644 index 00000000..b6fc1126 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/User.kt @@ -0,0 +1,11 @@ +package org.panda_lang.hub.user + +import kotlinx.serialization.Serializable +import org.panda_lang.hub.project.Package + +@Serializable +data class User( + val id: String, + val username: String, + val packages: Collection +) \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserConfiguration.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserConfiguration.kt new file mode 100644 index 00000000..d2432d75 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserConfiguration.kt @@ -0,0 +1,15 @@ +package org.panda_lang.hub.user + +import io.ktor.application.* +import io.ktor.routing.* +import org.litote.kmongo.coroutine.CoroutineDatabase + +fun configureUsers(app: Application, database: CoroutineDatabase): UserFacade { + val userRepository = UserRepository(database) + return UserFacade(userRepository) +} + +fun installUserRouting(routing: Routing, userFacade: UserFacade) { + val userEndpoint = UserEndpoint(userFacade) + routing.routes(userEndpoint) +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserEndpoint.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserEndpoint.kt new file mode 100644 index 00000000..1b22750b --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserEndpoint.kt @@ -0,0 +1,16 @@ +package org.panda_lang.hub.user + +import io.ktor.application.* +import io.ktor.auth.jwt.* +import io.ktor.response.* +import org.panda_lang.hub.auth.ID_CLAIM + +internal class UserEndpoint( + private val userFacade: UserFacade +) { + + suspend fun user(ctx: ApplicationCall, jwtPrincipal: JWTPrincipal) { + ctx.respond(userFacade.findUserById(jwtPrincipal.payload.getClaim(ID_CLAIM).asString())) + } + +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserFacade.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserFacade.kt new file mode 100644 index 00000000..9ac8815c --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserFacade.kt @@ -0,0 +1,20 @@ +package org.panda_lang.hub.user + +import org.panda_lang.hub.github.GitHubUser + +class UserFacade internal constructor( + private val userRepository: UserRepository +) { + + suspend fun findUserById(id: String): User { + return userRepository.findUserById(id)!! + } + + suspend fun fetchUser(githubUser: GitHubUser): User { + return userRepository.findUserById(githubUser.id) ?: run { + val user = User(githubUser.id, githubUser.login, ArrayList()) + return userRepository.saveUser(user) + } + } + +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRepository.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRepository.kt new file mode 100644 index 00000000..e882bec4 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRepository.kt @@ -0,0 +1,19 @@ +package org.panda_lang.hub.user + +import org.litote.kmongo.eq +import org.litote.kmongo.coroutine.* + +internal class UserRepository(database: CoroutineDatabase) { + + private val collection = database.getCollection() + + suspend fun findUserById(id: String): User? { + return collection.findOne(User::id eq id) + } + + suspend fun saveUser(user: User): User { + collection.insertOne(user) + return user + } + +} \ No newline at end of file diff --git a/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRouter.kt b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRouter.kt new file mode 100644 index 00000000..9d495881 --- /dev/null +++ b/hub-backend/src/main/kotlin/org/panda_lang/hub/user/UserRouter.kt @@ -0,0 +1,22 @@ +package org.panda_lang.hub.user + +import io.ktor.application.* +import io.ktor.auth.* +import io.ktor.auth.jwt.* +import io.ktor.locations.* +import io.ktor.routing.* + +@Location("/user") +internal class UserLocation + +internal fun Routing.routes(userEndpoint: UserEndpoint) { + authenticate("jwt") { + location { + get { + call.authentication.principal()?.let { + userEndpoint.user(this.context, it) + } + } + } + } +} \ No newline at end of file diff --git a/hub-backend/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/hub-backend/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index a26aeaca..00000000 --- a/hub-backend/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "properties": [ - { - "name": "springfox.documentation.swagger.v2.path", - "type": "java.lang.String", - "description": "Description for springfox.documentation.swagger.v2.path." - }, - { - "name": "hub.built-in-frontend", - "type": "java.lang.String", - "description": "Description for hub.built-in-frontend." - }, - { - "name": "hub.workspace", - "type": "java.lang.String", - "description": "Description for hub.workspace." - }, - { - "name": "hub.frontend", - "type": "java.lang.String", - "description": "Description for hub.frontend." - } - ] } \ No newline at end of file diff --git a/hub-backend/src/main/resources/application-development.yml b/hub-backend/src/main/resources/application-development.yml deleted file mode 100644 index 1f223291..00000000 --- a/hub-backend/src/main/resources/application-development.yml +++ /dev/null @@ -1,13 +0,0 @@ -hub: - workspace: "hub-backend/src/test/workspace" - -management: - endpoints: - web: - exposure: - include: "*" - -spring: - data: - mongodb: - uri: mongodb://127.0.0.1:27017/hub diff --git a/hub-backend/src/main/resources/application-test.yml b/hub-backend/src/main/resources/application-test.yml deleted file mode 100644 index 6fb934b9..00000000 --- a/hub-backend/src/main/resources/application-test.yml +++ /dev/null @@ -1,6 +0,0 @@ -spring: - data: - mongodb: - host: 127.0.0.1 - port: 0 - database: hub \ No newline at end of file diff --git a/hub-backend/src/main/resources/application.conf b/hub-backend/src/main/resources/application.conf new file mode 100644 index 00000000..20ab92eb --- /dev/null +++ b/hub-backend/src/main/resources/application.conf @@ -0,0 +1,17 @@ +frontend { + url = "http://localhost:3000" + authUrl = ${frontend.url}"/authorized" +} +github { + clientId = ${GITHUB_CLIENT_ID} + clientSecret = ${GITHUB_CLIENT_SECRET} +} +jwt { + issuer = "https://panda-lang.org" + audience = "hub" + realm = "Hub" + ttl = 30 +} +mongo { + url = "mongodb://localhost:27017" +} \ No newline at end of file diff --git a/hub-backend/src/main/resources/application.yml b/hub-backend/src/main/resources/application.yml deleted file mode 100644 index 3f9e852e..00000000 --- a/hub-backend/src/main/resources/application.yml +++ /dev/null @@ -1,39 +0,0 @@ -hub: - built-in-frontend: "on" - frontend: "http://localhost:80/" - workspace: "./" - -server: - address: 127.0.0.1 - port: 3000 - -#logging: -# level: -# org: -# springframework: WARN -# apache: WARN -# jline: ERROR -# panda_lang: WARN -# mongodb: WARN -# springfox: WARN - -springfox: - documentation: - swagger: - v2: - path: "/api/docs" - -spring: - main: - banner-mode: "off" - security: - oauth2: - client: - registration: - github: - clientId: ${oauth.client.id} - clientSecret: ${oauth.client.secret} - redirectUriTemplate: "{baseUrl}/oauth2/callback/{registrationId}" - scope: - - user:email - - read:user \ No newline at end of file diff --git a/hub-backend/src/main/resources/auth.properties b/hub-backend/src/main/resources/auth.properties deleted file mode 100644 index b3241d61..00000000 --- a/hub-backend/src/main/resources/auth.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2020 Hub Team of panda-lang organization -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# url that user will be redirected to after successful authentication -auth.oauth.redirectUrls=${hub.frontend}/oauth2/redirect - -# jwt secret, use -Djwt.secret={token} to define -auth.token.secret=${oauth.jwt.secret} - -# token expiration time in days -auth.token.expiration=7 \ No newline at end of file diff --git a/hub-backend/src/main/resources/log4j2.xml b/hub-backend/src/main/resources/log4j2.xml deleted file mode 100644 index b8562dd4..00000000 --- a/hub-backend/src/main/resources/log4j2.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/hub-backend/src/main/resources/messages.properties b/hub-backend/src/main/resources/messages.properties deleted file mode 100644 index e0dd8870..00000000 --- a/hub-backend/src/main/resources/messages.properties +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (c) 2020 Hub Team of panda-lang organization -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# USERNAME -username.notNull=Username cannot be null. -username.notEmpty=Username cannot be empty. -username.length=Username must be at least 3 and up to 32 characters long. -# DISPLAYNAME -displayName.notNull=Display name cannot be null. -displayName.notEmpty=Display name cannot be empty. -displayName.length=Display name must be at least 3 and up to 32 characters long. -# PASSWORD -password.length=Password must be at least 6 characters long. -password.notNull=Password cannot be null. -password.notEmpty=Password cannot be empty. -# EMAIL -email.format=Must be a well-formed email address. -email.notNull=Email cannot be null. -email.notEmpty=Email cannot be empty. -# MATCH -match.password=Confirm password doesn`t match. -match.email=Confirm email doesn`t match. -# DESCRIPTION -description.length=Description must be up to 200 characters long. -description.notNull=Description cannot be null. -description.notEmpty=Description cannot be empty. -# SITE -site.format=Must be well-formed URL address. -site.notNull=Site cannot be null. -site.notEmpty=Site cannot be empty. -# NAME -name.notNull=Name cannot be null. -name.notEmpty=Name cannot be empty. -name.length=Name must be at least 3 and up to 32 characters long. \ No newline at end of file diff --git a/hub-backend/src/main/resources/tinylog.properties b/hub-backend/src/main/resources/tinylog.properties new file mode 100644 index 00000000..fe6347b2 --- /dev/null +++ b/hub-backend/src/main/resources/tinylog.properties @@ -0,0 +1,3 @@ +writer = console +writer.level = trace +writer.format = {date: HH:mm:ss.SSS} {level} | {message} \ No newline at end of file diff --git a/hub-backend/src/test/groovy/org/panda_lang/hub/error/ErrorDtoTest.groovy b/hub-backend/src/test/groovy/org/panda_lang/hub/error/ErrorDtoTest.groovy deleted file mode 100644 index c4b31c7f..00000000 --- a/hub-backend/src/test/groovy/org/panda_lang/hub/error/ErrorDtoTest.groovy +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.panda_lang.hub.error - -import spock.lang.Specification - -class ErrorDtoTest extends Specification { - - def 'should return proper properties' () { - given: - def error = new ErrorDto(404, 'Error message') - - expect: - error.code == 404 - error.message == 'Error message' - } - -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractContextIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractContextIntegrationTest.kt deleted file mode 100644 index 1fc4f84d..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractContextIntegrationTest.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext - -abstract class AbstractContextIntegrationTest : AbstractIntegrationTest() { - - @Autowired - private val applicationContext: WebApplicationContext? = null - - @Autowired - private val mongoTemplate: MongoTemplate? = null - - @Override - protected override fun setup(): MockMvc { - return MockMvcBuilders.webAppContextSetup(applicationContext) - .apply(SecurityMockMvcConfigurers.springSecurity()) - .build() - } - - protected fun drop(name: String?) { - mongoTemplate.getCollection(name).drop() - } - - protected fun getApplicationContext(): WebApplicationContext? { - return applicationContext - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractIntegrationTest.kt deleted file mode 100644 index a4b9438f..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractIntegrationTest.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import org.junit.jupiter.api.BeforeEach -import org.junit.runner.RunWith -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors -import org.springframework.test.context.junit4.SpringRunner -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.ResultActions -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import kotlin.Throws - -@RunWith(SpringRunner::class) -@SpringBootTest -abstract class AbstractIntegrationTest { - private var mockMvc: MockMvc? = null - protected abstract fun setup(): MockMvc? - @BeforeEach - protected fun setUp() { - mockMvc = setup() - } - - @Throws(Exception::class) - protected fun perform(uri: String?): ResultActions { - return getMockMvc().perform(MockMvcRequestBuilders.get(uri)) - } - - protected fun getAuthenticated(uri: String?, username: String?, password: String?): MockHttpServletRequestBuilder { - return MockMvcRequestBuilders.get(uri).with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - } - - protected fun getMockMvc(): MockMvc? { - return mockMvc - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractStandaloneIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractStandaloneIntegrationTest.kt deleted file mode 100644 index 4b362721..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/AbstractStandaloneIntegrationTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.setup.MockMvcBuilders - -abstract class AbstractStandaloneIntegrationTest : AbstractIntegrationTest() { - - protected abstract fun controllers(): Array? - - @Override - protected override fun setup(): MockMvc { - return MockMvcBuilders.standaloneSetup(controllers()).build() - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/HubApplicationIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/HubApplicationIntegrationTest.kt deleted file mode 100644 index 90598fe7..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/HubApplicationIntegrationTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub - -import org.hamcrest.Matchers -import org.junit.Assert -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -@SpringBootTest -internal class HubApplicationIntegrationTest { - @Autowired - private val hubConfiguration: HubConfiguration? = null - @Test - fun contextLoads() { - Assert.assertThat(hubConfiguration, Matchers.notNullValue()) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationEndpointsControllerTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationEndpointsControllerTest.kt deleted file mode 100644 index 8da58c78..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationEndpointsControllerTest.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.junit.platform.runner.JUnitPlatform -import org.junit.runner.RunWith -import org.mockito.InjectMocks -import org.mockito.Mock -import org.mockito.junit.jupiter.MockitoExtension -import org.panda_lang.hub.user.UserFacade -import org.panda_lang.hub.utils.AbstractDtoUtils -import org.springframework.security.authentication.AuthenticationManager -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import kotlin.Throws - -@ExtendWith(MockitoExtension::class) -@RunWith(JUnitPlatform::class) -internal class AuthenticationEndpointsControllerTest { - @InjectMocks - private val authenticationEndpointsController: AuthenticationEndpointsController? = null - - @Mock - private val userFacade: UserFacade? = null - - @Mock - private val authenticationManager: AuthenticationManager? = null - - @Mock - private val authenticationTokenCreator: AuthenticationTokenCreator? = null - private var mockMvc: MockMvc? = null - @BeforeEach - fun setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(authenticationEndpointsController).build() - } - - @Test - @Throws(Exception::class) - fun registerUser() { - val signUpDto = SignUpDto( - "username12", - "Username", - "test@email.com", - "passwd12" - ) - AbstractDtoUtils.perform(mockMvc, "/api/users/signup", signUpDto, status().isCreated()) - } - - @Test - @Throws(Exception::class) - fun authenticateUser() { - authenticationEndpointsController.registerUser( - SignUpDto( - "username-sign", - "Username Sign", - "username-sign@emailcom", - "passwd12" - ) - ) - val signInDto = SignInDto("username-sign", "passwd12") - AbstractDtoUtils.perform(mockMvc, "/api/users/signin", signInDto, status().isOk()) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationTestConfiguration.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationTestConfiguration.kt deleted file mode 100644 index c5d16383..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/AuthenticationTestConfiguration.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.core.annotation.Order -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter -import org.springframework.security.oauth2.client.registration.ClientRegistration -import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository -import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository -import org.springframework.security.oauth2.core.AuthorizationGrantType -import java.util.Collections -import java.util.List -import java.util.Objects -import java.util.stream.Collectors - -@Configuration -@EnableWebSecurity -@Order(101) -class AuthenticationTestConfiguration : WebSecurityConfigurerAdapter() { - @Bean - fun clientRegistrationRepository(): ClientRegistrationRepository { - val registrations: List = CLIENTS.stream() - .map { client: String -> getRegistration(client) } - .filter(Objects::nonNull) - .collect(Collectors.toList()) - return InMemoryClientRegistrationRepository(registrations) - } - - private fun getRegistration(client: String): ClientRegistration { - return ClientRegistration.withRegistrationId(client) - .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) - .clientId("0") - .clientName(client) - .clientSecret("0") - .tokenUri("unknown") - .build() - } - - companion object { - private val CLIENTS: List = Collections.singletonList("github") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerIntegrationTest.kt deleted file mode 100644 index 2e15d2b9..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerIntegrationTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.platform.runner.JUnitPlatform -import org.junit.runner.RunWith -import org.panda_lang.hub.user.UserRegistrationDto -import org.panda_lang.hub.utils.AbstractDtoUtils -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.EnableAutoConfiguration -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import kotlin.Throws - -@RunWith(JUnitPlatform::class) -@EnableAutoConfiguration -@SpringBootTest -internal class RegistrationControllerIntegrationTest { - @Autowired - private val registrationController: RegistrationController? = null - - @Autowired - private val mongoTemplate: MongoTemplate? = null - private var mockMvc: MockMvc? = null - @BeforeEach - fun setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(registrationController).build() - } - - @Test - @Throws(Exception::class) - fun shouldReturnConflictIfUserAlreadyExists() { - val dto = UserRegistrationDto( - "test123", - "test123", - "test123", - "test123", - "test123@test", - "test123@test" - ) - AbstractDtoUtils.perform(mockMvc, "/api/register", dto, status().isCreated()) - AbstractDtoUtils.perform(mockMvc, "/api/register", dto, status().isConflict()) - } - - @AfterEach - fun tearDown() { - mongoTemplate.dropCollection("users") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerTest.kt deleted file mode 100644 index 49df17f4..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/authentication/RegistrationControllerTest.kt +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.authentication - -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.junit.platform.runner.JUnitPlatform -import org.junit.runner.RunWith -import org.mockito.InjectMocks -import org.mockito.Mock -import org.mockito.junit.jupiter.MockitoExtension -import org.panda_lang.hub.user.UserRegistrationDto -import org.panda_lang.hub.user.UserService -import org.panda_lang.hub.utils.AbstractDtoUtils -import org.panda_lang.hub.utils.entity.AbstractDto -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.ResultMatcher -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import kotlin.Throws - -@ExtendWith(MockitoExtension::class) -@RunWith(JUnitPlatform::class) -internal class RegistrationControllerTest { - @InjectMocks - private val registrationController: RegistrationController? = null - - @Mock - private val userService: UserService? = null - private var mockMvc: MockMvc? = null - @BeforeEach - fun setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(registrationController).build() - } - - @Test - @Throws(Exception::class) - fun registrationTest() { - val dto = UserRegistrationDto( - "username-123", - "display-name-123", - "password-123", - "password-123", - "test123@test", - "test123@test" - ) - perform(dto, status().isCreated()) - } - - @Test - @Throws(Exception::class) - fun shouldReturnBadRequestIfEmpty() { - val dto = UserRegistrationDto( - "", - "", - "", - "", - "", - "" - ) - perform(dto, status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - fun shouldReturnBadRequestIfUsernameLengthIsLessThan3() { - val dto = UserRegistrationDto( - "12", - "test123", - "test123", - "test123", - "test123@test", - "test123@test" - ) - perform(dto, status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - fun shouldReturnBadRequestIfPasswordLengthIsLessThan6() { - val dto = UserRegistrationDto( - "test123", - "test123", - "test1", - "test1", - "test123@test", - "test123@test" - ) - perform(dto, status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - fun shouldReturnBadRequestIfConfirmationDoesNotMatch() { - val dto = UserRegistrationDto( - "test123", - "test123", - "test123", - "test12", - "test123@test", - "test123@test" - ) - perform(dto, status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - fun shouldReturnBadRequestIfEmailDoesNotMatchPattern() { - val dto = UserRegistrationDto( - "test123", - "test123", - "test123", - "test123", - "test123", - "test123" - ) - perform(dto, status().isBadRequest()) - } - - @Throws(Exception::class) - private fun perform(dto: AbstractDto<*>, resultMatcher: ResultMatcher) { - AbstractDtoUtils.perform(mockMvc, "/api/register", dto, resultMatcher) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/error/ErrorDtoTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/error/ErrorDtoTest.kt deleted file mode 100644 index 5ccb1309..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/error/ErrorDtoTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.error - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -internal class ErrorDtoTest { - @get:Test - val code: Unit - get() { - val errorDto = ErrorDto(404, null) - assertEquals(404, errorDto.getCode()) - } - - @get:Test - val message: Unit - get() { - val errorDto = ErrorDto(-1, "error message") - assertEquals("error message", errorDto.getMessage()) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationBuilderTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationBuilderTest.kt deleted file mode 100644 index 8e6ae74c..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationBuilderTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.user.User -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class OrganizationBuilderTest { - private var organization: Organization? = null - @BeforeEach - fun setUp() { - organization = OrganizationBuilder() - .withOwner( - User.builder() - .withPassword("test123") - .build() - ) - .build() - } - - @Test - fun shouldNotBeNull() { - assertNotNull(organization.getOwner()) - } - - @Test - fun toStringTest() { - assertEquals( - "Organization{" + - "identifier=null, " + - "name='null', " + - "displayName='null', " + - "description='null', " + - "email='null', " + - "site='null', " + - "owner=User{" + - "identifier=null, " + - "name='null', " + - "displayName='null', " + - "password='test123', " + - "description='null', " + - "email='null', " + - "site='null', " + - "roles=[]}}", - organization.toString() - ) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationUpdateDtoTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationUpdateDtoTest.kt deleted file mode 100644 index 9a7942d8..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/organization/OrganizationUpdateDtoTest.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.organization - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -internal class OrganizationUpdateDtoTest { - @get:Test - val description: Unit - get() { - assertEquals("description", DTO.getDescription()) - } - - @get:Test - val email: Unit - get() { - assertEquals("email", DTO.getEmail()) - } - - @get:Test - val site: Unit - get() { - assertEquals("site", DTO.getSite()) - } - - @get:Test - val displayName: Unit - get() { - assertEquals("display name", DTO.getDisplayName()) - } - - @get:Test - val name: Unit - get() { - assertEquals("name", DTO.getName()) - } - - companion object { - private val DTO: OrganizationUpdateDto = OrganizationUpdateDto("name", "display name", "description", "email", "site") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectControllerIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectControllerIntegrationTest.kt deleted file mode 100644 index 7c05f2c6..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectControllerIntegrationTest.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import org.hamcrest.CoreMatchers.`is` -import org.hamcrest.collection.IsCollectionWithSize.hasSize -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.panda_lang.hub.AbstractContextIntegrationTest -import org.panda_lang.hub.user.User -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import kotlin.Throws - -internal class ProjectControllerIntegrationTest : AbstractContextIntegrationTest() { - @Autowired - private val projectService: ProjectService? = null - @BeforeEach - fun prepare() { - projectService.save(Project("PROJECT NAME", User.builder().withName("onlypanda").build(), "uri", "website")) - } - - @Test - @Throws(Exception::class) - fun shouldReturnNoContent() { - super.perform("/api/projects") - .andExpect(status().isNoContent()) - } - - @Test - @Throws(Exception::class) - fun shouldReturn200AndProjectsCount() { - super.perform("/api/projects/count") - .andExpect(status().isOk()) - .andExpect(content().json("1")) - } - - @Test - @Throws(Exception::class) - fun shouldReturn200AndAmountOfPages() { - super.perform("/api/projects/page") - .andExpect(status().isOk()) - .andExpect(content().json("1")) - } - - @Test - @Throws(Exception::class) - fun shouldReturn200AndProjectPage() { - super.perform("/api/projects/page/0") - .andExpect(status().isOk()) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$", hasSize(1))) - .andExpect(jsonPath("$[0].name", `is`("PROJECT NAME"))) - } - - @Test - @Throws(Exception::class) - fun shouldReturn200AndAllUserProjects() { - super.perform("/api/projects/user/onlypanda") - .andExpect(status().isOk()) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$", hasSize(1))) - .andExpect(jsonPath("$[0].name", `is`("PROJECT NAME"))) - } - - @AfterEach - fun drop() { - super.drop("projects") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectUpdateDtoTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectUpdateDtoTest.kt deleted file mode 100644 index f28ce84a..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/project/ProjectUpdateDtoTest.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.project - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test -import org.panda_lang.hub.user.Owner -import org.panda_lang.hub.user.User - -internal class ProjectUpdateDtoTest { - @Test - fun toEntityTest() { - val owner: Owner = User.builder().withName("user").build() - val project: Project = ProjectUpdateDto("project", owner, "github:https://github.com/panda-lang/panda", "panda-lang.org").toEntity() - assertEquals( - "Project{" + - "identifier=null, " + - "name='project', " + - "owner=" + owner.toString() + ", " + - "platformUri='github:https://github.com/panda-lang/panda', " + - "website='panda-lang.org'" + - "}", - project.toString() - ) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/AbstractOwnerBuilderTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/AbstractOwnerBuilderTest.kt deleted file mode 100644 index 9d09f521..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/AbstractOwnerBuilderTest.kt +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.bson.types.ObjectId -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.utils.Buildable -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class AbstractOwnerBuilderTest { - private var projectOwner: TestOwner? = null - @BeforeEach - fun setUp() { - projectOwner = TestProjectOwnerBuilder() - .withName("test") - .withDescription("test description") - .withDisplayName("test displayName") - .withEmail("test@test") - .withSite("www.test.com") - .build() - } - - @Test - fun shouldNotBeNull() { - assertAll( - { assertNotNull(projectOwner!!.getName()) }, - { assertNotNull(projectOwner!!.getDescription()) }, - { assertNotNull(projectOwner!!.getDisplayName()) }, - { assertNotNull(projectOwner!!.getEmail()) } - ) { assertNotNull(projectOwner!!.getSite()) } - } - - @Test - fun toStringTest() { - assertEquals( - "TestProjectOwner{" + - "name='test', " + - "displayName='test displayName', " + - "description='test description', " + - "email='test@test', " + - "site='www.test.com'}", - projectOwner.toString() - ) - } - - private class TestProjectOwnerBuilder : Owner.AbstractProjectOwnerBuilder(), Buildable { - @Override - fun build(): TestOwner { - return TestOwner(this) - } - } - - private class TestOwner internal constructor(builder: TestProjectOwnerBuilder) : Owner { - private val name: String - private val displayName: String - private val description: String - private val email: String - private val avatar: String - private val site: String - @Override - fun setName(name: String?) { - } - - @Override - fun setDisplayName(displayName: String?) { - } - - @Override - fun setDescription(description: String?) { - } - - @Override - fun setEmail(email: String?) { - } - - @Override - fun setAvatar(avatar: String?) { - } - - @Override - fun setSite(site: String?) { - } - - @Override - fun getName(): String { - return name - } - - @Override - fun getDisplayName(): String { - return displayName - } - - @Override - fun getDescription(): String { - return description - } - - @Override - fun getEmail(): String { - return email - } - - @Override - fun getAvatar(): String { - return avatar - } - - @Override - fun getSite(): String { - return site - } - - @get:Override - val identifier: ObjectId? - get() = null - - @Override - override fun toString(): String { - return "TestProjectOwner{" + - "name='" + name + '\'' + - ", displayName='" + displayName + '\'' + - ", description='" + description + '\'' + - ", email='" + email + '\'' + - ", site='" + site + '\'' + - '}' - } - - init { - name = builder.name - displayName = builder.displayName - description = builder.description - email = builder.email - avatar = builder.avatar - site = builder.site - } - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserAuthenticationDtoTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserAuthenticationDtoTest.kt deleted file mode 100644 index de7565f7..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserAuthenticationDtoTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class UserAuthenticationDtoTest { - @Test - fun toEntityTest() { - val user: User = UserAuthenticationDto("test", "test123").toEntity() - assertAll( - { assertEquals("test", user.getName()) } - ) { assertEquals("test123", user.getPassword()) } - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserBuilderTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserBuilderTest.kt deleted file mode 100644 index 0ab8855c..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserBuilderTest.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.user.role.Role -import org.panda_lang.utilities.commons.collection.Sets -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class UserBuilderTest { - private var user: User? = null - @BeforeEach - fun setUp() { - user = UserBuilder() - .withPassword("test123") - .withRoles(Sets.newHashSet(Role("USER"))) - .build() - } - - @Test - fun shouldNotBeNull() { - assertAll( - { assertNotNull(user.getPassword()) } - ) { assertNotNull(user.getRoles()) } - } - - @Test - fun toStringTest() { - assertEquals( - "User{" + - "identifier=null, " + - "name='null', " + - "displayName='null', " + - "password='test123', " + - "description='null', " + - "email='null', " + - "site='null', " + - "roles=[Role{name='USER'}]}", - user.toString() - ) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserCommandsIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserCommandsIntegrationTest.kt deleted file mode 100644 index ac02bae3..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserCommandsIntegrationTest.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import com.mongodb.BasicDBObject -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.shell.Shell -import org.springframework.test.context.junit4.SpringRunner -import java.util.HashMap -import java.util.Map - -@RunWith(SpringRunner::class) -@SpringBootTest -internal class UserCommandsIntegrationTest { - @Autowired - private val shell: Shell? = null - - @Autowired - private val mongoTemplate: MongoTemplate? = null - @Test - fun userAddCommandTest() { - val result: Object = shell.evaluate { "useradd testUser123" } - val query = Query() - query.addCriteria(Criteria.where("name").`is`("testUser123")) - assertAll( - { assertTrue(mongoTemplate.exists(query, "users")) } - ) { assertEquals("Created user: testUser123", result) } - } - - @Test - fun userAddAlreadyExistsTest() { - val userDetails: Map = object : HashMap() { - init { - this.put("name", "testUser") - } - } - mongoTemplate.insert(BasicDBObject(userDetails), "users") - val result: Object = shell.evaluate { "useradd testUser" } - assertEquals("User already exists", result) - } - - @Test - fun passwdCommandTest() { - val userDetails: Map = object : HashMap() { - init { - this.put("name", "testUser133") - } - } - val userDbObject = BasicDBObject(userDetails) - mongoTemplate.insert(userDbObject, "users") - val result: Object = shell.evaluate { "passwd testUser133 test" } - val user: User = mongoTemplate.findOne(Query().addCriteria(Criteria.where("name").`is`("testUser133")), User::class.java, "users") - assertAll( - { assertEquals("Set password for user: testUser133", result) } - ) { assertNotNull(user.getPassword()) } - } - - @Test - fun passwdUserNotFoundTest() { - val result: Object = shell.evaluate { "passwd testUser135 test" } - assertEquals("User not found!", result) - } - - @AfterEach - fun tearDown() { - mongoTemplate.dropCollection("users") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserControllerIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserControllerIntegrationTest.kt deleted file mode 100644 index 8773591c..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserControllerIntegrationTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import com.google.common.collect.Sets -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Test -import org.panda_lang.hub.AbstractContextIntegrationTest -import org.panda_lang.hub.user.role.RoleFactory -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import kotlin.Throws - -internal class UserControllerIntegrationTest : AbstractContextIntegrationTest() { - @Autowired - private val userService: UserService? = null - - @Autowired - private val roleFactory: RoleFactory? = null - @Test - @Throws(Exception::class) - fun authenticationTest() { - val user: User = User.builder() - .withName("test123") - .withPassword("test123") - .withRoles(Sets.newHashSet(roleFactory.obtainRole("ADMIN"))) - .build() - userService.initializeUser(user) - super.getMockMvc().perform(getAuthenticated("/api/users/me", "test123", "test123")) - .andExpect(status().isOk()) - } - - @Test - @Throws(Exception::class) - fun authenticationShouldReturn401WhenNotLogged() { - super.perform("/api/users/me") - .andExpect(status().isUnauthorized()) - } - - @AfterEach - fun drop() { - super.drop("users") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserDetailsTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserDetailsTest.kt deleted file mode 100644 index 6c184619..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserDetailsTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.BeforeAll -import org.junit.jupiter.api.Test -import org.panda_lang.utilities.commons.StringUtils -import java.util.HashMap -import java.util.Map - -internal class UserDetailsTest { - @get:Test - val attributes: Unit - get() { - assertEquals(Companion.attributes, details.getAttributes()) - } - - @get:Test - val user: Unit - get() { - assertEquals(Companion.user, details.getUser()) - } - - companion object { - private var user: User? = null - private val attributes: Map = HashMap() - private var details: UserDetails? = null - @BeforeAll - fun prepare() { - user = User.builder() - .withName("username") - .withPassword(StringUtils.EMPTY) - .build() - details = UserDetails.of(user, attributes) - assertNotNull(details) - } - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserRegistrationDtoTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserRegistrationDtoTest.kt deleted file mode 100644 index f270a644..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/UserRegistrationDtoTest.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class UserRegistrationDtoTest { - @Test - fun toEntityTest() { - val user: User = UserRegistrationDto("test", "test displayName", "test", "test", "test@test", "test@test").toEntity() - assertEquals( - "User{" + - "identifier=null, " + - "name='test', " + - "displayName='test displayName', " + - "password='test', " + - "description='null', " + - "email='test@test', " + - "site='null', " + - "roles=[]}", - user.toString() - ) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleCommandsIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleCommandsIntegrationTest.kt deleted file mode 100644 index f97de044..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleCommandsIntegrationTest.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import com.mongodb.BasicDBObject -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.user.User -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.shell.Shell -import org.springframework.test.context.junit4.SpringRunner -import java.util.Collections -import java.util.HashMap -import java.util.Map - -@RunWith(SpringRunner::class) -@SpringBootTest -internal class RoleCommandsIntegrationTest { - @Autowired - private val shell: Shell? = null - - @Autowired - private val mongoTemplate: MongoTemplate? = null - - @Autowired - private val roleFactory: RoleFactory? = null - @BeforeEach - fun prepareRoles() { - roleFactory.obtainRole("ADMIN") - } - - @Test - fun rolesCommandTest() { - val result: Object = shell.evaluate { "roles" } - assertEquals("ADMIN", result) - } - - @Test - fun setRoleCommandTest() { - val userDetails: Map = object : HashMap() { - init { - this.put("name", "testUser2115") - this.put("roles", Collections.emptySet()) - } - } - mongoTemplate.insert(BasicDBObject(userDetails), "users") - val result: Object = shell.evaluate { "chrole --username testUser2115 --role ADMIN" } - val user: User = mongoTemplate.findOne(Query.query(Criteria.where("name").`is`("testUser2115")), User::class.java) - assertNotNull(user) - assertAll( - { assertNotNull(mongoTemplate.findById("ADMIN", Role::class.java)) }, - { assertEquals("Set role `ADMIN` for user: testUser2115", result) } - ) { assertTrue(user.getRoles().toString().contains("ADMIN")) } - } - - @Test - fun setRoleCommandWhenUserNotFound() { - val result: Object = shell.evaluate { "chrole --username testUser1337 --role ADMIN" } - assertEquals("User not found", result) - } - - @AfterEach - fun tearDown() { - mongoTemplate.dropCollection("users") - mongoTemplate.dropCollection("roles") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleFactoryIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleFactoryIntegrationTest.kt deleted file mode 100644 index 4ba341dd..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/user/role/RoleFactoryIntegrationTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.user.role - -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -@SpringBootTest -internal class RoleFactoryIntegrationTest { - @Autowired - private val roleFactory: RoleFactory? = null - - @Autowired - private val mongoTemplate: MongoTemplate? = null - @Test - fun obtainNewRoleTest() { - val role: Role = roleFactory.obtainRole("SUPER_VIP") - assertAll( - { assertNotNull(role) } - ) { assertNotNull(mongoTemplate.findById("SUPER_VIP", Role::class.java)) } - } - - @AfterEach - fun tearDown() { - mongoTemplate.dropCollection("roles") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/AbstractDtoUtils.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/AbstractDtoUtils.kt deleted file mode 100644 index d76145ac..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/AbstractDtoUtils.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils - -import org.panda_lang.hub.utils.entity.JsonDto -import org.springframework.http.MediaType -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.ResultMatcher -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import kotlin.Throws - -object AbstractDtoUtils { - @Throws(Exception::class) - fun perform(mockMvc: MockMvc?, uri: String?, dto: JsonDto, resultMatcher: ResultMatcher?) { - mockMvc.perform( - MockMvcRequestBuilders.post(uri) - .content(dto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ).andExpect(resultMatcher) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/BeanUtilTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/BeanUtilTest.kt deleted file mode 100644 index d3ab7c7b..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/BeanUtilTest.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils - -import org.bson.types.ObjectId -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.utils.entity.crud.TestEntity -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -internal class BeanUtilTest { - @Test - fun copyNonNullProperties() { - val id: ObjectId = ObjectId.get() - val testEntity = TestEntity(id, "testUsername", "something fucked up") - val testEntityEdited = TestEntity(null, "testUsernameButEdited", null) - BeanUtil.copyNonNullProperties(testEntity, testEntityEdited) - assertAll( - { assertNotNull(testEntity) }, - { assertNotNull(testEntityEdited) }, - { assertEquals(testEntityEdited.getName(), testEntity.getName()) }, - { assertEquals(testEntityEdited.getIdentifier(), testEntity.getIdentifier()) } - ) { assertEquals(testEntityEdited.getSomething(), testEntity.getSomething()) } - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/AbstractCrudControllerIntegrationTest.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/AbstractCrudControllerIntegrationTest.kt deleted file mode 100644 index 23e5b889..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/AbstractCrudControllerIntegrationTest.kt +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity - -import com.google.common.collect.Sets -import com.mongodb.BasicDBObject -import org.bson.types.ObjectId -import org.hamcrest.Matchers -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.Assertions.assertNull -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.runner.RunWith -import org.panda_lang.hub.user.role.RoleFactory -import org.panda_lang.hub.utils.entity.crud.TestDto -import org.panda_lang.hub.utils.entity.crud.TestEntity -import org.panda_lang.hub.utils.entity.crud.TestEntityController -import org.panda_lang.hub.utils.entity.crud.TestRepository -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.http.MediaType -import org.springframework.security.crypto.password.PasswordEncoder -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors -import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.context.junit4.SpringRunner -import org.springframework.test.context.web.WebAppConfiguration -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath -import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.web.context.WebApplicationContext -import java.util.HashMap -import java.util.Map -import kotlin.Throws - -@RunWith(SpringRunner::class) -@SpringBootTest -@ContextConfiguration -@WebAppConfiguration -internal class AbstractCrudControllerIntegrationTest { - @Autowired - private val mongoTemplate: MongoTemplate? = null - - @Autowired - private val testEntityController: TestEntityController? = null - - @Autowired - private val repository: TestRepository? = null - - @Autowired - private val passwordEncoder: PasswordEncoder? = null - - @Autowired - private val context: WebApplicationContext? = null - - @Autowired - private val roleFactory: RoleFactory? = null - private var mockMvc: MockMvc? = null - @BeforeEach - fun setUp() { - mockMvc = MockMvcBuilders.webAppContextSetup(context) - .apply(SecurityMockMvcConfigurers.springSecurity()) - .build() - } - - @Test - @Throws(Exception::class) - fun readAllEntitiesTest() { - repository.save(TestEntity(ObjectId.get(), "testEntity1125", "something")) - repository.save(TestEntity(ObjectId.get(), "testEntity1126", "something")) - mockMvc.perform(MockMvcRequestBuilders.get("/api/tests")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$[0].name", Matchers.`is`("testEntity1125"))) - .andExpect(jsonPath("$[1].name", Matchers.`is`("testEntity1126"))) - } - - @Test - @Throws(Exception::class) - fun readShouldReturn404WhenDoesNotExists() { - mockMvc.perform(MockMvcRequestBuilders.get("/api/tests/{id}", ObjectId.get())) - .andExpect(status().isNotFound()) - } - - @Test - @Throws(Exception::class) - fun readTest() { - val id: ObjectId = ObjectId.get() - repository.save(TestEntity(id, "testEntity1127", "something")) - mockMvc.perform(MockMvcRequestBuilders.get("/api/tests/{id}", id.toHexString())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.name", Matchers.`is`("testEntity1127"))) - .andExpect(jsonPath("$.identifier", Matchers.`is`(id.toHexString()))) - } - - @Test - @Throws(Exception::class) - fun createTest() { - val testDto = TestDto("testEntity1128", "something") - mockMvc.perform( - MockMvcRequestBuilders.post("/api/tests") - .content(testDto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isCreated()) - .andExpect(jsonPath("$.name", Matchers.`is`("testEntity1128"))) - } - - @Test - @Throws(Exception::class) - fun createShouldReturn409WhenAlreadyExists() { - val testDto = TestDto("testEntity1129", "something") - repository.save(TestEntity(ObjectId.get(), "testEntity1129", "something")) - mockMvc.perform( - MockMvcRequestBuilders.post("/api/tests") - .content(testDto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isConflict()) - } - - @Test - @Throws(Exception::class) - fun createShouldReturn400WhenValidationError() { - val testDto = TestDto(null, null) - mockMvc.perform( - MockMvcRequestBuilders.post("/api/tests") - .content(testDto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - private fun updateTest() { - val id: ObjectId = ObjectId.get() - val username = "testEntity123132" - val password = "test123" - val testDto = TestDto(username + "_EDITED", "something") - val testEntity = TestEntity(id, username, "something") - repository.save(testEntity) - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.put("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(testDto.toJson()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isNoContent()) - val query: Query = Query.query(Criteria.where("name").`is`(testDto.getUsername())) - val databaseEntity: TestEntity = mongoTemplate.findOne(query, TestEntity::class.java) - assertAll( - { assertNotNull(databaseEntity) }, - { assertNotEquals(databaseEntity, testEntity) } - ) { assertEquals(username + "_EDITED", databaseEntity.getName()) } - } - - @Test - @Throws(Exception::class) - fun updateShouldCreateNewEntityWhenEntityNotFound() { - val id: ObjectId = ObjectId.get() - val username = "testEntity3901028930" - val password = "test123" - val testDto = TestDto(username + "_EDITED", "something") - val testEntity = TestEntity(id, username, "something") - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.put("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(testDto.toJson()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isCreated()) - val query: Query = Query.query(Criteria.where("name").`is`(testDto.getUsername())) - val databaseEntity: TestEntity = mongoTemplate.findOne(query, TestEntity::class.java) - assertAll( - { assertNotNull(databaseEntity) }, - { assertNotEquals(databaseEntity, testEntity) } - ) { assertEquals(testDto.getUsername(), databaseEntity.getName()) } - } - - @Test - @Throws(Exception::class) - fun updateShouldReturn403WhenDifferentUser() { - val id: ObjectId = ObjectId.get() - val username = "testEntity30182u8038" - val password = "test123" - val testDto = TestDto(username + "_EDITED", "something") - val testEntity = TestEntity(id, username, "something") - repository.save(testEntity) - setUpUser(ObjectId.get(), username, password) - mockMvc.perform( - MockMvcRequestBuilders.put("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(testDto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isForbidden()) - } - - @Test - @Throws(Exception::class) - fun updateShouldReturn400WhenValidationError() { - val id: ObjectId = ObjectId.get() - val username = "testEntity30182u8038" - val password = "test123" - val testDto = TestDto("", "") - val testEntity = TestEntity(id, username, "something") - repository.save(testEntity) - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.put("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(testDto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isBadRequest()) - } - - @Test - @Throws(Exception::class) - fun partialUpdateTest() { - val id: ObjectId = ObjectId.get() - val username = "testEntity123131" - val password = "test123" - val dto = TestDto(null, "something_EDITED") - val testEntity = TestEntity(id, username, "something") - repository.save(testEntity) - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.patch("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(dto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isNoContent()) - val query: Query = Query.query(Criteria.where("name").`is`(username)) - val databaseEntity: TestEntity = mongoTemplate.findOne(query, TestEntity::class.java) - assertNotNull(databaseEntity) - assertAll( - { assertNotNull(databaseEntity.getSomething()) }, - { assertEquals(databaseEntity.getSomething(), "something_EDITED") } - ) { assertEquals(databaseEntity.getName(), username) } - } - - @Test - @Throws(Exception::class) - fun partialUpdateShouldReturn404WhenEntityNotFound() { - val id: ObjectId = ObjectId.get() - val username = "testEntity3901903190" - val password = "test123" - val dto = TestDto(null, "something_EDITED") - val testEntity = TestEntity(id, username, "something") - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.patch("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(dto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isNotFound()) - } - - @Test - @Throws(Exception::class) - fun partialUpdateShouldReturn403WhenDifferentUser() { - val id: ObjectId = ObjectId.get() - val username = "testEntity3901903190" - val password = "test123" - val dto = TestDto(null, "something_EDITED") - setUpUser(ObjectId.get(), username, password) - mockMvc.perform( - MockMvcRequestBuilders.patch("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - .content(dto.toJson().getBytes()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isForbidden()) - } - - @Test - @Throws(Exception::class) - fun deleteTest() { - val id: ObjectId = ObjectId.get() - val username = "testEntity12313" - val password = "test123" - mongoTemplate.insert(TestEntity(id, username, "something")) - val query: Query = Query.query(Criteria.where("name").`is`(username)) - assertNotNull(mongoTemplate.findOne(query, TestEntity::class.java)) - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.delete("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - ) - .andExpect(status().isNoContent()) - assertNull(mongoTemplate.findOne(query, TestEntity::class.java)) - } - - @Test - @Throws(Exception::class) - fun deleteShouldReturn404WhenEntityNotFound() { - val id: ObjectId = ObjectId.get() - val username = "testEntity123812" - val password = "test123" - setUpUser(id, username, password) - mockMvc.perform( - MockMvcRequestBuilders.delete("/api/tests/{id}", id) - .with(SecurityMockMvcRequestPostProcessors.httpBasic(username, password)) - ) - .andExpect(status().isNotFound()) - } - - private fun setUpUser(id: ObjectId, username: String, password: String) { - val userDetails: Map = object : HashMap() { - init { - this.put("_id", id) - this.put("name", username) - this.put("password", passwordEncoder.encode(password)) - this.put("roles", Sets.newHashSet(roleFactory.obtainRole("USER"))) - } - } - mongoTemplate.insert(BasicDBObject(userDetails), "users") - } - - @AfterEach - fun tearDown() { - mongoTemplate.dropCollection("tests") - mongoTemplate.dropCollection("users") - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestCrudService.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestCrudService.kt deleted file mode 100644 index 6e920333..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestCrudService.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity.crud - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudOperationService -import org.panda_lang.hub.utils.entity.CrudOperationsService -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.stereotype.Service - -@Service -class TestCrudService @Autowired internal constructor(testRepository: TestRepository?) : AbstractCrudOperationService(testRepository), CrudOperationsService diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestDto.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestDto.kt deleted file mode 100644 index 3ab2dabc..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestDto.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity.crud - -import org.panda_lang.hub.utils.entity.AbstractDto -import javax.validation.constraints.NotEmpty - -class TestDto : AbstractDto { - @NotEmpty - var name: String? = null - @Override get() = field - set - - @NotEmpty - var something: String? = null - - constructor(username: String?, something: String?) { - name = username - this.something = something - } - - constructor() { - // Jackson - } - - fun toEntity(): TestEntity { - return TestEntity(null, name, something) - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntity.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntity.kt deleted file mode 100644 index ebaa897d..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntity.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity.crud - -import com.fasterxml.jackson.databind.annotation.JsonSerialize -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.IdentifiableEntity -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document - -@Document("tests") -class TestEntity : IdentifiableEntity { - @Id - @JsonSerialize(using = ToStringSerializer::class) - private var identifier: ObjectId? = null - var name: String? = null - var something: String? = null - - constructor(identifier: ObjectId?, name: String?, something: String?) { - this.identifier = identifier - this.name = name - this.something = something - } - - constructor() { - // Jackson - } - - @Override - fun getIdentifier(): ObjectId? { - return identifier - } - - fun setIdentifier(identifier: ObjectId?) { - this.identifier = identifier - } - - @Override - override fun toString(): String { - return "TestEntity{" + - "identifier=" + identifier + - ", name='" + name + '\'' + - ", something='" + something + '\'' + - '}' - } -} diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntityController.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntityController.kt deleted file mode 100644 index a399e9b4..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestEntityController.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity.crud - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.AbstractCrudController -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController - -@RestController -@RequestMapping("/api/tests") -class TestEntityController @Autowired protected constructor(service: TestCrudService?) : AbstractCrudController(service) diff --git a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestRepository.kt b/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestRepository.kt deleted file mode 100644 index b44b32bb..00000000 --- a/hub-backend/src/test/old_tests/org/panda_lang/hub/utils/entity/crud/TestRepository.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.panda_lang.hub.utils.entity.crud - -import org.bson.types.ObjectId -import org.panda_lang.hub.utils.entity.NameableMongoRepository -import org.springframework.stereotype.Repository - -@Repository -interface TestRepository : NameableMongoRepository diff --git a/hub-backend/src/test/resources/application.yml b/hub-backend/src/test/resources/application.yml deleted file mode 100644 index 4120496e..00000000 --- a/hub-backend/src/test/resources/application.yml +++ /dev/null @@ -1,11 +0,0 @@ -hub: - workspace: "src/test/workspace" - -spring: - main: - allow-bean-definition-overriding: true - shell: - interactive: - enabled: false - profiles: - active: test \ No newline at end of file diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/_remote.repositories b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/_remote.repositories deleted file mode 100644 index 54893788..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/_remote.repositories +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Sat Jul 21 22:48:21 CEST 2018 -panda-utilities-indev-0.8.0.jar>= -panda-utilities-indev-0.8.0.pom>= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/panda-utilities-indev-0.8.0.jar b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/panda-utilities-indev-0.8.0.jar deleted file mode 100644 index e69de29b..00000000 diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/panda-utilities-indev-0.8.0.pom b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/panda-utilities-indev-0.8.0.pom deleted file mode 100644 index d02fd6ad..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.0/panda-utilities-indev-0.8.0.pom +++ /dev/null @@ -1,110 +0,0 @@ - - - - 4.0.0 - - - panda-parent - org.panda-lang - indev-0.8.0 - - - panda-utilities - jar - - - - com.google.auto.value - auto-value - - - org.reflections - reflections - - - org.jetbrains - annotations - - - - - org.slf4j - slf4j-api - - - org.apache.logging.log4j - log4j-core - - - org.apache.logging.log4j - log4j-slf4j-impl - - - - - org.junit.jupiter - junit-jupiter-engine - test - - - junit - junit - test - - - org.junit.platform - junit-platform-runner - test - - - org.junit.vintage - junit-vintage-engine - test - - - - - - panda-repository - https://repo.panda-lang.org/releases - - - - - clean install - - - org.apache.maven.plugins - maven-jar-plugin - - - - Panda-Utilities - Panda-Utilities - ${panda.version} - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - - \ No newline at end of file diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.jar.lastUpdated b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.jar.lastUpdated deleted file mode 100644 index 4fcfc9f1..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.jar.lastUpdated +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Tue Jul 31 22:21:21 CEST 2018 -https\://repo.maven.apache.org/maven2/.lastUpdated=1533068481156 -https\://repo.maven.apache.org/maven2/.error= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.pom.lastUpdated b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.pom.lastUpdated deleted file mode 100644 index 69ebd445..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.731/panda-utilities-indev-0.8.731.pom.lastUpdated +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Tue Jul 31 22:21:20 CEST 2018 -https\://repo.maven.apache.org/maven2/.lastUpdated=1533068480545 -https\://repo.maven.apache.org/maven2/.error= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/_remote.repositories b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/_remote.repositories deleted file mode 100644 index b370080a..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/_remote.repositories +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Tue Aug 07 19:06:52 CEST 2018 -panda-utilities-indev-0.8.87.jar>= -panda-utilities-indev-0.8.87.pom>= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.jar b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.jar deleted file mode 100644 index e69de29b..00000000 diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.jar.lastUpdated b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.jar.lastUpdated deleted file mode 100644 index 8328c28f..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.jar.lastUpdated +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Tue Aug 07 16:39:53 CEST 2018 -https\://repo.maven.apache.org/maven2/.lastUpdated=1533652793574 -https\://repo.maven.apache.org/maven2/.error= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom deleted file mode 100644 index d29929d0..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom +++ /dev/null @@ -1,90 +0,0 @@ - - - - 4.0.0 - - - panda-parent - org.panda-lang - indev-0.8.87 - - - panda-utilities - - - - org.javassist - javassist - - - org.jetbrains - annotations - - - - - org.slf4j - slf4j-api - - - org.apache.logging.log4j - log4j-core - - - org.apache.logging.log4j - log4j-slf4j-impl - - - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - panda-repository - https://repo.panda-lang.org/releases - - - - - clean install - - - org.apache.maven.plugins - maven-jar-plugin - - - - Panda-Utilities - Panda-Utilities - ${panda.version} - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - - \ No newline at end of file diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom.lastUpdated b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom.lastUpdated deleted file mode 100644 index 24790d17..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/indev-0.8.87/panda-utilities-indev-0.8.87.pom.lastUpdated +++ /dev/null @@ -1,4 +0,0 @@ -#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice. -#Tue Aug 07 16:39:53 CEST 2018 -https\://repo.maven.apache.org/maven2/.lastUpdated=1533652793020 -https\://repo.maven.apache.org/maven2/.error= diff --git a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/maven-metadata.xml b/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/maven-metadata.xml deleted file mode 100644 index 1f733011..00000000 --- a/hub-backend/src/test/workspace/repositories/maven/releases/org/panda-lang/panda-utilities/maven-metadata.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - org.panda-lang - panda-utilities - - indev-0.8.87 - - indev-0.8.0 - indev-0.8.87 - - 20180807170652 - - diff --git a/hub-backend/src/test/workspace/repositories/panda/dzikoysk/another-project/builds/another-project-0.0.1.zip b/hub-backend/src/test/workspace/repositories/panda/dzikoysk/another-project/builds/another-project-0.0.1.zip deleted file mode 100644 index e69de29b..00000000 diff --git a/hub-backend/src/test/workspace/repositories/panda/dzikoysk/example-project/builds/example-project.proxy b/hub-backend/src/test/workspace/repositories/panda/dzikoysk/example-project/builds/example-project.proxy deleted file mode 100644 index e69de29b..00000000 diff --git a/hub-frontend/.browserslistrc b/hub-frontend/.browserslistrc deleted file mode 100644 index d6471a38..00000000 --- a/hub-frontend/.browserslistrc +++ /dev/null @@ -1,2 +0,0 @@ -> 1% -last 2 versions diff --git a/hub-frontend/.editorconfig b/hub-frontend/.editorconfig deleted file mode 100644 index 8db7f272..00000000 --- a/hub-frontend/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -[*.{js,jsx,ts,tsx,vue}] -indent_style = tab -# indent_size = 2 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/hub-frontend/.gitignore b/hub-frontend/.gitignore index a0dddc6f..20fccdd4 100644 --- a/hub-frontend/.gitignore +++ b/hub-frontend/.gitignore @@ -1,21 +1,30 @@ -.DS_Store -node_modules -/dist +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# local env files -.env.local -.env.*.local +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ -# Log files +# production +/build + +# misc +.DS_Store + +# debug npm-debug.log* yarn-debug.log* yarn-error.log* -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local diff --git a/hub-frontend/README.md b/hub-frontend/README.md index 8cff664c..02695bc1 100644 --- a/hub-frontend/README.md +++ b/hub-frontend/README.md @@ -1,29 +1 @@ -# hub-frontend - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Run your tests -``` -npm run test -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). +This is a starter template for [Learn Next.js](https://nextjs.org/learn). \ No newline at end of file diff --git a/hub-frontend/babel.config.js b/hub-frontend/babel.config.js deleted file mode 100644 index 57ee511a..00000000 --- a/hub-frontend/babel.config.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - presets: [ - '@vue/app' - ] -} diff --git a/hub-frontend/config.js b/hub-frontend/config.js deleted file mode 100644 index c028671f..00000000 --- a/hub-frontend/config.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - port: 80, - frontend: 'http://localhost:80', - backend: 'http://localhost:3000' -} diff --git a/hub-frontend/next.config.js b/hub-frontend/next.config.js new file mode 100644 index 00000000..e78eced2 --- /dev/null +++ b/hub-frontend/next.config.js @@ -0,0 +1,10 @@ +module.exports = { + async rewrites() { + return [ + { + source: '/xxx', + destination: '/', + }, + ] + }, +} \ No newline at end of file diff --git a/hub-frontend/package-lock.json b/hub-frontend/package-lock.json new file mode 100644 index 00000000..8678be0a --- /dev/null +++ b/hub-frontend/package-lock.json @@ -0,0 +1,9605 @@ +{ + "name": "learn-starter", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "learn-starter", + "version": "0.1.0", + "dependencies": { + "@chakra-ui/icons": "^1.0.5", + "@chakra-ui/react": "^1.3.2", + "@emotion/react": "^11.1.5", + "@emotion/styled": "^11.1.5", + "axios": "^0.21.1", + "focus-visible": "^5.2.0", + "framer-motion": "^3.3.0", + "next": "^10.0.0", + "query-string": "^6.14.0", + "react": "17.0.1", + "react-dom": "17.0.1", + "react-icons": "^4.2.0", + "swr": "^0.4.2" + } + }, + "node_modules/@ampproject/toolbox-core": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-core/-/toolbox-core-2.7.4.tgz", + "integrity": "sha512-qpBhcS4urB7IKc+jx2kksN7BuvvwCo7Y3IstapWo+EW+COY5EYAUwb2pil37v3TsaqHKgX//NloFP1SKzGZAnw==", + "dependencies": { + "cross-fetch": "3.0.6", + "lru-cache": "6.0.0" + } + }, + "node_modules/@ampproject/toolbox-optimizer": { + "version": "2.7.1-alpha.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.7.1-alpha.0.tgz", + "integrity": "sha512-WGPZKVQvHgNYJk1XVJCCmY+NVGTGJtvn0OALDyiegN4FJWOcilQUhCIcjMkZN59u1flz/u+sEKccM5qsROqVyg==", + "hasInstallScript": true, + "dependencies": { + "@ampproject/toolbox-core": "^2.7.1-alpha.0", + "@ampproject/toolbox-runtime-version": "^2.7.1-alpha.0", + "@ampproject/toolbox-script-csp": "^2.5.4", + "@ampproject/toolbox-validator-rules": "^2.7.1-alpha.0", + "abort-controller": "3.0.0", + "cross-fetch": "3.0.6", + "cssnano-simple": "1.2.1", + "dom-serializer": "1.1.0", + "domhandler": "3.3.0", + "domutils": "2.4.2", + "htmlparser2": "5.0.1", + "https-proxy-agent": "5.0.0", + "lru-cache": "6.0.0", + "node-fetch": "2.6.1", + "normalize-html-whitespace": "1.0.0", + "postcss": "7.0.32", + "postcss-safe-parser": "4.0.2", + "terser": "5.5.1" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "probe-image-size": { + "optional": true + } + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/cssnano-preset-simple": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.1.tgz", + "integrity": "sha512-B2KahOIFTV6dw5Ioy9jHshTh/vAYNnUB2enyWRgnAEg3oJBjI/035ExpePaMqS2SwpbH7gCgvQqwpMBH6hTJSw==", + "dependencies": { + "caniuse-lite": "^1.0.30001093", + "postcss": "^7.0.32" + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/cssnano-simple": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.1.tgz", + "integrity": "sha512-9vOyjw8Dj/T12kIOnXPZ5VnEIo6F3YMaIn0wqJXmn277R58cWpI3AvtdlCBtohX7VAUNYcyk2d0dKcXXkb5I6Q==", + "dependencies": { + "cssnano-preset-simple": "1.2.1", + "postcss": "^7.0.32" + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + }, + "node_modules/@ampproject/toolbox-optimizer/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/toolbox-optimizer/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ampproject/toolbox-runtime-version": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.4.tgz", + "integrity": "sha512-SAdOUOERp42thVNWaBJlnFvFVvnacMVnz5z9LyUZHSnoL1EqrAW5Sz5jv+Ly+gkA8NYsEaUxAdSCBAzE9Uzb4Q==", + "dependencies": { + "@ampproject/toolbox-core": "2.7.4" + } + }, + "node_modules/@ampproject/toolbox-script-csp": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.5.4.tgz", + "integrity": "sha512-+knTYetI5nWllRZ9wFcj7mYxelkiiFVRAAW/hl0ad8EnKHMH82tRlk40CapEnUHhp6Er5sCYkumQ8dngs3Q4zQ==" + }, + "node_modules/@ampproject/toolbox-validator-rules": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.7.4.tgz", + "integrity": "sha512-z3JRcpIZLLdVC9XVe7YTZuB3a/eR9s2SjElYB9AWRdyJyL5Jt7+pGNv4Uwh1uHVoBXsWEVQzNOWSNtrO3mSwZA==", + "dependencies": { + "cross-fetch": "3.0.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/core": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.16.tgz", + "integrity": "sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.15", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helpers": "^7.12.13", + "@babel/parser": "^7.12.16", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "peer": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", + "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "peer": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "node_modules/@babel/helpers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", + "peer": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@chakra-ui/accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-1.1.2.tgz", + "integrity": "sha512-ni4lwO7I1f9uHgV/FHZVfyr+FRDabXfX2cqpCtY2+QvBzaWM+55VAHJfbel2N6/eogXy5WSLJyYD5fQmyu7Fpg==", + "dependencies": { + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/alert": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-1.1.1.tgz", + "integrity": "sha512-Hqbf4VuAL/gL6oLQapoF8BV5zAX41Rm+xN2q8c/jWZx5i3l7kWiQ5jn0dJ0prWnVdNbEPmIAqiU0UkSo/lUOjw==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/avatar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-1.1.2.tgz", + "integrity": "sha512-CqXedZed9bEWzzs+8mkB/4NLmD+JbMetNvVbHtLlENta7jnOJDCMJpaXD9QMmiGKKNuqFHfZlGmLmxIMruZBpg==", + "dependencies": { + "@chakra-ui/image": "1.0.7", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/breadcrumb": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-1.1.1.tgz", + "integrity": "sha512-EnbMYwqPI8if0WJ2m/054fKXc+K7GN8jafaLCm4qfWedogF6t3huB0qvLA00Z6HUwTNfdCtESxU44VfGHsbNDQ==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/button": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-1.1.2.tgz", + "integrity": "sha512-6QEn6cL3v1VcdqCT92uqduLI7ip+VQk4Adxekt5WWHDvkw9WqQz1aOqKzfPTEau27WHBBymB09vJR66CoUZCiw==", + "dependencies": { + "@chakra-ui/spinner": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/checkbox": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-1.2.2.tgz", + "integrity": "sha512-8WSpWZGD6cRKlu31/F1TfZxsibettQr+8mrPj81vlx4uAjK6nJPZOtgUwhQh0sZzH4bmKmiNTkaPsmuly6mjoQ==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/clickable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-1.0.4.tgz", + "integrity": "sha512-KAfOjz2zoF7OGay/rg9x2hPCgwd5WqnsxR3dgo6R6ULQ4dsee602kjy6OYxKyI9e6DUgodI/BDZq+57e7+wd5A==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/close-button": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-1.1.1.tgz", + "integrity": "sha512-vTapJ3kZZ04xxR1c+EO1t7w5BYZmm/7NTCotAPN6SuehlcqzG0YP2t+fHk7YPlXiweTQKL6v5DLCBlSuqSjZtw==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/color-mode": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-1.0.7.tgz", + "integrity": "sha512-WJV+aK6GB9nUhMbeYN6cJv+5nQzpWNNyZfxUs+B+gFv/NHMh3/ZwWW+bSSvk57m4v23Icj3ZPyhY4RCiWcBw2Q==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/control-box": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-1.0.4.tgz", + "integrity": "sha512-qiZAawX8EaWxk+QnCtpmGADV3D7mNy3DcPhIPmsY4XYfnh8wl9cJfm2B6u3we8nHhi8eQSReSHGbV5s884bO1g==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/counter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-1.0.7.tgz", + "integrity": "sha512-wcSqSZIvdumn8yIfpF7r/cuYQ6MQlSoY/WQu6aJuwpky/k4xgfVSQq/VCM/Jcb8VcnYeYmPasnKHo+5RY35gSw==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/css-reset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-1.0.0.tgz", + "integrity": "sha512-UaPsImGHvCgFO3ayp6Ugafu2/3/EG8wlW/8Y9Ihfk1UFv8cpV+3BfWKmuZ7IcmxcBL9dkP6E8p3/M1T0FB92hg==", + "peerDependencies": { + "@emotion/react": ">=10.0.35", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/descendant": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-1.0.7.tgz", + "integrity": "sha512-PnyLyV8hD+STVr9KYzPN13hCj7pwSLvGtQc3J1d+XXvazBtmwUIaX9WZ632kXQhxlvdz83tOzDbJPQs3e1VU3A==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/editable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-1.1.1.tgz", + "integrity": "sha512-p33kIcqBoM9c+hh10QRoV15Lb/sKT3KJoPwThjyDcBaNyvSyFhrOX0equVxjxD7Y4htp9/G7b8owx767lnobwg==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/focus-lock": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-1.0.4.tgz", + "integrity": "sha512-QIUQCqkBwKRbJrfkl/0QW2ikWy5kTZUjP+MDa7oWEU7kCSD41x+d1qbn+BZMdnTvLAEZOJjVVVhKye2BNj5z5Q==", + "dependencies": { + "@chakra-ui/utils": "1.2.0", + "react-focus-lock": "2.4.1" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/form-control": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-1.2.1.tgz", + "integrity": "sha512-pgp34e5DRHc8B+wUMxZNYBo8W7f2TdIOm04dO24WIIC+mPIu++QsV2O0SPOeN+WJzbirtq/8vibPmaZOfBdQVw==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/hooks": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-1.1.4.tgz", + "integrity": "sha512-5E4JT4Bl/JYe75N3/eU6eWkDhLCx1azcKpkvzNAgRFP1QqbXxAjxVnwHiMoNhWNFHBWRhkvTI/z4yBoOc7Rf4w==", + "dependencies": { + "@chakra-ui/utils": "1.2.0", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/icon": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-1.1.1.tgz", + "integrity": "sha512-dL1D1q11MM+cL849jmADSjY8KqOWplAEb/XgLXX/ZZau7GHqYAXIwdYnfXwOYBaypiosUvGsm9g2zU4iHYZtdg==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/icons": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-1.0.5.tgz", + "integrity": "sha512-l8CgisPAS44ehKLw/hoHI6dfSX7pOAfylv8QkINVPEzhHwnNIg0wHzcm1cGkRXuq3DN8G0z88KmFegFFp02yiA==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@types/react": "^17.0.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/image": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-1.0.7.tgz", + "integrity": "sha512-GqPHBzWgvkmxuovD8sLvwO45Zh+vRa0qIKFg6mBeMwpdQh4aWHZJLw8Ln5Hh3WFRtJcIbZqKQV3dUJln8ZpQkQ==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/input": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-1.1.2.tgz", + "integrity": "sha512-ipT5RpkwVTTzadvOEXt62m9a7Q3vH0cZf1Dis3xdh2FBJjR1Xk0Nr+jjXxtTj99Rn6UMxsVyq3EsSnH09O8o5A==", + "dependencies": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/layout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-1.3.1.tgz", + "integrity": "sha512-xkIemd9Sloq0kOnbyxnXO22W5YFlMxxHVJLkX9cN5+13i+Qi/Fk/da+yyP8wQ4g8zxQORFZb5K47GdJneGOUlQ==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/live-region": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-1.0.4.tgz", + "integrity": "sha512-sJkCqT1chDU04MMgFCy2amq/h/95IoOLbRhuJpWm4V7WIHT/YsQURk0DCHr8JhPXgTJx88jgNve/WFdVtZEmDw==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/media-query": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-1.0.5.tgz", + "integrity": "sha512-QoZt7YkPKEZhdHQ1M6F6QzRC0gUlLCDDrDEPHn3D4AZzhYcmygH4TlSTi2WwhZjdiwgTRJT4zqpkkdej0sLXuA==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "@chakra-ui/theme": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/menu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-1.1.1.tgz", + "integrity": "sha512-cRuieqR5zxhW0vt+2ll8fGYMwmSCX3OgAaiImcvi34R+Jjsa4bcKeIjspbIm26p9jYDu3dsPTpLWJ4MRvDYd6g==", + "dependencies": { + "@chakra-ui/clickable": "1.0.4", + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/modal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-1.5.1.tgz", + "integrity": "sha512-Wzs6vZzGvvxKT+7r6O9eIWUs1Hn66vteTv1AKCUO5rXz/sUAZkZZiiC1LVIQbpreDR0GXCVUuWxkoaxGETurKg==", + "dependencies": { + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/focus-lock": "1.0.4", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.4.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/number-input": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-1.1.1.tgz", + "integrity": "sha512-BAVfv79andVOEYx3YWLb0RrdLLqE484CwGxjoJ3aE8OprW/WE8Ghl2BO/wxWBXwX/TxnvB6JpC4iM4u6eHufnQ==", + "dependencies": { + "@chakra-ui/counter": "1.0.7", + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/pin-input": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-1.4.0.tgz", + "integrity": "sha512-85XXAMNNgX7RG0ca9tU4kJeYYrj9+jtUWINatYXVzcvkx/T1VRM3ohRQDtDdZ7wovzEE90mtzkQGPISZhLKHug==", + "dependencies": { + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/popover": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-1.2.1.tgz", + "integrity": "sha512-A3va8KwjdMM5stVNTUiliIeIRen9JWmWmSdXuN6B3ffdNbi5vee9OvdpF8yhevFxBscJWvqoFYf/9E2tduXDfg==", + "dependencies": { + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-1.1.3.tgz", + "integrity": "sha512-4Z73UJLki77aJG8RoeKdjIcqk/UbfmvSLMTqEhU/057OcjSugZZs0Qw3OZQZRNKTcdU1do8mo433THHYvnm/EQ==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@popperjs/core": "2.4.4", + "dequal": "2.0.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-1.1.1.tgz", + "integrity": "sha512-YzD/807srlkC1+F1jRaJYAlgtb2CN24RhYRVliV45xR59RkrgnAVVzt7+KmsUF4N9OK+OJhrMfhyM2sNvthw1g==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/progress": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-1.1.1.tgz", + "integrity": "sha512-lGZaUPvi0ySwvIp1FG2RyrioBBPGyr3TzQxT5nf6eUVTfwps3LlAGcCTfNy59tK8vcwXz0uDDKtobfRFwxj19g==", + "dependencies": { + "@chakra-ui/theme-tools": "1.0.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/radio": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-1.2.2.tgz", + "integrity": "sha512-HsNY0QjjC+ctPjo05qLCfKfXO+FOV1UQAKXVcl0kZlYXg/C+Ed4kTaWH2+JKqyPFwQf+KSQbZON1ZpvQY4ZPUg==", + "dependencies": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/react": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-1.3.2.tgz", + "integrity": "sha512-BsqX9x27JpIcU+ywuLiL1MfEAEhsxK6J5QCcsZHtDI/wiRy4p3o2qmTsCLPLvBX7HdukTFSCVm2bbYqLKTL8Zw==", + "dependencies": { + "@chakra-ui/accordion": "1.1.2", + "@chakra-ui/alert": "1.1.1", + "@chakra-ui/avatar": "1.1.2", + "@chakra-ui/breadcrumb": "1.1.1", + "@chakra-ui/button": "1.1.2", + "@chakra-ui/checkbox": "1.2.2", + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/control-box": "1.0.4", + "@chakra-ui/counter": "1.0.7", + "@chakra-ui/css-reset": "1.0.0", + "@chakra-ui/editable": "1.1.1", + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/image": "1.0.7", + "@chakra-ui/input": "1.1.2", + "@chakra-ui/layout": "1.3.1", + "@chakra-ui/live-region": "1.0.4", + "@chakra-ui/media-query": "1.0.5", + "@chakra-ui/menu": "1.1.1", + "@chakra-ui/modal": "1.5.1", + "@chakra-ui/number-input": "1.1.1", + "@chakra-ui/pin-input": "1.4.0", + "@chakra-ui/popover": "1.2.1", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/progress": "1.1.1", + "@chakra-ui/radio": "1.2.2", + "@chakra-ui/select": "1.1.1", + "@chakra-ui/skeleton": "1.1.2", + "@chakra-ui/slider": "1.1.1", + "@chakra-ui/spinner": "1.1.1", + "@chakra-ui/stat": "1.1.1", + "@chakra-ui/switch": "1.1.2", + "@chakra-ui/system": "1.3.0", + "@chakra-ui/table": "1.1.1", + "@chakra-ui/tabs": "1.1.1", + "@chakra-ui/tag": "1.1.1", + "@chakra-ui/textarea": "1.1.1", + "@chakra-ui/theme": "1.6.1", + "@chakra-ui/toast": "1.1.10", + "@chakra-ui/tooltip": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/select": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-1.1.1.tgz", + "integrity": "sha512-7sFPXjBlV/6Ms60hHyLgiCMe93BF6z59HFrGQyXavvN3NNSpR4B4+AQqD5/guRi3GV8TamyPiHVIQIPw6wt2Eg==", + "dependencies": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/skeleton": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-1.1.2.tgz", + "integrity": "sha512-5L2ISCA4ES1T+aHKNj+dnIFBlszMKHu1/xH8wSk2mNMAaPk3PvbZJqw0ufxX/dG5Pv8jQluAUMhulqviFSRSDw==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/media-query": "1.0.5", + "@chakra-ui/system": "1.3.0", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/slider": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-1.1.1.tgz", + "integrity": "sha512-D9xZqefmxx2clbd3iNK2bM1zFmygXXNZuwvPFCVWPa82zSOVPnfDjH1n+Z+VjPixEW6fl64sIl99oJdvDuH7wg==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/spinner": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-1.1.1.tgz", + "integrity": "sha512-dGT5DVvQwnj4B7FjIl6C/1ZmXgUFSA0ZC7JgQNQdJYc3DgtkGf0a6L+DhiyBneEPb9/RRHQJhHoRPndnHU15QA==", + "dependencies": { + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/stat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-1.1.1.tgz", + "integrity": "sha512-dG7SGe2ZEFugbA4kyCtSLRtwgMQ2pqq3QAWBjA/ZvdEdhL10EGp+bv3Ab0l1qju3DEpfyx3+M6mHxG5zWJ92Fw==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/styled-system": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-1.7.0.tgz", + "integrity": "sha512-IupaDUkAC2Y6/bJxYssiYbRYjKcEK9dIroPS1RJPa24slY7CkID7QND6F8HZMDLcOYfGa1Vek8lGOPlKa+FBgg==", + "dependencies": { + "@chakra-ui/utils": "1.2.0", + "css-get-unit": "1.0.1", + "csstype": "^3.0.6" + } + }, + "node_modules/@chakra-ui/switch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-1.1.2.tgz", + "integrity": "sha512-QzkfOgkcSVkejjobp3jl5Oso15Alr5N05NP454IkG487X6y625UD+BMujZX8QywywjgFWaoEj/dPnBilRjP28w==", + "dependencies": { + "@chakra-ui/checkbox": "1.2.2", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/system": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-1.3.0.tgz", + "integrity": "sha512-A/yJ8xcrMr2OiyX2J9OS732t7pq+ye7rT0FQDl4H+YObOMsq7B+0JJEBpTP5P174ZKCTOjBGy4muwa8o6GCNAQ==", + "dependencies": { + "@chakra-ui/color-mode": "1.0.7", + "@chakra-ui/styled-system": "1.7.0", + "@chakra-ui/utils": "1.2.0", + "react-fast-compare": "3.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/table": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-1.1.1.tgz", + "integrity": "sha512-GdYbqN1q/QPQqca3jfWbyWJ7waUg6RbpQbsyyhFNWHDKhOb6H2y+cDZCHrOiFwBahWZxykR4ZcMJnQjPqtB7ag==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/tabs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-1.1.1.tgz", + "integrity": "sha512-yfJct0Yfxt2fQ9KgbtVhC89OaB5iD8nLAFi3zhiuNQBp84OXESVfvanr1lHBg3YZLgVLW1O0QQLv3aHVGLtwYg==", + "dependencies": { + "@chakra-ui/clickable": "1.0.4", + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/tag": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-1.1.1.tgz", + "integrity": "sha512-I1ScSeaUEgNPY7lv2IZ0blTAb13wvu/UqGPuatG71PqI4LIKAtZJVxF/AnxAQY4WpbDKTp/t3z3DfyKr8Ccouw==", + "dependencies": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/textarea": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-1.1.1.tgz", + "integrity": "sha512-Mmw/mVfZSNf/0QpLe8Nnvpp1jAkRtjhKD4eDBG6AW6M0l6tST3LFbDC3qZePmEJpqxkOE3IyQgYEjHjb9PgcMA==", + "dependencies": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/theme": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-1.6.1.tgz", + "integrity": "sha512-9zrPG1osrV+N7RROrr/m+6JWWvvAPpElBLmbjPSzrf3JlxxD+3xDgLCOrZ/C0GzdVtgfyE5584W4VXWoA4OqXw==", + "dependencies": { + "@chakra-ui/theme-tools": "1.0.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0" + } + }, + "node_modules/@chakra-ui/theme-tools": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-1.0.4.tgz", + "integrity": "sha512-kx34izftAHvtRjxpkgWbnMx5DyGtUi8JoQO8E5bhwjJ5drNQl2yvNeoqLpHjf3YTqBYQqkz3VkzHIeHs3wZEwg==", + "dependencies": { + "@chakra-ui/utils": "1.2.0", + "@types/tinycolor2": "1.4.2", + "tinycolor2": "1.4.2" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0" + } + }, + "node_modules/@chakra-ui/toast": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-1.1.10.tgz", + "integrity": "sha512-pxI+GXMOyzkf012NMRNiBAZmTfRf+8829mbOGPhAr3Ce6N/mlv0Tu8X4BfzhSk1iEV4uWDMZ+dq3uhCtK2EttA==", + "dependencies": { + "@chakra-ui/alert": "1.1.1", + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/theme": "1.6.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "@reach/alert": "0.13.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/tooltip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-1.1.1.tgz", + "integrity": "sha512-m0R5+QBfJJYYZIjhF0jrfJotyoIvd560l4isngvcmVKzEkQR/Y4NcOfVdynENW3Mi2o7mjLXy43uW9YLOzU70g==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/transition": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-1.0.8.tgz", + "integrity": "sha512-c4BArP5Q9nl2R6QDAmigCklkMpGKP1ZYOfF1RD7qboPROZVt+SUNGKW+GHGN7mN0kaWHuCb+sbLXMCqQG/jQmQ==", + "dependencies": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "framer-motion": ">=3.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-oMTX8BX1+MUf+iYUafFm9tNfwa3m1cqzMcE/5iQFmNcqKlZmuADnVL28Yw7jhoeouIjANaGY+f51qj9zHgDn9Q==", + "dependencies": { + "@types/lodash.mergewith": "4.6.6", + "@types/object-assign": "4.0.30", + "css-box-model": "1.2.1", + "lodash.mergewith": "4.6.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/visually-hidden": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-1.0.4.tgz", + "integrity": "sha512-RxXmEjwOoMh28lSen4tmkQBRQ21Hi15UGLQTnKfY2LhJyxsojyPT9TSHzehWgFIb8D+N3Er09WLgkd6f/bJqyg==", + "dependencies": { + "@chakra-ui/utils": "1.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.2.0.tgz", + "integrity": "sha512-lsnQBnl3l4wu/FJoyHnYRpHJeIPNkOBMbtDUIXcO8luulwRKZXPvA10zd2eXVN6dABIWNX4E34en/jkejIg/yA==", + "dependencies": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/plugin-syntax-jsx": "^7.12.1", + "@babel/runtime": "^7.7.2", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.0", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "^4.0.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", + "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + }, + "node_modules/@emotion/cache": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.1.3.tgz", + "integrity": "sha512-n4OWinUPJVaP6fXxWZD9OUeQ0lY7DvtmtSuqtRWT0Ofo/sBLCVSgb4/Oa0Q5eFxcwablRKjUXqXtNZVyEwCAuA==", + "dependencies": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.0.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "^4.0.3" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", + "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.0.tgz", + "integrity": "sha512-9RkilvXAufQHsSsjQ3PIzSns+pxuX4EW8EbGeSPjZMHuMx6z/MOzb9LpqNieQX4F3mre3NWS2+X3JNRHTQztUQ==", + "dependencies": { + "@emotion/memoize": "^0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "node_modules/@emotion/react": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.1.5.tgz", + "integrity": "sha512-xfnZ9NJEv9SU9K2sxXM06lzjK245xSeHRpUh67eARBm3PBHjjKIZlfWZ7UQvD0Obvw6ZKjlC79uHrlzFYpOB/Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@emotion/cache": "^11.1.3", + "@emotion/serialize": "^1.0.0", + "@emotion/sheet": "^1.0.1", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.0.tgz", + "integrity": "sha512-zt1gm4rhdo5Sry8QpCOpopIUIKU+mUSpV9WNmFILUraatm5dttNEaYzUWWSboSMUE6PtN2j1cAsuvcugfdI3mw==", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.1.tgz", + "integrity": "sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g==" + }, + "node_modules/@emotion/styled": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.1.5.tgz", + "integrity": "sha512-nIq7pOBEDqT5xSFbclQ3XFy0q8C9EUU8ECqKN2kJKGxKh+vLz/x26kEih4aOpoAsyzc+R60rQxh7VJiLTUEdmg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@emotion/babel-plugin": "^11.1.2", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/serialize": "^1.0.0", + "@emotion/utils": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "node_modules/@hapi/accept": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", + "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", + "dependencies": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.1.tgz", + "integrity": "sha512-VNR8eDbBrOxBgbkddRYIe7+8DZ+vSbV6qlmaN2x7eWjsUjy2VmQgChkOKcVZIeupEZYj+I0dqNg430OhwzagjA==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", + "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==" + }, + "node_modules/@next/env": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-10.0.6.tgz", + "integrity": "sha512-++zgrcSL9SprjWKBbO3YuVj/8CTmxJl+zLErW/Kbr2VCT0u12SrBcMKvD236lEGs5/qUgeBfU3Dvmr6MASWrtA==" + }, + "node_modules/@next/polyfill-module": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-10.0.6.tgz", + "integrity": "sha512-Sk3HYFxiI3AyIhw7Nnc5un//duCthAP2XtPb4N1SamymOU2QSb8I1zkcsxVIlZRvftdXikQQgra6Ck2zfJRxpA==" + }, + "node_modules/@next/react-dev-overlay": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-10.0.6.tgz", + "integrity": "sha512-KbxpyVT6gr1KZ7JoFDKGNM0hK7CxPkIC14j/gYgR6qSOhxGs3GEIBScJRXfKD7LNPMgVgQtaJlBYlEJ7aQu1xg==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "anser": "1.4.9", + "chalk": "4.0.0", + "classnames": "2.2.6", + "css.escape": "1.5.1", + "data-uri-to-buffer": "3.0.1", + "platform": "1.3.6", + "shell-quote": "1.7.2", + "source-map": "0.8.0-beta.0", + "stacktrace-parser": "0.1.10", + "strip-ansi": "6.0.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17", + "react-dom": "^16.9.0 || ^17" + } + }, + "node_modules/@next/react-dev-overlay/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@next/react-dev-overlay/node_modules/chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "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/@next/react-dev-overlay/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@next/react-dev-overlay/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==" + }, + "node_modules/@next/react-dev-overlay/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@next/react-dev-overlay/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@next/react-refresh-utils": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.0.6.tgz", + "integrity": "sha512-4BF+8PyzDcYpumQJ22yBUjVP/CL2KLPM+3K3ZQb61HvmIptB/t+jFnH2ew8S7ORQNu/caVQC6wP5wAfOtpJNsg==", + "peerDependencies": { + "react-refresh": "0.8.3", + "webpack": "^4 || ^5" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@opentelemetry/api": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.14.0.tgz", + "integrity": "sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ==", + "dependencies": { + "@opentelemetry/context-base": "^0.14.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-base": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.14.0.tgz", + "integrity": "sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", + "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reach/alert": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.13.0.tgz", + "integrity": "sha512-5lpgRnlQ0JHBsRTPfKjD9aFPDZuLcaxTgD5PXdSLb+1CU8WgNbcy+7qSjqnu1uzWS2pQenIEBViV5wGpt63ADw==", + "dependencies": { + "@reach/utils": "0.13.0", + "@reach/visually-hidden": "0.13.0", + "prop-types": "^15.7.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || 17.x", + "react-dom": "^16.8.0 || 17.x" + } + }, + "node_modules/@reach/utils": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.13.0.tgz", + "integrity": "sha512-dypxuyA1Qy3LHxzzyS7jFGPgCCR04b8UEn+Tv/aj6y9V578dULQqkcCyobrdEa+OI8lxH7dFFHa+jH8M/noBrQ==", + "dependencies": { + "@types/warning": "^3.0.0", + "tslib": "^2.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^16.8.0 || 17.x", + "react-dom": "^16.8.0 || 17.x" + } + }, + "node_modules/@reach/visually-hidden": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.13.0.tgz", + "integrity": "sha512-LF11WL9/495Q3d86xNy0VO6ylPI6SqF2xZGg9jpZSXLbFKpQ5Bf0qC7DOJfSf+/yb9WgPgB4m+a48Fz8AO6oZA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || 17.x", + "react-dom": "^16.8.0 || 17.x" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + }, + "node_modules/@types/lodash.mergewith": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz", + "integrity": "sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/object-assign": { + "version": "4.0.30", + "resolved": "https://registry.npmjs.org/@types/object-assign/-/object-assign-4.0.30.tgz", + "integrity": "sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI=" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "node_modules/@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" + }, + "node_modules/@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/anser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", + "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "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/are-we-there-yet/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==", + "optional": true + }, + "node_modules/are-we-there-yet/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/aria-hidden": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.2.tgz", + "integrity": "sha512-WAMH9q3vRimVqP+B0q2eDvx7IPDoY17A2fWwj5atTA/zTYJCNcS6HJ5YErZ5FO3PUHhrV0y0yR1NA0dRNm913A==", + "dependencies": { + "tslib": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + } + }, + "node_modules/aria-hidden/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "optional": true + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dependencies": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001185", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", + "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==" + }, + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "optional": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "optional": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "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==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz", + "integrity": "sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/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==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-get-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-get-unit/-/css-get-unit-1.0.1.tgz", + "integrity": "sha1-5JC55Wss0g+QOiLMr7RIOC7feXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "node_modules/cssnano-preset-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz", + "integrity": "sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001179", + "postcss": "^7.0.32" + } + }, + "node_modules/cssnano-preset-simple/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-simple/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-preset-simple/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cssnano-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.2.tgz", + "integrity": "sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g==", + "dependencies": { + "cssnano-preset-simple": "1.2.2", + "postcss": "^7.0.32" + } + }, + "node_modules/cssnano-simple/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-simple/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-simple/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/csstype": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", + "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==" + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.0.0.tgz", + "integrity": "sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg==" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", + "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.662", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.662.tgz", + "integrity": "sha512-IGBXmTGwdVGUVTnZ8ISEvkhDfhhD+CDFndG4//BhvDcEtPYiVrzoB+rzT/Y12OQCf5bvRCrVmrUbGrS9P7a6FQ==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/focus-lock": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.7.0.tgz", + "integrity": "sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw==" + }, + "node_modules/focus-visible": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", + "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" + }, + "node_modules/follow-redirects": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/framer-motion": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-3.3.0.tgz", + "integrity": "sha512-bjUrwXfMJZ6D+HSMDiXbMGKmlWGnUux8HotWgORTZkdPTgKAndlRXjeC2ikCgNVo2ifmRvEla5ckP9JaZc7JKA==", + "dependencies": { + "@emotion/is-prop-valid": "^0.8.2", + "framesync": "^5.0.0", + "hey-listen": "^1.0.8", + "popmotion": "^9.1.0", + "style-value-types": "^4.0.1", + "tslib": "^1.10.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/framesync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-5.0.0.tgz", + "integrity": "sha512-wd8t+JsQGisluSv1twiEeDv0aNGpavGb9q7xgIk9fGbcIWkNXF/KVtrjnOrCwBWJuiXxlJfNkcvGudsI32FxYA==" + }, + "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==", + "optional": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "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": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "optional": true + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "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==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "optional": true + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "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==", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "dependencies": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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==" + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "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==", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "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==", + "optional": true + }, + "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==" + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "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==", + "optional": true + }, + "node_modules/native-url": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz", + "integrity": "sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==", + "dependencies": { + "querystring": "^0.2.0" + } + }, + "node_modules/next": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/next/-/next-10.0.6.tgz", + "integrity": "sha512-uM5Yv4Ha9iL6Lbg7Ez36GyJ0YTdRLzXLA9b1REH3rX2Wytw0Ls5qPuFGk4BHSQpQhYx6Z61iA2qPkGl33W4iBg==", + "dependencies": { + "@ampproject/toolbox-optimizer": "2.7.1-alpha.0", + "@babel/runtime": "7.12.5", + "@hapi/accept": "5.0.1", + "@next/env": "10.0.6", + "@next/polyfill-module": "10.0.6", + "@next/react-dev-overlay": "10.0.6", + "@next/react-refresh-utils": "10.0.6", + "@opentelemetry/api": "0.14.0", + "ast-types": "0.13.2", + "browserslist": "4.16.1", + "buffer": "5.6.0", + "caniuse-lite": "^1.0.30001179", + "chalk": "2.4.2", + "chokidar": "3.5.1", + "crypto-browserify": "3.12.0", + "cssnano-simple": "1.2.2", + "etag": "1.8.1", + "find-cache-dir": "3.3.1", + "jest-worker": "24.9.0", + "native-url": "0.3.4", + "node-fetch": "2.6.1", + "node-html-parser": "1.4.9", + "node-libs-browser": "^2.2.1", + "p-limit": "3.1.0", + "path-browserify": "1.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "8.1.7", + "process": "0.11.10", + "prop-types": "15.7.2", + "raw-body": "2.4.1", + "react-is": "16.13.1", + "react-refresh": "0.8.3", + "sharp": "0.26.3", + "stream-browserify": "3.0.0", + "styled-jsx": "3.3.2", + "use-subscription": "1.5.1", + "vm-browserify": "1.1.2", + "watchpack": "2.0.0-beta.13" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=10.13.0" + }, + "optionalDependencies": { + "sharp": "0.26.3" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0", + "react": "^16.6.0 || ^17", + "react-dom": "^16.6.0 || ^17", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-abi": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz", + "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==", + "optional": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-html-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", + "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", + "dependencies": { + "he": "1.2.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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/node-libs-browser/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==" + }, + "node_modules/node-libs-browser/node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/node-libs-browser/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==" + }, + "node_modules/noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "optional": true + }, + "node_modules/normalize-html-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz", + "integrity": "sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "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==", + "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/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/popmotion": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.1.0.tgz", + "integrity": "sha512-+J7pzzBy5kk2qsP8ilowKs/CH+HoZa3kOGEBNCleCvsPXEF3nKHdfAR3SboMyPvdpIrofaT7ZIy/xWgz446Azw==", + "dependencies": { + "framesync": "5.0.0", + "hey-listen": "^1.0.8", + "style-value-types": "^4.0.1", + "tslib": "^1.10.0" + } + }, + "node_modules/popmotion/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/postcss": { + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.7.tgz", + "integrity": "sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ==", + "dependencies": { + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.16", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prebuild-install": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", + "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "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": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prebuild-install/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuild-install/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install/node_modules/simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "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==" + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/query-string": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.0.tgz", + "integrity": "sha512-In3o+lUxlgejoVJgwEdYtdxrmlL0cQWJXj0+kkI7RWVo7hg5AhFtybeKlC9Dpgbr8eOC4ydpEh8017WwyfzqVQ==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "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/react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz", + "integrity": "sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA==", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-clientside-effect/node_modules/@babel/runtime": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + }, + "peerDependencies": { + "react": "17.0.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-focus-lock": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.4.1.tgz", + "integrity": "sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.7.0", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.2", + "use-callback-ref": "^1.2.1", + "use-sidecar": "^1.0.1" + }, + "peerDependencies": { + "react": "^16.8.0" + } + }, + "node_modules/react-icons": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", + "integrity": "sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ==", + "peerDependencies": { + "react": "*" + } + }, + "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==" + }, + "node_modules/react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.0.tgz", + "integrity": "sha512-BZIO3GaEs0Or1OhA5C//n1ibUP1HdjJmqUVUsOCMxwoIpaCocbB9TFKwHOkBa/nyYy3slirqXeiPYGwdSDiseA==", + "dependencies": { + "react-remove-scroll-bar": "^2.1.0", + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0", + "use-callback-ref": "^1.2.3", + "use-sidecar": "^1.0.1" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0", + "react": "^16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz", + "integrity": "sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==", + "dependencies": { + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/react-remove-scroll/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/react-style-singleton": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz", + "integrity": "sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^1.0.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", + "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sharp": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.26.3.tgz", + "integrity": "sha512-NdEJ9S6AMr8Px0zgtFo1TJjMK/ROMU92MkDtYn2BBrDjIx3YfH9TUyGdzPC+I/L619GeYQc690Vbaxc5FPCCWg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.0.2", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.0", + "semver": "^7.3.2", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "optional": true + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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/stream-http/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==" + }, + "node_modules/stream-http/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-value-types": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-4.0.1.tgz", + "integrity": "sha512-aOV/HHyynIyTmU27qfs0oAHhFde6BFIvV4+nMerE2MAPZMwYOeQk1/F3S6djxF2u4HdbiieCPs3ZzWsbNUoc9A==", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "^1.10.0" + } + }, + "node_modules/style-value-types/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/styled-jsx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.3.2.tgz", + "integrity": "sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g==", + "dependencies": { + "@babel/types": "7.8.3", + "babel-plugin-syntax-jsx": "6.18.0", + "convert-source-map": "1.7.0", + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "string-hash": "1.1.3", + "stylis": "3.5.4", + "stylis-rule-sheet": "0.0.10" + }, + "peerDependencies": { + "react": "15.x.x || 16.x.x || 17.x.x" + } + }, + "node_modules/styled-jsx/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "node_modules/stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "peerDependencies": { + "stylis": "^3.5.0" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/swr": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/swr/-/swr-0.4.2.tgz", + "integrity": "sha512-SKGxcAfyijj/lE5ja5zVMDqJNudASH3WZPRUakDVOePTM18FnsXgugndjl9BSRwj+jokFCulMDe7F2pQL+VhEw==", + "dependencies": { + "dequal": "2.0.2" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0" + } + }, + "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==", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "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==", + "optional": true, + "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/terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "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": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use-callback-ref": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz", + "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==", + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.4.tgz", + "integrity": "sha512-A5ggIS3/qTdxCAlcy05anO2/oqXOfpmxnpRE1Jm+fHHtCvUvNSZDGqgOSAXPriBVAcw2fMFFkh5v5KqrFFhCMA==", + "dependencies": { + "detect-node-es": "^1.0.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-sidecar/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "dependencies": { + "object-assign": "^4.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0-beta.13.tgz", + "integrity": "sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "optional": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/toolbox-core": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-core/-/toolbox-core-2.7.4.tgz", + "integrity": "sha512-qpBhcS4urB7IKc+jx2kksN7BuvvwCo7Y3IstapWo+EW+COY5EYAUwb2pil37v3TsaqHKgX//NloFP1SKzGZAnw==", + "requires": { + "cross-fetch": "3.0.6", + "lru-cache": "6.0.0" + } + }, + "@ampproject/toolbox-optimizer": { + "version": "2.7.1-alpha.0", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-optimizer/-/toolbox-optimizer-2.7.1-alpha.0.tgz", + "integrity": "sha512-WGPZKVQvHgNYJk1XVJCCmY+NVGTGJtvn0OALDyiegN4FJWOcilQUhCIcjMkZN59u1flz/u+sEKccM5qsROqVyg==", + "requires": { + "@ampproject/toolbox-core": "^2.7.1-alpha.0", + "@ampproject/toolbox-runtime-version": "^2.7.1-alpha.0", + "@ampproject/toolbox-script-csp": "^2.5.4", + "@ampproject/toolbox-validator-rules": "^2.7.1-alpha.0", + "abort-controller": "3.0.0", + "cross-fetch": "3.0.6", + "cssnano-simple": "1.2.1", + "dom-serializer": "1.1.0", + "domhandler": "3.3.0", + "domutils": "2.4.2", + "htmlparser2": "5.0.1", + "https-proxy-agent": "5.0.0", + "lru-cache": "6.0.0", + "node-fetch": "2.6.1", + "normalize-html-whitespace": "1.0.0", + "postcss": "7.0.32", + "postcss-safe-parser": "4.0.2", + "terser": "5.5.1" + }, + "dependencies": { + "cssnano-preset-simple": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.1.tgz", + "integrity": "sha512-B2KahOIFTV6dw5Ioy9jHshTh/vAYNnUB2enyWRgnAEg3oJBjI/035ExpePaMqS2SwpbH7gCgvQqwpMBH6hTJSw==", + "requires": { + "caniuse-lite": "^1.0.30001093", + "postcss": "^7.0.32" + } + }, + "cssnano-simple": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.1.tgz", + "integrity": "sha512-9vOyjw8Dj/T12kIOnXPZ5VnEIo6F3YMaIn0wqJXmn277R58cWpI3AvtdlCBtohX7VAUNYcyk2d0dKcXXkb5I6Q==", + "requires": { + "cssnano-preset-simple": "1.2.1", + "postcss": "^7.0.32" + } + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@ampproject/toolbox-runtime-version": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.4.tgz", + "integrity": "sha512-SAdOUOERp42thVNWaBJlnFvFVvnacMVnz5z9LyUZHSnoL1EqrAW5Sz5jv+Ly+gkA8NYsEaUxAdSCBAzE9Uzb4Q==", + "requires": { + "@ampproject/toolbox-core": "2.7.4" + } + }, + "@ampproject/toolbox-script-csp": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-script-csp/-/toolbox-script-csp-2.5.4.tgz", + "integrity": "sha512-+knTYetI5nWllRZ9wFcj7mYxelkiiFVRAAW/hl0ad8EnKHMH82tRlk40CapEnUHhp6Er5sCYkumQ8dngs3Q4zQ==" + }, + "@ampproject/toolbox-validator-rules": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.7.4.tgz", + "integrity": "sha512-z3JRcpIZLLdVC9XVe7YTZuB3a/eR9s2SjElYB9AWRdyJyL5Jt7+pGNv4Uwh1uHVoBXsWEVQzNOWSNtrO3mSwZA==", + "requires": { + "cross-fetch": "3.0.6" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.16.tgz", + "integrity": "sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw==", + "peer": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.15", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helpers": "^7.12.13", + "@babel/parser": "^7.12.16", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "peer": true + } + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "peer": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "peer": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz", + "integrity": "sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "peer": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "peer": true, + "requires": { + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helpers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", + "peer": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", + "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", + "peer": true + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "peer": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "peer": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "peer": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "peer": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@chakra-ui/accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-1.1.2.tgz", + "integrity": "sha512-ni4lwO7I1f9uHgV/FHZVfyr+FRDabXfX2cqpCtY2+QvBzaWM+55VAHJfbel2N6/eogXy5WSLJyYD5fQmyu7Fpg==", + "requires": { + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/alert": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-1.1.1.tgz", + "integrity": "sha512-Hqbf4VuAL/gL6oLQapoF8BV5zAX41Rm+xN2q8c/jWZx5i3l7kWiQ5jn0dJ0prWnVdNbEPmIAqiU0UkSo/lUOjw==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/avatar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-1.1.2.tgz", + "integrity": "sha512-CqXedZed9bEWzzs+8mkB/4NLmD+JbMetNvVbHtLlENta7jnOJDCMJpaXD9QMmiGKKNuqFHfZlGmLmxIMruZBpg==", + "requires": { + "@chakra-ui/image": "1.0.7", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/breadcrumb": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-1.1.1.tgz", + "integrity": "sha512-EnbMYwqPI8if0WJ2m/054fKXc+K7GN8jafaLCm4qfWedogF6t3huB0qvLA00Z6HUwTNfdCtESxU44VfGHsbNDQ==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/button": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-1.1.2.tgz", + "integrity": "sha512-6QEn6cL3v1VcdqCT92uqduLI7ip+VQk4Adxekt5WWHDvkw9WqQz1aOqKzfPTEau27WHBBymB09vJR66CoUZCiw==", + "requires": { + "@chakra-ui/spinner": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/checkbox": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-1.2.2.tgz", + "integrity": "sha512-8WSpWZGD6cRKlu31/F1TfZxsibettQr+8mrPj81vlx4uAjK6nJPZOtgUwhQh0sZzH4bmKmiNTkaPsmuly6mjoQ==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/clickable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-1.0.4.tgz", + "integrity": "sha512-KAfOjz2zoF7OGay/rg9x2hPCgwd5WqnsxR3dgo6R6ULQ4dsee602kjy6OYxKyI9e6DUgodI/BDZq+57e7+wd5A==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/close-button": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-1.1.1.tgz", + "integrity": "sha512-vTapJ3kZZ04xxR1c+EO1t7w5BYZmm/7NTCotAPN6SuehlcqzG0YP2t+fHk7YPlXiweTQKL6v5DLCBlSuqSjZtw==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/color-mode": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-1.0.7.tgz", + "integrity": "sha512-WJV+aK6GB9nUhMbeYN6cJv+5nQzpWNNyZfxUs+B+gFv/NHMh3/ZwWW+bSSvk57m4v23Icj3ZPyhY4RCiWcBw2Q==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/control-box": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-1.0.4.tgz", + "integrity": "sha512-qiZAawX8EaWxk+QnCtpmGADV3D7mNy3DcPhIPmsY4XYfnh8wl9cJfm2B6u3we8nHhi8eQSReSHGbV5s884bO1g==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/counter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-1.0.7.tgz", + "integrity": "sha512-wcSqSZIvdumn8yIfpF7r/cuYQ6MQlSoY/WQu6aJuwpky/k4xgfVSQq/VCM/Jcb8VcnYeYmPasnKHo+5RY35gSw==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/css-reset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-1.0.0.tgz", + "integrity": "sha512-UaPsImGHvCgFO3ayp6Ugafu2/3/EG8wlW/8Y9Ihfk1UFv8cpV+3BfWKmuZ7IcmxcBL9dkP6E8p3/M1T0FB92hg==", + "requires": {} + }, + "@chakra-ui/descendant": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-1.0.7.tgz", + "integrity": "sha512-PnyLyV8hD+STVr9KYzPN13hCj7pwSLvGtQc3J1d+XXvazBtmwUIaX9WZ632kXQhxlvdz83tOzDbJPQs3e1VU3A==", + "requires": { + "@chakra-ui/hooks": "1.1.4" + } + }, + "@chakra-ui/editable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-1.1.1.tgz", + "integrity": "sha512-p33kIcqBoM9c+hh10QRoV15Lb/sKT3KJoPwThjyDcBaNyvSyFhrOX0equVxjxD7Y4htp9/G7b8owx767lnobwg==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/focus-lock": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-1.0.4.tgz", + "integrity": "sha512-QIUQCqkBwKRbJrfkl/0QW2ikWy5kTZUjP+MDa7oWEU7kCSD41x+d1qbn+BZMdnTvLAEZOJjVVVhKye2BNj5z5Q==", + "requires": { + "@chakra-ui/utils": "1.2.0", + "react-focus-lock": "2.4.1" + } + }, + "@chakra-ui/form-control": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-1.2.1.tgz", + "integrity": "sha512-pgp34e5DRHc8B+wUMxZNYBo8W7f2TdIOm04dO24WIIC+mPIu++QsV2O0SPOeN+WJzbirtq/8vibPmaZOfBdQVw==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/hooks": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-1.1.4.tgz", + "integrity": "sha512-5E4JT4Bl/JYe75N3/eU6eWkDhLCx1azcKpkvzNAgRFP1QqbXxAjxVnwHiMoNhWNFHBWRhkvTI/z4yBoOc7Rf4w==", + "requires": { + "@chakra-ui/utils": "1.2.0", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + } + }, + "@chakra-ui/icon": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-1.1.1.tgz", + "integrity": "sha512-dL1D1q11MM+cL849jmADSjY8KqOWplAEb/XgLXX/ZZau7GHqYAXIwdYnfXwOYBaypiosUvGsm9g2zU4iHYZtdg==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/icons": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-1.0.5.tgz", + "integrity": "sha512-l8CgisPAS44ehKLw/hoHI6dfSX7pOAfylv8QkINVPEzhHwnNIg0wHzcm1cGkRXuq3DN8G0z88KmFegFFp02yiA==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@types/react": "^17.0.0" + } + }, + "@chakra-ui/image": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-1.0.7.tgz", + "integrity": "sha512-GqPHBzWgvkmxuovD8sLvwO45Zh+vRa0qIKFg6mBeMwpdQh4aWHZJLw8Ln5Hh3WFRtJcIbZqKQV3dUJln8ZpQkQ==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/input": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-1.1.2.tgz", + "integrity": "sha512-ipT5RpkwVTTzadvOEXt62m9a7Q3vH0cZf1Dis3xdh2FBJjR1Xk0Nr+jjXxtTj99Rn6UMxsVyq3EsSnH09O8o5A==", + "requires": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/layout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-1.3.1.tgz", + "integrity": "sha512-xkIemd9Sloq0kOnbyxnXO22W5YFlMxxHVJLkX9cN5+13i+Qi/Fk/da+yyP8wQ4g8zxQORFZb5K47GdJneGOUlQ==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/live-region": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-1.0.4.tgz", + "integrity": "sha512-sJkCqT1chDU04MMgFCy2amq/h/95IoOLbRhuJpWm4V7WIHT/YsQURk0DCHr8JhPXgTJx88jgNve/WFdVtZEmDw==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/media-query": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-1.0.5.tgz", + "integrity": "sha512-QoZt7YkPKEZhdHQ1M6F6QzRC0gUlLCDDrDEPHn3D4AZzhYcmygH4TlSTi2WwhZjdiwgTRJT4zqpkkdej0sLXuA==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/menu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-1.1.1.tgz", + "integrity": "sha512-cRuieqR5zxhW0vt+2ll8fGYMwmSCX3OgAaiImcvi34R+Jjsa4bcKeIjspbIm26p9jYDu3dsPTpLWJ4MRvDYd6g==", + "requires": { + "@chakra-ui/clickable": "1.0.4", + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/modal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-1.5.1.tgz", + "integrity": "sha512-Wzs6vZzGvvxKT+7r6O9eIWUs1Hn66vteTv1AKCUO5rXz/sUAZkZZiiC1LVIQbpreDR0GXCVUuWxkoaxGETurKg==", + "requires": { + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/focus-lock": "1.0.4", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.4.0" + } + }, + "@chakra-ui/number-input": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-1.1.1.tgz", + "integrity": "sha512-BAVfv79andVOEYx3YWLb0RrdLLqE484CwGxjoJ3aE8OprW/WE8Ghl2BO/wxWBXwX/TxnvB6JpC4iM4u6eHufnQ==", + "requires": { + "@chakra-ui/counter": "1.0.7", + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/pin-input": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-1.4.0.tgz", + "integrity": "sha512-85XXAMNNgX7RG0ca9tU4kJeYYrj9+jtUWINatYXVzcvkx/T1VRM3ohRQDtDdZ7wovzEE90mtzkQGPISZhLKHug==", + "requires": { + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/popover": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-1.2.1.tgz", + "integrity": "sha512-A3va8KwjdMM5stVNTUiliIeIRen9JWmWmSdXuN6B3ffdNbi5vee9OvdpF8yhevFxBscJWvqoFYf/9E2tduXDfg==", + "requires": { + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-1.1.3.tgz", + "integrity": "sha512-4Z73UJLki77aJG8RoeKdjIcqk/UbfmvSLMTqEhU/057OcjSugZZs0Qw3OZQZRNKTcdU1do8mo433THHYvnm/EQ==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@popperjs/core": "2.4.4", + "dequal": "2.0.2" + } + }, + "@chakra-ui/portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-1.1.1.tgz", + "integrity": "sha512-YzD/807srlkC1+F1jRaJYAlgtb2CN24RhYRVliV45xR59RkrgnAVVzt7+KmsUF4N9OK+OJhrMfhyM2sNvthw1g==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/progress": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-1.1.1.tgz", + "integrity": "sha512-lGZaUPvi0ySwvIp1FG2RyrioBBPGyr3TzQxT5nf6eUVTfwps3LlAGcCTfNy59tK8vcwXz0uDDKtobfRFwxj19g==", + "requires": { + "@chakra-ui/theme-tools": "1.0.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/radio": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-1.2.2.tgz", + "integrity": "sha512-HsNY0QjjC+ctPjo05qLCfKfXO+FOV1UQAKXVcl0kZlYXg/C+Ed4kTaWH2+JKqyPFwQf+KSQbZON1ZpvQY4ZPUg==", + "requires": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/react": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-1.3.2.tgz", + "integrity": "sha512-BsqX9x27JpIcU+ywuLiL1MfEAEhsxK6J5QCcsZHtDI/wiRy4p3o2qmTsCLPLvBX7HdukTFSCVm2bbYqLKTL8Zw==", + "requires": { + "@chakra-ui/accordion": "1.1.2", + "@chakra-ui/alert": "1.1.1", + "@chakra-ui/avatar": "1.1.2", + "@chakra-ui/breadcrumb": "1.1.1", + "@chakra-ui/button": "1.1.2", + "@chakra-ui/checkbox": "1.2.2", + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/control-box": "1.0.4", + "@chakra-ui/counter": "1.0.7", + "@chakra-ui/css-reset": "1.0.0", + "@chakra-ui/editable": "1.1.1", + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/image": "1.0.7", + "@chakra-ui/input": "1.1.2", + "@chakra-ui/layout": "1.3.1", + "@chakra-ui/live-region": "1.0.4", + "@chakra-ui/media-query": "1.0.5", + "@chakra-ui/menu": "1.1.1", + "@chakra-ui/modal": "1.5.1", + "@chakra-ui/number-input": "1.1.1", + "@chakra-ui/pin-input": "1.4.0", + "@chakra-ui/popover": "1.2.1", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/progress": "1.1.1", + "@chakra-ui/radio": "1.2.2", + "@chakra-ui/select": "1.1.1", + "@chakra-ui/skeleton": "1.1.2", + "@chakra-ui/slider": "1.1.1", + "@chakra-ui/spinner": "1.1.1", + "@chakra-ui/stat": "1.1.1", + "@chakra-ui/switch": "1.1.2", + "@chakra-ui/system": "1.3.0", + "@chakra-ui/table": "1.1.1", + "@chakra-ui/tabs": "1.1.1", + "@chakra-ui/tag": "1.1.1", + "@chakra-ui/textarea": "1.1.1", + "@chakra-ui/theme": "1.6.1", + "@chakra-ui/toast": "1.1.10", + "@chakra-ui/tooltip": "1.1.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/select": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-1.1.1.tgz", + "integrity": "sha512-7sFPXjBlV/6Ms60hHyLgiCMe93BF6z59HFrGQyXavvN3NNSpR4B4+AQqD5/guRi3GV8TamyPiHVIQIPw6wt2Eg==", + "requires": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/skeleton": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-1.1.2.tgz", + "integrity": "sha512-5L2ISCA4ES1T+aHKNj+dnIFBlszMKHu1/xH8wSk2mNMAaPk3PvbZJqw0ufxX/dG5Pv8jQluAUMhulqviFSRSDw==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/media-query": "1.0.5", + "@chakra-ui/system": "1.3.0", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/slider": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-1.1.1.tgz", + "integrity": "sha512-D9xZqefmxx2clbd3iNK2bM1zFmygXXNZuwvPFCVWPa82zSOVPnfDjH1n+Z+VjPixEW6fl64sIl99oJdvDuH7wg==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/spinner": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-1.1.1.tgz", + "integrity": "sha512-dGT5DVvQwnj4B7FjIl6C/1ZmXgUFSA0ZC7JgQNQdJYc3DgtkGf0a6L+DhiyBneEPb9/RRHQJhHoRPndnHU15QA==", + "requires": { + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/stat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-1.1.1.tgz", + "integrity": "sha512-dG7SGe2ZEFugbA4kyCtSLRtwgMQ2pqq3QAWBjA/ZvdEdhL10EGp+bv3Ab0l1qju3DEpfyx3+M6mHxG5zWJ92Fw==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/styled-system": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-1.7.0.tgz", + "integrity": "sha512-IupaDUkAC2Y6/bJxYssiYbRYjKcEK9dIroPS1RJPa24slY7CkID7QND6F8HZMDLcOYfGa1Vek8lGOPlKa+FBgg==", + "requires": { + "@chakra-ui/utils": "1.2.0", + "css-get-unit": "1.0.1", + "csstype": "^3.0.6" + } + }, + "@chakra-ui/switch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-1.1.2.tgz", + "integrity": "sha512-QzkfOgkcSVkejjobp3jl5Oso15Alr5N05NP454IkG487X6y625UD+BMujZX8QywywjgFWaoEj/dPnBilRjP28w==", + "requires": { + "@chakra-ui/checkbox": "1.2.2", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/system": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-1.3.0.tgz", + "integrity": "sha512-A/yJ8xcrMr2OiyX2J9OS732t7pq+ye7rT0FQDl4H+YObOMsq7B+0JJEBpTP5P174ZKCTOjBGy4muwa8o6GCNAQ==", + "requires": { + "@chakra-ui/color-mode": "1.0.7", + "@chakra-ui/styled-system": "1.7.0", + "@chakra-ui/utils": "1.2.0", + "react-fast-compare": "3.2.0" + } + }, + "@chakra-ui/table": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-1.1.1.tgz", + "integrity": "sha512-GdYbqN1q/QPQqca3jfWbyWJ7waUg6RbpQbsyyhFNWHDKhOb6H2y+cDZCHrOiFwBahWZxykR4ZcMJnQjPqtB7ag==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/tabs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-1.1.1.tgz", + "integrity": "sha512-yfJct0Yfxt2fQ9KgbtVhC89OaB5iD8nLAFi3zhiuNQBp84OXESVfvanr1lHBg3YZLgVLW1O0QQLv3aHVGLtwYg==", + "requires": { + "@chakra-ui/clickable": "1.0.4", + "@chakra-ui/descendant": "1.0.7", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/tag": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-1.1.1.tgz", + "integrity": "sha512-I1ScSeaUEgNPY7lv2IZ0blTAb13wvu/UqGPuatG71PqI4LIKAtZJVxF/AnxAQY4WpbDKTp/t3z3DfyKr8Ccouw==", + "requires": { + "@chakra-ui/icon": "1.1.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/textarea": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-1.1.1.tgz", + "integrity": "sha512-Mmw/mVfZSNf/0QpLe8Nnvpp1jAkRtjhKD4eDBG6AW6M0l6tST3LFbDC3qZePmEJpqxkOE3IyQgYEjHjb9PgcMA==", + "requires": { + "@chakra-ui/form-control": "1.2.1", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/theme": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-1.6.1.tgz", + "integrity": "sha512-9zrPG1osrV+N7RROrr/m+6JWWvvAPpElBLmbjPSzrf3JlxxD+3xDgLCOrZ/C0GzdVtgfyE5584W4VXWoA4OqXw==", + "requires": { + "@chakra-ui/theme-tools": "1.0.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/theme-tools": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-1.0.4.tgz", + "integrity": "sha512-kx34izftAHvtRjxpkgWbnMx5DyGtUi8JoQO8E5bhwjJ5drNQl2yvNeoqLpHjf3YTqBYQqkz3VkzHIeHs3wZEwg==", + "requires": { + "@chakra-ui/utils": "1.2.0", + "@types/tinycolor2": "1.4.2", + "tinycolor2": "1.4.2" + } + }, + "@chakra-ui/toast": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-1.1.10.tgz", + "integrity": "sha512-pxI+GXMOyzkf012NMRNiBAZmTfRf+8829mbOGPhAr3Ce6N/mlv0Tu8X4BfzhSk1iEV4uWDMZ+dq3uhCtK2EttA==", + "requires": { + "@chakra-ui/alert": "1.1.1", + "@chakra-ui/close-button": "1.1.1", + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/theme": "1.6.1", + "@chakra-ui/transition": "1.0.8", + "@chakra-ui/utils": "1.2.0", + "@reach/alert": "0.13.0" + } + }, + "@chakra-ui/tooltip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-1.1.1.tgz", + "integrity": "sha512-m0R5+QBfJJYYZIjhF0jrfJotyoIvd560l4isngvcmVKzEkQR/Y4NcOfVdynENW3Mi2o7mjLXy43uW9YLOzU70g==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/popper": "1.1.3", + "@chakra-ui/portal": "1.1.1", + "@chakra-ui/utils": "1.2.0", + "@chakra-ui/visually-hidden": "1.0.4" + } + }, + "@chakra-ui/transition": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-1.0.8.tgz", + "integrity": "sha512-c4BArP5Q9nl2R6QDAmigCklkMpGKP1ZYOfF1RD7qboPROZVt+SUNGKW+GHGN7mN0kaWHuCb+sbLXMCqQG/jQmQ==", + "requires": { + "@chakra-ui/hooks": "1.1.4", + "@chakra-ui/utils": "1.2.0" + } + }, + "@chakra-ui/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-oMTX8BX1+MUf+iYUafFm9tNfwa3m1cqzMcE/5iQFmNcqKlZmuADnVL28Yw7jhoeouIjANaGY+f51qj9zHgDn9Q==", + "requires": { + "@types/lodash.mergewith": "4.6.6", + "@types/object-assign": "4.0.30", + "css-box-model": "1.2.1", + "lodash.mergewith": "4.6.2" + } + }, + "@chakra-ui/visually-hidden": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-1.0.4.tgz", + "integrity": "sha512-RxXmEjwOoMh28lSen4tmkQBRQ21Hi15UGLQTnKfY2LhJyxsojyPT9TSHzehWgFIb8D+N3Er09WLgkd6f/bJqyg==", + "requires": { + "@chakra-ui/utils": "1.2.0" + } + }, + "@emotion/babel-plugin": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.2.0.tgz", + "integrity": "sha512-lsnQBnl3l4wu/FJoyHnYRpHJeIPNkOBMbtDUIXcO8luulwRKZXPvA10zd2eXVN6dABIWNX4E34en/jkejIg/yA==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/plugin-syntax-jsx": "^7.12.1", + "@babel/runtime": "^7.7.2", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.0", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "^4.0.3" + }, + "dependencies": { + "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==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "stylis": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", + "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + } + } + }, + "@emotion/cache": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.1.3.tgz", + "integrity": "sha512-n4OWinUPJVaP6fXxWZD9OUeQ0lY7DvtmtSuqtRWT0Ofo/sBLCVSgb4/Oa0Q5eFxcwablRKjUXqXtNZVyEwCAuA==", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.0.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "^4.0.3" + }, + "dependencies": { + "stylis": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", + "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + } + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.0.tgz", + "integrity": "sha512-9RkilvXAufQHsSsjQ3PIzSns+pxuX4EW8EbGeSPjZMHuMx6z/MOzb9LpqNieQX4F3mre3NWS2+X3JNRHTQztUQ==", + "requires": { + "@emotion/memoize": "^0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" + }, + "@emotion/react": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.1.5.tgz", + "integrity": "sha512-xfnZ9NJEv9SU9K2sxXM06lzjK245xSeHRpUh67eARBm3PBHjjKIZlfWZ7UQvD0Obvw6ZKjlC79uHrlzFYpOB/Q==", + "requires": { + "@babel/runtime": "^7.7.2", + "@emotion/cache": "^11.1.3", + "@emotion/serialize": "^1.0.0", + "@emotion/sheet": "^1.0.1", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.0.tgz", + "integrity": "sha512-zt1gm4rhdo5Sry8QpCOpopIUIKU+mUSpV9WNmFILUraatm5dttNEaYzUWWSboSMUE6PtN2j1cAsuvcugfdI3mw==", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.1.tgz", + "integrity": "sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g==" + }, + "@emotion/styled": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.1.5.tgz", + "integrity": "sha512-nIq7pOBEDqT5xSFbclQ3XFy0q8C9EUU8ECqKN2kJKGxKh+vLz/x26kEih4aOpoAsyzc+R60rQxh7VJiLTUEdmg==", + "requires": { + "@babel/runtime": "^7.7.2", + "@emotion/babel-plugin": "^11.1.2", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/serialize": "^1.0.0", + "@emotion/utils": "^1.0.0" + } + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "@hapi/accept": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", + "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.1.tgz", + "integrity": "sha512-VNR8eDbBrOxBgbkddRYIe7+8DZ+vSbV6qlmaN2x7eWjsUjy2VmQgChkOKcVZIeupEZYj+I0dqNg430OhwzagjA==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", + "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==" + }, + "@next/env": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-10.0.6.tgz", + "integrity": "sha512-++zgrcSL9SprjWKBbO3YuVj/8CTmxJl+zLErW/Kbr2VCT0u12SrBcMKvD236lEGs5/qUgeBfU3Dvmr6MASWrtA==" + }, + "@next/polyfill-module": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-10.0.6.tgz", + "integrity": "sha512-Sk3HYFxiI3AyIhw7Nnc5un//duCthAP2XtPb4N1SamymOU2QSb8I1zkcsxVIlZRvftdXikQQgra6Ck2zfJRxpA==" + }, + "@next/react-dev-overlay": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-10.0.6.tgz", + "integrity": "sha512-KbxpyVT6gr1KZ7JoFDKGNM0hK7CxPkIC14j/gYgR6qSOhxGs3GEIBScJRXfKD7LNPMgVgQtaJlBYlEJ7aQu1xg==", + "requires": { + "@babel/code-frame": "7.12.11", + "anser": "1.4.9", + "chalk": "4.0.0", + "classnames": "2.2.6", + "css.escape": "1.5.1", + "data-uri-to-buffer": "3.0.1", + "platform": "1.3.6", + "shell-quote": "1.7.2", + "source-map": "0.8.0-beta.0", + "stacktrace-parser": "0.1.10", + "strip-ansi": "6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@next/react-refresh-utils": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.0.6.tgz", + "integrity": "sha512-4BF+8PyzDcYpumQJ22yBUjVP/CL2KLPM+3K3ZQb61HvmIptB/t+jFnH2ew8S7ORQNu/caVQC6wP5wAfOtpJNsg==", + "requires": {} + }, + "@opentelemetry/api": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.14.0.tgz", + "integrity": "sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ==", + "requires": { + "@opentelemetry/context-base": "^0.14.0" + } + }, + "@opentelemetry/context-base": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.14.0.tgz", + "integrity": "sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw==" + }, + "@popperjs/core": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", + "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" + }, + "@reach/alert": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/alert/-/alert-0.13.0.tgz", + "integrity": "sha512-5lpgRnlQ0JHBsRTPfKjD9aFPDZuLcaxTgD5PXdSLb+1CU8WgNbcy+7qSjqnu1uzWS2pQenIEBViV5wGpt63ADw==", + "requires": { + "@reach/utils": "0.13.0", + "@reach/visually-hidden": "0.13.0", + "prop-types": "^15.7.2", + "tslib": "^2.0.0" + } + }, + "@reach/utils": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/utils/-/utils-0.13.0.tgz", + "integrity": "sha512-dypxuyA1Qy3LHxzzyS7jFGPgCCR04b8UEn+Tv/aj6y9V578dULQqkcCyobrdEa+OI8lxH7dFFHa+jH8M/noBrQ==", + "requires": { + "@types/warning": "^3.0.0", + "tslib": "^2.0.0", + "warning": "^4.0.3" + } + }, + "@reach/visually-hidden": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.13.0.tgz", + "integrity": "sha512-LF11WL9/495Q3d86xNy0VO6ylPI6SqF2xZGg9jpZSXLbFKpQ5Bf0qC7DOJfSf+/yb9WgPgB4m+a48Fz8AO6oZA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + }, + "@types/lodash.mergewith": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz", + "integrity": "sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/object-assign": { + "version": "4.0.30", + "resolved": "https://registry.npmjs.org/@types/object-assign/-/object-assign-4.0.30.tgz", + "integrity": "sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI=" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, + "@types/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz", + "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==" + }, + "@types/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "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==", + "requires": { + "debug": "4" + } + }, + "anser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", + "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "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" + } + }, + "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==", + "optional": true + }, + "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==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "aria-hidden": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.2.tgz", + "integrity": "sha512-WAMH9q3vRimVqP+B0q2eDvx7IPDoY17A2fWwj5atTA/zTYJCNcS6HJ5YErZ5FO3PUHhrV0y0yR1NA0dRNm913A==", + "requires": { + "tslib": "^1.0.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "optional": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "caniuse-lite": { + "version": "1.0.30001185", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", + "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "optional": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true + }, + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "optional": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "optional": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compute-scroll-into-view": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz", + "integrity": "sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "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==" + } + } + }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-get-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-get-unit/-/css-get-unit-1.0.1.tgz", + "integrity": "sha1-5JC55Wss0g+QOiLMr7RIOC7feXY=" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "cssnano-preset-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz", + "integrity": "sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ==", + "requires": { + "caniuse-lite": "^1.0.30001179", + "postcss": "^7.0.32" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.2.tgz", + "integrity": "sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g==", + "requires": { + "cssnano-preset-simple": "1.2.2", + "postcss": "^7.0.32" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "csstype": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.6.tgz", + "integrity": "sha512-+ZAmfyWMT7TiIlzdqJgjMb7S4f1beorDbWbsocyK4RaiqA5RTX3K14bnBWmmA9QEM0gRdsjyyrEmcyga8Zsxmw==" + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "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==", + "optional": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "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==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, + "detect-node-es": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.0.0.tgz", + "integrity": "sha512-S4AHriUkTX9FoFvL4G8hXDcx6t3gp2HpfCza3Q0v6S78gul2hKWifLQbeW+ZF89+hSm2ZIc/uF3J97ZgytgTRg==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", + "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + } + }, + "electron-to-chromium": { + "version": "1.3.662", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.662.tgz", + "integrity": "sha512-IGBXmTGwdVGUVTnZ8ISEvkhDfhhD+CDFndG4//BhvDcEtPYiVrzoB+rzT/Y12OQCf5bvRCrVmrUbGrS9P7a6FQ==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "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==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "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==", + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "focus-lock": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.7.0.tgz", + "integrity": "sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw==" + }, + "focus-visible": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz", + "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" + }, + "follow-redirects": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==" + }, + "framer-motion": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-3.3.0.tgz", + "integrity": "sha512-bjUrwXfMJZ6D+HSMDiXbMGKmlWGnUux8HotWgORTZkdPTgKAndlRXjeC2ikCgNVo2ifmRvEla5ckP9JaZc7JKA==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "framesync": "^5.0.0", + "hey-listen": "^1.0.8", + "popmotion": "^9.1.0", + "style-value-types": "^4.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "framesync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-5.0.0.tgz", + "integrity": "sha512-wd8t+JsQGisluSv1twiEeDv0aNGpavGb9q7xgIk9fGbcIWkNXF/KVtrjnOrCwBWJuiXxlJfNkcvGudsI32FxYA==" + }, + "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==", + "optional": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "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==", + "peer": true + }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "peer": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "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==", + "requires": { + "react-is": "^16.7.0" + } + }, + "htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "optional": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "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==", + "optional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "peer": true + }, + "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==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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==" + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "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==", + "optional": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "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==", + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "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==", + "optional": true + }, + "native-url": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz", + "integrity": "sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "next": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/next/-/next-10.0.6.tgz", + "integrity": "sha512-uM5Yv4Ha9iL6Lbg7Ez36GyJ0YTdRLzXLA9b1REH3rX2Wytw0Ls5qPuFGk4BHSQpQhYx6Z61iA2qPkGl33W4iBg==", + "requires": { + "@ampproject/toolbox-optimizer": "2.7.1-alpha.0", + "@babel/runtime": "7.12.5", + "@hapi/accept": "5.0.1", + "@next/env": "10.0.6", + "@next/polyfill-module": "10.0.6", + "@next/react-dev-overlay": "10.0.6", + "@next/react-refresh-utils": "10.0.6", + "@opentelemetry/api": "0.14.0", + "ast-types": "0.13.2", + "browserslist": "4.16.1", + "buffer": "5.6.0", + "caniuse-lite": "^1.0.30001179", + "chalk": "2.4.2", + "chokidar": "3.5.1", + "crypto-browserify": "3.12.0", + "cssnano-simple": "1.2.2", + "etag": "1.8.1", + "find-cache-dir": "3.3.1", + "jest-worker": "24.9.0", + "native-url": "0.3.4", + "node-fetch": "2.6.1", + "node-html-parser": "1.4.9", + "node-libs-browser": "^2.2.1", + "p-limit": "3.1.0", + "path-browserify": "1.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "8.1.7", + "process": "0.11.10", + "prop-types": "15.7.2", + "raw-body": "2.4.1", + "react-is": "16.13.1", + "react-refresh": "0.8.3", + "sharp": "0.26.3", + "stream-browserify": "3.0.0", + "styled-jsx": "3.3.2", + "use-subscription": "1.5.1", + "vm-browserify": "1.1.2", + "watchpack": "2.0.0-beta.13" + } + }, + "node-abi": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz", + "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==", + "optional": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true + } + } + }, + "node-addon-api": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "optional": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-html-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", + "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", + "requires": { + "he": "1.2.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + }, + "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==" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==" + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "optional": true + }, + "normalize-html-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz", + "integrity": "sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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==", + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "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==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "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==", + "requires": { + "@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" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "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==" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "popmotion": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-9.1.0.tgz", + "integrity": "sha512-+J7pzzBy5kk2qsP8ilowKs/CH+HoZa3kOGEBNCleCvsPXEF3nKHdfAR3SboMyPvdpIrofaT7ZIy/xWgz446Azw==", + "requires": { + "framesync": "5.0.0", + "hey-listen": "^1.0.8", + "style-value-types": "^4.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "postcss": { + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.7.tgz", + "integrity": "sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ==", + "requires": { + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.16", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "prebuild-install": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", + "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==", + "optional": true, + "requires": { + "detect-libc": "^1.0.3", + "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": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "optional": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "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==" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "query-string": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.0.tgz", + "integrity": "sha512-In3o+lUxlgejoVJgwEdYtdxrmlL0cQWJXj0+kkI7RWVo7hg5AhFtybeKlC9Dpgbr8eOC4ydpEh8017WwyfzqVQ==", + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-clientside-effect": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz", + "integrity": "sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA==", + "requires": { + "@babel/runtime": "^7.12.13" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "react-dom": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" + } + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-focus-lock": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.4.1.tgz", + "integrity": "sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w==", + "requires": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.7.0", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.2", + "use-callback-ref": "^1.2.1", + "use-sidecar": "^1.0.1" + } + }, + "react-icons": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", + "integrity": "sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ==", + "requires": {} + }, + "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==" + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, + "react-remove-scroll": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.0.tgz", + "integrity": "sha512-BZIO3GaEs0Or1OhA5C//n1ibUP1HdjJmqUVUsOCMxwoIpaCocbB9TFKwHOkBa/nyYy3slirqXeiPYGwdSDiseA==", + "requires": { + "react-remove-scroll-bar": "^2.1.0", + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0", + "use-callback-ref": "^1.2.3", + "use-sidecar": "^1.0.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "react-remove-scroll-bar": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz", + "integrity": "sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==", + "requires": { + "react-style-singleton": "^2.1.0", + "tslib": "^1.0.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "react-style-singleton": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz", + "integrity": "sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^1.0.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "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==" + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scheduler": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", + "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sharp": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.26.3.tgz", + "integrity": "sha512-NdEJ9S6AMr8Px0zgtFo1TJjMK/ROMU92MkDtYn2BBrDjIx3YfH9TUyGdzPC+I/L619GeYQc690Vbaxc5FPCCWg==", + "optional": true, + "requires": { + "array-flatten": "^3.0.0", + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.0.2", + "npmlog": "^4.1.2", + "prebuild-install": "^6.0.0", + "semver": "^7.3.2", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "optional": true + }, + "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==", + "optional": true + }, + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "optional": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "optional": true, + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "requires": { + "type-fest": "^0.7.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + }, + "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==" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "style-value-types": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-4.0.1.tgz", + "integrity": "sha512-aOV/HHyynIyTmU27qfs0oAHhFde6BFIvV4+nMerE2MAPZMwYOeQk1/F3S6djxF2u4HdbiieCPs3ZzWsbNUoc9A==", + "requires": { + "hey-listen": "^1.0.8", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "styled-jsx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.3.2.tgz", + "integrity": "sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g==", + "requires": { + "@babel/types": "7.8.3", + "babel-plugin-syntax-jsx": "6.18.0", + "convert-source-map": "1.7.0", + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "string-hash": "1.1.3", + "stylis": "3.5.4", + "stylis-rule-sheet": "0.0.10" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "requires": {} + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "swr": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/swr/-/swr-0.4.2.tgz", + "integrity": "sha512-SKGxcAfyijj/lE5ja5zVMDqJNudASH3WZPRUakDVOePTM18FnsXgugndjl9BSRwj+jokFCulMDe7F2pQL+VhEw==", + "requires": { + "dequal": "2.0.2" + } + }, + "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==", + "optional": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "optional": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use-callback-ref": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz", + "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==", + "requires": {} + }, + "use-sidecar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.4.tgz", + "integrity": "sha512-A5ggIS3/qTdxCAlcy05anO2/oqXOfpmxnpRE1Jm+fHHtCvUvNSZDGqgOSAXPriBVAcw2fMFFkh5v5KqrFFhCMA==", + "requires": { + "detect-node-es": "^1.0.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "requires": { + "object-assign": "^4.1.1" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.0.0-beta.13", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0-beta.13.tgz", + "integrity": "sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + }, + "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==" + } + } +} diff --git a/hub-frontend/package.json b/hub-frontend/package.json index b3a5a765..718a5d8e 100644 --- a/hub-frontend/package.json +++ b/hub-frontend/package.json @@ -1,33 +1,25 @@ { - "name": "@panda-lang/hub-frontend", + "name": "learn-starter", "version": "0.1.0", "private": true, "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" + "dev": "next dev", + "build": "next build", + "start": "next start" }, "dependencies": { - "buefy": "^0.8.2", - "core-js": "^2.6.5", - "js-file-download": "^0.4.8", - "path": "^0.12.7", - "toastr": "^2.1.4", - "vue": "^2.6.10", - "vue-router": "^3.0.3", - "vuex": "^3.1.2" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "^3.11.0", - "@vue/cli-service": "^3.11.0", - "babel-eslint": "^10.0.3", - "eslint": "^5.16.0", - "eslint-plugin-vue": "^5.0.0", - "lint-staged": "^9.4.2", - "node-sass": "^4.12.0", - "sass-loader": "^8.0.0", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.2", - "vue-template-compiler": "^2.6.10" + "@chakra-ui/icons": "^1.0.5", + "@chakra-ui/react": "^1.3.2", + "@emotion/react": "^11.1.5", + "@emotion/styled": "^11.1.5", + "axios": "^0.21.1", + "focus-visible": "^5.2.0", + "framer-motion": "^3.3.0", + "next": "^10.0.0", + "query-string": "^6.14.0", + "react": "17.0.1", + "react-dom": "17.0.1", + "react-icons": "^4.2.0", + "swr": "^0.4.2" } } diff --git a/hub-frontend/pom.xml b/hub-frontend/pom.xml deleted file mode 100644 index 6a883a0c..00000000 --- a/hub-frontend/pom.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - 4.0.0 - - org.panda-lang - hub-parent - indev-2020.7.16 - - - hub-frontend - indev-2020.7.16 - - \ No newline at end of file diff --git a/hub-frontend/postcss.config.js b/hub-frontend/postcss.config.js deleted file mode 100644 index d043741f..00000000 --- a/hub-frontend/postcss.config.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - plugins: { - autoprefixer: {} - } -} diff --git a/hub-frontend/public/favicon.ico b/hub-frontend/public/favicon.ico deleted file mode 100644 index df36fcfb..00000000 Binary files a/hub-frontend/public/favicon.ico and /dev/null differ diff --git a/hub-frontend/public/index.html b/hub-frontend/public/index.html deleted file mode 100644 index 2d0a7aad..00000000 --- a/hub-frontend/public/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - Hub - Panda Package Registry - - - -
- - - diff --git a/hub-frontend/src/App.vue b/hub-frontend/src/App.vue deleted file mode 100644 index f3ea47f3..00000000 --- a/hub-frontend/src/App.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - diff --git a/hub-frontend/src/api.js b/hub-frontend/src/api.js deleted file mode 100644 index b46716f0..00000000 --- a/hub-frontend/src/api.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { BACKEND } from './constants' - -const API = { - async fetch (url, options) { - const fetchUrl = url[0] === '/' - ? `${BACKEND}/api${url}` - : url - - const res = await fetch(fetchUrl, options) - - if (!res.ok) { - const err = new Error(`Cannot fetch resource. Status: ${res.status}`) - err.status = res.status - err.response = res - throw err - } - - // TODO: Handle files - - return res.json() - }, - async fetchWithData (url, data, headers = {}, method = 'POST') { - const options = { - method, - headers: { - 'Content-Type': 'application/json', - ...headers - } - } - - if (data instanceof FormData && data.values().next().value instanceof File) { - delete options.headers['Content-Type'] - options.body = data - } else { - options.body = JSON.stringify(data) - } - - return fetch(url, options) - }, - - async get (url, headers) { - return API.fetch(url, { headers }) - }, - - async post (url, data, headers = {}) { - return API.fetchWithData(url, data, headers) - }, - - async put (url, data, headers = {}) { - return API.fetchWithData(url, data, headers, 'PUT') - }, - - repositories: { - async all () { - return API.get('/repositories') - } - }, - repository: { - async entities (qualifier) { - return API.get(`/repository/${qualifier}`) - }, - async maven (path, data, token) { - return API.put(`/repository/maven/${path}`, data, { - Authorization: `Bearer ${token}` - }) - } - }, - users: { - async signin (data) { - return API.post('/users/signin', data) - }, - async signup (data) { - return API.post('/users/signup', data) - }, - async me (token) { - return API.get('/users/me', { - Authorization: `Bearer ${token}` - }) - } - } -} - -export default API diff --git a/hub-frontend/src/assets/background.png b/hub-frontend/src/assets/background.png deleted file mode 100644 index 5795cd3c..00000000 Binary files a/hub-frontend/src/assets/background.png and /dev/null differ diff --git a/hub-frontend/src/components/AuthProvider.js b/hub-frontend/src/components/AuthProvider.js new file mode 100644 index 00000000..be0fe385 --- /dev/null +++ b/hub-frontend/src/components/AuthProvider.js @@ -0,0 +1,65 @@ +import { useState, createContext, useContext, useEffect } from 'react' +import axios from 'axios' + +const AuthContext = createContext() +const userInfoUrl = 'http://localhost:8080/user' + +const AuthProvider = ({ children }) => { + const [token, setToken] = useState() + const [user, setUser] = useState({}) + + useEffect(() => { + const storedToken = localStorage.getItem('token') + + if (storedToken != undefined) { + setToken(storedToken) + } + }, []) + + useEffect(() => { + if (token != undefined) { + localStorage.setItem('token', token) + + axios + .get('http://localhost:8080/user', { + headers: { + Authorization: `Bearer ${token}` + } + }) + .then(response => { + setUser(response.data) + }) + } + else { + localStorage.removeItem('token') + } + }, [token]) + + const login = value => { + setToken(value) + } + + const logout = () => { + setToken(undefined) + } + + const context = { + token, + user, + login, + logout + } + + return ( + + {children} + + ) +} + +const useAuth = () => useContext(AuthContext) + +export { + AuthProvider, + useAuth +} \ No newline at end of file diff --git a/hub-frontend/src/components/Dashboard.vue b/hub-frontend/src/components/Dashboard.vue deleted file mode 100644 index 0770bee1..00000000 --- a/hub-frontend/src/components/Dashboard.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - diff --git a/hub-frontend/src/components/Menu.vue b/hub-frontend/src/components/Menu.vue deleted file mode 100644 index 6600736f..00000000 --- a/hub-frontend/src/components/Menu.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - diff --git a/hub-frontend/src/components/Welcome.vue b/hub-frontend/src/components/Welcome.vue deleted file mode 100644 index 135e8933..00000000 --- a/hub-frontend/src/components/Welcome.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - diff --git a/hub-frontend/src/components/index/Hero.js b/hub-frontend/src/components/index/Hero.js new file mode 100644 index 00000000..5c6c1962 --- /dev/null +++ b/hub-frontend/src/components/index/Hero.js @@ -0,0 +1,22 @@ +import { Flex, Heading, Text } from "@chakra-ui/react" + +const Hero = () => { + return ( + + + Where the Universe begins + + + Instantly publish packages and spread it around the world. + Explore new possibilities and find out more information about latest discoveries
in the panda-lang related ecosystem 💕 +
+
+ ) +} + +export default Hero \ No newline at end of file diff --git a/hub-frontend/src/components/index/PackagePreview.js b/hub-frontend/src/components/index/PackagePreview.js new file mode 100644 index 00000000..1c2edec0 --- /dev/null +++ b/hub-frontend/src/components/index/PackagePreview.js @@ -0,0 +1,51 @@ +import { Box, Flex, Text, AvatarGroup, Avatar,useColorModeValue } from "@chakra-ui/react" +import { HiOutlineDotsHorizontal } from 'react-icons/hi' + +const PackagePreview = props => { + const bgColor = useColorModeValue('gray.50', 'gray.800') + const color = useColorModeValue('black', 'white') + const imgA = useColorModeValue('https://bit.ly/sage-adebayo', 'https://bit.ly/ryan-florence') + const imgB = useColorModeValue('https://bit.ly/ryan-florence', 'https://bit.ly/sage-adebayo') + + return ( + + + + + + + Name + Description + + + + + + + + + + + + + + + ) +} + +export { PackagePreview } diff --git a/hub-frontend/src/components/index/PackagesHero.js b/hub-frontend/src/components/index/PackagesHero.js new file mode 100644 index 00000000..3deca657 --- /dev/null +++ b/hub-frontend/src/components/index/PackagesHero.js @@ -0,0 +1,71 @@ +import { Box, Flex, Heading, Input } from "@chakra-ui/react" +import { PackagePreview } from './PackagePreview' + +const Category = props => { + return ( + + {props.children} + + ) +} + +const PackagesHero = props => { + return ( + + Packages + + + Popular + Trending + Latest + + + + + + Add package + + + + + + + + + + + + + + + + ) +} + +export default PackagesHero \ No newline at end of file diff --git a/hub-frontend/src/components/layout/ColorModeSwitch.js b/hub-frontend/src/components/layout/ColorModeSwitch.js new file mode 100644 index 00000000..027d906d --- /dev/null +++ b/hub-frontend/src/components/layout/ColorModeSwitch.js @@ -0,0 +1,17 @@ +import { useColorMode, Switch } from '@chakra-ui/react' + +const ColorModeSwitch = props => { + const { colorMode, toggleColorMode } = useColorMode() + const isDark = colorMode === 'dark' + return ( + + ) +} + +export default ColorModeSwitch diff --git a/hub-frontend/src/components/layout/Container.js b/hub-frontend/src/components/layout/Container.js new file mode 100644 index 00000000..9f79649c --- /dev/null +++ b/hub-frontend/src/components/layout/Container.js @@ -0,0 +1,19 @@ +import { Flex } from '@chakra-ui/react' + +const Container = props => { + return ( + + {props.children} + + ) +} + +const Content = props => { + return ( + + {props.children} + + ) +} + +export { Container, Content } \ No newline at end of file diff --git a/hub-frontend/src/components/layout/Footer.js b/hub-frontend/src/components/layout/Footer.js new file mode 100644 index 00000000..07b9146b --- /dev/null +++ b/hub-frontend/src/components/layout/Footer.js @@ -0,0 +1,40 @@ +import { Box, Flex, Link, Text, useColorModeValue } from "@chakra-ui/react" +import { FaGithub, FaTwitter } from 'react-icons/fa' +import { Container, Content } from './Container' + +const Footer = () => { + const bgColor = useColorModeValue('gray.50', 'gray.900') + const color = useColorModeValue('black', 'white') + + return ( + + + + + + + + + + + + ~ powered by  + + @panda-lang/hub + + + + + ) +} + +export default Footer \ No newline at end of file diff --git a/hub-frontend/src/components/layout/Header.js b/hub-frontend/src/components/layout/Header.js new file mode 100644 index 00000000..fa65101b --- /dev/null +++ b/hub-frontend/src/components/layout/Header.js @@ -0,0 +1,40 @@ +import { Box, Heading, Link, useColorModeValue } from '@chakra-ui/react' +import { Container, Content } from './Container' +import HeaderMenu from './HeaderMenu' +import HeaderLogin from './HeaderLogin' + +const Header = ({title}) => { + const bgColor = useColorModeValue('gray.50', 'gray.900') + const color = useColorModeValue('black', 'white') + + return ( + + + + + {title} + + + + + + + ) +} + +Header.defaultProps = { + title: 'Hub' +} + +export default Header \ No newline at end of file diff --git a/hub-frontend/src/components/layout/HeaderLogin.js b/hub-frontend/src/components/layout/HeaderLogin.js new file mode 100644 index 00000000..4d9c62ff --- /dev/null +++ b/hub-frontend/src/components/layout/HeaderLogin.js @@ -0,0 +1,48 @@ +import { useState, createContext, useContext, useEffect } from 'react' +import { Flex, Text, Box, Link } from '@chakra-ui/react' +import { FaGithub } from 'react-icons/fa' +import { IoExitOutline } from 'react-icons/io5' +import ColorModeSwitch from './ColorModeSwitch' +import { useAuth } from '../AuthProvider' + +const HeaderLogin = props => { + const { token, user, logout } = useAuth() + + const authView = () => { + if (token) { + return ( + + {user.username} + + + + + ) + } + else { + return ( + + + Sign In + + + + + + ) + } + } + + return ( + + { authView() } + + + ) +} + +export default HeaderLogin \ No newline at end of file diff --git a/hub-frontend/src/components/layout/HeaderMenu.js b/hub-frontend/src/components/layout/HeaderMenu.js new file mode 100644 index 00000000..98204cfd --- /dev/null +++ b/hub-frontend/src/components/layout/HeaderMenu.js @@ -0,0 +1,28 @@ +import { Flex, Link } from "@chakra-ui/react" + +const MenuItem = props => { + return ( + + {props.label} + + ) +} + +const HeaderMenu = props => { + return ( + + + + + + + ) +} + +export default HeaderMenu \ No newline at end of file diff --git a/hub-frontend/src/components/layout/Main.js b/hub-frontend/src/components/layout/Main.js new file mode 100644 index 00000000..bc426587 --- /dev/null +++ b/hub-frontend/src/components/layout/Main.js @@ -0,0 +1,22 @@ +import { Flex, useColorModeValue } from "@chakra-ui/react" + +const Main = props => { + const bgColor = useColorModeValue('gray.100', 'gray.900') + const color = useColorModeValue('black', 'white') + + return ( + + {props.content} + + ) +} + +export default Main \ No newline at end of file diff --git a/hub-frontend/src/components/layout/Page.js b/hub-frontend/src/components/layout/Page.js new file mode 100644 index 00000000..916b73ea --- /dev/null +++ b/hub-frontend/src/components/layout/Page.js @@ -0,0 +1,18 @@ +import { Flex, useColorModeValue } from '@chakra-ui/react' + +const Page = props => { + const bgColor = useColorModeValue('gray.50', 'gray.900') + const color = useColorModeValue('black', 'white') + + return ( + + ) +} + +export default Page \ No newline at end of file diff --git a/hub-frontend/src/constants.js b/hub-frontend/src/constants.js deleted file mode 100644 index 5ae19390..00000000 --- a/hub-frontend/src/constants.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const config = require('../config') - -export const BACKEND = config.backend -export const FRONTEND = config.frontend - -export const ACCESS_TOKEN = 'access_token' -export const GITHUB_OAUTH_URL = `${BACKEND}/oauth2/authorize/github?redirect_uri=${FRONTEND}/oauth2/redirect` diff --git a/hub-frontend/src/main.js b/hub-frontend/src/main.js deleted file mode 100644 index ef02a63e..00000000 --- a/hub-frontend/src/main.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2020 Hub Team of panda-lang organization - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Vue from 'vue' -import Vuex from 'vuex' -import Buefy from 'buefy' -import 'buefy/dist/buefy.css' - -import App from './App.vue' -import { router } from './router' -import { store } from './store/store' -import { notifications } from './services' - -Vue.use(Vuex) -Vue.use(Buefy) -Vue.prototype.$notify = notifications -Vue.config.productionTip = false - -new Vue({ - router, - store, - render: h => h(App) -}).$mount('#app') diff --git a/hub-frontend/src/pages/_app.js b/hub-frontend/src/pages/_app.js new file mode 100644 index 00000000..55306f4d --- /dev/null +++ b/hub-frontend/src/pages/_app.js @@ -0,0 +1,24 @@ +import axios from 'axios' +import { ChakraProvider, ColorModeProvider } from '@chakra-ui/react' + +import { AuthProvider } from '../components/AuthProvider' +import 'focus-visible/dist/focus-visible' +import theme from '../theme' + +function HubApp ({ Component, pageProps }) { + return ( + + + + + + + + ) +} + +export default HubApp diff --git a/hub-frontend/src/pages/_document.js b/hub-frontend/src/pages/_document.js new file mode 100644 index 00000000..9aaf02f6 --- /dev/null +++ b/hub-frontend/src/pages/_document.js @@ -0,0 +1,18 @@ +import NextDocument, { Html, Head, Main, NextScript } from 'next/document' +import { ColorModeScript } from '@chakra-ui/react' + +export default class Document extends NextDocument { + render () { + return ( + + + + {/* Make Color mode to persists when you refresh the page. */} + +
+ + + + ) + } +} \ No newline at end of file diff --git a/hub-frontend/src/pages/about.js b/hub-frontend/src/pages/about.js new file mode 100644 index 00000000..703b98fe --- /dev/null +++ b/hub-frontend/src/pages/about.js @@ -0,0 +1,26 @@ +import Head from 'next/head' + +import Page from '../components/Page' +import Header from '../components/Header' +import Main from '../components/Main' +import Footer from '../components/Footer' +import { Box } from '@chakra-ui/react' + +const About = () => { + return ( + + + Hub - About + +
+
+ + + } /> +