├── .gitignore
├── slides.pdf
├── CookingMasters
├── images
│ ├── icons
│ │ ├── icon.png
│ │ └── icon-maskable.png
│ ├── original
│ │ ├── asado.png
│ │ ├── asado.jpeg
│ │ ├── ddl-brownies.png
│ │ ├── laptop-recipe.png
│ │ ├── mobile-recipe.png
│ │ ├── tablet-recipe.png
│ │ ├── vegetarian-pho.png
│ │ ├── southwest-nachos.png
│ │ ├── calamari-and-shrimp-pasta.png
│ │ ├── fish-tacos-with-pickled-onion.png
│ │ ├── pork-tenderloin-with-kale-and-swee-potato.png
│ │ ├── permissions-image-laptop.svg
│ │ └── permissions-image-mobile-tablet.svg
│ ├── icon-permissions.svg
│ ├── permissions.svg
│ └── logo.svg
├── app.webmanifest
├── scripts
│ ├── Router.js
│ ├── Cooking.js
│ └── app.js
├── index.html
├── styles.css
└── data
│ └── recipes.json
├── README.md
└── samples
├── public
├── gpt.js
├── playground
│ ├── app.js
│ ├── index.html
│ └── styles.css
└── chat
│ ├── app.js
│ ├── index.html
│ └── styles.css
├── package.json
├── server.js
└── package-lock.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
--------------------------------------------------------------------------------
/slides.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/slides.pdf
--------------------------------------------------------------------------------
/CookingMasters/images/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/icons/icon.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/asado.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/asado.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/asado.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/asado.jpeg
--------------------------------------------------------------------------------
/CookingMasters/images/icons/icon-maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/icons/icon-maskable.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/ddl-brownies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/ddl-brownies.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/laptop-recipe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/laptop-recipe.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/mobile-recipe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/mobile-recipe.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/tablet-recipe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/tablet-recipe.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/vegetarian-pho.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/vegetarian-pho.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/southwest-nachos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/southwest-nachos.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/calamari-and-shrimp-pasta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/calamari-and-shrimp-pasta.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/fish-tacos-with-pickled-onion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/fish-tacos-with-pickled-onion.png
--------------------------------------------------------------------------------
/CookingMasters/images/original/pork-tenderloin-with-kale-and-swee-potato.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/pork-tenderloin-with-kale-and-swee-potato.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [][fem]
2 |
3 | This is a companion repo for the [First Look at ChatGPT for Web Developers][course] course on [Frontend Masters][fem].
4 |
5 | [fem]: https://frontendmasters.com
6 | [course]: https://frontendmasters.com/courses/chatgpt-api/
7 |
--------------------------------------------------------------------------------
/samples/public/gpt.js:
--------------------------------------------------------------------------------
1 | export async function callAPI(endpoint, data) {
2 | const response = await fetch(endpoint, {
3 | method: 'POST',
4 | headers: {
5 | 'Content-Type': 'application/json',
6 | },
7 | body: JSON.stringify(data)
8 | })
9 | return await response.json();
10 | }
11 |
--------------------------------------------------------------------------------
/samples/public/playground/app.js:
--------------------------------------------------------------------------------
1 |
2 | async function send() {
3 | const prompt = document.querySelector("#prompt").value;
4 |
5 | const response = await fetch("/api/general", {
6 | method: 'POST',
7 | headers: {
8 | 'Content-Type': 'application/json',
9 | },
10 | body: JSON.stringify({prompt})
11 | })
12 | const output = await response.json();
13 | document.querySelector("output").textContent = output;
14 |
15 |
16 | }
--------------------------------------------------------------------------------
/samples/public/chat/app.js:
--------------------------------------------------------------------------------
1 | const OPENAI_KEY = "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";
2 | const price = 0.0002/1000;
3 |
4 | const messages = [];
5 | let totalTokens = 0;
6 |
7 | async function sendChat() {
8 | const prompt = document.querySelector("#prompt").value;
9 | document.querySelector("#prompt").value = "";
10 |
11 | // TODO make query and parse results
12 |
13 | document.querySelector("#prompt").value = "";
14 | document.querySelector("input").focus();
15 | }
--------------------------------------------------------------------------------
/samples/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Chat GPT API and Samples",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "nodemon server.js"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "cors": "^2.8.5",
14 | "express": "^4.18.2",
15 | "openai": "^3.2.1"
16 | },
17 | "devDependencies": {
18 | "nodemon": "^2.0.22"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/samples/public/playground/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ChatGPT for Web Developers
8 |
9 |
10 |
11 |
12 |
13 | ChatGPT for Web Developers
14 |
18 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/samples/server.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | const OPENAI_KEY = "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";
4 |
5 | const path = require('path');
6 | const express = require('express');
7 | const cors = require('cors');
8 | const app = express();
9 |
10 | app.use(express.json()); // parse JSON requests
11 | app.use(cors());
12 | app.use(express.static(path.join(__dirname, 'public')));
13 |
14 |
15 | app.post('/api/chat', async (req, res) => {
16 |
17 | });
18 |
19 | app.post('/api/general', async (req, res) => {
20 |
21 | });
22 |
23 | app.post('/api/image', async (req, res) => {
24 |
25 | })
26 |
27 | app.post('/api/recipe', async (req, res) => {
28 |
29 | });
30 |
31 | app.listen(3000, () => {
32 | console.log('Server started on port 3000');
33 | });
34 |
--------------------------------------------------------------------------------
/samples/public/chat/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ChatGPT for Web Developers
8 |
9 |
10 |
11 |
12 |
13 | ChatGPT for Web Developers
14 |
17 |
20 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/samples/public/playground/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: Arial, Helvetica, sans-serif;
4 | }
5 |
6 | main {
7 | display: flex;
8 | flex-direction: column;
9 | padding: 10px;
10 | }
11 |
12 |
13 | ul {
14 | list-style: none;
15 | padding: 0;
16 | }
17 |
18 | #chatbox {
19 | background-color: black;
20 | color: white;
21 | position: fixed;
22 | bottom: 0;
23 | padding: 10px;
24 | }
25 |
26 |
27 |
28 | textarea {
29 | padding: 8px;
30 | width: 90%;
31 | height: 300px;
32 | min-width: 300px;;
33 | background-color: #444;
34 | color: white;
35 | font-size: 18px;
36 | display: block;
37 | }
38 |
39 | button {
40 | border: 0;
41 | background-color: orangered;
42 | color: white;
43 | font-size: large;
44 | padding: 10px 30px;
45 | margin: 10px 0;
46 | }
47 |
48 | output {
49 | background-color: beige;
50 | font-size: large;
51 | padding: 5px;
52 | font-family: monospace;
53 | }
--------------------------------------------------------------------------------
/CookingMasters/images/icon-permissions.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/CookingMasters/app.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Coffee Masters",
3 | "short_name": "CoffeeMasters",
4 | "theme_color": "#43281C",
5 | "display": "standalone",
6 | "background_color": "#EFEFEF",
7 | "start_url": "/",
8 | "scope": "/",
9 | "description": "The app for order at Coffee Masters, the best coffee shop in the Frontend world, by Frontend Masters.",
10 | "icons": [
11 | {
12 | "src": "images/icons/icon.png",
13 | "sizes": "1024x1024",
14 | "type": "image/png"
15 | },
16 | {
17 | "src": "images/icons/icon-maskable.png",
18 | "sizes": "512x512",
19 | "type": "image/png",
20 | "purpose": "maskable"
21 | }
22 | ],
23 | "screenshots": [
24 | {
25 | "src": "images/screen1.jpg",
26 | "type": "image/jpeg"
27 | },
28 | {
29 | "src": "images/screen2.jpg",
30 | "type": "image/jpeg"
31 | }
32 | ]
33 | }
--------------------------------------------------------------------------------
/CookingMasters/images/permissions.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/CookingMasters/images/original/permissions-image-laptop.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/samples/public/chat/styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: Arial, Helvetica, sans-serif;
4 | }
5 |
6 | main {
7 | display: flex;
8 | flex-direction: column;
9 | padding: 10px;
10 | }
11 |
12 | ul {
13 | list-style: none;
14 | padding: 0;
15 | }
16 |
17 | #chatbox {
18 | background-color: black;
19 | color: white;
20 | position: fixed;
21 | bottom: 0;
22 | padding: 10px;
23 | }
24 |
25 | ul {
26 | flex-grow: 10;
27 | padding-bottom: 50px;
28 | }
29 |
30 | ul li::before {
31 | content: '🤖'
32 | }
33 |
34 | ul li:has(b)::before {
35 | content: '🧑'
36 | }
37 |
38 | input {
39 | padding: 8px;
40 | width: 50%;
41 | min-width: 300px;;
42 | background-color: #444;
43 | color: white;
44 | }
45 |
46 | button {
47 | border: 0;
48 | background-color: orangered;
49 | color: white;
50 | }
51 |
52 | output {
53 | background-color: beige;
54 | font-size: small;
55 | position: absolute;
56 | top: 0;
57 | right: 0;
58 | padding: 5px;
59 | }
--------------------------------------------------------------------------------
/CookingMasters/images/original/permissions-image-mobile-tablet.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/CookingMasters/scripts/Router.js:
--------------------------------------------------------------------------------
1 | import { renderRecipeDetails } from "./app.js";
2 |
3 | const Router = {
4 | init: () => {
5 | // It listen for history changes
6 | window.addEventListener('popstate', event => {
7 | Router.go(event.state.route, false);
8 | });
9 | // Process initial URL
10 | Router.go(location.pathname);
11 | },
12 | go: (route, addToHistory=true) => {
13 | if (addToHistory) {
14 | history.pushState({ route }, '', route);
15 | }
16 | document.querySelectorAll("section.page")
17 | .forEach(s => s.style.display = "none");
18 | switch (route) {
19 | case "/":
20 | document.querySelector("section#home").style.display = "block";
21 | break;
22 | default:
23 | if (route.startsWith("/recipe")) {
24 | document.querySelector("section#recipe").style.display = "block";
25 | const id = route.substring(route.lastIndexOf("/")+1);
26 | renderRecipeDetails(id);
27 | }
28 | break;
29 | }
30 | window.scrollX = 0;
31 | }
32 | }
33 |
34 | export default Router;
--------------------------------------------------------------------------------
/CookingMasters/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Cooking Masters
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | 
21 |
22 |
23 |
24 |
25 |
26 |
27 |
31 |
32 |
35 |
36 |
37 |
38 |
Recipe of the Week
39 |
40 |
41 |
42 |
43 |
Most Cooked
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | All Recipes
52 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
82 |
86 |
87 |
88 |
89 | Description
90 |
91 |
92 | Ingredients
93 |
94 |
95 |
96 |
97 |
98 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/CookingMasters/scripts/Cooking.js:
--------------------------------------------------------------------------------
1 | import { alertTimerFinished } from "./app.js";
2 |
3 | // WebKit prefix still mandatory for iPad and Safari on macOS
4 | export const Cooking = {
5 | init: (element) => {
6 | Cooking.root = element;
7 | Cooking.timers = [];
8 | // ADDED
9 | const handler = e => {
10 | if (!document.fullscreenElement && !document.webkitFullscreenElement) {
11 | Cooking.root.hidden = true;
12 | }
13 | }
14 | document.addEventListener("fullscreenchange", handler);
15 | document.addEventListener("webkitfullscreenchange", handler);
16 |
17 | Cooking
18 | },
19 | start: (recipe) => {
20 | Cooking.root.hidden = false;
21 | Cooking.recipe = recipe;
22 |
23 | document.querySelector("#cooking h2").textContent = `${recipe.name}: Steps`;
24 | Cooking.step(0);
25 |
26 | // ADDED
27 | if (Cooking.root.requestFullscreen) {
28 | Cooking.root.requestFullscreen();
29 | } else {
30 | if (Cooking.root.webkitRequestFullscreen) {
31 | Cooking.root.webkitRequestFullscreen();
32 | }
33 | }
34 | },
35 | end: () => {
36 | document.exitFullscreen();
37 | },
38 | next: () => {
39 | Cooking.step(Cooking.currentStep + 1);
40 | },
41 | previous: () => {
42 | Cooking.step(Cooking.currentStep - 1);
43 | },
44 | addTimer: (name, minutes) => {
45 | // Change 1 with minutes for real world
46 | const li = document.createElement("li");
47 | li.innerHTML = `
48 |
49 | ${name}
50 | ${String(minutes).padStart(2, '0')}:00
51 |
52 | `;
53 |
54 | document.querySelector("#cooking ul").appendChild(li);
55 | const timer = {
56 | name,
57 | duration: minutes*60,
58 | current: minutes*60,
59 | element: li,
60 | }
61 | const timerFunction = ()=> {
62 | Cooking.updateTimer(timer)
63 | };
64 |
65 | timer.interval = setInterval(timerFunction.bind(timer), 1000);
66 | li.onclick = () => {
67 | li.remove();
68 | clearInterval(timer.interval);
69 | }
70 | Cooking.timers.push(timer);
71 | },
72 | updateTimer: (timer) => {
73 | timer.current--;
74 | timer.element.querySelector("p").textContent = `${String(Math.floor(timer.current / 60)).padStart(2, '0')}:${String(timer.current % 60).padStart(2, '0')}`
75 | if (timer.current<20) {
76 | timer.element.style.color = "red";
77 | }
78 | if (timer.current==0) {
79 | alertTimerFinished(timer);
80 | timer.element.querySelector("article").style.color = "white";
81 | timer.element.querySelector("article").style.backgroundColor = "red";
82 | clearInterval(timer.interval);
83 | }
84 | },
85 | step: (index) => {
86 | Cooking.currentStep = index;
87 | if (index>Cooking.recipe.steps.length-1) {
88 | Cooking.end();
89 | }
90 | const step = Cooking.recipe.steps[index];
91 | document.querySelector("#cooking h3").textContent = `${index+1} of ${Cooking.recipe.steps.length} | ${step.name}`;
92 | document.querySelector("#cooking .step").innerHTML = step.description ;
93 |
94 | if (step.timer) {
95 | const timerButton = document.createElement("button");
96 | timerButton.textContent = `Add timer for ${step.timer} minutes`;
97 | timerButton.onclick = () => {
98 | Cooking.addTimer(step.name, step.timer);
99 | }
100 | document.querySelector("#cooking .step").appendChild(timerButton);
101 |
102 | }
103 |
104 | document.querySelector("#btn-previous").disabled = index==0;
105 | document.querySelector("#btn-next").textContent = index==Cooking.recipe.steps.length-1 ? "You finished!" : "Next Step";
106 |
107 | }
108 | }
--------------------------------------------------------------------------------
/CookingMasters/scripts/app.js:
--------------------------------------------------------------------------------
1 | import Router from './Router.js';
2 | import { Cooking } from './Cooking.js';
3 |
4 | window.app = {}
5 | app.router = Router;
6 | app.cooking = Cooking;
7 | app.recipes = [];
8 |
9 | window.addEventListener("DOMContentLoaded", () => {
10 | app.router.init();
11 | app.cooking.init(document.querySelector("#cooking"));
12 | loadRecipes();
13 | });
14 |
15 | app.recipeAI = async () => {
16 | const ingredients = document.getElementById("ingredients");
17 | const value = ingredients.value;
18 | ingredients.disabled = true;
19 | ingredients.value = "🤖 Our AI Chef is working...";
20 | const response = await fetch("http://localhost:3000/api/recipe", {
21 | method: 'POST',
22 | headers: {
23 | 'Content-Type': 'application/json',
24 | },
25 | body: JSON.stringify({"ingredients": value })
26 | })
27 | const jsonResponse = await response.json();
28 | const recipe = JSON.parse(jsonResponse.content);
29 | console.log(recipe);
30 | if (recipe!=false) {
31 | app.recipes.push(recipe);
32 | const responseImg = await fetch("http://localhost:3000/api/image", {
33 | method: 'POST',
34 | headers: {
35 | 'Content-Type': 'application/json',
36 | },
37 | body: JSON.stringify({"prompt": `A high-quality photograph of the meal ${recipe.name}: ${recipe.description}` })
38 | })
39 | const jsonImage = await responseImg.json();
40 | recipe.image = jsonImage.url;
41 | const div = document.createElement("div");
42 | document.getElementById("ai-recipe").appendChild(div);
43 | renderRecipe(div, recipe, "large");
44 | } else {
45 | alert("Ingredients aren't valid")
46 | }
47 | ingredients.value = "";
48 | ingredients.disabled = false;
49 | }
50 |
51 | export async function alertTimerFinished(timer) {
52 | console.log(`Timer finished: ${timer.name}`);
53 |
54 | }
55 | async function loadRecipes() {
56 | const response = await fetch("/data/recipes.json");
57 | app.recipes = await response.json();
58 | renderRecipes();
59 | }
60 |
61 | function renderRecipes() {
62 | renderRecipe(document.querySelector("#recipe-week"), app.recipes[0], "large");
63 | renderRecipe(document.querySelector("#recipe-most"), app.recipes[1], "large");
64 | const theRest = app.recipes.slice(2);
65 | document.querySelector("#all ul").innerHTML = "";
66 | theRest.forEach(r => {
67 | const li = document.createElement("li");
68 | document.querySelector("#all ul").appendChild(li);
69 | renderRecipe(li, r, "small");
70 | })
71 | }
72 |
73 | function renderRecipe(element, recipe, className) {
74 | element.innerHTML = `
75 |
76 |
77 | ${recipe.name}
78 | ${recipe.type} | ${Object.keys(recipe.ingredients).length} ingredients | ${recipe.duration} min
79 |
80 | `
81 | }
82 |
83 | export async function renderRecipeDetails(id) {
84 | if (app.recipes.length==0) {
85 | await loadRecipes();
86 | }
87 | const recipe = app.recipes.filter(r=>r.slug==id)[0];
88 | document.querySelector("#recipe h2").textContent = recipe.name;
89 | document.querySelector("#recipe img").src = recipe.image;
90 | document.querySelector("#recipe .metadata").textContent =
91 | `${Object.keys(recipe.ingredients).length} ingredients |
92 | ${recipe.duration} minutes | ${recipe.type}`;
93 | document.querySelector("#recipe .description").textContent = recipe.description;
94 |
95 | const list = document.querySelector("#recipe dl");
96 | list.innerHTML = "";
97 | for (let ingredient in recipe.ingredients) {
98 | list.innerHTML += `
99 | ${ingredient}${recipe.ingredients[ingredient]}
100 | `
101 | }
102 | document.querySelector("#recipe button").onclick = () => {
103 | app.cooking.start(recipe);
104 | }
105 |
106 | }
--------------------------------------------------------------------------------
/CookingMasters/styles.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --background-surface: #F1F1F3;
3 | --primaryColor: #C06918;
4 | --secondaryColor: #333D29;
5 | --color3: #8D8D8D;
6 | --color4: #B08968;
7 | --color5: #DDB892;
8 | --color6: #EDE0D4;
9 | --highlight: #FBF2C6;
10 | }
11 |
12 |
13 |
14 | body {
15 | background-color: var(--background-surface);
16 | font-family: Helvetica, Arial, sans-serif;
17 | }
18 |
19 | textarea {
20 | width: 80%;
21 | height: 80px;
22 | font-size: 19px;
23 | }
24 |
25 | main a {
26 | text-decoration: none;
27 | color: black;
28 | display: block;
29 | }
30 | main a:hover {
31 | scale: 1.05;
32 | transition: scale 100ms;
33 | }
34 |
35 | main {
36 | max-width: 850px;
37 | margin: auto;
38 | }
39 |
40 | .form {
41 | margin-bottom: 20px;
42 | }
43 |
44 | body>header {
45 | max-width: 850px;
46 | margin: auto;
47 | display: flex;
48 | align-items: center;
49 | justify-content: center;
50 | }
51 |
52 | body>header * {
53 | flex-grow: 1;
54 | }
55 |
56 |
57 |
58 | footer {
59 | border-top: 1px solid var(--primaryColor);
60 | }
61 |
62 | footer div {
63 | max-width: 850px;
64 | margin: auto;
65 | margin-top: 18px;
66 | width: 100%;
67 | }
68 |
69 | footer a {
70 | color: var(--primaryColor);
71 | }
72 |
73 | footer p {
74 | font-size: 13px;
75 | color: var(--color3)
76 | }
77 |
78 | img#logo {
79 | width: 200px;
80 | }
81 |
82 | #btn-permissions {
83 | text-align: right;
84 | }
85 |
86 | #btn-permissions img {
87 | width: 40px;
88 | }
89 |
90 | ul {
91 | list-style: none;
92 | padding: 0;
93 | }
94 |
95 | h2 {
96 | font-size: 15px;
97 | }
98 |
99 | h3 {
100 | font-size: 13px;
101 | padding-bottom: 10px;
102 | border-bottom: 1px solid orange;
103 | margin-top: 24px;
104 |
105 | }
106 |
107 | .two-columns {
108 | display: flex;
109 | }
110 |
111 | .two-columns div:first-child {
112 | margin-right: 10px;
113 | }
114 | .two-columns div {
115 | flex-grow: 1;
116 | }
117 |
118 | h3, .recipe {
119 | width: 400px;
120 | }
121 |
122 | .recipe {
123 | background: white;
124 | border-radius: 15px;
125 | padding-bottom: 8px;
126 | box-shadow: 0px 6px 6px -10px rgba(0, 0, 0, 0.45), 6px 0 6px -10px rgba(0, 0, 0, 0.45);}
127 |
128 | .recipe h4 {
129 | margin: 0 0 0 12px;
130 | }
131 |
132 | .recipe p {
133 | margin: 4px 12px;
134 | font-size: 11px;
135 | color: var(--color3);
136 | }
137 |
138 | .recipe img {
139 | width: 100%;
140 | border-radius: 15px;
141 | }
142 |
143 | .recipe.small {
144 | width: 195px;
145 | }
146 | .recipe.small img {
147 | height: 96px;
148 | }
149 |
150 | section#all h3 {
151 | margin-top: 16px;
152 | width: 100%;
153 | }
154 |
155 | section#all ul {
156 | display: flex;
157 | flex-wrap: wrap;
158 | row-gap: 10px;
159 | column-gap: 10px;
160 | align-content: space-between;
161 | }
162 |
163 |
164 | button {
165 | background-color: var(--primaryColor);
166 | color: white;
167 | width: 300px;
168 | padding: 8px;
169 | font-size: 17px;
170 | border: 0;
171 | border-radius: 5px;
172 | }
173 |
174 | #recipe, #permissions {
175 | background-color: white;
176 | border-top-left-radius: 15px;
177 | border-top-right-radius: 15px;
178 | box-shadow: 0px -6px 6px -10px rgba(0, 0, 0, 0.45), 6px 0 16px -10px rgba(0, 0, 0, 0.45);
179 | padding-bottom: 10px;
180 | margin-bottom: 20px;
181 | }
182 |
183 | .page h2 {
184 | font-size: 40px;
185 | margin: 0;
186 | margin-top: 16px;
187 | }
188 |
189 | article h3 {
190 | border: 0;
191 | font-size: 1.15em;
192 | margin-bottom: 0;
193 | padding-bottom: 0;
194 | }
195 |
196 | .page dl, .page p {
197 | font-size: 0.9em;
198 | }
199 |
200 | .page header section {
201 | margin-right: 16px;
202 | padding-left: 16px;
203 | flex: 2
204 | }
205 |
206 | #recipe img {
207 | width: 300px;
208 | }
209 |
210 | dl {
211 | width: 300px;
212 | display: flex;
213 | flex-wrap: wrap;
214 | }
215 |
216 | dd, dt {
217 | display: block;
218 | flex-grow: 1;
219 | }
220 | dt {
221 | width: 200px;
222 | }
223 | dd {
224 | width: 90px;
225 | margin: 0;
226 | text-align: right;
227 | margin-bottom: 8px;
228 | color: var(--color3)
229 | }
230 |
231 |
232 | .page header img {
233 | flex-grow: 1;
234 | flex: 1;
235 | border-top-right-radius: 15px;
236 | }
237 |
238 | .page header {
239 | display: flex;
240 | }
241 |
242 | .page>section {
243 | margin: 16px;
244 | }
245 |
246 | #permissions {
247 | color: var(--secondaryColor)
248 | }
249 |
250 | #permissions dd, #permissions dt {
251 | width: 40%;
252 | }
253 |
254 | #permissions {
255 | text-align: center;
256 | }
257 |
258 | #permissions h2 {
259 | font-size: 24px;
260 | }
261 |
262 | #permissions button {
263 | width: auto;
264 | }
265 |
266 | #permissions img {
267 | width: 150px;
268 | margin-top: 24px;
269 | }
270 |
271 | #permissions h3 {
272 | width: auto;
273 | margin: 0;
274 | border: 0;
275 | text-align: right;
276 | font-weight: bold;
277 | padding: 0;
278 | }
279 | #permissions table {
280 | max-width: 400px;
281 | margin: auto;
282 | font-size: 15px;
283 | margin-top: 24px;
284 | column-gap: 10px;
285 | }
286 |
287 | #permissions td {
288 | height: 30px;
289 | vertical-align: center;
290 | padding: 12px;
291 | }
292 |
293 | #permissions button {
294 | font-size: 13px;
295 | }
296 |
297 | #permissions span {
298 | text-align: left;
299 | }
300 |
301 | #permissions button {
302 | width: 80px;
303 | }
304 |
305 |
306 | #cooking {
307 | background-color: var(--background-surface);
308 | padding: 36px;
309 | display: flex;
310 | flex-direction: column;
311 | flex-wrap: nowrap;
312 | justify-content: space-between;
313 | align-items: stretch;
314 | align-content: stretch;
315 | row-gap: 12px;
316 | }
317 |
318 | #cooking[hidden] {
319 | display: none;
320 | }
321 |
322 | #cooking h2 {
323 | color: var(--primaryColor);
324 | text-align: center;
325 | font-size: 22px;
326 | margin: 0;
327 | }
328 |
329 | #cooking h3 {
330 | text-align: center;
331 | font-size: 25px;
332 | width: auto;
333 | border: 0;
334 | margin: 0;
335 | }
336 |
337 | #cooking .step {
338 | background-color: white;
339 | padding: 18px;
340 | border-radius: 15px;
341 | font-size: 50px;
342 | flex-grow: 1;
343 | border: 2px solid var(--primaryColor)
344 | }
345 |
346 | #cooking .toolbar {
347 | width: 100%;
348 | display: flex;
349 | column-gap: 18px;
350 | align-items: stretch;
351 | margin: 0;
352 | }
353 |
354 | #cooking .timers {
355 | height: 100px;
356 | margin: 0;
357 | }
358 |
359 | #cooking button {
360 | width: 100%;
361 | }
362 |
363 | #cooking .status {
364 | background-color: white;
365 | margin: auto;
366 | border-radius: 15px;
367 | padding: 18px;
368 | margin: 18px 0;
369 | text-align: center;
370 | }
371 |
372 | #cooking .status span {
373 | font-size: 20px;
374 | padding: 0 20px;
375 | }
376 |
377 | #cooking .status span.on {
378 | opacity: 1;
379 | font-size: 25px;
380 | }
381 |
382 | #cooking .status span.off {
383 | opacity: 0.3
384 | }
385 |
386 | #cooking .timers ul {
387 | display: flex;
388 | text-align: center;
389 | margin: 0;
390 | column-gap: 16px;
391 | }
392 |
393 | #cooking .timer {
394 | background-color: white;
395 | border-radius: 15px;
396 | padding: 18px;
397 | text-align: center;
398 | width: 150px;
399 | }
400 |
401 | #cooking .timer h5 {
402 | margin: 0;
403 | }
404 |
405 | #cooking .timer p {
406 | font-size: 32px;
407 | margin: 0;
408 | }
--------------------------------------------------------------------------------
/CookingMasters/images/logo.svg:
--------------------------------------------------------------------------------
1 |
19 |
--------------------------------------------------------------------------------
/CookingMasters/data/recipes.json:
--------------------------------------------------------------------------------
1 | [{
2 | "slug": "fish-tacos",
3 | "name": "Fish Tacos with Pickled Onion",
4 | "type": "Main Meal",
5 | "duration": 60,
6 | "image": "images/original/fish-tacos-with-pickled-onion.png",
7 | "description": "Delicious fish tacos made with crispy breaded fish, fresh cilantro, and tangy pickled onions wrapped in a soft flour tortilla.",
8 | "ingredients": {
9 | "Red onion": "1",
10 | "Water": "1 cup",
11 | "Vinegar": "1 cup",
12 | "Sugar": "1 tablespoon",
13 | "Salt": "1 teaspoon",
14 | "White fish fillets": "1 pound",
15 | "Flour": "1 cup",
16 | "Egg": "1",
17 | "Breadcrumbs": "1 cup",
18 | "Vegetable oil": "for frying",
19 | "Flour tortillas": "8",
20 | "Cilantro": "1 bunch",
21 | "Lime": "1"
22 | },
23 | "steps": [
24 | {
25 | "name": "Pickle Onions",
26 | "description": "Thinly slice the red onion and set aside."
27 | },
28 | {
29 | "name": "Prepare Pickling Liquid",
30 | "description": "In a small saucepan, combine the water, vinegar, sugar, and salt. Bring to a simmer, then remove from heat.",
31 | "timer": 5
32 | },
33 | {
34 | "name": "Pickle Onions",
35 | "description": "Add the sliced onions to the pickling liquid and let sit for at least 30 minutes.",
36 | "timer": 30
37 | },
38 | {
39 | "name": "Prepare Fish",
40 | "description": "Cut the fish fillets into 2-inch wide strips."
41 | },
42 | {
43 | "name": "Bread Fish",
44 | "description": "Set up a breading station with three shallow dishes: one with flour, one with a beaten egg, and one with breadcrumbs. Coat each fish strip in flour, dip in egg, and then coat with breadcrumbs."
45 | },
46 | {
47 | "name": "Fry Fish",
48 | "description": "Heat vegetable oil in a deep skillet over medium-high heat. Fry the breaded fish strips until golden brown and cooked through, about 3-4 minutes per side. Drain on paper towels."
49 | },
50 | {
51 | "name": "Assemble Tacos",
52 | "description": "Place a piece of fried fish on a flour tortilla, top with pickled onions, chopped cilantro, and a squeeze of lime. Fold and serve."
53 | }
54 | ]
55 | },
56 | {
57 | "name": "Vegetarian Pho",
58 | "slug": "vegetarian-pho",
59 | "image": "images/original/vegetarian-pho.png",
60 | "type": "Main Meal",
61 | "duration": 90,
62 | "description": "A flavorful and comforting vegetarian pho made with a rich, aromatic broth and loaded with veggies, rice noodles, and fresh herbs.",
63 | "ingredients": {
64 | "Vegetable oil": "1 tablespoon",
65 | "Onion": "1, halved",
66 | "Ginger": "4-inch piece, unpeeled",
67 | "Vegetable broth": "8 cups",
68 | "Star anise": "3",
69 | "Cinnamon stick": "1",
70 | "Cardamom pods": "3",
71 | "Cloves": "5",
72 | "Coriander seeds": "1 tablespoon",
73 | "Soy sauce": "3 tablespoons",
74 | "Brown sugar": "1 tablespoon",
75 | "Rice noodles": "8 ounces",
76 | "Assorted vegetables": "3 cups, e.g., mushrooms, bok choy, broccoli, carrots",
77 | "Lime": "1",
78 | "Bean sprouts": "1 cup",
79 | "Fresh basil": "1 cup",
80 | "Fresh mint": "1 cup",
81 | "Fresh cilantro": "1 cup",
82 | "Green onions": "2, thinly sliced",
83 | "Jalapeno": "1, thinly sliced",
84 | "Sriracha": "to taste",
85 | "Hoisin sauce": "to taste"
86 | },
87 | "steps": [
88 | {
89 | "name": "Char Onion and Ginger",
90 | "description": "Heat vegetable oil in a large pot over medium-high heat. Add onion halves and ginger, cut side down, and cook until charred, about 5 minutes."
91 | },
92 | {
93 | "name": "Prepare Broth",
94 | "description": "Add vegetable broth, star anise, cinnamon stick, cardamom pods, cloves, and coriander seeds to the pot. Bring to a boil, then reduce heat and simmer for 30 minutes."
95 | },
96 | {
97 | "name": "Strain Broth",
98 | "description": "Strain the broth into a large bowl, discarding the solids. Stir in soy sauce and brown sugar, then return the broth to the pot and keep warm over low heat."
99 | },
100 | {
101 | "name": "Prepare Noodles",
102 | "description": "Cook rice noodles according to package instructions, then drain and set aside."
103 | },
104 | {
105 | "name": "Prepare Vegetables",
106 | "description": "Steam or sauté your choice of vegetables until just tender."
107 | },
108 | {
109 | "name": "Assemble Pho",
110 | "description": "Divide the cooked noodles among 4 serving bowls. Ladle the hot broth over the noodles, then top with cooked vegetables, a squeeze of lime, bean sprouts, fresh herbs, green onions, and jalapeno slices."
111 | },
112 | {
113 | "name": "Serve",
114 | "description": "Serve with sriracha and hoisin sauce on the side for guests to season their pho to taste."
115 | }
116 | ]
117 | },
118 | {
119 | "name": "Argentinian Asado",
120 | "type": "Main Meal",
121 | "image": "images/original/asado.png",
122 | "slug": "asado",
123 | "duration": 240,
124 | "description": "A traditional Argentinian asado featuring various cuts of meat grilled to perfection over a wood or charcoal fire, served with chimichurri sauce.",
125 | "ingredients": {
126 | "Beef short ribs": "4 pounds",
127 | "Pork ribs": "4 pounds",
128 | "Sausages": "2 pounds, e.g., chorizo, morcilla",
129 | "Sweetbreads": "1 pound",
130 | "Chicken": "1, cut into pieces",
131 | "Sea salt": "to taste",
132 | "Wood or charcoal": "for grilling",
133 | "Chimichurri sauce": "to the taste"
134 | },
135 | "steps": [
136 | {
137 | "name": "Prepare Chimichurri Sauce",
138 | "description": "In a small bowl, combine the chopped parsley, oregano, minced garlic, red pepper flakes, red wine vinegar, olive oil, salt, and black pepper. Mix well and set aside."
139 | },
140 | {
141 | "name": "Season Meat",
142 | "description": "Generously season the beef short ribs, pork ribs, sausages, sweetbreads, and chicken pieces with sea salt."
143 | },
144 | {
145 | "name": "Prepare Grill",
146 | "description": "Build a wood or charcoal fire in a grill or fire pit, allowing it to burn down until the coals are glowing red and covered with white ash. Set up a two-zone fire, with one side for direct grilling and the other for indirect cooking."
147 | },
148 | {
149 | "name": "Grill Meat",
150 | "description": "Place the beef short ribs, pork ribs, and sweetbreads over the indirect heat side of the grill. Cook for 1.5-2 hours, turning occasionally, until tender and cooked through.",
151 | "timer": 90
152 | },
153 | {
154 | "name": "Grill Chicken",
155 | "description": "Add the sausages and chicken pieces to the direct heat side of the grill during the last 30-45 minutes of cooking, turning occasionally, until cooked through",
156 | "timer": 30
157 | },
158 | {
159 | "name": "Serve",
160 | "description": "Arrange the grilled meats on a large platter and serve with the chimichurri sauce on the side."
161 | }
162 | ]
163 | },
164 | {
165 | "name": "Southwest Nachos",
166 | "type": "Appetizer",
167 | "slug": "southwest-nachos",
168 | "image": "images/original/southwest-nachos.png",
169 | "duration": 30,
170 | "description": "A delicious and colorful appetizer of nachos loaded with Southwest-inspired flavors, including black beans, corn, tomatoes, and avocado.",
171 | "ingredients": {
172 | "Tortilla chips": "1 large bag",
173 | "Black beans": "1 can (15 ounces), drained and rinsed",
174 | "Frozen corn": "1 cup, thawed",
175 | "Cherry tomatoes": "1 cup, halved",
176 | "Jalapenos": "1-2, sliced",
177 | "Red onion": "1/4 cup, diced",
178 | "Cheddar cheese": "2 cups, shredded",
179 | "Monterey Jack cheese": "2 cups, shredded",
180 | "Avocado": "1, diced",
181 | "Fresh cilantro": "1/4 cup, chopped",
182 | "Sour cream": "for serving",
183 | "Salsa": "for serving"
184 | },
185 | "steps": [
186 | {
187 | "name": "Preheat Oven",
188 | "description": "Preheat your oven to 350°F (175°C)."
189 | },
190 | {
191 | "name": "Assemble Nachos",
192 | "description": "On a large, oven-safe platter or baking sheet, spread out an even layer of tortilla chips. Top with black beans, corn, cherry tomatoes, jalapenos, red onion, and a generous amount of shredded cheddar and Monterey Jack cheese."
193 | },
194 | {
195 | "name": "Bake",
196 | "description": "Bake the nachos in the preheated oven for 10-15 minutes, or until the cheese is melted and bubbly."
197 | },
198 | {
199 | "name": "Garnish",
200 | "description": "Remove the nachos from the oven, and top with diced avocado and chopped fresh cilantro."
201 | },
202 | {
203 | "name": "Serve",
204 | "description": "Serve the Southwest Nachos hot, alongside sour cream and salsa for dipping."
205 | }
206 | ]
207 | },
208 | {
209 | "name": "Calamari and Shrimp Pasta",
210 | "type": "Main Meal",
211 | "slug": "calamari-shrimp-pasta",
212 | "image": "images/original/calamari-and-shrimp-pasta.png",
213 | "duration": 45,
214 | "description": "A delicious and easy-to-make pasta dish featuring tender calamari and shrimp tossed in a flavorful garlic and tomato sauce.",
215 | "ingredients": {
216 | "Olive oil": "2 tablespoons",
217 | "Garlic": "4 cloves, minced",
218 | "Crushed red pepper flakes": "1/4 teaspoon",
219 | "Canned crushed tomatoes": "1 can (28 ounces)",
220 | "White wine": "1/2 cup",
221 | "Salt": "to taste",
222 | "Black pepper": "to taste",
223 | "Calamari": "1 pound, cleaned and sliced into rings",
224 | "Shrimp": "1 pound, peeled and deveined",
225 | "Linguine": "1 pound",
226 | "Fresh parsley": "1/4 cup, chopped",
227 | "Lemon": "1, zested and juiced"
228 | },
229 | "steps": [
230 | {
231 | "name": "Prepare Sauce",
232 | "description": "In a large skillet, heat the olive oil over medium heat. Add the minced garlic and red pepper flakes, and cook until fragrant, about 1 minute. Stir in the crushed tomatoes, white wine, salt, and black pepper. Bring to a simmer, then reduce heat and cook for 20 minutes.",
233 | "timer": 20
234 | },
235 | {
236 | "name": "Cook Pasta",
237 | "description": "Meanwhile, bring a large pot of salted water to a boil. Cook the linguine according to package instructions until al dente, then drain."
238 | },
239 | {
240 | "name": "Add Seafood",
241 | "description": "Stir the calamari and shrimp into the tomato sauce, and cook for 3-4 minutes, or until the shrimp are pink and cooked through and the calamari is tender.",
242 | "timer": 3
243 | },
244 | {
245 | "name": "Toss and Serve",
246 | "description": "Add the cooked linguine to the skillet with the sauce and seafood, and toss to combine. Stir in the chopped parsley, lemon zest, and lemon juice. Serve immediately."
247 | }
248 | ]
249 | },
250 | {
251 | "name": "Dulce de Leche Brownies",
252 | "type": "Dessert",
253 | "slug": "ddl-brownies",
254 | "image": "images/original/ddl-brownies.png",
255 | "duration": 60,
256 | "description": "Rich, fudgy brownies swirled with velvety dulce de leche, creating a decadent and irresistible dessert.",
257 | "ingredients": {
258 | "Unsalted butter": "1 cup (2 sticks)",
259 | "Semisweet chocolate chips": "1 1/2 cups",
260 | "Granulated sugar": "1 1/2 cups",
261 | "Eggs": "4",
262 | "Vanilla extract": "1 teaspoon",
263 | "All-purpose flour": "1 cup",
264 | "Cocoa powder": "1/3 cup",
265 | "Salt": "1/2 teaspoon",
266 | "Dulce de leche": "1 cup"
267 | },
268 | "steps": [
269 | {
270 | "name": "Preheat Oven",
271 | "description": "Preheat your oven to 350°F (175°C). Grease a 9x13-inch baking pan and line with parchment paper, leaving an overhang on two sides."
272 | },
273 | {
274 | "name": "Melt Butter and Chocolate",
275 | "description": "In a large microwave-safe bowl, combine the butter and semisweet chocolate chips. Microwave in 30-second intervals, stirring after each, until completely melted and smooth."
276 | },
277 | {
278 | "name": "Mix Wet Ingredients",
279 | "description": "Add the granulated sugar to the melted chocolate mixture, stirring until combined. Stir in the eggs, one at a time, followed by the vanilla extract."
280 | },
281 | {
282 | "name": "Mix Dry Ingredients",
283 | "description": "In a separate bowl, whisk together the all-purpose flour, cocoa powder, and salt. Gradually add the dry ingredients to the wet ingredients, stirring until just combined."
284 | },
285 | {
286 | "name": "Assemble Brownies",
287 | "description": "Spread half of the brownie batter in the prepared pan. Drop spoonfuls of half the dulce de leche on top, then swirl with a knife. Add the remaining brownie batter, followed by the remaining dulce de leche, swirling again with a knife."
288 | },
289 | {
290 | "name": "Bake",
291 | "description": "Bake the brownies in the preheated oven for 35-40 minutes, or until a toothpick inserted into the center comes out with moist crumbs attached. Do not overbake.",
292 | "timer": 35
293 | },
294 | {
295 | "name": "Cool and Serve",
296 | "description": "Allow the brownies to cool completely in the pan on a wire rack. Use the parchment paper overhang to lift the brownies from the pan, then cut into squares and serve."
297 | }
298 | ]
299 | }
300 | ]
--------------------------------------------------------------------------------
/samples/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "samples",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "samples",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cors": "^2.8.5",
13 | "express": "^4.18.2",
14 | "openai": "^3.2.1"
15 | },
16 | "devDependencies": {
17 | "nodemon": "^2.0.22"
18 | }
19 | },
20 | "node_modules/abbrev": {
21 | "version": "1.1.1",
22 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
23 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
24 | "dev": true
25 | },
26 | "node_modules/accepts": {
27 | "version": "1.3.8",
28 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
29 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
30 | "dependencies": {
31 | "mime-types": "~2.1.34",
32 | "negotiator": "0.6.3"
33 | },
34 | "engines": {
35 | "node": ">= 0.6"
36 | }
37 | },
38 | "node_modules/anymatch": {
39 | "version": "3.1.3",
40 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
41 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
42 | "dev": true,
43 | "dependencies": {
44 | "normalize-path": "^3.0.0",
45 | "picomatch": "^2.0.4"
46 | },
47 | "engines": {
48 | "node": ">= 8"
49 | }
50 | },
51 | "node_modules/array-flatten": {
52 | "version": "1.1.1",
53 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
54 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
55 | },
56 | "node_modules/asynckit": {
57 | "version": "0.4.0",
58 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
59 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
60 | },
61 | "node_modules/axios": {
62 | "version": "0.26.1",
63 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
64 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
65 | "dependencies": {
66 | "follow-redirects": "^1.14.8"
67 | }
68 | },
69 | "node_modules/balanced-match": {
70 | "version": "1.0.2",
71 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
72 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
73 | "dev": true
74 | },
75 | "node_modules/binary-extensions": {
76 | "version": "2.2.0",
77 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
78 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
79 | "dev": true,
80 | "engines": {
81 | "node": ">=8"
82 | }
83 | },
84 | "node_modules/body-parser": {
85 | "version": "1.20.1",
86 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
87 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
88 | "dependencies": {
89 | "bytes": "3.1.2",
90 | "content-type": "~1.0.4",
91 | "debug": "2.6.9",
92 | "depd": "2.0.0",
93 | "destroy": "1.2.0",
94 | "http-errors": "2.0.0",
95 | "iconv-lite": "0.4.24",
96 | "on-finished": "2.4.1",
97 | "qs": "6.11.0",
98 | "raw-body": "2.5.1",
99 | "type-is": "~1.6.18",
100 | "unpipe": "1.0.0"
101 | },
102 | "engines": {
103 | "node": ">= 0.8",
104 | "npm": "1.2.8000 || >= 1.4.16"
105 | }
106 | },
107 | "node_modules/brace-expansion": {
108 | "version": "1.1.11",
109 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
110 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
111 | "dev": true,
112 | "dependencies": {
113 | "balanced-match": "^1.0.0",
114 | "concat-map": "0.0.1"
115 | }
116 | },
117 | "node_modules/braces": {
118 | "version": "3.0.2",
119 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
120 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
121 | "dev": true,
122 | "dependencies": {
123 | "fill-range": "^7.0.1"
124 | },
125 | "engines": {
126 | "node": ">=8"
127 | }
128 | },
129 | "node_modules/bytes": {
130 | "version": "3.1.2",
131 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
132 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
133 | "engines": {
134 | "node": ">= 0.8"
135 | }
136 | },
137 | "node_modules/call-bind": {
138 | "version": "1.0.2",
139 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
140 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
141 | "dependencies": {
142 | "function-bind": "^1.1.1",
143 | "get-intrinsic": "^1.0.2"
144 | },
145 | "funding": {
146 | "url": "https://github.com/sponsors/ljharb"
147 | }
148 | },
149 | "node_modules/chokidar": {
150 | "version": "3.5.3",
151 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
152 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
153 | "dev": true,
154 | "funding": [
155 | {
156 | "type": "individual",
157 | "url": "https://paulmillr.com/funding/"
158 | }
159 | ],
160 | "dependencies": {
161 | "anymatch": "~3.1.2",
162 | "braces": "~3.0.2",
163 | "glob-parent": "~5.1.2",
164 | "is-binary-path": "~2.1.0",
165 | "is-glob": "~4.0.1",
166 | "normalize-path": "~3.0.0",
167 | "readdirp": "~3.6.0"
168 | },
169 | "engines": {
170 | "node": ">= 8.10.0"
171 | },
172 | "optionalDependencies": {
173 | "fsevents": "~2.3.2"
174 | }
175 | },
176 | "node_modules/combined-stream": {
177 | "version": "1.0.8",
178 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
179 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
180 | "dependencies": {
181 | "delayed-stream": "~1.0.0"
182 | },
183 | "engines": {
184 | "node": ">= 0.8"
185 | }
186 | },
187 | "node_modules/concat-map": {
188 | "version": "0.0.1",
189 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
190 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
191 | "dev": true
192 | },
193 | "node_modules/content-disposition": {
194 | "version": "0.5.4",
195 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
196 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
197 | "dependencies": {
198 | "safe-buffer": "5.2.1"
199 | },
200 | "engines": {
201 | "node": ">= 0.6"
202 | }
203 | },
204 | "node_modules/content-type": {
205 | "version": "1.0.5",
206 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
207 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
208 | "engines": {
209 | "node": ">= 0.6"
210 | }
211 | },
212 | "node_modules/cookie": {
213 | "version": "0.5.0",
214 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
215 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
216 | "engines": {
217 | "node": ">= 0.6"
218 | }
219 | },
220 | "node_modules/cookie-signature": {
221 | "version": "1.0.6",
222 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
223 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
224 | },
225 | "node_modules/cors": {
226 | "version": "2.8.5",
227 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
228 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
229 | "dependencies": {
230 | "object-assign": "^4",
231 | "vary": "^1"
232 | },
233 | "engines": {
234 | "node": ">= 0.10"
235 | }
236 | },
237 | "node_modules/debug": {
238 | "version": "2.6.9",
239 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
240 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
241 | "dependencies": {
242 | "ms": "2.0.0"
243 | }
244 | },
245 | "node_modules/delayed-stream": {
246 | "version": "1.0.0",
247 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
248 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
249 | "engines": {
250 | "node": ">=0.4.0"
251 | }
252 | },
253 | "node_modules/depd": {
254 | "version": "2.0.0",
255 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
256 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
257 | "engines": {
258 | "node": ">= 0.8"
259 | }
260 | },
261 | "node_modules/destroy": {
262 | "version": "1.2.0",
263 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
264 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
265 | "engines": {
266 | "node": ">= 0.8",
267 | "npm": "1.2.8000 || >= 1.4.16"
268 | }
269 | },
270 | "node_modules/ee-first": {
271 | "version": "1.1.1",
272 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
273 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
274 | },
275 | "node_modules/encodeurl": {
276 | "version": "1.0.2",
277 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
278 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
279 | "engines": {
280 | "node": ">= 0.8"
281 | }
282 | },
283 | "node_modules/escape-html": {
284 | "version": "1.0.3",
285 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
286 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
287 | },
288 | "node_modules/etag": {
289 | "version": "1.8.1",
290 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
291 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
292 | "engines": {
293 | "node": ">= 0.6"
294 | }
295 | },
296 | "node_modules/express": {
297 | "version": "4.18.2",
298 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
299 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
300 | "dependencies": {
301 | "accepts": "~1.3.8",
302 | "array-flatten": "1.1.1",
303 | "body-parser": "1.20.1",
304 | "content-disposition": "0.5.4",
305 | "content-type": "~1.0.4",
306 | "cookie": "0.5.0",
307 | "cookie-signature": "1.0.6",
308 | "debug": "2.6.9",
309 | "depd": "2.0.0",
310 | "encodeurl": "~1.0.2",
311 | "escape-html": "~1.0.3",
312 | "etag": "~1.8.1",
313 | "finalhandler": "1.2.0",
314 | "fresh": "0.5.2",
315 | "http-errors": "2.0.0",
316 | "merge-descriptors": "1.0.1",
317 | "methods": "~1.1.2",
318 | "on-finished": "2.4.1",
319 | "parseurl": "~1.3.3",
320 | "path-to-regexp": "0.1.7",
321 | "proxy-addr": "~2.0.7",
322 | "qs": "6.11.0",
323 | "range-parser": "~1.2.1",
324 | "safe-buffer": "5.2.1",
325 | "send": "0.18.0",
326 | "serve-static": "1.15.0",
327 | "setprototypeof": "1.2.0",
328 | "statuses": "2.0.1",
329 | "type-is": "~1.6.18",
330 | "utils-merge": "1.0.1",
331 | "vary": "~1.1.2"
332 | },
333 | "engines": {
334 | "node": ">= 0.10.0"
335 | }
336 | },
337 | "node_modules/fill-range": {
338 | "version": "7.0.1",
339 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
340 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
341 | "dev": true,
342 | "dependencies": {
343 | "to-regex-range": "^5.0.1"
344 | },
345 | "engines": {
346 | "node": ">=8"
347 | }
348 | },
349 | "node_modules/finalhandler": {
350 | "version": "1.2.0",
351 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
352 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
353 | "dependencies": {
354 | "debug": "2.6.9",
355 | "encodeurl": "~1.0.2",
356 | "escape-html": "~1.0.3",
357 | "on-finished": "2.4.1",
358 | "parseurl": "~1.3.3",
359 | "statuses": "2.0.1",
360 | "unpipe": "~1.0.0"
361 | },
362 | "engines": {
363 | "node": ">= 0.8"
364 | }
365 | },
366 | "node_modules/follow-redirects": {
367 | "version": "1.15.2",
368 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
369 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
370 | "funding": [
371 | {
372 | "type": "individual",
373 | "url": "https://github.com/sponsors/RubenVerborgh"
374 | }
375 | ],
376 | "engines": {
377 | "node": ">=4.0"
378 | },
379 | "peerDependenciesMeta": {
380 | "debug": {
381 | "optional": true
382 | }
383 | }
384 | },
385 | "node_modules/form-data": {
386 | "version": "4.0.0",
387 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
388 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
389 | "dependencies": {
390 | "asynckit": "^0.4.0",
391 | "combined-stream": "^1.0.8",
392 | "mime-types": "^2.1.12"
393 | },
394 | "engines": {
395 | "node": ">= 6"
396 | }
397 | },
398 | "node_modules/forwarded": {
399 | "version": "0.2.0",
400 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
401 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
402 | "engines": {
403 | "node": ">= 0.6"
404 | }
405 | },
406 | "node_modules/fresh": {
407 | "version": "0.5.2",
408 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
409 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
410 | "engines": {
411 | "node": ">= 0.6"
412 | }
413 | },
414 | "node_modules/fsevents": {
415 | "version": "2.3.2",
416 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
417 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
418 | "dev": true,
419 | "hasInstallScript": true,
420 | "optional": true,
421 | "os": [
422 | "darwin"
423 | ],
424 | "engines": {
425 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
426 | }
427 | },
428 | "node_modules/function-bind": {
429 | "version": "1.1.1",
430 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
431 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
432 | },
433 | "node_modules/get-intrinsic": {
434 | "version": "1.2.0",
435 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
436 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
437 | "dependencies": {
438 | "function-bind": "^1.1.1",
439 | "has": "^1.0.3",
440 | "has-symbols": "^1.0.3"
441 | },
442 | "funding": {
443 | "url": "https://github.com/sponsors/ljharb"
444 | }
445 | },
446 | "node_modules/glob-parent": {
447 | "version": "5.1.2",
448 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
449 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
450 | "dev": true,
451 | "dependencies": {
452 | "is-glob": "^4.0.1"
453 | },
454 | "engines": {
455 | "node": ">= 6"
456 | }
457 | },
458 | "node_modules/has": {
459 | "version": "1.0.3",
460 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
461 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
462 | "dependencies": {
463 | "function-bind": "^1.1.1"
464 | },
465 | "engines": {
466 | "node": ">= 0.4.0"
467 | }
468 | },
469 | "node_modules/has-flag": {
470 | "version": "3.0.0",
471 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
472 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
473 | "dev": true,
474 | "engines": {
475 | "node": ">=4"
476 | }
477 | },
478 | "node_modules/has-symbols": {
479 | "version": "1.0.3",
480 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
481 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
482 | "engines": {
483 | "node": ">= 0.4"
484 | },
485 | "funding": {
486 | "url": "https://github.com/sponsors/ljharb"
487 | }
488 | },
489 | "node_modules/http-errors": {
490 | "version": "2.0.0",
491 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
492 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
493 | "dependencies": {
494 | "depd": "2.0.0",
495 | "inherits": "2.0.4",
496 | "setprototypeof": "1.2.0",
497 | "statuses": "2.0.1",
498 | "toidentifier": "1.0.1"
499 | },
500 | "engines": {
501 | "node": ">= 0.8"
502 | }
503 | },
504 | "node_modules/iconv-lite": {
505 | "version": "0.4.24",
506 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
507 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
508 | "dependencies": {
509 | "safer-buffer": ">= 2.1.2 < 3"
510 | },
511 | "engines": {
512 | "node": ">=0.10.0"
513 | }
514 | },
515 | "node_modules/ignore-by-default": {
516 | "version": "1.0.1",
517 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
518 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
519 | "dev": true
520 | },
521 | "node_modules/inherits": {
522 | "version": "2.0.4",
523 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
524 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
525 | },
526 | "node_modules/ipaddr.js": {
527 | "version": "1.9.1",
528 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
529 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
530 | "engines": {
531 | "node": ">= 0.10"
532 | }
533 | },
534 | "node_modules/is-binary-path": {
535 | "version": "2.1.0",
536 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
537 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
538 | "dev": true,
539 | "dependencies": {
540 | "binary-extensions": "^2.0.0"
541 | },
542 | "engines": {
543 | "node": ">=8"
544 | }
545 | },
546 | "node_modules/is-extglob": {
547 | "version": "2.1.1",
548 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
549 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
550 | "dev": true,
551 | "engines": {
552 | "node": ">=0.10.0"
553 | }
554 | },
555 | "node_modules/is-glob": {
556 | "version": "4.0.3",
557 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
558 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
559 | "dev": true,
560 | "dependencies": {
561 | "is-extglob": "^2.1.1"
562 | },
563 | "engines": {
564 | "node": ">=0.10.0"
565 | }
566 | },
567 | "node_modules/is-number": {
568 | "version": "7.0.0",
569 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
570 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
571 | "dev": true,
572 | "engines": {
573 | "node": ">=0.12.0"
574 | }
575 | },
576 | "node_modules/media-typer": {
577 | "version": "0.3.0",
578 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
579 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
580 | "engines": {
581 | "node": ">= 0.6"
582 | }
583 | },
584 | "node_modules/merge-descriptors": {
585 | "version": "1.0.1",
586 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
587 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
588 | },
589 | "node_modules/methods": {
590 | "version": "1.1.2",
591 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
592 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
593 | "engines": {
594 | "node": ">= 0.6"
595 | }
596 | },
597 | "node_modules/mime": {
598 | "version": "1.6.0",
599 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
600 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
601 | "bin": {
602 | "mime": "cli.js"
603 | },
604 | "engines": {
605 | "node": ">=4"
606 | }
607 | },
608 | "node_modules/mime-db": {
609 | "version": "1.52.0",
610 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
611 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
612 | "engines": {
613 | "node": ">= 0.6"
614 | }
615 | },
616 | "node_modules/mime-types": {
617 | "version": "2.1.35",
618 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
619 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
620 | "dependencies": {
621 | "mime-db": "1.52.0"
622 | },
623 | "engines": {
624 | "node": ">= 0.6"
625 | }
626 | },
627 | "node_modules/minimatch": {
628 | "version": "3.1.2",
629 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
630 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
631 | "dev": true,
632 | "dependencies": {
633 | "brace-expansion": "^1.1.7"
634 | },
635 | "engines": {
636 | "node": "*"
637 | }
638 | },
639 | "node_modules/ms": {
640 | "version": "2.0.0",
641 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
642 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
643 | },
644 | "node_modules/negotiator": {
645 | "version": "0.6.3",
646 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
647 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
648 | "engines": {
649 | "node": ">= 0.6"
650 | }
651 | },
652 | "node_modules/nodemon": {
653 | "version": "2.0.22",
654 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
655 | "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
656 | "dev": true,
657 | "dependencies": {
658 | "chokidar": "^3.5.2",
659 | "debug": "^3.2.7",
660 | "ignore-by-default": "^1.0.1",
661 | "minimatch": "^3.1.2",
662 | "pstree.remy": "^1.1.8",
663 | "semver": "^5.7.1",
664 | "simple-update-notifier": "^1.0.7",
665 | "supports-color": "^5.5.0",
666 | "touch": "^3.1.0",
667 | "undefsafe": "^2.0.5"
668 | },
669 | "bin": {
670 | "nodemon": "bin/nodemon.js"
671 | },
672 | "engines": {
673 | "node": ">=8.10.0"
674 | },
675 | "funding": {
676 | "type": "opencollective",
677 | "url": "https://opencollective.com/nodemon"
678 | }
679 | },
680 | "node_modules/nodemon/node_modules/debug": {
681 | "version": "3.2.7",
682 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
683 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
684 | "dev": true,
685 | "dependencies": {
686 | "ms": "^2.1.1"
687 | }
688 | },
689 | "node_modules/nodemon/node_modules/ms": {
690 | "version": "2.1.3",
691 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
692 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
693 | "dev": true
694 | },
695 | "node_modules/nopt": {
696 | "version": "1.0.10",
697 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
698 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
699 | "dev": true,
700 | "dependencies": {
701 | "abbrev": "1"
702 | },
703 | "bin": {
704 | "nopt": "bin/nopt.js"
705 | },
706 | "engines": {
707 | "node": "*"
708 | }
709 | },
710 | "node_modules/normalize-path": {
711 | "version": "3.0.0",
712 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
713 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
714 | "dev": true,
715 | "engines": {
716 | "node": ">=0.10.0"
717 | }
718 | },
719 | "node_modules/object-assign": {
720 | "version": "4.1.1",
721 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
722 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
723 | "engines": {
724 | "node": ">=0.10.0"
725 | }
726 | },
727 | "node_modules/object-inspect": {
728 | "version": "1.12.3",
729 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
730 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
731 | "funding": {
732 | "url": "https://github.com/sponsors/ljharb"
733 | }
734 | },
735 | "node_modules/on-finished": {
736 | "version": "2.4.1",
737 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
738 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
739 | "dependencies": {
740 | "ee-first": "1.1.1"
741 | },
742 | "engines": {
743 | "node": ">= 0.8"
744 | }
745 | },
746 | "node_modules/openai": {
747 | "version": "3.2.1",
748 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz",
749 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==",
750 | "dependencies": {
751 | "axios": "^0.26.0",
752 | "form-data": "^4.0.0"
753 | }
754 | },
755 | "node_modules/parseurl": {
756 | "version": "1.3.3",
757 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
758 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
759 | "engines": {
760 | "node": ">= 0.8"
761 | }
762 | },
763 | "node_modules/path-to-regexp": {
764 | "version": "0.1.7",
765 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
766 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
767 | },
768 | "node_modules/picomatch": {
769 | "version": "2.3.1",
770 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
771 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
772 | "dev": true,
773 | "engines": {
774 | "node": ">=8.6"
775 | },
776 | "funding": {
777 | "url": "https://github.com/sponsors/jonschlinkert"
778 | }
779 | },
780 | "node_modules/proxy-addr": {
781 | "version": "2.0.7",
782 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
783 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
784 | "dependencies": {
785 | "forwarded": "0.2.0",
786 | "ipaddr.js": "1.9.1"
787 | },
788 | "engines": {
789 | "node": ">= 0.10"
790 | }
791 | },
792 | "node_modules/pstree.remy": {
793 | "version": "1.1.8",
794 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
795 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
796 | "dev": true
797 | },
798 | "node_modules/qs": {
799 | "version": "6.11.0",
800 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
801 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
802 | "dependencies": {
803 | "side-channel": "^1.0.4"
804 | },
805 | "engines": {
806 | "node": ">=0.6"
807 | },
808 | "funding": {
809 | "url": "https://github.com/sponsors/ljharb"
810 | }
811 | },
812 | "node_modules/range-parser": {
813 | "version": "1.2.1",
814 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
815 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
816 | "engines": {
817 | "node": ">= 0.6"
818 | }
819 | },
820 | "node_modules/raw-body": {
821 | "version": "2.5.1",
822 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
823 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
824 | "dependencies": {
825 | "bytes": "3.1.2",
826 | "http-errors": "2.0.0",
827 | "iconv-lite": "0.4.24",
828 | "unpipe": "1.0.0"
829 | },
830 | "engines": {
831 | "node": ">= 0.8"
832 | }
833 | },
834 | "node_modules/readdirp": {
835 | "version": "3.6.0",
836 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
837 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
838 | "dev": true,
839 | "dependencies": {
840 | "picomatch": "^2.2.1"
841 | },
842 | "engines": {
843 | "node": ">=8.10.0"
844 | }
845 | },
846 | "node_modules/safe-buffer": {
847 | "version": "5.2.1",
848 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
849 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
850 | "funding": [
851 | {
852 | "type": "github",
853 | "url": "https://github.com/sponsors/feross"
854 | },
855 | {
856 | "type": "patreon",
857 | "url": "https://www.patreon.com/feross"
858 | },
859 | {
860 | "type": "consulting",
861 | "url": "https://feross.org/support"
862 | }
863 | ]
864 | },
865 | "node_modules/safer-buffer": {
866 | "version": "2.1.2",
867 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
868 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
869 | },
870 | "node_modules/semver": {
871 | "version": "5.7.1",
872 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
873 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
874 | "dev": true,
875 | "bin": {
876 | "semver": "bin/semver"
877 | }
878 | },
879 | "node_modules/send": {
880 | "version": "0.18.0",
881 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
882 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
883 | "dependencies": {
884 | "debug": "2.6.9",
885 | "depd": "2.0.0",
886 | "destroy": "1.2.0",
887 | "encodeurl": "~1.0.2",
888 | "escape-html": "~1.0.3",
889 | "etag": "~1.8.1",
890 | "fresh": "0.5.2",
891 | "http-errors": "2.0.0",
892 | "mime": "1.6.0",
893 | "ms": "2.1.3",
894 | "on-finished": "2.4.1",
895 | "range-parser": "~1.2.1",
896 | "statuses": "2.0.1"
897 | },
898 | "engines": {
899 | "node": ">= 0.8.0"
900 | }
901 | },
902 | "node_modules/send/node_modules/ms": {
903 | "version": "2.1.3",
904 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
905 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
906 | },
907 | "node_modules/serve-static": {
908 | "version": "1.15.0",
909 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
910 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
911 | "dependencies": {
912 | "encodeurl": "~1.0.2",
913 | "escape-html": "~1.0.3",
914 | "parseurl": "~1.3.3",
915 | "send": "0.18.0"
916 | },
917 | "engines": {
918 | "node": ">= 0.8.0"
919 | }
920 | },
921 | "node_modules/setprototypeof": {
922 | "version": "1.2.0",
923 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
924 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
925 | },
926 | "node_modules/side-channel": {
927 | "version": "1.0.4",
928 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
929 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
930 | "dependencies": {
931 | "call-bind": "^1.0.0",
932 | "get-intrinsic": "^1.0.2",
933 | "object-inspect": "^1.9.0"
934 | },
935 | "funding": {
936 | "url": "https://github.com/sponsors/ljharb"
937 | }
938 | },
939 | "node_modules/simple-update-notifier": {
940 | "version": "1.1.0",
941 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
942 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
943 | "dev": true,
944 | "dependencies": {
945 | "semver": "~7.0.0"
946 | },
947 | "engines": {
948 | "node": ">=8.10.0"
949 | }
950 | },
951 | "node_modules/simple-update-notifier/node_modules/semver": {
952 | "version": "7.0.0",
953 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
954 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
955 | "dev": true,
956 | "bin": {
957 | "semver": "bin/semver.js"
958 | }
959 | },
960 | "node_modules/statuses": {
961 | "version": "2.0.1",
962 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
963 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
964 | "engines": {
965 | "node": ">= 0.8"
966 | }
967 | },
968 | "node_modules/supports-color": {
969 | "version": "5.5.0",
970 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
971 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
972 | "dev": true,
973 | "dependencies": {
974 | "has-flag": "^3.0.0"
975 | },
976 | "engines": {
977 | "node": ">=4"
978 | }
979 | },
980 | "node_modules/to-regex-range": {
981 | "version": "5.0.1",
982 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
983 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
984 | "dev": true,
985 | "dependencies": {
986 | "is-number": "^7.0.0"
987 | },
988 | "engines": {
989 | "node": ">=8.0"
990 | }
991 | },
992 | "node_modules/toidentifier": {
993 | "version": "1.0.1",
994 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
995 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
996 | "engines": {
997 | "node": ">=0.6"
998 | }
999 | },
1000 | "node_modules/touch": {
1001 | "version": "3.1.0",
1002 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1003 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1004 | "dev": true,
1005 | "dependencies": {
1006 | "nopt": "~1.0.10"
1007 | },
1008 | "bin": {
1009 | "nodetouch": "bin/nodetouch.js"
1010 | }
1011 | },
1012 | "node_modules/type-is": {
1013 | "version": "1.6.18",
1014 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1015 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1016 | "dependencies": {
1017 | "media-typer": "0.3.0",
1018 | "mime-types": "~2.1.24"
1019 | },
1020 | "engines": {
1021 | "node": ">= 0.6"
1022 | }
1023 | },
1024 | "node_modules/undefsafe": {
1025 | "version": "2.0.5",
1026 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1027 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1028 | "dev": true
1029 | },
1030 | "node_modules/unpipe": {
1031 | "version": "1.0.0",
1032 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1033 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1034 | "engines": {
1035 | "node": ">= 0.8"
1036 | }
1037 | },
1038 | "node_modules/utils-merge": {
1039 | "version": "1.0.1",
1040 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1041 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1042 | "engines": {
1043 | "node": ">= 0.4.0"
1044 | }
1045 | },
1046 | "node_modules/vary": {
1047 | "version": "1.1.2",
1048 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1049 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1050 | "engines": {
1051 | "node": ">= 0.8"
1052 | }
1053 | }
1054 | },
1055 | "dependencies": {
1056 | "abbrev": {
1057 | "version": "1.1.1",
1058 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1059 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
1060 | "dev": true
1061 | },
1062 | "accepts": {
1063 | "version": "1.3.8",
1064 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1065 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1066 | "requires": {
1067 | "mime-types": "~2.1.34",
1068 | "negotiator": "0.6.3"
1069 | }
1070 | },
1071 | "anymatch": {
1072 | "version": "3.1.3",
1073 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1074 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1075 | "dev": true,
1076 | "requires": {
1077 | "normalize-path": "^3.0.0",
1078 | "picomatch": "^2.0.4"
1079 | }
1080 | },
1081 | "array-flatten": {
1082 | "version": "1.1.1",
1083 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1084 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1085 | },
1086 | "asynckit": {
1087 | "version": "0.4.0",
1088 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1089 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
1090 | },
1091 | "axios": {
1092 | "version": "0.26.1",
1093 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
1094 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
1095 | "requires": {
1096 | "follow-redirects": "^1.14.8"
1097 | }
1098 | },
1099 | "balanced-match": {
1100 | "version": "1.0.2",
1101 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1102 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1103 | "dev": true
1104 | },
1105 | "binary-extensions": {
1106 | "version": "2.2.0",
1107 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1108 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
1109 | "dev": true
1110 | },
1111 | "body-parser": {
1112 | "version": "1.20.1",
1113 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
1114 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
1115 | "requires": {
1116 | "bytes": "3.1.2",
1117 | "content-type": "~1.0.4",
1118 | "debug": "2.6.9",
1119 | "depd": "2.0.0",
1120 | "destroy": "1.2.0",
1121 | "http-errors": "2.0.0",
1122 | "iconv-lite": "0.4.24",
1123 | "on-finished": "2.4.1",
1124 | "qs": "6.11.0",
1125 | "raw-body": "2.5.1",
1126 | "type-is": "~1.6.18",
1127 | "unpipe": "1.0.0"
1128 | }
1129 | },
1130 | "brace-expansion": {
1131 | "version": "1.1.11",
1132 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1133 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1134 | "dev": true,
1135 | "requires": {
1136 | "balanced-match": "^1.0.0",
1137 | "concat-map": "0.0.1"
1138 | }
1139 | },
1140 | "braces": {
1141 | "version": "3.0.2",
1142 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1143 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1144 | "dev": true,
1145 | "requires": {
1146 | "fill-range": "^7.0.1"
1147 | }
1148 | },
1149 | "bytes": {
1150 | "version": "3.1.2",
1151 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
1152 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
1153 | },
1154 | "call-bind": {
1155 | "version": "1.0.2",
1156 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
1157 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1158 | "requires": {
1159 | "function-bind": "^1.1.1",
1160 | "get-intrinsic": "^1.0.2"
1161 | }
1162 | },
1163 | "chokidar": {
1164 | "version": "3.5.3",
1165 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1166 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1167 | "dev": true,
1168 | "requires": {
1169 | "anymatch": "~3.1.2",
1170 | "braces": "~3.0.2",
1171 | "fsevents": "~2.3.2",
1172 | "glob-parent": "~5.1.2",
1173 | "is-binary-path": "~2.1.0",
1174 | "is-glob": "~4.0.1",
1175 | "normalize-path": "~3.0.0",
1176 | "readdirp": "~3.6.0"
1177 | }
1178 | },
1179 | "combined-stream": {
1180 | "version": "1.0.8",
1181 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1182 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1183 | "requires": {
1184 | "delayed-stream": "~1.0.0"
1185 | }
1186 | },
1187 | "concat-map": {
1188 | "version": "0.0.1",
1189 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1190 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1191 | "dev": true
1192 | },
1193 | "content-disposition": {
1194 | "version": "0.5.4",
1195 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
1196 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1197 | "requires": {
1198 | "safe-buffer": "5.2.1"
1199 | }
1200 | },
1201 | "content-type": {
1202 | "version": "1.0.5",
1203 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
1204 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
1205 | },
1206 | "cookie": {
1207 | "version": "0.5.0",
1208 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1209 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1210 | },
1211 | "cookie-signature": {
1212 | "version": "1.0.6",
1213 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1214 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1215 | },
1216 | "cors": {
1217 | "version": "2.8.5",
1218 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
1219 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
1220 | "requires": {
1221 | "object-assign": "^4",
1222 | "vary": "^1"
1223 | }
1224 | },
1225 | "debug": {
1226 | "version": "2.6.9",
1227 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1228 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1229 | "requires": {
1230 | "ms": "2.0.0"
1231 | }
1232 | },
1233 | "delayed-stream": {
1234 | "version": "1.0.0",
1235 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1236 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
1237 | },
1238 | "depd": {
1239 | "version": "2.0.0",
1240 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1241 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1242 | },
1243 | "destroy": {
1244 | "version": "1.2.0",
1245 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
1246 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1247 | },
1248 | "ee-first": {
1249 | "version": "1.1.1",
1250 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1251 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
1252 | },
1253 | "encodeurl": {
1254 | "version": "1.0.2",
1255 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1256 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1257 | },
1258 | "escape-html": {
1259 | "version": "1.0.3",
1260 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1261 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1262 | },
1263 | "etag": {
1264 | "version": "1.8.1",
1265 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1266 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1267 | },
1268 | "express": {
1269 | "version": "4.18.2",
1270 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
1271 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
1272 | "requires": {
1273 | "accepts": "~1.3.8",
1274 | "array-flatten": "1.1.1",
1275 | "body-parser": "1.20.1",
1276 | "content-disposition": "0.5.4",
1277 | "content-type": "~1.0.4",
1278 | "cookie": "0.5.0",
1279 | "cookie-signature": "1.0.6",
1280 | "debug": "2.6.9",
1281 | "depd": "2.0.0",
1282 | "encodeurl": "~1.0.2",
1283 | "escape-html": "~1.0.3",
1284 | "etag": "~1.8.1",
1285 | "finalhandler": "1.2.0",
1286 | "fresh": "0.5.2",
1287 | "http-errors": "2.0.0",
1288 | "merge-descriptors": "1.0.1",
1289 | "methods": "~1.1.2",
1290 | "on-finished": "2.4.1",
1291 | "parseurl": "~1.3.3",
1292 | "path-to-regexp": "0.1.7",
1293 | "proxy-addr": "~2.0.7",
1294 | "qs": "6.11.0",
1295 | "range-parser": "~1.2.1",
1296 | "safe-buffer": "5.2.1",
1297 | "send": "0.18.0",
1298 | "serve-static": "1.15.0",
1299 | "setprototypeof": "1.2.0",
1300 | "statuses": "2.0.1",
1301 | "type-is": "~1.6.18",
1302 | "utils-merge": "1.0.1",
1303 | "vary": "~1.1.2"
1304 | }
1305 | },
1306 | "fill-range": {
1307 | "version": "7.0.1",
1308 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1309 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1310 | "dev": true,
1311 | "requires": {
1312 | "to-regex-range": "^5.0.1"
1313 | }
1314 | },
1315 | "finalhandler": {
1316 | "version": "1.2.0",
1317 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1318 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1319 | "requires": {
1320 | "debug": "2.6.9",
1321 | "encodeurl": "~1.0.2",
1322 | "escape-html": "~1.0.3",
1323 | "on-finished": "2.4.1",
1324 | "parseurl": "~1.3.3",
1325 | "statuses": "2.0.1",
1326 | "unpipe": "~1.0.0"
1327 | }
1328 | },
1329 | "follow-redirects": {
1330 | "version": "1.15.2",
1331 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
1332 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
1333 | },
1334 | "form-data": {
1335 | "version": "4.0.0",
1336 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1337 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1338 | "requires": {
1339 | "asynckit": "^0.4.0",
1340 | "combined-stream": "^1.0.8",
1341 | "mime-types": "^2.1.12"
1342 | }
1343 | },
1344 | "forwarded": {
1345 | "version": "0.2.0",
1346 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1347 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1348 | },
1349 | "fresh": {
1350 | "version": "0.5.2",
1351 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1352 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1353 | },
1354 | "fsevents": {
1355 | "version": "2.3.2",
1356 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1357 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1358 | "dev": true,
1359 | "optional": true
1360 | },
1361 | "function-bind": {
1362 | "version": "1.1.1",
1363 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1364 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1365 | },
1366 | "get-intrinsic": {
1367 | "version": "1.2.0",
1368 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
1369 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
1370 | "requires": {
1371 | "function-bind": "^1.1.1",
1372 | "has": "^1.0.3",
1373 | "has-symbols": "^1.0.3"
1374 | }
1375 | },
1376 | "glob-parent": {
1377 | "version": "5.1.2",
1378 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1379 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1380 | "dev": true,
1381 | "requires": {
1382 | "is-glob": "^4.0.1"
1383 | }
1384 | },
1385 | "has": {
1386 | "version": "1.0.3",
1387 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1388 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1389 | "requires": {
1390 | "function-bind": "^1.1.1"
1391 | }
1392 | },
1393 | "has-flag": {
1394 | "version": "3.0.0",
1395 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1396 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
1397 | "dev": true
1398 | },
1399 | "has-symbols": {
1400 | "version": "1.0.3",
1401 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1402 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1403 | },
1404 | "http-errors": {
1405 | "version": "2.0.0",
1406 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1407 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1408 | "requires": {
1409 | "depd": "2.0.0",
1410 | "inherits": "2.0.4",
1411 | "setprototypeof": "1.2.0",
1412 | "statuses": "2.0.1",
1413 | "toidentifier": "1.0.1"
1414 | }
1415 | },
1416 | "iconv-lite": {
1417 | "version": "0.4.24",
1418 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1419 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1420 | "requires": {
1421 | "safer-buffer": ">= 2.1.2 < 3"
1422 | }
1423 | },
1424 | "ignore-by-default": {
1425 | "version": "1.0.1",
1426 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1427 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
1428 | "dev": true
1429 | },
1430 | "inherits": {
1431 | "version": "2.0.4",
1432 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1433 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1434 | },
1435 | "ipaddr.js": {
1436 | "version": "1.9.1",
1437 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1438 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1439 | },
1440 | "is-binary-path": {
1441 | "version": "2.1.0",
1442 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1443 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1444 | "dev": true,
1445 | "requires": {
1446 | "binary-extensions": "^2.0.0"
1447 | }
1448 | },
1449 | "is-extglob": {
1450 | "version": "2.1.1",
1451 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1452 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1453 | "dev": true
1454 | },
1455 | "is-glob": {
1456 | "version": "4.0.3",
1457 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1458 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1459 | "dev": true,
1460 | "requires": {
1461 | "is-extglob": "^2.1.1"
1462 | }
1463 | },
1464 | "is-number": {
1465 | "version": "7.0.0",
1466 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1467 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1468 | "dev": true
1469 | },
1470 | "media-typer": {
1471 | "version": "0.3.0",
1472 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1473 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1474 | },
1475 | "merge-descriptors": {
1476 | "version": "1.0.1",
1477 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1478 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1479 | },
1480 | "methods": {
1481 | "version": "1.1.2",
1482 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1483 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1484 | },
1485 | "mime": {
1486 | "version": "1.6.0",
1487 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1488 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1489 | },
1490 | "mime-db": {
1491 | "version": "1.52.0",
1492 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1493 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1494 | },
1495 | "mime-types": {
1496 | "version": "2.1.35",
1497 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1498 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1499 | "requires": {
1500 | "mime-db": "1.52.0"
1501 | }
1502 | },
1503 | "minimatch": {
1504 | "version": "3.1.2",
1505 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1506 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1507 | "dev": true,
1508 | "requires": {
1509 | "brace-expansion": "^1.1.7"
1510 | }
1511 | },
1512 | "ms": {
1513 | "version": "2.0.0",
1514 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1515 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1516 | },
1517 | "negotiator": {
1518 | "version": "0.6.3",
1519 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1520 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1521 | },
1522 | "nodemon": {
1523 | "version": "2.0.22",
1524 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
1525 | "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
1526 | "dev": true,
1527 | "requires": {
1528 | "chokidar": "^3.5.2",
1529 | "debug": "^3.2.7",
1530 | "ignore-by-default": "^1.0.1",
1531 | "minimatch": "^3.1.2",
1532 | "pstree.remy": "^1.1.8",
1533 | "semver": "^5.7.1",
1534 | "simple-update-notifier": "^1.0.7",
1535 | "supports-color": "^5.5.0",
1536 | "touch": "^3.1.0",
1537 | "undefsafe": "^2.0.5"
1538 | },
1539 | "dependencies": {
1540 | "debug": {
1541 | "version": "3.2.7",
1542 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1543 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1544 | "dev": true,
1545 | "requires": {
1546 | "ms": "^2.1.1"
1547 | }
1548 | },
1549 | "ms": {
1550 | "version": "2.1.3",
1551 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1552 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1553 | "dev": true
1554 | }
1555 | }
1556 | },
1557 | "nopt": {
1558 | "version": "1.0.10",
1559 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1560 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1561 | "dev": true,
1562 | "requires": {
1563 | "abbrev": "1"
1564 | }
1565 | },
1566 | "normalize-path": {
1567 | "version": "3.0.0",
1568 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1569 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1570 | "dev": true
1571 | },
1572 | "object-assign": {
1573 | "version": "4.1.1",
1574 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1575 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
1576 | },
1577 | "object-inspect": {
1578 | "version": "1.12.3",
1579 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1580 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
1581 | },
1582 | "on-finished": {
1583 | "version": "2.4.1",
1584 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1585 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1586 | "requires": {
1587 | "ee-first": "1.1.1"
1588 | }
1589 | },
1590 | "openai": {
1591 | "version": "3.2.1",
1592 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz",
1593 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==",
1594 | "requires": {
1595 | "axios": "^0.26.0",
1596 | "form-data": "^4.0.0"
1597 | }
1598 | },
1599 | "parseurl": {
1600 | "version": "1.3.3",
1601 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1602 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1603 | },
1604 | "path-to-regexp": {
1605 | "version": "0.1.7",
1606 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1607 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1608 | },
1609 | "picomatch": {
1610 | "version": "2.3.1",
1611 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1612 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1613 | "dev": true
1614 | },
1615 | "proxy-addr": {
1616 | "version": "2.0.7",
1617 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1618 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1619 | "requires": {
1620 | "forwarded": "0.2.0",
1621 | "ipaddr.js": "1.9.1"
1622 | }
1623 | },
1624 | "pstree.remy": {
1625 | "version": "1.1.8",
1626 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1627 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1628 | "dev": true
1629 | },
1630 | "qs": {
1631 | "version": "6.11.0",
1632 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1633 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1634 | "requires": {
1635 | "side-channel": "^1.0.4"
1636 | }
1637 | },
1638 | "range-parser": {
1639 | "version": "1.2.1",
1640 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1641 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1642 | },
1643 | "raw-body": {
1644 | "version": "2.5.1",
1645 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1646 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1647 | "requires": {
1648 | "bytes": "3.1.2",
1649 | "http-errors": "2.0.0",
1650 | "iconv-lite": "0.4.24",
1651 | "unpipe": "1.0.0"
1652 | }
1653 | },
1654 | "readdirp": {
1655 | "version": "3.6.0",
1656 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1657 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1658 | "dev": true,
1659 | "requires": {
1660 | "picomatch": "^2.2.1"
1661 | }
1662 | },
1663 | "safe-buffer": {
1664 | "version": "5.2.1",
1665 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1666 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1667 | },
1668 | "safer-buffer": {
1669 | "version": "2.1.2",
1670 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1671 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1672 | },
1673 | "semver": {
1674 | "version": "5.7.1",
1675 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1676 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1677 | "dev": true
1678 | },
1679 | "send": {
1680 | "version": "0.18.0",
1681 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1682 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1683 | "requires": {
1684 | "debug": "2.6.9",
1685 | "depd": "2.0.0",
1686 | "destroy": "1.2.0",
1687 | "encodeurl": "~1.0.2",
1688 | "escape-html": "~1.0.3",
1689 | "etag": "~1.8.1",
1690 | "fresh": "0.5.2",
1691 | "http-errors": "2.0.0",
1692 | "mime": "1.6.0",
1693 | "ms": "2.1.3",
1694 | "on-finished": "2.4.1",
1695 | "range-parser": "~1.2.1",
1696 | "statuses": "2.0.1"
1697 | },
1698 | "dependencies": {
1699 | "ms": {
1700 | "version": "2.1.3",
1701 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1702 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1703 | }
1704 | }
1705 | },
1706 | "serve-static": {
1707 | "version": "1.15.0",
1708 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1709 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1710 | "requires": {
1711 | "encodeurl": "~1.0.2",
1712 | "escape-html": "~1.0.3",
1713 | "parseurl": "~1.3.3",
1714 | "send": "0.18.0"
1715 | }
1716 | },
1717 | "setprototypeof": {
1718 | "version": "1.2.0",
1719 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1720 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1721 | },
1722 | "side-channel": {
1723 | "version": "1.0.4",
1724 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1725 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1726 | "requires": {
1727 | "call-bind": "^1.0.0",
1728 | "get-intrinsic": "^1.0.2",
1729 | "object-inspect": "^1.9.0"
1730 | }
1731 | },
1732 | "simple-update-notifier": {
1733 | "version": "1.1.0",
1734 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
1735 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
1736 | "dev": true,
1737 | "requires": {
1738 | "semver": "~7.0.0"
1739 | },
1740 | "dependencies": {
1741 | "semver": {
1742 | "version": "7.0.0",
1743 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
1744 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
1745 | "dev": true
1746 | }
1747 | }
1748 | },
1749 | "statuses": {
1750 | "version": "2.0.1",
1751 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1752 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1753 | },
1754 | "supports-color": {
1755 | "version": "5.5.0",
1756 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1757 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1758 | "dev": true,
1759 | "requires": {
1760 | "has-flag": "^3.0.0"
1761 | }
1762 | },
1763 | "to-regex-range": {
1764 | "version": "5.0.1",
1765 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1766 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1767 | "dev": true,
1768 | "requires": {
1769 | "is-number": "^7.0.0"
1770 | }
1771 | },
1772 | "toidentifier": {
1773 | "version": "1.0.1",
1774 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1775 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1776 | },
1777 | "touch": {
1778 | "version": "3.1.0",
1779 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1780 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1781 | "dev": true,
1782 | "requires": {
1783 | "nopt": "~1.0.10"
1784 | }
1785 | },
1786 | "type-is": {
1787 | "version": "1.6.18",
1788 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1789 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1790 | "requires": {
1791 | "media-typer": "0.3.0",
1792 | "mime-types": "~2.1.24"
1793 | }
1794 | },
1795 | "undefsafe": {
1796 | "version": "2.0.5",
1797 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1798 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1799 | "dev": true
1800 | },
1801 | "unpipe": {
1802 | "version": "1.0.0",
1803 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1804 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1805 | },
1806 | "utils-merge": {
1807 | "version": "1.0.1",
1808 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1809 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1810 | },
1811 | "vary": {
1812 | "version": "1.1.2",
1813 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1814 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1815 | }
1816 | }
1817 | }
1818 |
--------------------------------------------------------------------------------