From 51766c11755f7687aedc7810c4a3df33d2cbf395 Mon Sep 17 00:00:00 2001 From: Jane Petrovna Date: Mon, 14 Jun 2021 18:04:46 -0400 Subject: [PATCH] s --- {todo => backend}/LICENSE | 0 {todo => backend}/README.md | 0 {todo => backend}/config.json | 16 +- {todo => backend}/package.json | 0 {todo => backend}/pnpm-lock.yaml | 0 {todo => backend}/src/config.js | 40 +- {todo => backend}/src/db_interface.js | 152 +- {todo => backend}/src/index.js | 124 +- {todo => backend}/src/user.js | 470 +++--- elm-deprecated/src/Api.elm | 580 +++---- elm-deprecated/src/Api/Endpoint.elm | 198 +-- elm-deprecated/src/Asset.elm | 92 +- elm-deprecated/src/Avatar.elm | 112 +- elm-deprecated/src/Email.elm | 76 +- elm-deprecated/src/NavRow.elm | 114 +- elm-deprecated/src/PageState.elm | 132 +- elm-deprecated/src/Route.elm | 196 +-- elm-deprecated/src/Session.elm | 150 +- elm-deprecated/src/Todo.elm | 506 +++--- elm-deprecated/src/Todo/UUID.elm | 70 +- elm-deprecated/src/Username.elm | 94 +- elm-deprecated/src/Viewer.elm | 132 +- frontend/.gitignore | 30 + frontend/README.md | 1 + frontend/package-lock.json | 2066 +++++++++++++++++++++++++ frontend/package.json | 15 + frontend/pages/index.js | 209 +++ frontend/pnpm-lock.yaml | 1889 ++++++++++++++++++++++ frontend/public/favicon.ico | Bin 0 -> 15086 bytes frontend/public/vercel.svg | 4 + 30 files changed, 5841 insertions(+), 1627 deletions(-) rename {todo => backend}/LICENSE (100%) rename {todo => backend}/README.md (100%) rename {todo => backend}/config.json (94%) rename {todo => backend}/package.json (100%) rename {todo => backend}/pnpm-lock.yaml (100%) rename {todo => backend}/src/config.js (85%) rename {todo => backend}/src/db_interface.js (94%) rename {todo => backend}/src/index.js (96%) rename {todo => backend}/src/user.js (95%) create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/pages/index.js create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/vercel.svg diff --git a/todo/LICENSE b/backend/LICENSE similarity index 100% rename from todo/LICENSE rename to backend/LICENSE diff --git a/todo/README.md b/backend/README.md similarity index 100% rename from todo/README.md rename to backend/README.md diff --git a/todo/config.json b/backend/config.json similarity index 94% rename from todo/config.json rename to backend/config.json index 948073a..1623976 100644 --- a/todo/config.json +++ b/backend/config.json @@ -1,9 +1,9 @@ -{ - "secret": "TEST_SECRET", - "https": false, - "alter_db": true, - "port": 8080, - "db_url": "postgres://postgres:@127.0.0.1/todo", - "cert": "", - "cert_key": "" +{ + "secret": "TEST_SECRET", + "https": false, + "alter_db": true, + "port": 8080, + "db_url": "postgres://postgres:@127.0.0.1/todo", + "cert": "", + "cert_key": "" } \ No newline at end of file diff --git a/todo/package.json b/backend/package.json similarity index 100% rename from todo/package.json rename to backend/package.json diff --git a/todo/pnpm-lock.yaml b/backend/pnpm-lock.yaml similarity index 100% rename from todo/pnpm-lock.yaml rename to backend/pnpm-lock.yaml diff --git a/todo/src/config.js b/backend/src/config.js similarity index 85% rename from todo/src/config.js rename to backend/src/config.js index 9343cec..47634ed 100644 --- a/todo/src/config.js +++ b/backend/src/config.js @@ -1,21 +1,21 @@ -const fs = require('fs'); - -if (!global.config) { - global.config = {} - const cfg = JSON.parse(fs.readFileSync('./config.json')); - if (cfg) { - global.config = cfg; - } -} - -class Config { - get config() { - return global.config; - } - - set config(dat) { - global.config = dat; - } -} - +const fs = require('fs'); + +if (!global.config) { + global.config = {} + const cfg = JSON.parse(fs.readFileSync('./config.json')); + if (cfg) { + global.config = cfg; + } +} + +class Config { + get config() { + return global.config; + } + + set config(dat) { + global.config = dat; + } +} + module.exports = new Config(); \ No newline at end of file diff --git a/todo/src/db_interface.js b/backend/src/db_interface.js similarity index 94% rename from todo/src/db_interface.js rename to backend/src/db_interface.js index d841c92..60ff18f 100644 --- a/todo/src/db_interface.js +++ b/backend/src/db_interface.js @@ -1,77 +1,77 @@ -const Sequelize = require('sequelize'); -const Config = require('./config.js'); - -if (!Config.config.db_url) { - console.error("No database url found. please set `db_url` in config.json"); - process.exit(); -} - -const db = new Sequelize(Config.config.db_url); - -const User = db.define('User', { - id: { - type: Sequelize.DataTypes.UUID, - defaultValue: Sequelize.UUIDV4, - allowNull: false, - primaryKey: true, - unique: true - }, - email: { - type: Sequelize.DataTypes.STRING, - allowNull: false, - unique: true - }, - password_hash: { - type: Sequelize.DataTypes.STRING, - allowNull: true - } -}); - -const Todo = db.define('Todo', { - id: { - type: Sequelize.DataTypes.UUID, - defaultValue: Sequelize.UUIDV4, - allowNull: false, - primaryKey: true, - unique: true - }, - content: { - type: Sequelize.DataTypes.TEXT, - allowNull: false - } -}); - -const Tag = db.define('Tag', { - id: { - type: Sequelize.DataTypes.UUID, - defaultValue: Sequelize.UUIDV4, - allowNull: false, - primaryKey: true, - unique: true - }, - content: { - type: Sequelize.DataTypes.STRING, - allowNull: false - } -}); - -User.hasMany(Todo); -Todo.hasMany(Tag); - -let options = { - alter: false -}; -if (Config.config.alter_db) { - options.alter = true; -} - -User.sync(options); -module.exports = { - db: db, - constructors: { - user: () => { return User.build(); } - }, - schemas: { - user: User - } +const Sequelize = require('sequelize'); +const Config = require('./config.js'); + +if (!Config.config.db_url) { + console.error("No database url found. please set `db_url` in config.json"); + process.exit(); +} + +const db = new Sequelize(Config.config.db_url); + +const User = db.define('User', { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.UUIDV4, + allowNull: false, + primaryKey: true, + unique: true + }, + email: { + type: Sequelize.DataTypes.STRING, + allowNull: false, + unique: true + }, + password_hash: { + type: Sequelize.DataTypes.STRING, + allowNull: true + } +}); + +const Todo = db.define('Todo', { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.UUIDV4, + allowNull: false, + primaryKey: true, + unique: true + }, + content: { + type: Sequelize.DataTypes.TEXT, + allowNull: false + } +}); + +const Tag = db.define('Tag', { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.UUIDV4, + allowNull: false, + primaryKey: true, + unique: true + }, + content: { + type: Sequelize.DataTypes.STRING, + allowNull: false + } +}); + +User.hasMany(Todo); +Todo.hasMany(Tag); + +let options = { + alter: false +}; +if (Config.config.alter_db) { + options.alter = true; +} + +User.sync(options); +module.exports = { + db: db, + constructors: { + user: () => { return User.build(); } + }, + schemas: { + user: User + } } \ No newline at end of file diff --git a/todo/src/index.js b/backend/src/index.js similarity index 96% rename from todo/src/index.js rename to backend/src/index.js index 8c86ac0..b997841 100644 --- a/todo/src/index.js +++ b/backend/src/index.js @@ -1,62 +1,62 @@ -const http = require('http'); -const https = require('https'); -const cors = require('cors'); -const express = require('express'); -const cookieParser = require('cookie-parser'); -const Config = require('./config.js'); - -const UserInterface = require('./user.js'); - -let credentials = {}; - -if (Config.config.https) { - if ( - fs.existsSync(Config.config.cert) && - fs.existsSync(Config.config.cert_key) - ) { - credentials.key = fs.readFileSync(Config.config.cert_key); - credentials.cert = fs.readFileSync(Config.config.cert); - } -} - -let app = express(); - -app.use(cors()); -app.use(cookieParser()); - -// force https -app.use((req, res, next) => { - if (Config.config.https) { - if (req.headers['x-forwarded-proto'] !== 'https') { - return res.redirect(`https://${req.headers.host}${req.url}`); - } - } - return next(); -}); - -if (!Config.config.secret) { - console.error('No password secret found. please set `secret` in config.json'); - process.exit(); -} else if (Config.config.https && Config.config.secret == 'TEST_SECRET') { - console.error('please do not use the testing secret in production.'); - process.exit(); -} - -app.use('/api/user', UserInterface.router); - -// serve static files last -app.use(express.static('./static')); -// DISABLED: no longer needs to serve static files -// due to frontend being employed in elm - -if (Config.config.https) { - var server = https.createServer(credentials, app); - server.listen(Config.config.port || 8080); -} else { - var server = http.createServer(app); - server.listen(Config.config.port || 8080); -} -console.log( - `listening on port ${Config.config.port || 8080}` + - ` with https ${Config.config.https ? 'enabled' : 'disabled'}` -); +const http = require('http'); +const https = require('https'); +const cors = require('cors'); +const express = require('express'); +const cookieParser = require('cookie-parser'); +const Config = require('./config.js'); + +const UserInterface = require('./user.js'); + +let credentials = {}; + +if (Config.config.https) { + if ( + fs.existsSync(Config.config.cert) && + fs.existsSync(Config.config.cert_key) + ) { + credentials.key = fs.readFileSync(Config.config.cert_key); + credentials.cert = fs.readFileSync(Config.config.cert); + } +} + +let app = express(); + +app.use(cors()); +app.use(cookieParser()); + +// force https +app.use((req, res, next) => { + if (Config.config.https) { + if (req.headers['x-forwarded-proto'] !== 'https') { + return res.redirect(`https://${req.headers.host}${req.url}`); + } + } + return next(); +}); + +if (!Config.config.secret) { + console.error('No password secret found. please set `secret` in config.json'); + process.exit(); +} else if (Config.config.https && Config.config.secret == 'TEST_SECRET') { + console.error('please do not use the testing secret in production.'); + process.exit(); +} + +app.use('/api/user', UserInterface.router); + +// serve static files last +app.use(express.static('./static')); +// DISABLED: no longer needs to serve static files +// due to frontend being employed in elm + +if (Config.config.https) { + var server = https.createServer(credentials, app); + server.listen(Config.config.port || 8080); +} else { + var server = http.createServer(app); + server.listen(Config.config.port || 8080); +} +console.log( + `listening on port ${Config.config.port || 8080}` + + ` with https ${Config.config.https ? 'enabled' : 'disabled'}` +); diff --git a/todo/src/user.js b/backend/src/user.js similarity index 95% rename from todo/src/user.js rename to backend/src/user.js index 980cb77..f0cfff1 100644 --- a/todo/src/user.js +++ b/backend/src/user.js @@ -1,235 +1,235 @@ -const express = require('express'); -const crypto = require('crypto'); -const Config = require('./config.js'); -const Database = require('./db_interface.js'); - -let router = express.Router(); - -router.use(express.json()); - -let session_entropy = {}; - -user_cache = {}; -email_cache = {}; - -async function get_user_details(id) { - if (!id) { - return undefined; - } - console.log(`search for user with id ${id}`); - if (!user_cache[id]) { - let user = await Database.schemas.user.findOne({where: {id: id}}); - if (!user) { - return undefined; - } - user_cache[user.id] = { - id: user.id, - email: user.email, - password_hash: user.password_hash, - }; - email_cache[user.email] = user.id; - } - console.log(`returning ${JSON.stringify(user_cache[id])}`); - return user_cache[id]; -} - -async function get_user_details_by_email(email) { - if (!email) { - return undefined; - } - console.log(`search for user with email ${email}}`); - if (!email_cache[email] || !user_cache[email_cache[email]]) { - let user = await Database.schemas.user.findOne({where: {email: email}}); - if (!user) { - return undefined; - } - user_cache[user.id] = { - id: user.id, - email: user.email, - password_hash: user.password_hash, - }; - email_cache[user.email] = user.id; - } - console.log(`returning ${JSON.stringify(user_cache[email_cache[email]])}`); - return user_cache[email_cache[email]]; -} - -router.get('/byEmail/:email', async (req, res) => { - if (!req.params?.email) { - res.status(400).json({ - error: 'email is a required parameter', - }); - } - let user = get_user_details_by_email(req.params.email); - console.log(user); - if (user != null) { - res.json({ - id: user.id, - email: user.email, - }); - } else { - res.sendStatus(404); - } -}); - -function hash(secret, password) { - let pw_hash = crypto.pbkdf2Sync( - password, - secret, - Config.config.key?.iterations || 1000, - Config.config.key?.length || 64, - 'sha512' - ); - - return pw_hash.toString('base64'); -} - -function verify(secret, password, hash) { - let pw_hash = crypto.pbkdf2Sync( - password, - secret, - Config.config.key?.iterations || 1000, - Config.config.key?.length || 64, - 'sha512' - ); - - return hash === pw_hash.toString('base64'); -} - -function hash_password(password) { - return hash(Config.config.secret, password); -} - -function verify_password(password, hash) { - return verify(Config.config.secret, password, hash); -} - -function get_session_token(id, token) { - session_entropy[id] = crypto.randomBytes(Config.config.session_entropy || 32); - return hash(session_entropy[id], token); -} - -function verify_session_token(id, hash, token) { - if (session_entropy[id]) { - return verify(session_entropy[id], hash, token); - } else { - return false; - } -} - -async function enforce_session_login(req, res, next) { - let userid = req.cookies?.userid; - let session_token = req.cookies?._session; - console.log('a', userid, session_token); - if (!userid || !session_token) { - return res.sendStatus(401); - } - let user = await get_user_details(userid); - if (!user) { - return res.sendStatus(401); - } - let verified_session = verify_session_token( - userid, - user.password_hash, - session_token - ); - if (!verified_session) { - return res.sendStatus(401); - } - return next(); -} - -router.post('/new', async (req, res) => { - if (!req.body?.email || !req.body?.password) { - return res.status(400).json({ - error: 'must have email and password fields', - }); - } - let user = await get_user_details_by_email(req.body.email); - console.log(user); - if (user != null) { - return res.status(403).json({ - error: `email ${req.body.email} is already in use.`, - }); - } else { - let user = await Database.schemas.user.create({ - email: String(req.body.email), - password_hash: hash_password(req.body.password), - }); - - return res.json({ - id: user.id, - email: user.email, - }); - } -}); - -router.post('/login', async (req, res) => { - if (!req.body?.email || !req.body?.password) { - return res.status(400).json({ - error: 'must have email and password fields', - }); - } - let user = await get_user_details_by_email(req.body.email); - if (!user) { - return res.status(401).json({ - error: 'incorrect email or password', - }); - } - let verified = verify_password(req.body.password, user.password_hash); - - if (!verified) { - return res.status(401).json({ - error: 'incorrect email or password', - }); - } - - res.cookie('userid', user.id, { - httpOnly: true, - secure: true, - }); - res.cookie('_session', get_session_token(user.id, user.password_hash), { - httpOnly: true, - secure: true, - }); - return res.sendStatus(204); -}); - -router.get('/:id([a-f0-9-]+)', async (req, res) => { - console.log(req.params); - if (!req.params?.id) { - return res.status(400).json({ - error: 'must have id parameter', - }); - } - let id = req.params?.id; - console.log(id); - let user = await get_user_details(id); - console.log(user); - if (user != null) { - return res.json({ - id: user.id, - email: user.email, - }); - } else { - return res.sendStatus(404); - } -}); - -router.use('/authorized', enforce_session_login); -router.get('/authorized', async (req, res) => { - let userid = req.cookies?.userid; - let user = await get_user_details(userid); - return res.json({ - authorized: true, - user: { - id: user.id, - email: user.email, - }, - }); -}); - -module.exports = { - router: router, - enforce_session_login: enforce_session_login, -}; +const express = require('express'); +const crypto = require('crypto'); +const Config = require('./config.js'); +const Database = require('./db_interface.js'); + +let router = express.Router(); + +router.use(express.json()); + +let session_entropy = {}; + +user_cache = {}; +email_cache = {}; + +async function get_user_details(id) { + if (!id) { + return undefined; + } + console.log(`search for user with id ${id}`); + if (!user_cache[id]) { + let user = await Database.schemas.user.findOne({where: {id: id}}); + if (!user) { + return undefined; + } + user_cache[user.id] = { + id: user.id, + email: user.email, + password_hash: user.password_hash, + }; + email_cache[user.email] = user.id; + } + console.log(`returning ${JSON.stringify(user_cache[id])}`); + return user_cache[id]; +} + +async function get_user_details_by_email(email) { + if (!email) { + return undefined; + } + console.log(`search for user with email ${email}}`); + if (!email_cache[email] || !user_cache[email_cache[email]]) { + let user = await Database.schemas.user.findOne({where: {email: email}}); + if (!user) { + return undefined; + } + user_cache[user.id] = { + id: user.id, + email: user.email, + password_hash: user.password_hash, + }; + email_cache[user.email] = user.id; + } + console.log(`returning ${JSON.stringify(user_cache[email_cache[email]])}`); + return user_cache[email_cache[email]]; +} + +router.get('/byEmail/:email', async (req, res) => { + if (!req.params?.email) { + res.status(400).json({ + error: 'email is a required parameter', + }); + } + let user = get_user_details_by_email(req.params.email); + console.log(user); + if (user != null) { + res.json({ + id: user.id, + email: user.email, + }); + } else { + res.sendStatus(404); + } +}); + +function hash(secret, password) { + let pw_hash = crypto.pbkdf2Sync( + password, + secret, + Config.config.key?.iterations || 1000, + Config.config.key?.length || 64, + 'sha512' + ); + + return pw_hash.toString('base64'); +} + +function verify(secret, password, hash) { + let pw_hash = crypto.pbkdf2Sync( + password, + secret, + Config.config.key?.iterations || 1000, + Config.config.key?.length || 64, + 'sha512' + ); + + return hash === pw_hash.toString('base64'); +} + +function hash_password(password) { + return hash(Config.config.secret, password); +} + +function verify_password(password, hash) { + return verify(Config.config.secret, password, hash); +} + +function get_session_token(id, token) { + session_entropy[id] = crypto.randomBytes(Config.config.session_entropy || 32); + return hash(session_entropy[id], token); +} + +function verify_session_token(id, hash, token) { + if (session_entropy[id]) { + return verify(session_entropy[id], hash, token); + } else { + return false; + } +} + +async function enforce_session_login(req, res, next) { + let userid = req.cookies?.userid; + let session_token = req.cookies?._session; + console.log('a', userid, session_token); + if (!userid || !session_token) { + return res.sendStatus(401); + } + let user = await get_user_details(userid); + if (!user) { + return res.sendStatus(401); + } + let verified_session = verify_session_token( + userid, + user.password_hash, + session_token + ); + if (!verified_session) { + return res.sendStatus(401); + } + return next(); +} + +router.post('/new', async (req, res) => { + if (!req.body?.email || !req.body?.password) { + return res.status(400).json({ + error: 'must have email and password fields', + }); + } + let user = await get_user_details_by_email(req.body.email); + console.log(user); + if (user != null) { + return res.status(403).json({ + error: `email ${req.body.email} is already in use.`, + }); + } else { + let user = await Database.schemas.user.create({ + email: String(req.body.email), + password_hash: hash_password(req.body.password), + }); + + return res.json({ + id: user.id, + email: user.email, + }); + } +}); + +router.post('/login', async (req, res) => { + if (!req.body?.email || !req.body?.password) { + return res.status(400).json({ + error: 'must have email and password fields', + }); + } + let user = await get_user_details_by_email(req.body.email); + if (!user) { + return res.status(401).json({ + error: 'incorrect email or password', + }); + } + let verified = verify_password(req.body.password, user.password_hash); + + if (!verified) { + return res.status(401).json({ + error: 'incorrect email or password', + }); + } + + res.cookie('userid', user.id, { + httpOnly: true, + secure: true, + }); + res.cookie('_session', get_session_token(user.id, user.password_hash), { + httpOnly: true, + secure: true, + }); + return res.sendStatus(204); +}); + +router.get('/:id([a-f0-9-]+)', async (req, res) => { + console.log(req.params); + if (!req.params?.id) { + return res.status(400).json({ + error: 'must have id parameter', + }); + } + let id = req.params?.id; + console.log(id); + let user = await get_user_details(id); + console.log(user); + if (user != null) { + return res.json({ + id: user.id, + email: user.email, + }); + } else { + return res.sendStatus(404); + } +}); + +router.use('/authorized', enforce_session_login); +router.get('/authorized', async (req, res) => { + let userid = req.cookies?.userid; + let user = await get_user_details(userid); + return res.json({ + authorized: true, + user: { + id: user.id, + email: user.email, + }, + }); +}); + +module.exports = { + router: router, + enforce_session_login: enforce_session_login, +}; diff --git a/elm-deprecated/src/Api.elm b/elm-deprecated/src/Api.elm index acdbec6..99aa5b5 100644 --- a/elm-deprecated/src/Api.elm +++ b/elm-deprecated/src/Api.elm @@ -1,290 +1,290 @@ -port module Api exposing (Cred, addServerError, application, decodeErrors, delete, get, login, logout, post, put, register, settings, storeCredWith, username, viewerChanges) - -{-| This module is responsible for communicating to the Conduit API. -It exposes an opaque Endpoint type which is guaranteed to point to the correct URL. --} - -import Api.Endpoint as Endpoint exposing (Endpoint) -import Avatar exposing (Avatar) -import Browser -import Browser.Navigation as Nav -import Http exposing (Body, Expect) -import Json.Decode as Decode exposing (Decoder, Value, decodeString, field, string) -import Json.Encode as Encode -import Url exposing (Url) -import Username exposing (Username) - - - --- CRED - - -{-| The authentication credentials for the Viewer (that is, the currently logged-in user.) -This includes: - - - The cred's Username - - The cred's authentication token - By design, there is no way to access the token directly as a String. - It can be encoded for persistence, and it can be added to a header - to a HttpBuilder for a request, but that's it. - This token should never be rendered to the end user, and with this API, it - can't be! - --} -type Cred - = Cred Username String - - -username : Cred -> Username -username (Cred val _) = - val - - -credHeader : Cred -> Http.Header -credHeader (Cred _ str) = - Http.header "authorization" ("Token " ++ str) - - -{-| It's important that this is never exposed! -We expose `login` and `application` instead, so we can be certain that if anyone -ever has access to a `Cred` value, it came from either the login API endpoint -or was passed in via flags. --} -credDecoder : Decoder Cred -credDecoder = - Decode.succeed Cred - |> field "username" Username.decoder - |> field "token" Decode.string - - - --- PERSISTENCE - - -decode : Decoder (Cred -> viewer) -> Value -> Result Decode.Error viewer -decode decoder value = - -- It's stored in localStorage as a JSON String; - -- first decode the Value as a String, then - -- decode that String as JSON. - Decode.decodeValue Decode.string value - |> Result.andThen (\str -> Decode.decodeString (Decode.field "user" (decoderFromCred decoder)) str) - - -port onStoreChange : (Value -> msg) -> Sub msg - - -viewerChanges : (Maybe viewer -> msg) -> Decoder (Cred -> viewer) -> Sub msg -viewerChanges toMsg decoder = - onStoreChange (\value -> toMsg (decodeFromChange decoder value)) - - -decodeFromChange : Decoder (Cred -> viewer) -> Value -> Maybe viewer -decodeFromChange viewerDecoder val = - -- It's stored in localStorage as a JSON String; - -- first decode the Value as a String, then - -- decode that String as JSON. - Decode.decodeValue (storageDecoder viewerDecoder) val - |> Result.toMaybe - - -storeCredWith : Cred -> Avatar -> Cmd msg -storeCredWith (Cred uname token) avatar = - let - json = - Encode.object - [ ( "user" - , Encode.object - [ ( "username", Username.encode uname ) - , ( "token", Encode.string token ) - , ( "image", Avatar.encode avatar ) - ] - ) - ] - in - storeCache (Just json) - - -logout : Cmd msg -logout = - storeCache Nothing - - -port storeCache : Maybe Value -> Cmd msg - - - --- SERIALIZATION --- APPLICATION - - -application : - Decoder (Cred -> viewer) - -> - { init : Maybe viewer -> Url -> Nav.Key -> ( model, Cmd msg ) - , onUrlChange : Url -> msg - , onUrlRequest : Browser.UrlRequest -> msg - , subscriptions : model -> Sub msg - , update : msg -> model -> ( model, Cmd msg ) - , view : model -> Browser.Document msg - } - -> Program Value model msg -application viewerDecoder config = - let - init flags url navKey = - let - maybeViewer = - Decode.decodeValue Decode.string flags - |> Result.andThen (Decode.decodeString (storageDecoder viewerDecoder)) - |> Result.toMaybe - in - config.init maybeViewer url navKey - in - Browser.application - { init = init - , onUrlChange = config.onUrlChange - , onUrlRequest = config.onUrlRequest - , subscriptions = config.subscriptions - , update = config.update - , view = config.view - } - - -storageDecoder : Decoder (Cred -> viewer) -> Decoder viewer -storageDecoder viewerDecoder = - Decode.field "user" (decoderFromCred viewerDecoder) - - - --- HTTP - - -get : Endpoint -> Maybe Cred -> Decoder a -> Cmd a -get url maybeCred decoder = - Endpoint.request - { method = "GET" - , url = url - , expect = Http.expectJson decoder - , headers = - case maybeCred of - Just cred -> - [ credHeader cred ] - - Nothing -> - [] - , body = Http.emptyBody - , timeout = Nothing - , withCredentials = False - } - - -put : Endpoint -> Cred -> Body -> Decoder a -> Cmd a -put url cred body decoder = - Endpoint.request - { method = "PUT" - , url = url - , expect = Http.expectJson decoder - , headers = [ credHeader cred ] - , body = body - , timeout = Nothing - , withCredentials = False - } - - -post : Endpoint -> Maybe Cred -> Body -> Decoder a -> Cmd a -post url maybeCred body decoder = - Endpoint.request - { method = "POST" - , url = url - , expect = Http.expectJson decoder - , headers = - case maybeCred of - Just cred -> - [ credHeader cred ] - - Nothing -> - [] - , body = body - , timeout = Nothing - , withCredentials = False - } - - -delete : Endpoint -> Cred -> Body -> Decoder a -> Cmd a -delete url cred body decoder = - Endpoint.request - { method = "DELETE" - , url = url - , expect = Http.expectJson decoder - , headers = [ credHeader cred ] - , body = body - , timeout = Nothing - , withCredentials = False - } - - -login : Http.Body -> Decoder (Cred -> a) -> Cmd a -login body decoder = - post Endpoint.login Nothing body (Decode.field "user" (decoderFromCred decoder)) - - -register : Http.Body -> Decoder (Cred -> a) -> Cmd a -register body decoder = - post Endpoint.users Nothing body (Decode.field "user" (decoderFromCred decoder)) - - -settings : Cred -> Http.Body -> Decoder (Cred -> a) -> Cmd a -settings cred body decoder = - put Endpoint.user cred body (Decode.field "user" (decoderFromCred decoder)) - - -decoderFromCred : Decoder (Cred -> a) -> Decoder a -decoderFromCred decoder = - Decode.map2 (\fromCred cred -> fromCred cred) - decoder - credDecoder - - - --- ERRORS - - -addServerError : List String -> List String -addServerError list = - "Server error" :: list - - -{-| Many API endpoints include an "errors" field in their BadStatus responses. --} -decodeErrors : Http.Error -> List String -decodeErrors error = - case error of - Http.BadStatus errid -> - [ Int.toString errid ] - - err -> - [ "Server error" ] - - -errorsDecoder : Decoder (List String) -errorsDecoder = - Decode.keyValuePairs (Decode.list Decode.string) - |> Decode.map (List.concatMap fromPair) - - -fromPair : ( String, List String ) -> List String -fromPair ( field, errors ) = - List.map (\error -> field ++ " " ++ error) errors - - - --- LOCALSTORAGE KEYS - - -cacheStorageKey : String -cacheStorageKey = - "cache" - - -credStorageKey : String -credStorageKey = - "cred" +port module Api exposing (Cred, addServerError, application, decodeErrors, delete, get, login, logout, post, put, register, settings, storeCredWith, username, viewerChanges) + +{-| This module is responsible for communicating to the Conduit API. +It exposes an opaque Endpoint type which is guaranteed to point to the correct URL. +-} + +import Api.Endpoint as Endpoint exposing (Endpoint) +import Avatar exposing (Avatar) +import Browser +import Browser.Navigation as Nav +import Http exposing (Body, Expect) +import Json.Decode as Decode exposing (Decoder, Value, decodeString, field, string) +import Json.Encode as Encode +import Url exposing (Url) +import Username exposing (Username) + + + +-- CRED + + +{-| The authentication credentials for the Viewer (that is, the currently logged-in user.) +This includes: + + - The cred's Username + - The cred's authentication token + By design, there is no way to access the token directly as a String. + It can be encoded for persistence, and it can be added to a header + to a HttpBuilder for a request, but that's it. + This token should never be rendered to the end user, and with this API, it + can't be! + +-} +type Cred + = Cred Username String + + +username : Cred -> Username +username (Cred val _) = + val + + +credHeader : Cred -> Http.Header +credHeader (Cred _ str) = + Http.header "authorization" ("Token " ++ str) + + +{-| It's important that this is never exposed! +We expose `login` and `application` instead, so we can be certain that if anyone +ever has access to a `Cred` value, it came from either the login API endpoint +or was passed in via flags. +-} +credDecoder : Decoder Cred +credDecoder = + Decode.succeed Cred + |> field "username" Username.decoder + |> field "token" Decode.string + + + +-- PERSISTENCE + + +decode : Decoder (Cred -> viewer) -> Value -> Result Decode.Error viewer +decode decoder value = + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- decode that String as JSON. + Decode.decodeValue Decode.string value + |> Result.andThen (\str -> Decode.decodeString (Decode.field "user" (decoderFromCred decoder)) str) + + +port onStoreChange : (Value -> msg) -> Sub msg + + +viewerChanges : (Maybe viewer -> msg) -> Decoder (Cred -> viewer) -> Sub msg +viewerChanges toMsg decoder = + onStoreChange (\value -> toMsg (decodeFromChange decoder value)) + + +decodeFromChange : Decoder (Cred -> viewer) -> Value -> Maybe viewer +decodeFromChange viewerDecoder val = + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- decode that String as JSON. + Decode.decodeValue (storageDecoder viewerDecoder) val + |> Result.toMaybe + + +storeCredWith : Cred -> Avatar -> Cmd msg +storeCredWith (Cred uname token) avatar = + let + json = + Encode.object + [ ( "user" + , Encode.object + [ ( "username", Username.encode uname ) + , ( "token", Encode.string token ) + , ( "image", Avatar.encode avatar ) + ] + ) + ] + in + storeCache (Just json) + + +logout : Cmd msg +logout = + storeCache Nothing + + +port storeCache : Maybe Value -> Cmd msg + + + +-- SERIALIZATION +-- APPLICATION + + +application : + Decoder (Cred -> viewer) + -> + { init : Maybe viewer -> Url -> Nav.Key -> ( model, Cmd msg ) + , onUrlChange : Url -> msg + , onUrlRequest : Browser.UrlRequest -> msg + , subscriptions : model -> Sub msg + , update : msg -> model -> ( model, Cmd msg ) + , view : model -> Browser.Document msg + } + -> Program Value model msg +application viewerDecoder config = + let + init flags url navKey = + let + maybeViewer = + Decode.decodeValue Decode.string flags + |> Result.andThen (Decode.decodeString (storageDecoder viewerDecoder)) + |> Result.toMaybe + in + config.init maybeViewer url navKey + in + Browser.application + { init = init + , onUrlChange = config.onUrlChange + , onUrlRequest = config.onUrlRequest + , subscriptions = config.subscriptions + , update = config.update + , view = config.view + } + + +storageDecoder : Decoder (Cred -> viewer) -> Decoder viewer +storageDecoder viewerDecoder = + Decode.field "user" (decoderFromCred viewerDecoder) + + + +-- HTTP + + +get : Endpoint -> Maybe Cred -> Decoder a -> Cmd a +get url maybeCred decoder = + Endpoint.request + { method = "GET" + , url = url + , expect = Http.expectJson decoder + , headers = + case maybeCred of + Just cred -> + [ credHeader cred ] + + Nothing -> + [] + , body = Http.emptyBody + , timeout = Nothing + , withCredentials = False + } + + +put : Endpoint -> Cred -> Body -> Decoder a -> Cmd a +put url cred body decoder = + Endpoint.request + { method = "PUT" + , url = url + , expect = Http.expectJson decoder + , headers = [ credHeader cred ] + , body = body + , timeout = Nothing + , withCredentials = False + } + + +post : Endpoint -> Maybe Cred -> Body -> Decoder a -> Cmd a +post url maybeCred body decoder = + Endpoint.request + { method = "POST" + , url = url + , expect = Http.expectJson decoder + , headers = + case maybeCred of + Just cred -> + [ credHeader cred ] + + Nothing -> + [] + , body = body + , timeout = Nothing + , withCredentials = False + } + + +delete : Endpoint -> Cred -> Body -> Decoder a -> Cmd a +delete url cred body decoder = + Endpoint.request + { method = "DELETE" + , url = url + , expect = Http.expectJson decoder + , headers = [ credHeader cred ] + , body = body + , timeout = Nothing + , withCredentials = False + } + + +login : Http.Body -> Decoder (Cred -> a) -> Cmd a +login body decoder = + post Endpoint.login Nothing body (Decode.field "user" (decoderFromCred decoder)) + + +register : Http.Body -> Decoder (Cred -> a) -> Cmd a +register body decoder = + post Endpoint.users Nothing body (Decode.field "user" (decoderFromCred decoder)) + + +settings : Cred -> Http.Body -> Decoder (Cred -> a) -> Cmd a +settings cred body decoder = + put Endpoint.user cred body (Decode.field "user" (decoderFromCred decoder)) + + +decoderFromCred : Decoder (Cred -> a) -> Decoder a +decoderFromCred decoder = + Decode.map2 (\fromCred cred -> fromCred cred) + decoder + credDecoder + + + +-- ERRORS + + +addServerError : List String -> List String +addServerError list = + "Server error" :: list + + +{-| Many API endpoints include an "errors" field in their BadStatus responses. +-} +decodeErrors : Http.Error -> List String +decodeErrors error = + case error of + Http.BadStatus errid -> + [ Int.toString errid ] + + err -> + [ "Server error" ] + + +errorsDecoder : Decoder (List String) +errorsDecoder = + Decode.keyValuePairs (Decode.list Decode.string) + |> Decode.map (List.concatMap fromPair) + + +fromPair : ( String, List String ) -> List String +fromPair ( field, errors ) = + List.map (\error -> field ++ " " ++ error) errors + + + +-- LOCALSTORAGE KEYS + + +cacheStorageKey : String +cacheStorageKey = + "cache" + + +credStorageKey : String +credStorageKey = + "cred" diff --git a/elm-deprecated/src/Api/Endpoint.elm b/elm-deprecated/src/Api/Endpoint.elm index f4a4f05..fe6866c 100644 --- a/elm-deprecated/src/Api/Endpoint.elm +++ b/elm-deprecated/src/Api/Endpoint.elm @@ -1,99 +1,99 @@ -module Api.Endpoint exposing (Endpoint, login, request, tags, todo, todoList, user, users) - -import Http -import Todo.UUID as UUID exposing (UUID) -import Url.Builder exposing (QueryParameter) -import Username exposing (Username) - - -{-| Http.request, except it takes an Endpoint instead of a Url. --} -request : - { body : Http.Body - , expect : Http.Expect a - , headers : List Http.Header - , method : String - , timeout : Maybe Float - , url : Endpoint - , tracker : Maybe String - } - -> Cmd a -request config = - Http.request - { body = config.body - , expect = config.expect - , headers = config.headers - , method = config.method - , timeout = config.timeout - , url = unwrap config.url - , tracker = config.tracker - } - - - --- TYPES - - -{-| Get a URL to the Conduit API. -This is not publicly exposed, because we want to make sure the only way to get one of these URLs is from this module. --} -type Endpoint - = Endpoint String - - -unwrap : Endpoint -> String -unwrap (Endpoint str) = - str - - -url : List String -> List QueryParameter -> Endpoint -url paths queryParams = - -- NOTE: Url.Builder takes care of percent-encoding special URL characters. - -- See https://package.elm-lang.org/packages/elm/url/latest/Url#percentEncode - Url.Builder.crossOrigin "https://conduit.productionready.io" - ("api" :: paths) - queryParams - |> Endpoint - - - --- ENDPOINTS - - -login : Endpoint -login = - url [ "users", "login" ] [] - - -user : Endpoint -user = - url [ "user" ] [] - - -users : Endpoint -users = - url [ "users" ] [] - - -follow : Username -> Endpoint -follow uname = - url [ "profiles", Username.toString uname, "follow" ] [] - - - --- ARTICLE ENDPOINTS - - -todo : UUID -> Endpoint -todo uuid = - url [ "articles", UUID.toString uuid ] [] - - -todoList : List QueryParameter -> Endpoint -todoList params = - url [ "articles" ] params - - -tags : Endpoint -tags = - url [ "tags" ] [] +module Api.Endpoint exposing (Endpoint, login, request, tags, todo, todoList, user, users) + +import Http +import Todo.UUID as UUID exposing (UUID) +import Url.Builder exposing (QueryParameter) +import Username exposing (Username) + + +{-| Http.request, except it takes an Endpoint instead of a Url. +-} +request : + { body : Http.Body + , expect : Http.Expect a + , headers : List Http.Header + , method : String + , timeout : Maybe Float + , url : Endpoint + , tracker : Maybe String + } + -> Cmd a +request config = + Http.request + { body = config.body + , expect = config.expect + , headers = config.headers + , method = config.method + , timeout = config.timeout + , url = unwrap config.url + , tracker = config.tracker + } + + + +-- TYPES + + +{-| Get a URL to the Conduit API. +This is not publicly exposed, because we want to make sure the only way to get one of these URLs is from this module. +-} +type Endpoint + = Endpoint String + + +unwrap : Endpoint -> String +unwrap (Endpoint str) = + str + + +url : List String -> List QueryParameter -> Endpoint +url paths queryParams = + -- NOTE: Url.Builder takes care of percent-encoding special URL characters. + -- See https://package.elm-lang.org/packages/elm/url/latest/Url#percentEncode + Url.Builder.crossOrigin "https://conduit.productionready.io" + ("api" :: paths) + queryParams + |> Endpoint + + + +-- ENDPOINTS + + +login : Endpoint +login = + url [ "users", "login" ] [] + + +user : Endpoint +user = + url [ "user" ] [] + + +users : Endpoint +users = + url [ "users" ] [] + + +follow : Username -> Endpoint +follow uname = + url [ "profiles", Username.toString uname, "follow" ] [] + + + +-- ARTICLE ENDPOINTS + + +todo : UUID -> Endpoint +todo uuid = + url [ "articles", UUID.toString uuid ] [] + + +todoList : List QueryParameter -> Endpoint +todoList params = + url [ "articles" ] params + + +tags : Endpoint +tags = + url [ "tags" ] [] diff --git a/elm-deprecated/src/Asset.elm b/elm-deprecated/src/Asset.elm index daa023b..8f34dbd 100644 --- a/elm-deprecated/src/Asset.elm +++ b/elm-deprecated/src/Asset.elm @@ -1,46 +1,46 @@ -module Asset exposing (Image, defaultAvatar, error, loading, src) - -{-| Assets, such as images, videos, and audio. (We only have images for now.) -We should never expose asset URLs directly; this module should be in charge of -all of them. One source of truth! --} - -import Html exposing (Attribute, Html) -import Html.Attributes as Attr - - -type Image - = Image String - - - --- IMAGES - - -error : Image -error = - image "error.jpg" - - -loading : Image -loading = - image "loading.svg" - - -defaultAvatar : Image -defaultAvatar = - image "smiley-cyrus.jpg" - - -image : String -> Image -image filename = - Image ("/assets/images/" ++ filename) - - - --- USING IMAGES - - -src : Image -> Attribute msg -src (Image url) = - Attr.src url +module Asset exposing (Image, defaultAvatar, error, loading, src) + +{-| Assets, such as images, videos, and audio. (We only have images for now.) +We should never expose asset URLs directly; this module should be in charge of +all of them. One source of truth! +-} + +import Html exposing (Attribute, Html) +import Html.Attributes as Attr + + +type Image + = Image String + + + +-- IMAGES + + +error : Image +error = + image "error.jpg" + + +loading : Image +loading = + image "loading.svg" + + +defaultAvatar : Image +defaultAvatar = + image "smiley-cyrus.jpg" + + +image : String -> Image +image filename = + Image ("/assets/images/" ++ filename) + + + +-- USING IMAGES + + +src : Image -> Attribute msg +src (Image url) = + Attr.src url diff --git a/elm-deprecated/src/Avatar.elm b/elm-deprecated/src/Avatar.elm index 7ecafb3..592787d 100644 --- a/elm-deprecated/src/Avatar.elm +++ b/elm-deprecated/src/Avatar.elm @@ -1,56 +1,56 @@ -module Avatar exposing (Avatar, decoder, encode, src, toMaybeString) - -import Asset -import Html exposing (Attribute) -import Html.Attributes -import Json.Decode as Decode exposing (Decoder) -import Json.Encode as Encode exposing (Value) - - - --- TYPES - - -type Avatar - = Avatar (Maybe String) - - - --- CREATE - - -decoder : Decoder Avatar -decoder = - Decode.map Avatar (Decode.nullable Decode.string) - - - --- TRANSFORM - - -encode : Avatar -> Value -encode (Avatar maybeUrl) = - case maybeUrl of - Just url -> - Encode.string url - - Nothing -> - Encode.null - - -src : Avatar -> Attribute msg -src (Avatar maybeUrl) = - case maybeUrl of - Nothing -> - Asset.src Asset.defaultAvatar - - Just "" -> - Asset.src Asset.defaultAvatar - - Just url -> - Html.Attributes.src url - - -toMaybeString : Avatar -> Maybe String -toMaybeString (Avatar maybeUrl) = - maybeUrl +module Avatar exposing (Avatar, decoder, encode, src, toMaybeString) + +import Asset +import Html exposing (Attribute) +import Html.Attributes +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode exposing (Value) + + + +-- TYPES + + +type Avatar + = Avatar (Maybe String) + + + +-- CREATE + + +decoder : Decoder Avatar +decoder = + Decode.map Avatar (Decode.nullable Decode.string) + + + +-- TRANSFORM + + +encode : Avatar -> Value +encode (Avatar maybeUrl) = + case maybeUrl of + Just url -> + Encode.string url + + Nothing -> + Encode.null + + +src : Avatar -> Attribute msg +src (Avatar maybeUrl) = + case maybeUrl of + Nothing -> + Asset.src Asset.defaultAvatar + + Just "" -> + Asset.src Asset.defaultAvatar + + Just url -> + Html.Attributes.src url + + +toMaybeString : Avatar -> Maybe String +toMaybeString (Avatar maybeUrl) = + maybeUrl diff --git a/elm-deprecated/src/Email.elm b/elm-deprecated/src/Email.elm index 0181842..61cb415 100644 --- a/elm-deprecated/src/Email.elm +++ b/elm-deprecated/src/Email.elm @@ -1,38 +1,38 @@ -module Email exposing (Email, decoder, encode, toString) - -import Json.Decode as Decode exposing (Decoder) -import Json.Encode as Encode exposing (Value) - - -{-| An email address. -Having this as a custom type that's separate from String makes certain -mistakes impossible. Consider this function: -updateEmailAddress : Email -> String -> Http.Request -updateEmailAddress email password = ... -(The server needs your password to confirm that you should be allowed -to update the email address.) -Because Email is not a type alias for String, but is instead a separate -custom type, it is now impossible to mix up the argument order of the -email and the password. If we do, it won't compile! -If Email were instead defined as `type alias Email = String`, we could -call updateEmailAddress password email and it would compile (and never -work properly). -This way, we make it impossible for a bug like that to compile! --} -type Email - = Email String - - -toString : Email -> String -toString (Email str) = - str - - -encode : Email -> Value -encode (Email str) = - Encode.string str - - -decoder : Decoder Email -decoder = - Decode.map Email Decode.string +module Email exposing (Email, decoder, encode, toString) + +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode exposing (Value) + + +{-| An email address. +Having this as a custom type that's separate from String makes certain +mistakes impossible. Consider this function: +updateEmailAddress : Email -> String -> Http.Request +updateEmailAddress email password = ... +(The server needs your password to confirm that you should be allowed +to update the email address.) +Because Email is not a type alias for String, but is instead a separate +custom type, it is now impossible to mix up the argument order of the +email and the password. If we do, it won't compile! +If Email were instead defined as `type alias Email = String`, we could +call updateEmailAddress password email and it would compile (and never +work properly). +This way, we make it impossible for a bug like that to compile! +-} +type Email + = Email String + + +toString : Email -> String +toString (Email str) = + str + + +encode : Email -> Value +encode (Email str) = + Encode.string str + + +decoder : Decoder Email +decoder = + Decode.map Email Decode.string diff --git a/elm-deprecated/src/NavRow.elm b/elm-deprecated/src/NavRow.elm index 9edcd2d..dda9b2d 100644 --- a/elm-deprecated/src/NavRow.elm +++ b/elm-deprecated/src/NavRow.elm @@ -1,57 +1,57 @@ -module NavRow exposing (..) - -import CommonElements exposing (..) -import Element exposing (..) -import Element.Region as Region -import Model exposing (..) -import Request exposing (..) -import Url - - -getNavRow : Model -> Element Msg -getNavRow model = - row - [ Region.navigation - - --, explain Debug.todo - , paddingXY 10 5 - , spacing 10 - , width fill - ] - [ namedLink "/" "TODOAPP" - , getDebugInfo model - , getCurrentUser model - ] - - - --- temp function to get current page url --- and links in case shit breaks - - -getDebugInfo : Model -> Element Msg -getDebugInfo model = - row - [ centerX ] - [ text "Current URL: " - , bolded (Url.toString model.url) - , column [] - [ namedLink "/" "root" - , namedLink "/login" "login" - , namedLink "/signup" "signup" - , namedLink "/account" "account" - , namedLink "/about" "about" - ] - ] - - -getCurrentUser : Model -> Element Msg -getCurrentUser model = - el [] - (case model.user of - Just user -> - namedLink "/account" user.email - - _ -> - namedLink "/login" "Log In" - ) +module NavRow exposing (..) + +import CommonElements exposing (..) +import Element exposing (..) +import Element.Region as Region +import Model exposing (..) +import Request exposing (..) +import Url + + +getNavRow : Model -> Element Msg +getNavRow model = + row + [ Region.navigation + + --, explain Debug.todo + , paddingXY 10 5 + , spacing 10 + , width fill + ] + [ namedLink "/" "TODOAPP" + , getDebugInfo model + , getCurrentUser model + ] + + + +-- temp function to get current page url +-- and links in case shit breaks + + +getDebugInfo : Model -> Element Msg +getDebugInfo model = + row + [ centerX ] + [ text "Current URL: " + , bolded (Url.toString model.url) + , column [] + [ namedLink "/" "root" + , namedLink "/login" "login" + , namedLink "/signup" "signup" + , namedLink "/account" "account" + , namedLink "/about" "about" + ] + ] + + +getCurrentUser : Model -> Element Msg +getCurrentUser model = + el [] + (case model.user of + Just user -> + namedLink "/account" user.email + + _ -> + namedLink "/login" "Log In" + ) diff --git a/elm-deprecated/src/PageState.elm b/elm-deprecated/src/PageState.elm index e2982fd..312b757 100644 --- a/elm-deprecated/src/PageState.elm +++ b/elm-deprecated/src/PageState.elm @@ -1,66 +1,66 @@ -module PageState exposing (getMainContent) - -import About as AboutPage -import Account as AccountPage -import Element exposing (..) -import Home as HomePage -import Login as LoginPage -import Model exposing (..) -import Signup as SignupPage -import Url -import Url.Parser as Parser exposing (..) - - -type Route - = About - | Account - | Home - | Login - | Signup - | NotFound - - -getMainContent : Model -> Element Msg -getMainContent model = - el [] - (case consume (toRoute model.url) of - About -> - AboutPage.getPage model - - Account -> - AccountPage.getPage model - - Home -> - HomePage.getPage model - - Login -> - LoginPage.getPage model - - Signup -> - SignupPage.getPage model - - _ -> - text "Page not found." - ) - - -routeParser : Parser (Route -> a) a -routeParser = - oneOf - [ Parser.map Home top - , Parser.map Account (s "account") - , Parser.map About (s "about") - , Parser.map Login (s "login") - , Parser.map Signup (s "signup") - ] - - -toRoute : Url.Url -> Maybe Route -toRoute url = - { url | path = Maybe.withDefault "" url.fragment, fragment = Nothing } - |> Parser.parse routeParser - - -consume : Maybe Route -> Route -consume route = - Maybe.withDefault NotFound route +module PageState exposing (getMainContent) + +import About as AboutPage +import Account as AccountPage +import Element exposing (..) +import Home as HomePage +import Login as LoginPage +import Model exposing (..) +import Signup as SignupPage +import Url +import Url.Parser as Parser exposing (..) + + +type Route + = About + | Account + | Home + | Login + | Signup + | NotFound + + +getMainContent : Model -> Element Msg +getMainContent model = + el [] + (case consume (toRoute model.url) of + About -> + AboutPage.getPage model + + Account -> + AccountPage.getPage model + + Home -> + HomePage.getPage model + + Login -> + LoginPage.getPage model + + Signup -> + SignupPage.getPage model + + _ -> + text "Page not found." + ) + + +routeParser : Parser (Route -> a) a +routeParser = + oneOf + [ Parser.map Home top + , Parser.map Account (s "account") + , Parser.map About (s "about") + , Parser.map Login (s "login") + , Parser.map Signup (s "signup") + ] + + +toRoute : Url.Url -> Maybe Route +toRoute url = + { url | path = Maybe.withDefault "" url.fragment, fragment = Nothing } + |> Parser.parse routeParser + + +consume : Maybe Route -> Route +consume route = + Maybe.withDefault NotFound route diff --git a/elm-deprecated/src/Route.elm b/elm-deprecated/src/Route.elm index 484d8a9..c41448e 100644 --- a/elm-deprecated/src/Route.elm +++ b/elm-deprecated/src/Route.elm @@ -1,98 +1,98 @@ -module Route exposing (Route(..), fromUrl, href, replaceUrl) - -import Browser.Navigation as Nav -import Html exposing (Attribute) -import Html.Attributes as Attr -import Todo.UUID as UUID -import Url exposing (Url) -import Url.Parser as Parser exposing ((), Parser, oneOf, s, string) -import Username exposing (Username) - - - --- ROUTING - - -type Route - = Home - | Login - | Logout - | Signup - | Account - | Todo UUID.UUID - | NewTodo - | EditTodo UUID.UUID - - -parser : Parser (Route -> a) a -parser = - oneOf - [ Parser.map Home Parser.top - , Parser.map Login (s "login") - , Parser.map Logout (s "logout") - , Parser.map Account (s "account") - , Parser.map Signup (s "signup") - , Parser.map Todo (s "article" UUID.urlParser) - , Parser.map NewTodo (s "editor") - , Parser.map EditTodo (s "editor" UUID.urlParser) - ] - - - --- PUBLIC HELPERS - - -href : Route -> Attribute msg -href targetRoute = - Attr.href (routeToString targetRoute) - - -replaceUrl : Nav.Key -> Route -> Cmd msg -replaceUrl key route = - Nav.replaceUrl key (routeToString route) - - -fromUrl : Url -> Maybe Route -fromUrl url = - -- The RealWorld spec treats the fragment like a path. - -- This makes it *literally* the path, so we can proceed - -- with parsing as if it had been a normal path all along. - { url | path = Maybe.withDefault "" url.fragment, fragment = Nothing } - |> Parser.parse parser - - - --- INTERNAL - - -routeToString : Route -> String -routeToString page = - "#/" ++ String.join "/" (routeToPieces page) - - -routeToPieces : Route -> List String -routeToPieces page = - case page of - Home -> - [] - - Login -> - [ "login" ] - - Logout -> - [ "logout" ] - - Signup -> - [ "Signup" ] - - Account -> - [ "account" ] - - Todo uuid -> - [ "article", UUID.toString uuid ] - - NewTodo -> - [ "editor" ] - - EditTodo uuid -> - [ "editor", UUID.toString uuid ] +module Route exposing (Route(..), fromUrl, href, replaceUrl) + +import Browser.Navigation as Nav +import Html exposing (Attribute) +import Html.Attributes as Attr +import Todo.UUID as UUID +import Url exposing (Url) +import Url.Parser as Parser exposing ((), Parser, oneOf, s, string) +import Username exposing (Username) + + + +-- ROUTING + + +type Route + = Home + | Login + | Logout + | Signup + | Account + | Todo UUID.UUID + | NewTodo + | EditTodo UUID.UUID + + +parser : Parser (Route -> a) a +parser = + oneOf + [ Parser.map Home Parser.top + , Parser.map Login (s "login") + , Parser.map Logout (s "logout") + , Parser.map Account (s "account") + , Parser.map Signup (s "signup") + , Parser.map Todo (s "article" UUID.urlParser) + , Parser.map NewTodo (s "editor") + , Parser.map EditTodo (s "editor" UUID.urlParser) + ] + + + +-- PUBLIC HELPERS + + +href : Route -> Attribute msg +href targetRoute = + Attr.href (routeToString targetRoute) + + +replaceUrl : Nav.Key -> Route -> Cmd msg +replaceUrl key route = + Nav.replaceUrl key (routeToString route) + + +fromUrl : Url -> Maybe Route +fromUrl url = + -- The RealWorld spec treats the fragment like a path. + -- This makes it *literally* the path, so we can proceed + -- with parsing as if it had been a normal path all along. + { url | path = Maybe.withDefault "" url.fragment, fragment = Nothing } + |> Parser.parse parser + + + +-- INTERNAL + + +routeToString : Route -> String +routeToString page = + "#/" ++ String.join "/" (routeToPieces page) + + +routeToPieces : Route -> List String +routeToPieces page = + case page of + Home -> + [] + + Login -> + [ "login" ] + + Logout -> + [ "logout" ] + + Signup -> + [ "Signup" ] + + Account -> + [ "account" ] + + Todo uuid -> + [ "article", UUID.toString uuid ] + + NewTodo -> + [ "editor" ] + + EditTodo uuid -> + [ "editor", UUID.toString uuid ] diff --git a/elm-deprecated/src/Session.elm b/elm-deprecated/src/Session.elm index 2a8e994..5907308 100644 --- a/elm-deprecated/src/Session.elm +++ b/elm-deprecated/src/Session.elm @@ -1,75 +1,75 @@ -module Session exposing (Session, changes, cred, fromViewer, navKey, viewer) - -import Api exposing (Cred) -import Avatar exposing (Avatar) -import Browser.Navigation as Nav -import Json.Decode as Decode exposing (Decoder) -import Json.Encode as Encode exposing (Value) -import Profile exposing (Profile) -import Time -import Viewer exposing (Viewer) - - - --- TYPES - - -type Session - = LoggedIn Nav.Key Viewer - | Guest Nav.Key - - - --- INFO - - -viewer : Session -> Maybe Viewer -viewer session = - case session of - LoggedIn _ val -> - Just val - - Guest _ -> - Nothing - - -cred : Session -> Maybe Cred -cred session = - case session of - LoggedIn _ val -> - Just (Viewer.cred val) - - Guest _ -> - Nothing - - -navKey : Session -> Nav.Key -navKey session = - case session of - LoggedIn key _ -> - key - - Guest key -> - key - - - --- CHANGES - - -changes : (Session -> msg) -> Nav.Key -> Sub msg -changes toMsg key = - Api.viewerChanges (\maybeViewer -> toMsg (fromViewer key maybeViewer)) Viewer.decoder - - -fromViewer : Nav.Key -> Maybe Viewer -> Session -fromViewer key maybeViewer = - -- It's stored in localStorage as a JSON String; - -- first decode the Value as a String, then - -- decode that String as JSON. - case maybeViewer of - Just viewerVal -> - LoggedIn key viewerVal - - Nothing -> - Guest key +module Session exposing (Session, changes, cred, fromViewer, navKey, viewer) + +import Api exposing (Cred) +import Avatar exposing (Avatar) +import Browser.Navigation as Nav +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode exposing (Value) +import Profile exposing (Profile) +import Time +import Viewer exposing (Viewer) + + + +-- TYPES + + +type Session + = LoggedIn Nav.Key Viewer + | Guest Nav.Key + + + +-- INFO + + +viewer : Session -> Maybe Viewer +viewer session = + case session of + LoggedIn _ val -> + Just val + + Guest _ -> + Nothing + + +cred : Session -> Maybe Cred +cred session = + case session of + LoggedIn _ val -> + Just (Viewer.cred val) + + Guest _ -> + Nothing + + +navKey : Session -> Nav.Key +navKey session = + case session of + LoggedIn key _ -> + key + + Guest key -> + key + + + +-- CHANGES + + +changes : (Session -> msg) -> Nav.Key -> Sub msg +changes toMsg key = + Api.viewerChanges (\maybeViewer -> toMsg (fromViewer key maybeViewer)) Viewer.decoder + + +fromViewer : Nav.Key -> Maybe Viewer -> Session +fromViewer key maybeViewer = + -- It's stored in localStorage as a JSON String; + -- first decode the Value as a String, then + -- decode that String as JSON. + case maybeViewer of + Just viewerVal -> + LoggedIn key viewerVal + + Nothing -> + Guest key diff --git a/elm-deprecated/src/Todo.elm b/elm-deprecated/src/Todo.elm index 2e97eef..81edcc6 100644 --- a/elm-deprecated/src/Todo.elm +++ b/elm-deprecated/src/Todo.elm @@ -1,253 +1,253 @@ -module Todo exposing (Full, Preview, Todo, author, body, favorite, favoriteButton, fetch, fromPreview, fullDecoder, mapAuthor, metadata, previewDecoder, unfavorite, unfavoriteButton, uuid) - -{-| The interface to the Todo data structure. -This includes: - - - The Todo type itself - - Ways to make HTTP requests to retrieve and modify Todos - - Ways to access information about an Todo - - Converting between various types - --} - -import Api exposing (Cred) -import Api.Endpoint as Endpoint -import Author exposing (Author) -import Element exposing (..) -import Http -import Iso8601 -import Json.Decode as Decode exposing (Decoder) -import Json.Encode as Encode -import Markdown -import Time -import Todo.Body as Body exposing (Body) -import Todo.Tag as Tag exposing (Tag) -import Todo.UUID exposing (UUID) -import Username as Username exposing (Username) -import Viewer exposing (Viewer) - - - --- TYPES - - -{-| An Todo, optionally with an Todo body. -To see the difference between { extraInfo : a } and { extraInfo : Maybe Body }, -consider the difference between the "view individual Todo" page (which -renders one Todo, including its body) and the "Todo feed" - -which displays multiple Todos, but without bodies. -This definition for `Todo` means we can write: -viewTodo : Todo Full -> Html msg -viewFeed : List (Todo Preview) -> Html msg -This indicates that `viewTodo` requires an Todo _with a `body` present_, -wereas `viewFeed` accepts Todos with no bodies. (We could also have written -it as `List (Todo a)` to specify that feeds can accept either Todos that -have `body` present or not. Either work, given that feeds do not attempt to -read the `body` field from Todos.) -This is an important distinction, because in Request.Todo, the `feed` -function produces `List (Todo Preview)` because the API does not return bodies. -Those Todos are useful to the feed, but not to the individual Todo view. --} -type Todo a - = Todo Internals a - - -{-| Metadata about the Todo - its title, description, and so on. -Importantly, this module's public API exposes a way to read this metadata, but -not to alter it. This is read-only information! -If we find ourselves using any particular piece of metadata often, -for example `title`, we could expose a convenience function like this: -Todo.title : Todo a -> String -If you like, it's totally reasonable to expose a function like that for every one -of these fields! -(Okay, to be completely honest, exposing one function per field is how I prefer -to do it, and that's how I originally wrote this module. However, I'm aware that -this code base has become a common reference point for beginners, and I think it -is _extremely important_ that slapping some "getters and setters" on a record -does not become a habit for anyone who is getting started with Elm. The whole -point of making the Todo type opaque is to create guarantees through -_selectively choosing boundaries_ around it. If you aren't selective about -where those boundaries are, and instead expose a "getter and setter" for every -field in the record, the result is an API with no more guarantees than if you'd -exposed the entire record directly! It is so important to me that beginners not -fall into the terrible "getters and setters" trap that I've exposed this -Metadata record instead of exposing a single function for each of its fields, -as I did originally. This record is not a bad way to do it, by any means, -but if this seems at odds with - now you know why! -) --} -type alias Metadata = - { description : String - , title : String - , tags : List String - , createdAt : Time.Posix - , favorited : Bool - , favoritesCount : Int - } - - -type alias Internals = - { uuid : UUID - , author : Author - , metadata : Metadata - } - - -type Preview - = Preview - - -type Full - = Full Body - - - --- INFO - - -author : Todo a -> Author -author (Todo internals _) = - internals.author - - -metadata : Todo a -> Metadata -metadata (Todo internals _) = - internals.metadata - - -uuid : Todo a -> UUID -uuid (Todo internals _) = - internals.uuid - - -body : Todo Full -> Body -body (Todo _ (Full extraInfo)) = - extraInfo - - - --- TRANSFORM - - -{-| This is the only way you can transform an existing Todo: -you can change its author (e.g. to follow or unfollow them). -All other Todo data necessarily comes from the server! -We can tell this for sure by looking at the types of the exposed functions -in this module. --} -mapAuthor : (Author -> Author) -> Todo a -> Todo a -mapAuthor transform (Todo info extras) = - Todo { info | author = transform info.author } extras - - -fromPreview : Body -> Todo Preview -> Todo Full -fromPreview newBody (Todo info Preview) = - Todo info (Full newBody) - - - --- SERIALIZATION - - -previewDecoder : Maybe Cred -> Decoder (Todo Preview) -previewDecoder maybeCred = - Decode.succeed Todo - |> custom (internalsDecoder maybeCred) - |> hardcoded Preview - - -fullDecoder : Maybe Cred -> Decoder (Todo Full) -fullDecoder maybeCred = - Decode.succeed Todo - |> custom (internalsDecoder maybeCred) - |> required "body" (Decode.map Full Body.decoder) - - -internalsDecoder : Maybe Cred -> Decoder Internals -internalsDecoder maybeCred = - Decode.succeed Internals - |> required "uuid" UUID.decoder - |> required "author" (Author.decoder maybeCred) - |> custom metadataDecoder - - -metadataDecoder : Decoder Metadata -metadataDecoder = - Decode.succeed Metadata - |> required "description" (Decode.map (Maybe.withDefault "") (Decode.nullable Decode.string)) - |> required "title" Decode.string - |> required "tagList" (Decode.list Decode.string) - |> required "createdAt" Iso8601.decoder - |> required "favorited" Decode.bool - |> required "favoritesCount" Decode.int - - - --- SINGLE - - -fetch : Maybe Cred -> UUID -> Http.Request (Todo Full) -fetch maybeCred uuid = - Decode.field "Todo" (fullDecoder maybeCred) - |> Api.get (Endpoint.Todo uuid) maybeCred - - - --- FAVORITE - - -favorite : UUID -> Cred -> Http.Request (Todo Preview) -favorite uuid cred = - Api.post (Endpoint.favorite uuid) (Just cred) Http.emptyBody (faveDecoder cred) - - -unfavorite : UUID -> Cred -> Http.Request (Todo Preview) -unfavorite uuid cred = - Api.delete (Endpoint.favorite uuid) cred Http.emptyBody (faveDecoder cred) - - -faveDecoder : Cred -> Decoder (Todo Preview) -faveDecoder cred = - Decode.field "Todo" (previewDecoder (Just cred)) - - -{-| This is a "build your own element" API. -You pass it some configuration, followed by a `List (Attribute msg)` and a -`List (Html msg)`, just like any standard Html element. --} -favoriteButton : - Cred - -> msg - -> List (Attribute msg) - -> List (Element msg) - -> Element msg -favoriteButton _ msg attrs kids = - toggleFavoriteButton "btn btn-sm btn-outline-primary" msg attrs kids - - -unfavoriteButton : - Cred - -> msg - -> List (Attribute msg) - -> List (Element msg) - -> Element msg -unfavoriteButton _ msg attrs kids = - toggleFavoriteButton "btn btn-sm btn-primary" msg attrs kids - - -toggleFavoriteButton : - String - -> msg - -> List (Attribute msg) - -> List (Element msg) - -> Element msg -toggleFavoriteButton classStr msg attrs kids = - Html.button - (class classStr :: onClickStopPropagation msg :: attrs) - (i [ class "ion-heart" ] [] :: kids) - - -onClickStopPropagation : msg -> Attribute msg -onClickStopPropagation msg = - stopPropagationOn "click" - (Decode.succeed ( msg, True )) +module Todo exposing (Full, Preview, Todo, author, body, favorite, favoriteButton, fetch, fromPreview, fullDecoder, mapAuthor, metadata, previewDecoder, unfavorite, unfavoriteButton, uuid) + +{-| The interface to the Todo data structure. +This includes: + + - The Todo type itself + - Ways to make HTTP requests to retrieve and modify Todos + - Ways to access information about an Todo + - Converting between various types + +-} + +import Api exposing (Cred) +import Api.Endpoint as Endpoint +import Author exposing (Author) +import Element exposing (..) +import Http +import Iso8601 +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode +import Markdown +import Time +import Todo.Body as Body exposing (Body) +import Todo.Tag as Tag exposing (Tag) +import Todo.UUID exposing (UUID) +import Username as Username exposing (Username) +import Viewer exposing (Viewer) + + + +-- TYPES + + +{-| An Todo, optionally with an Todo body. +To see the difference between { extraInfo : a } and { extraInfo : Maybe Body }, +consider the difference between the "view individual Todo" page (which +renders one Todo, including its body) and the "Todo feed" - +which displays multiple Todos, but without bodies. +This definition for `Todo` means we can write: +viewTodo : Todo Full -> Html msg +viewFeed : List (Todo Preview) -> Html msg +This indicates that `viewTodo` requires an Todo _with a `body` present_, +wereas `viewFeed` accepts Todos with no bodies. (We could also have written +it as `List (Todo a)` to specify that feeds can accept either Todos that +have `body` present or not. Either work, given that feeds do not attempt to +read the `body` field from Todos.) +This is an important distinction, because in Request.Todo, the `feed` +function produces `List (Todo Preview)` because the API does not return bodies. +Those Todos are useful to the feed, but not to the individual Todo view. +-} +type Todo a + = Todo Internals a + + +{-| Metadata about the Todo - its title, description, and so on. +Importantly, this module's public API exposes a way to read this metadata, but +not to alter it. This is read-only information! +If we find ourselves using any particular piece of metadata often, +for example `title`, we could expose a convenience function like this: +Todo.title : Todo a -> String +If you like, it's totally reasonable to expose a function like that for every one +of these fields! +(Okay, to be completely honest, exposing one function per field is how I prefer +to do it, and that's how I originally wrote this module. However, I'm aware that +this code base has become a common reference point for beginners, and I think it +is _extremely important_ that slapping some "getters and setters" on a record +does not become a habit for anyone who is getting started with Elm. The whole +point of making the Todo type opaque is to create guarantees through +_selectively choosing boundaries_ around it. If you aren't selective about +where those boundaries are, and instead expose a "getter and setter" for every +field in the record, the result is an API with no more guarantees than if you'd +exposed the entire record directly! It is so important to me that beginners not +fall into the terrible "getters and setters" trap that I've exposed this +Metadata record instead of exposing a single function for each of its fields, +as I did originally. This record is not a bad way to do it, by any means, +but if this seems at odds with - now you know why! +) +-} +type alias Metadata = + { description : String + , title : String + , tags : List String + , createdAt : Time.Posix + , favorited : Bool + , favoritesCount : Int + } + + +type alias Internals = + { uuid : UUID + , author : Author + , metadata : Metadata + } + + +type Preview + = Preview + + +type Full + = Full Body + + + +-- INFO + + +author : Todo a -> Author +author (Todo internals _) = + internals.author + + +metadata : Todo a -> Metadata +metadata (Todo internals _) = + internals.metadata + + +uuid : Todo a -> UUID +uuid (Todo internals _) = + internals.uuid + + +body : Todo Full -> Body +body (Todo _ (Full extraInfo)) = + extraInfo + + + +-- TRANSFORM + + +{-| This is the only way you can transform an existing Todo: +you can change its author (e.g. to follow or unfollow them). +All other Todo data necessarily comes from the server! +We can tell this for sure by looking at the types of the exposed functions +in this module. +-} +mapAuthor : (Author -> Author) -> Todo a -> Todo a +mapAuthor transform (Todo info extras) = + Todo { info | author = transform info.author } extras + + +fromPreview : Body -> Todo Preview -> Todo Full +fromPreview newBody (Todo info Preview) = + Todo info (Full newBody) + + + +-- SERIALIZATION + + +previewDecoder : Maybe Cred -> Decoder (Todo Preview) +previewDecoder maybeCred = + Decode.succeed Todo + |> custom (internalsDecoder maybeCred) + |> hardcoded Preview + + +fullDecoder : Maybe Cred -> Decoder (Todo Full) +fullDecoder maybeCred = + Decode.succeed Todo + |> custom (internalsDecoder maybeCred) + |> required "body" (Decode.map Full Body.decoder) + + +internalsDecoder : Maybe Cred -> Decoder Internals +internalsDecoder maybeCred = + Decode.succeed Internals + |> required "uuid" UUID.decoder + |> required "author" (Author.decoder maybeCred) + |> custom metadataDecoder + + +metadataDecoder : Decoder Metadata +metadataDecoder = + Decode.succeed Metadata + |> required "description" (Decode.map (Maybe.withDefault "") (Decode.nullable Decode.string)) + |> required "title" Decode.string + |> required "tagList" (Decode.list Decode.string) + |> required "createdAt" Iso8601.decoder + |> required "favorited" Decode.bool + |> required "favoritesCount" Decode.int + + + +-- SINGLE + + +fetch : Maybe Cred -> UUID -> Http.Request (Todo Full) +fetch maybeCred uuid = + Decode.field "Todo" (fullDecoder maybeCred) + |> Api.get (Endpoint.Todo uuid) maybeCred + + + +-- FAVORITE + + +favorite : UUID -> Cred -> Http.Request (Todo Preview) +favorite uuid cred = + Api.post (Endpoint.favorite uuid) (Just cred) Http.emptyBody (faveDecoder cred) + + +unfavorite : UUID -> Cred -> Http.Request (Todo Preview) +unfavorite uuid cred = + Api.delete (Endpoint.favorite uuid) cred Http.emptyBody (faveDecoder cred) + + +faveDecoder : Cred -> Decoder (Todo Preview) +faveDecoder cred = + Decode.field "Todo" (previewDecoder (Just cred)) + + +{-| This is a "build your own element" API. +You pass it some configuration, followed by a `List (Attribute msg)` and a +`List (Html msg)`, just like any standard Html element. +-} +favoriteButton : + Cred + -> msg + -> List (Attribute msg) + -> List (Element msg) + -> Element msg +favoriteButton _ msg attrs kids = + toggleFavoriteButton "btn btn-sm btn-outline-primary" msg attrs kids + + +unfavoriteButton : + Cred + -> msg + -> List (Attribute msg) + -> List (Element msg) + -> Element msg +unfavoriteButton _ msg attrs kids = + toggleFavoriteButton "btn btn-sm btn-primary" msg attrs kids + + +toggleFavoriteButton : + String + -> msg + -> List (Attribute msg) + -> List (Element msg) + -> Element msg +toggleFavoriteButton classStr msg attrs kids = + Html.button + (class classStr :: onClickStopPropagation msg :: attrs) + (i [ class "ion-heart" ] [] :: kids) + + +onClickStopPropagation : msg -> Attribute msg +onClickStopPropagation msg = + stopPropagationOn "click" + (Decode.succeed ( msg, True )) diff --git a/elm-deprecated/src/Todo/UUID.elm b/elm-deprecated/src/Todo/UUID.elm index bd200f1..12ca691 100644 --- a/elm-deprecated/src/Todo/UUID.elm +++ b/elm-deprecated/src/Todo/UUID.elm @@ -1,35 +1,35 @@ -module Todo.UUID exposing (UUID, decoder, toString, urlParser) - -import Json.Decode as Decode exposing (Decoder) -import Url.Parser exposing (Parser) - - - --- TYPES - - -type UUID - = UUID String - - - --- CREATE - - -urlParser : Parser (UUID -> a) a -urlParser = - Url.Parser.custom "UUID" (\str -> Just (UUID str)) - - -decoder : Decoder UUID -decoder = - Decode.map UUID Decode.string - - - --- TRANSFORM - - -toString : UUID -> String -toString (UUID str) = - str +module Todo.UUID exposing (UUID, decoder, toString, urlParser) + +import Json.Decode as Decode exposing (Decoder) +import Url.Parser exposing (Parser) + + + +-- TYPES + + +type UUID + = UUID String + + + +-- CREATE + + +urlParser : Parser (UUID -> a) a +urlParser = + Url.Parser.custom "UUID" (\str -> Just (UUID str)) + + +decoder : Decoder UUID +decoder = + Decode.map UUID Decode.string + + + +-- TRANSFORM + + +toString : UUID -> String +toString (UUID str) = + str diff --git a/elm-deprecated/src/Username.elm b/elm-deprecated/src/Username.elm index 781104d..8e80655 100644 --- a/elm-deprecated/src/Username.elm +++ b/elm-deprecated/src/Username.elm @@ -1,47 +1,47 @@ -module Username exposing (Username, decoder, encode, toHtml, toString, urlParser) - -import Element exposing (..) -import Json.Decode as Decode exposing (Decoder) -import Json.Encode as Encode exposing (Value) -import Url.Parser - - - --- TYPES - - -type Username - = Username String - - - --- CREATE - - -decoder : Decoder Username -decoder = - Decode.map Username Decode.string - - - --- TRANSFORM - - -encode : Username -> Value -encode (Username username) = - Encode.string username - - -toString : Username -> String -toString (Username username) = - username - - -urlParser : Url.Parser.Parser (Username -> a) a -urlParser = - Url.Parser.custom "USERNAME" (\str -> Just (Username str)) - - -toHtml : Username -> Element msg -toHtml (Username username) = - text username +module Username exposing (Username, decoder, encode, toHtml, toString, urlParser) + +import Element exposing (..) +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode exposing (Value) +import Url.Parser + + + +-- TYPES + + +type Username + = Username String + + + +-- CREATE + + +decoder : Decoder Username +decoder = + Decode.map Username Decode.string + + + +-- TRANSFORM + + +encode : Username -> Value +encode (Username username) = + Encode.string username + + +toString : Username -> String +toString (Username username) = + username + + +urlParser : Url.Parser.Parser (Username -> a) a +urlParser = + Url.Parser.custom "USERNAME" (\str -> Just (Username str)) + + +toHtml : Username -> Element msg +toHtml (Username username) = + text username diff --git a/elm-deprecated/src/Viewer.elm b/elm-deprecated/src/Viewer.elm index 58ec005..2a88b3e 100644 --- a/elm-deprecated/src/Viewer.elm +++ b/elm-deprecated/src/Viewer.elm @@ -1,66 +1,66 @@ -module Viewer exposing (Viewer, avatar, cred, decoder, minPasswordChars, store, username) - -{-| The logged-in user currently viewing this page. It stores enough data to -be able to render the menu bar (username and avatar), along with Cred so it's -impossible to have a Viewer if you aren't logged in. --} - -import Api exposing (Cred) -import Avatar exposing (Avatar) -import Email exposing (Email) -import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (custom, required) -import Json.Encode as Encode exposing (Value) -import Profile exposing (Profile) -import Username exposing (Username) - - - --- TYPES - - -type Viewer - = Viewer Avatar Cred - - - --- INFO - - -cred : Viewer -> Cred -cred (Viewer _ val) = - val - - -username : Viewer -> Username -username (Viewer _ val) = - Api.username val - - -avatar : Viewer -> Avatar -avatar (Viewer val _) = - val - - -{-| Passwords must be at least this many characters long! --} -minPasswordChars : Int -minPasswordChars = - 6 - - - --- SERIALIZATION - - -decoder : Decoder (Cred -> Viewer) -decoder = - Decode.succeed Viewer - |> custom (Decode.field "image" Avatar.decoder) - - -store : Viewer -> Cmd msg -store (Viewer avatarVal credVal) = - Api.storeCredWith - credVal - avatarVal +module Viewer exposing (Viewer, avatar, cred, decoder, minPasswordChars, store, username) + +{-| The logged-in user currently viewing this page. It stores enough data to +be able to render the menu bar (username and avatar), along with Cred so it's +impossible to have a Viewer if you aren't logged in. +-} + +import Api exposing (Cred) +import Avatar exposing (Avatar) +import Email exposing (Email) +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (custom, required) +import Json.Encode as Encode exposing (Value) +import Profile exposing (Profile) +import Username exposing (Username) + + + +-- TYPES + + +type Viewer + = Viewer Avatar Cred + + + +-- INFO + + +cred : Viewer -> Cred +cred (Viewer _ val) = + val + + +username : Viewer -> Username +username (Viewer _ val) = + Api.username val + + +avatar : Viewer -> Avatar +avatar (Viewer val _) = + val + + +{-| Passwords must be at least this many characters long! +-} +minPasswordChars : Int +minPasswordChars = + 6 + + + +-- SERIALIZATION + + +decoder : Decoder (Cred -> Viewer) +decoder = + Decode.succeed Viewer + |> custom (Decode.field "image" Avatar.decoder) + + +store : Viewer -> Cmd msg +store (Viewer avatarVal credVal) = + Api.storeCredWith + credVal + avatarVal diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..20fccdd --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,30 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..02695bc --- /dev/null +++ b/frontend/README.md @@ -0,0 +1 @@ +This is a starter template for [Learn Next.js](https://nextjs.org/learn). \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..37fbb02 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2066 @@ +{ + "name": "learn-starter", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@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/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@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/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" + } + }, + "@hapi/accept": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", + "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.2.tgz", + "integrity": "sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" + }, + "@next/env": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-10.2.3.tgz", + "integrity": "sha512-uBOjRBjsWC4C8X3DfmWWP6ekwLnf2JCCwQX9KVnJtJkqfDsv1yQPakdOEwvJzXQc3JC/v5KKffYPVmV2wHXCgQ==" + }, + "@next/polyfill-module": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-10.2.3.tgz", + "integrity": "sha512-OkeY4cLhzfYbXxM4fd+6V4s5pTPuyfKSlavItfNRA6PpS7t1/R6YjO7S7rB8tu1pbTGuDHGIdE1ioDv15bAbDQ==" + }, + "@next/react-dev-overlay": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-10.2.3.tgz", + "integrity": "sha512-E6g2jws4YW94l0lMMopBVKIZK2mEHfSBvM0d9dmzKG9L/A/kEq6LZCB4SiwGJbNsAdlk2y3USDa0oNbpA+m5Kw==", + "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.2.3", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.2.3.tgz", + "integrity": "sha512-qtBF56vPC6d6a8p7LYd0iRjW89fhY80kAIzmj+VonvIGjK/nymBjcFUhbKiMFqlhsarCksnhwX+Zmn95Dw9qvA==" + }, + "@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==" + }, + "@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + }, + "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==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "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.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "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-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==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001237", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz", + "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==" + }, + "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" + } + }, + "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==" + }, + "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=" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "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==" + } + } + }, + "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=" + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "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" + } + }, + "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.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": "2.0.0", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-2.0.0.tgz", + "integrity": "sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg==", + "requires": { + "caniuse-lite": "^1.0.30001202" + } + }, + "cssnano-simple": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-2.0.0.tgz", + "integrity": "sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w==", + "requires": { + "cssnano-preset-simple": "^2.0.0" + } + }, + "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": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "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" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "domain-browser": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", + "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" + }, + "electron-to-chromium": { + "version": "1.3.752", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", + "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==" + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, + "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=" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "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" + } + }, + "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" + } + }, + "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-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" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-orientation": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz", + "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==", + "requires": { + "stream-parser": "^0.3.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "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==" + }, + "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-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "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==" + }, + "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" + } + }, + "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=" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "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-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + }, + "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-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jest-worker": { + "version": "27.0.0-next.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz", + "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.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==" + }, + "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" + } + }, + "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.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "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==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + }, + "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.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-10.2.3.tgz", + "integrity": "sha512-dkM1mIfnORtGyzw/Yme8RdqNxlCMZyi4Lqj56F01/yHbe1ZtOaJ0cyqqRB4RGiPhjGGh0319f8ddjDyO1605Ow==", + "requires": { + "@babel/runtime": "7.12.5", + "@hapi/accept": "5.0.2", + "@next/env": "10.2.3", + "@next/polyfill-module": "10.2.3", + "@next/react-dev-overlay": "10.2.3", + "@next/react-refresh-utils": "10.2.3", + "@opentelemetry/api": "0.14.0", + "assert": "2.0.0", + "ast-types": "0.13.2", + "browserify-zlib": "0.2.0", + "browserslist": "4.16.6", + "buffer": "5.6.0", + "caniuse-lite": "^1.0.30001228", + "chalk": "2.4.2", + "chokidar": "3.5.1", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "cssnano-simple": "2.0.0", + "domain-browser": "4.19.0", + "encoding": "0.1.13", + "etag": "1.8.1", + "find-cache-dir": "3.3.1", + "get-orientation": "1.1.2", + "https-browserify": "1.0.0", + "jest-worker": "27.0.0-next.5", + "native-url": "0.3.4", + "node-fetch": "2.6.1", + "node-html-parser": "1.4.9", + "node-libs-browser": "^2.2.1", + "os-browserify": "0.3.0", + "p-limit": "3.1.0", + "path-browserify": "1.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "8.2.13", + "process": "0.11.10", + "prop-types": "15.7.2", + "querystring-es3": "0.2.1", + "raw-body": "2.4.1", + "react-is": "16.13.1", + "react-refresh": "0.8.3", + "stream-browserify": "3.0.0", + "stream-http": "3.1.1", + "string_decoder": "1.3.0", + "styled-jsx": "3.3.2", + "timers-browserify": "2.0.12", + "tty-browserify": "0.0.1", + "use-subscription": "1.5.1", + "util": "0.12.3", + "vm-browserify": "1.1.2", + "watchpack": "2.1.1" + } + }, + "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": { + "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": { + "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" + } + } + } + }, + "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" + } + }, + "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==" + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "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==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "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" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "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=" + } + } + } + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.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==" + }, + "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" + } + }, + "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==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "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.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "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" + } + }, + "postcss": { + "version": "8.2.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.13.tgz", + "integrity": "sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==", + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.22", + "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==" + } + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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-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-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==" + }, + "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==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "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==" + }, + "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" + } + }, + "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==" + }, + "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" + } + }, + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", + "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "requires": { + "debug": "2" + } + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "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==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "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=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + } + } + }, + "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.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "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==" + }, + "watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "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-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "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/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..d693cc2 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,15 @@ +{ + "name": "todo", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "next": "^10.0.0", + "react": "17.0.1", + "react-dom": "17.0.1" + } +} \ No newline at end of file diff --git a/frontend/pages/index.js b/frontend/pages/index.js new file mode 100644 index 0000000..0443431 --- /dev/null +++ b/frontend/pages/index.js @@ -0,0 +1,209 @@ +import Head from 'next/head' + +export default function Home() { + return ( +
+ + Create Next App + + + +
+

+ Welcome to Next.js! +

+ +

+ Get started by editing pages/index.js +

+ + +
+ + + + + + +
+ ) +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..9d92fb0 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,1889 @@ +dependencies: + next: 10.2.3_react-dom@17.0.1+react@17.0.1 + react: 17.0.1 + react-dom: 17.0.1_react@17.0.1 +lockfileVersion: 5.2 +packages: + /@babel/code-frame/7.12.11: + dependencies: + '@babel/highlight': 7.14.5 + dev: false + resolution: + integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + /@babel/helper-validator-identifier/7.14.5: + dev: false + engines: + node: '>=6.9.0' + resolution: + integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + /@babel/highlight/7.14.5: + dependencies: + '@babel/helper-validator-identifier': 7.14.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + engines: + node: '>=6.9.0' + resolution: + integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + /@babel/runtime/7.12.5: + dependencies: + regenerator-runtime: 0.13.7 + dev: false + resolution: + integrity: sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + /@babel/types/7.8.3: + dependencies: + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 2.0.0 + dev: false + resolution: + integrity: sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + /@hapi/accept/5.0.2: + dependencies: + '@hapi/boom': 9.1.2 + '@hapi/hoek': 9.2.0 + dev: false + resolution: + integrity: sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== + /@hapi/boom/9.1.2: + dependencies: + '@hapi/hoek': 9.2.0 + dev: false + resolution: + integrity: sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q== + /@hapi/hoek/9.2.0: + dev: false + resolution: + integrity: sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== + /@next/env/10.2.3: + dev: false + resolution: + integrity: sha512-uBOjRBjsWC4C8X3DfmWWP6ekwLnf2JCCwQX9KVnJtJkqfDsv1yQPakdOEwvJzXQc3JC/v5KKffYPVmV2wHXCgQ== + /@next/polyfill-module/10.2.3: + dev: false + resolution: + integrity: sha512-OkeY4cLhzfYbXxM4fd+6V4s5pTPuyfKSlavItfNRA6PpS7t1/R6YjO7S7rB8tu1pbTGuDHGIdE1ioDv15bAbDQ== + /@next/react-dev-overlay/10.2.3_react-dom@17.0.1+react@17.0.1: + 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 + react: 17.0.1 + react-dom: 17.0.1_react@17.0.1 + shell-quote: 1.7.2 + source-map: 0.8.0-beta.0 + stacktrace-parser: 0.1.10 + strip-ansi: 6.0.0 + dev: false + peerDependencies: + react: ^16.9.0 || ^17 + react-dom: ^16.9.0 || ^17 + resolution: + integrity: sha512-E6g2jws4YW94l0lMMopBVKIZK2mEHfSBvM0d9dmzKG9L/A/kEq6LZCB4SiwGJbNsAdlk2y3USDa0oNbpA+m5Kw== + /@next/react-refresh-utils/10.2.3_react-refresh@0.8.3: + dependencies: + react-refresh: 0.8.3 + dev: false + peerDependencies: + react-refresh: 0.8.3 + webpack: ^4 || ^5 + peerDependenciesMeta: + webpack: + optional: true + resolution: + integrity: sha512-qtBF56vPC6d6a8p7LYd0iRjW89fhY80kAIzmj+VonvIGjK/nymBjcFUhbKiMFqlhsarCksnhwX+Zmn95Dw9qvA== + /@opentelemetry/api/0.14.0: + dependencies: + '@opentelemetry/context-base': 0.14.0 + dev: false + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== + /@opentelemetry/context-base/0.14.0: + dev: false + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== + /@types/node/15.12.2: + dev: false + resolution: + integrity: sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== + /anser/1.4.9: + dev: false + resolution: + integrity: sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + /ansi-regex/5.0.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /ansi-styles/4.3.0: + dependencies: + color-convert: 2.0.1 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + /anymatch/3.1.2: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.0 + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + /asn1.js/5.4.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + /assert/1.5.0: + dependencies: + object-assign: 4.1.1 + util: 0.10.3 + dev: false + resolution: + integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + /assert/2.0.0: + dependencies: + es6-object-assign: 1.1.0 + is-nan: 1.3.2 + object-is: 1.1.5 + util: 0.12.3 + dev: false + resolution: + integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + /ast-types/0.13.2: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + /available-typed-arrays/1.0.4: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA== + /babel-plugin-syntax-jsx/6.18.0: + dev: false + resolution: + integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= + /base64-js/1.5.1: + dev: false + resolution: + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + /big.js/5.2.2: + dev: false + resolution: + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + /binary-extensions/2.2.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + /bn.js/4.12.0: + dev: false + resolution: + integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + /bn.js/5.2.0: + dev: false + resolution: + integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + /braces/3.0.2: + dependencies: + fill-range: 7.0.1 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + /brorand/1.1.0: + dev: false + resolution: + integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + /browserify-aes/1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + /browserify-cipher/1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: false + resolution: + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + /browserify-des/1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + /browserify-rsa/4.1.0: + dependencies: + bn.js: 5.2.0 + randombytes: 2.1.0 + dev: false + resolution: + integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + /browserify-sign/4.2.1: + dependencies: + bn.js: 5.2.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + /browserify-zlib/0.2.0: + dependencies: + pako: 1.0.11 + dev: false + resolution: + integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + /browserslist/4.16.6: + dependencies: + caniuse-lite: 1.0.30001237 + colorette: 1.2.2 + electron-to-chromium: 1.3.752 + escalade: 3.1.1 + node-releases: 1.1.73 + dev: false + engines: + node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 + hasBin: true + resolution: + integrity: sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + /buffer-xor/1.0.3: + dev: false + resolution: + integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + /buffer/4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: false + resolution: + integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + /buffer/5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + resolution: + integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + /builtin-status-codes/3.0.0: + dev: false + resolution: + integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + /bytes/3.1.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /call-bind/1.0.2: + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + resolution: + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + /caniuse-lite/1.0.30001237: + dev: false + resolution: + integrity: sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chalk/4.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + /chokidar/3.5.1: + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.5.0 + dev: false + engines: + node: '>= 8.10.0' + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + /cipher-base/1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + /classnames/2.2.6: + dev: false + resolution: + integrity: sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + dev: false + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-convert/2.0.1: + dependencies: + color-name: 1.1.4 + dev: false + engines: + node: '>=7.0.0' + resolution: + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + /color-name/1.1.3: + dev: false + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /color-name/1.1.4: + dev: false + resolution: + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + /colorette/1.2.2: + dev: false + resolution: + integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + /commondir/1.0.1: + dev: false + resolution: + integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + /console-browserify/1.2.0: + dev: false + resolution: + integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + /constants-browserify/1.0.0: + dev: false + resolution: + integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + /convert-source-map/1.7.0: + dependencies: + safe-buffer: 5.1.2 + dev: false + resolution: + integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + /core-util-is/1.0.2: + dev: false + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /create-ecdh/4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: false + resolution: + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + /create-hash/1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: false + resolution: + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + /create-hmac/1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + resolution: + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + /crypto-browserify/3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: false + resolution: + integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + /css.escape/1.5.1: + dev: false + resolution: + integrity: sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + /cssnano-preset-simple/2.0.0_postcss@8.2.13: + dependencies: + caniuse-lite: 1.0.30001237 + postcss: 8.2.13 + dev: false + peerDependencies: + postcss: ^8.2.1 + resolution: + integrity: sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg== + /cssnano-simple/2.0.0_postcss@8.2.13: + dependencies: + cssnano-preset-simple: 2.0.0_postcss@8.2.13 + postcss: 8.2.13 + dev: false + peerDependencies: + postcss: ^8.2.2 + resolution: + integrity: sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w== + /data-uri-to-buffer/3.0.1: + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + /debug/2.6.9: + dependencies: + ms: 2.0.0 + dev: false + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /define-properties/1.1.3: + dependencies: + object-keys: 1.1.1 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + /depd/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /des.js/1.0.1: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + resolution: + integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + /diffie-hellman/5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: false + resolution: + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + /domain-browser/1.2.0: + dev: false + engines: + node: '>=0.4' + npm: '>=1.2' + resolution: + integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + /domain-browser/4.19.0: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + /electron-to-chromium/1.3.752: + dev: false + resolution: + integrity: sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== + /elliptic/6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + resolution: + integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + /emojis-list/2.1.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + /encoding/0.1.13: + dependencies: + iconv-lite: 0.6.3 + dev: false + resolution: + integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + /es-abstract/1.18.3: + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + is-callable: 1.2.3 + is-negative-zero: 2.0.1 + is-regex: 1.1.3 + is-string: 1.0.6 + object-inspect: 1.10.3 + object-keys: 1.1.1 + object.assign: 4.1.2 + string.prototype.trimend: 1.0.4 + string.prototype.trimstart: 1.0.4 + unbox-primitive: 1.0.1 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + /es-to-primitive/1.2.1: + dependencies: + is-callable: 1.2.3 + is-date-object: 1.0.4 + is-symbol: 1.0.4 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + /es6-object-assign/1.1.0: + dev: false + resolution: + integrity: sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + /escalade/3.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + /escape-string-regexp/1.0.5: + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /esutils/2.0.3: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + /etag/1.8.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + /events/3.3.0: + dev: false + engines: + node: '>=0.8.x' + resolution: + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + /evp_bytestokey/1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + /fill-range/7.0.1: + dependencies: + to-regex-range: 5.0.1 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + /find-cache-dir/3.3.1: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + /find-up/4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + /foreach/2.0.5: + dev: false + resolution: + integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k= + /fsevents/2.3.2: + dev: false + engines: + node: ^8.16.0 || ^10.6.0 || >=11.0.0 + optional: true + os: + - darwin + resolution: + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + /function-bind/1.1.1: + dev: false + resolution: + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /get-intrinsic/1.1.1: + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: false + resolution: + integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + /get-orientation/1.1.2: + dependencies: + stream-parser: 0.3.1 + dev: false + resolution: + integrity: sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + /glob-parent/5.1.2: + dependencies: + is-glob: 4.0.1 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + /glob-to-regexp/0.4.1: + dev: false + resolution: + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + /graceful-fs/4.2.6: + dev: false + resolution: + integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + /has-bigints/1.0.1: + dev: false + resolution: + integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + /has-flag/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-flag/4.0.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + /has-symbols/1.0.2: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + /has/1.0.3: + dependencies: + function-bind: 1.1.1 + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + /hash-base/3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + /hash.js/1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + resolution: + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + /he/1.2.0: + dev: false + hasBin: true + resolution: + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + /hmac-drbg/1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + resolution: + integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + /http-errors/1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + /https-browserify/1.0.0: + dev: false + resolution: + integrity: sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /iconv-lite/0.6.3: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + /ieee754/1.2.1: + dev: false + resolution: + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + /inherits/2.0.1: + dev: false + resolution: + integrity: sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + /inherits/2.0.3: + dev: false + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /inherits/2.0.4: + dev: false + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /is-arguments/1.1.0: + dependencies: + call-bind: 1.0.2 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + /is-bigint/1.0.2: + dev: false + resolution: + integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + /is-binary-path/2.1.0: + dependencies: + binary-extensions: 2.2.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + /is-boolean-object/1.1.1: + dependencies: + call-bind: 1.0.2 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + /is-callable/1.2.3: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + /is-date-object/1.0.4: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + /is-extglob/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + /is-generator-function/1.0.9: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A== + /is-glob/4.0.1: + dependencies: + is-extglob: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + /is-nan/1.3.2: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + /is-negative-zero/2.0.1: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + /is-number-object/1.0.5: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + /is-number/7.0.0: + dev: false + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + /is-regex/1.1.3: + dependencies: + call-bind: 1.0.2 + has-symbols: 1.0.2 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + /is-string/1.0.6: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + /is-symbol/1.0.4: + dependencies: + has-symbols: 1.0.2 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + /is-typed-array/1.1.5: + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + has-symbols: 1.0.2 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== + /isarray/1.0.0: + dev: false + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /jest-worker/27.0.0-next.5: + dependencies: + '@types/node': 15.12.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false + engines: + node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 + resolution: + integrity: sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== + /js-tokens/4.0.0: + dev: false + resolution: + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + /json5/1.0.1: + dependencies: + minimist: 1.2.5 + dev: false + hasBin: true + resolution: + integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + /loader-utils/1.2.3: + dependencies: + big.js: 5.2.2 + emojis-list: 2.1.0 + json5: 1.0.1 + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + /locate-path/5.0.0: + dependencies: + p-locate: 4.1.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + /lodash.sortby/4.7.0: + dev: false + resolution: + integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + /lodash/4.17.21: + dev: false + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + /loose-envify/1.4.0: + dependencies: + js-tokens: 4.0.0 + dev: false + hasBin: true + resolution: + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + /make-dir/3.1.0: + dependencies: + semver: 6.3.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + /md5.js/1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + /merge-stream/2.0.0: + dev: false + resolution: + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + /miller-rabin/4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: false + hasBin: true + resolution: + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + /minimalistic-assert/1.0.1: + dev: false + resolution: + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + /minimalistic-crypto-utils/1.0.1: + dev: false + resolution: + integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + /minimist/1.2.5: + dev: false + resolution: + integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + /ms/2.0.0: + dev: false + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /nanoid/3.1.23: + dev: false + engines: + node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 + hasBin: true + resolution: + integrity: sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + /native-url/0.3.4: + dependencies: + querystring: 0.2.1 + dev: false + resolution: + integrity: sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + /next/10.2.3_react-dom@17.0.1+react@17.0.1: + dependencies: + '@babel/runtime': 7.12.5 + '@hapi/accept': 5.0.2 + '@next/env': 10.2.3 + '@next/polyfill-module': 10.2.3 + '@next/react-dev-overlay': 10.2.3_react-dom@17.0.1+react@17.0.1 + '@next/react-refresh-utils': 10.2.3_react-refresh@0.8.3 + '@opentelemetry/api': 0.14.0 + assert: 2.0.0 + ast-types: 0.13.2 + browserify-zlib: 0.2.0 + browserslist: 4.16.6 + buffer: 5.6.0 + caniuse-lite: 1.0.30001237 + chalk: 2.4.2 + chokidar: 3.5.1 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + cssnano-simple: 2.0.0_postcss@8.2.13 + domain-browser: 4.19.0 + encoding: 0.1.13 + etag: 1.8.1 + find-cache-dir: 3.3.1 + get-orientation: 1.1.2 + https-browserify: 1.0.0 + jest-worker: 27.0.0-next.5 + native-url: 0.3.4 + node-fetch: 2.6.1 + node-html-parser: 1.4.9 + node-libs-browser: 2.2.1 + os-browserify: 0.3.0 + p-limit: 3.1.0 + path-browserify: 1.0.1 + pnp-webpack-plugin: 1.6.4 + postcss: 8.2.13 + process: 0.11.10 + prop-types: 15.7.2 + querystring-es3: 0.2.1 + raw-body: 2.4.1 + react: 17.0.1 + react-dom: 17.0.1_react@17.0.1 + react-is: 16.13.1 + react-refresh: 0.8.3 + stream-browserify: 3.0.0 + stream-http: 3.1.1 + string_decoder: 1.3.0 + styled-jsx: 3.3.2_react@17.0.1 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + use-subscription: 1.5.1_react@17.0.1 + util: 0.12.3 + vm-browserify: 1.1.2 + watchpack: 2.1.1 + dev: false + engines: + node: '>=10.13.0' + hasBin: true + 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 + resolution: + integrity: sha512-dkM1mIfnORtGyzw/Yme8RdqNxlCMZyi4Lqj56F01/yHbe1ZtOaJ0cyqqRB4RGiPhjGGh0319f8ddjDyO1605Ow== + /node-fetch/2.6.1: + dev: false + engines: + node: 4.x || >=6.0.0 + resolution: + integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + /node-html-parser/1.4.9: + dependencies: + he: 1.2.0 + dev: false + resolution: + integrity: sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + /node-libs-browser/2.2.1: + dependencies: + assert: 1.5.0 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.7 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.0 + util: 0.11.1 + vm-browserify: 1.1.2 + dev: false + resolution: + integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + /node-releases/1.1.73: + dev: false + resolution: + integrity: sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + /normalize-path/3.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /object-inspect/1.10.3: + dev: false + resolution: + integrity: sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + /object-is/1.1.5: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + /object-keys/1.1.1: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + /object.assign/4.1.2: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + has-symbols: 1.0.2 + object-keys: 1.1.1 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + /os-browserify/0.3.0: + dev: false + resolution: + integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + /p-limit/2.3.0: + dependencies: + p-try: 2.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + /p-limit/3.1.0: + dependencies: + yocto-queue: 0.1.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + /p-locate/4.1.0: + dependencies: + p-limit: 2.3.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + /p-try/2.2.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + /pako/1.0.11: + dev: false + resolution: + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + /parse-asn1/5.1.6: + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + /path-browserify/0.0.1: + dev: false + resolution: + integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + /path-browserify/1.0.1: + dev: false + resolution: + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + /path-exists/4.0.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + /pbkdf2/3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: false + engines: + node: '>=0.12' + resolution: + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + /picomatch/2.3.0: + dev: false + engines: + node: '>=8.6' + resolution: + integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + /pkg-dir/4.2.0: + dependencies: + find-up: 4.1.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + /platform/1.3.6: + dev: false + resolution: + integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + /pnp-webpack-plugin/1.6.4: + dependencies: + ts-pnp: 1.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + /postcss/8.2.13: + dependencies: + colorette: 1.2.2 + nanoid: 3.1.23 + source-map: 0.6.1 + dev: false + engines: + node: ^10 || ^12 || >=14 + resolution: + integrity: sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ== + /process-nextick-args/2.0.1: + dev: false + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /process/0.11.10: + dev: false + engines: + node: '>= 0.6.0' + resolution: + integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + /prop-types/15.7.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + resolution: + integrity: sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + /public-encrypt/4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + /punycode/1.3.2: + dev: false + resolution: + integrity: sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + /punycode/1.4.1: + dev: false + resolution: + integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /querystring-es3/0.2.1: + dev: false + engines: + node: '>=0.4.x' + resolution: + integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + /querystring/0.2.0: + dev: false + engines: + node: '>=0.4.x' + resolution: + integrity: sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + /querystring/0.2.1: + dev: false + engines: + node: '>=0.4.x' + resolution: + integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + /randombytes/2.1.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + /randomfill/1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + /raw-body/2.4.1: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + /react-dom/17.0.1_react@17.0.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.1 + scheduler: 0.20.2 + dev: false + peerDependencies: + react: 17.0.1 + resolution: + integrity: sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== + /react-is/16.13.1: + dev: false + resolution: + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + /react-refresh/0.8.3: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + /react/17.0.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== + /readable-stream/2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + resolution: + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /readable-stream/3.6.0: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + /readdirp/3.5.0: + dependencies: + picomatch: 2.3.0 + dev: false + engines: + node: '>=8.10.0' + resolution: + integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + /regenerator-runtime/0.13.7: + dev: false + resolution: + integrity: sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + /ripemd160/2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: false + resolution: + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + /safe-buffer/5.1.2: + dev: false + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.1: + dev: false + resolution: + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + /safer-buffer/2.1.2: + dev: false + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /scheduler/0.20.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: false + resolution: + integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + /semver/6.3.0: + dev: false + hasBin: true + resolution: + integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + /setimmediate/1.0.5: + dev: false + resolution: + integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + /setprototypeof/1.1.1: + dev: false + resolution: + integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + /sha.js/2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + hasBin: true + resolution: + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + /shell-quote/1.7.2: + dev: false + resolution: + integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + /source-map/0.6.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /source-map/0.7.3: + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + /source-map/0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + /stacktrace-parser/0.1.10: + dependencies: + type-fest: 0.7.1 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + /statuses/1.5.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /stream-browserify/2.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: false + resolution: + integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + /stream-browserify/3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + resolution: + integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + /stream-http/2.8.3: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.7 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + dev: false + resolution: + integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + /stream-http/3.1.1: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + xtend: 4.0.2 + dev: false + resolution: + integrity: sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + /stream-parser/0.3.1: + dependencies: + debug: 2.6.9 + dev: false + resolution: + integrity: sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + /string-hash/1.1.3: + dev: false + resolution: + integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= + /string.prototype.trimend/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + resolution: + integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + /string.prototype.trimstart/1.0.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.3 + dev: false + resolution: + integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + dev: false + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /string_decoder/1.3.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /strip-ansi/6.0.0: + dependencies: + ansi-regex: 5.0.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + /styled-jsx/3.3.2_react@17.0.1: + dependencies: + '@babel/types': 7.8.3 + babel-plugin-syntax-jsx: 6.18.0 + convert-source-map: 1.7.0 + loader-utils: 1.2.3 + react: 17.0.1 + source-map: 0.7.3 + string-hash: 1.1.3 + stylis: 3.5.4 + stylis-rule-sheet: 0.0.10_stylis@3.5.4 + dev: false + peerDependencies: + react: 15.x.x || 16.x.x || 17.x.x + resolution: + integrity: sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== + /stylis-rule-sheet/0.0.10_stylis@3.5.4: + dependencies: + stylis: 3.5.4 + dev: false + peerDependencies: + stylis: ^3.5.0 + resolution: + integrity: sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + /stylis/3.5.4: + dev: false + resolution: + integrity: sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/7.2.0: + dependencies: + has-flag: 4.0.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + /supports-color/8.1.1: + dependencies: + has-flag: 4.0.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + /timers-browserify/2.0.12: + dependencies: + setimmediate: 1.0.5 + dev: false + engines: + node: '>=0.6.0' + resolution: + integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + /to-arraybuffer/1.0.1: + dev: false + resolution: + integrity: sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + /to-fast-properties/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + /to-regex-range/5.0.1: + dependencies: + is-number: 7.0.0 + dev: false + engines: + node: '>=8.0' + resolution: + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + /toidentifier/1.0.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + /tr46/1.0.1: + dependencies: + punycode: 2.1.1 + dev: false + resolution: + integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + /ts-pnp/1.2.0: + dev: false + engines: + node: '>=6' + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + resolution: + integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + /tty-browserify/0.0.0: + dev: false + resolution: + integrity: sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + /tty-browserify/0.0.1: + dev: false + resolution: + integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + /type-fest/0.7.1: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + /unbox-primitive/1.0.1: + dependencies: + function-bind: 1.1.1 + has-bigints: 1.0.1 + has-symbols: 1.0.2 + which-boxed-primitive: 1.0.2 + dev: false + resolution: + integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + /unpipe/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /url/0.11.0: + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: false + resolution: + integrity: sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + /use-subscription/1.5.1_react@17.0.1: + dependencies: + object-assign: 4.1.1 + react: 17.0.1 + dev: false + peerDependencies: + react: ^16.8.0 || ^17.0.0 + resolution: + integrity: sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + /util-deprecate/1.0.2: + dev: false + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /util/0.10.3: + dependencies: + inherits: 2.0.1 + dev: false + resolution: + integrity: sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + /util/0.11.1: + dependencies: + inherits: 2.0.3 + dev: false + resolution: + integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + /util/0.12.3: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.0 + is-generator-function: 1.0.9 + is-typed-array: 1.1.5 + safe-buffer: 5.2.1 + which-typed-array: 1.1.4 + dev: false + resolution: + integrity: sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + /vm-browserify/1.1.2: + dev: false + resolution: + integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + /watchpack/2.1.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.6 + dev: false + engines: + node: '>=10.13.0' + resolution: + integrity: sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + /webidl-conversions/4.0.2: + dev: false + resolution: + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + /whatwg-url/7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + resolution: + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + /which-boxed-primitive/1.0.2: + dependencies: + is-bigint: 1.0.2 + is-boolean-object: 1.1.1 + is-number-object: 1.0.5 + is-string: 1.0.6 + is-symbol: 1.0.4 + dev: false + resolution: + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + /which-typed-array/1.1.4: + dependencies: + available-typed-arrays: 1.0.4 + call-bind: 1.0.2 + es-abstract: 1.18.3 + foreach: 2.0.5 + function-bind: 1.1.1 + has-symbols: 1.0.2 + is-typed-array: 1.1.5 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== + /xtend/4.0.2: + dev: false + engines: + node: '>=0.4' + resolution: + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + /yocto-queue/0.1.0: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +specifiers: + next: ^10.0.0 + react: 17.0.1 + react-dom: 17.0.1 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a GIT binary patch literal 15086 zcmeHOOH5Q(7(R0cc?bh2AT>N@1PWL!LLfZKyG5c!MTHoP7_p!sBz0k$?pjS;^lmgJ zU6^i~bWuZYHL)9$wuvEKm~qo~(5=Lvx5&Hv;?X#m}i|`yaGY4gX+&b>tew;gcnRQA1kp zBbm04SRuuE{Hn+&1wk%&g;?wja_Is#1gKoFlI7f`Gt}X*-nsMO30b_J@)EFNhzd1QM zdH&qFb9PVqQOx@clvc#KAu}^GrN`q5oP(8>m4UOcp`k&xwzkTio*p?kI4BPtIwX%B zJN69cGsm=x90<;Wmh-bs>43F}ro$}Of@8)4KHndLiR$nW?*{Rl72JPUqRr3ta6e#A z%DTEbi9N}+xPtd1juj8;(CJt3r9NOgb>KTuK|z7!JB_KsFW3(pBN4oh&M&}Nb$Ee2 z$-arA6a)CdsPj`M#1DS>fqj#KF%0q?w50GN4YbmMZIoF{e1yTR=4ablqXHBB2!`wM z1M1ke9+<);|AI;f=2^F1;G6Wfpql?1d5D4rMr?#f(=hkoH)U`6Gb)#xDLjoKjp)1;Js@2Iy5yk zMXUqj+gyk1i0yLjWS|3sM2-1ECc;MAz<4t0P53%7se$$+5Ex`L5TQO_MMXXi04UDIU+3*7Ez&X|mj9cFYBXqM{M;mw_ zpw>azP*qjMyNSD4hh)XZt$gqf8f?eRSFX8VQ4Y+H3jAtvyTrXr`qHAD6`m;aYmH2zOhJC~_*AuT} zvUxC38|JYN94i(05R)dVKgUQF$}#cxV7xZ4FULqFCNX*Forhgp*yr6;DsIk=ub0Hv zpk2L{9Q&|uI^b<6@i(Y+iSxeO_n**4nRLc`P!3ld5jL=nZRw6;DEJ*1z6Pvg+eW|$lnnjO zjd|8>6l{i~UxI244CGn2kK@cJ|#ecwgSyt&HKA2)z zrOO{op^o*- + + \ No newline at end of file