diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..3e63cca2 Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml new file mode 100644 index 00000000..80cb378b --- /dev/null +++ b/.github/workflows/firebase-hosting-merge.yml @@ -0,0 +1,20 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting on merge +'on': + push: + branches: + - main +jobs: + build_and_deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: cd volunteerverse-ui && npm ci && npm run build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_VOLUNTEERVERSE_3B6B2 }}' + channelId: live + projectId: volunteerverse-3b6b2 diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml new file mode 100644 index 00000000..40b62141 --- /dev/null +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -0,0 +1,17 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting on PR +'on': pull_request +jobs: + build_and_preview: + if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: npm ci && npm run build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_VOLUNTEERVERSE_3B6B2 }}' + projectId: volunteerverse-3b6b2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9bdf3559 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +.env \ No newline at end of file diff --git a/README.md b/README.md index d8bbe2a1..09e1865c 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ # SITE Capstone Project -SITE Course Year: **20__** +SITE Course Year: **2023** -Cohort: **Add Company Sponsor Name** +Cohort: **Salesforce** -Team Member Names:**Insert Team Member Names** +Team Member Names:**Kelechi Emeruwa, Melyssa Cristino, Iretomiwa Idowu** -Mentors Names: **Insert Professional Mentor Names** +Mentors Names: **A'Shaun Thomas, Sammy Au, Paige Godfrey** Project Code Repository Links diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..99520ebf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "site-capstone-volunteerverse", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..9028785a --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react-icons": "^4.10.1" + } +} diff --git a/planning/README.md b/planning/README.md index 1ba34000..754ad6bd 100644 --- a/planning/README.md +++ b/planning/README.md @@ -8,6 +8,34 @@ For each group deliverable, have **one member** of your pod submit a link to thi **All deliverables are due Friday by 6:00pm PDT** -* **Project Proposal:** Week 4 +* ## **Project Proposal:** Week 4 +* Pod members and team name. + * Melyssa, Tom, Kelechi - VolunteerVerse +* Problem Statement and Target Audience: + * Students find it difficult to find volunteer opportunities in their local area. +* Brief Description: + * The main purpose of our project is to enable students to easily search volunteer opportunities within their location. It will also allow organizations + * in need of volunteers to register volunteer opportunities and recruit volunteers. +* Expected Feature List. + * Home Page + * Account creation + * Student Profile + * Organization Profile + * Search/filtering for areas of interest + * User stats (keep data on the volunteering period) + * Email verification + * Feature that tracks registered opportunities + +Related Work: What similar apps and websites? How will your project stand out from these other websites? + * VolunteerMatch + * Ours will be specifically tailored towards students and interns. + * Modern and easy-to-use interface + * Provide resources on what it means to be a good volunteer. + +Open Questions. + * How fo we retrieve data from different organizations in different locations? + * How can we implement email verification? + + * **User Stories:** Week 5 * **Development Plan:** Week 6 diff --git a/planning/project_plan.md b/planning/project_plan.md index fdc22201..baadf6eb 100644 --- a/planning/project_plan.md +++ b/planning/project_plan.md @@ -1,28 +1,62 @@ # Project Plan -Pod Members: **Add Pod Members Names** +Pod Members: **Tom, Kelechi, Melysssa** -## Problem Statement and Description +## Problem Statement -Insert the latest summary of your problem statement and app description. +Organizations struggle to find volunteers with tech-related skills to help with outreach, brand exposure. -## User Roles and Personas +## User Roles -Include the most up-to-date user roles and personas. +- Students: A user who is looking to find tech volunteer opportunities in their industry of interest -## User Stories +- Tech Orgs : a user who is looking to find helpful skilled volunteers -List the current user stories you will implement. +## User Personas -## Pages/Screens +Include at least 2 personas per User Role +### Students +- Persona 1: + - Maya (21 years old) is a college student majoring in Design and aspiring to become a UX/UI designer. They are looking for opportunities to gain hands-on experience in designing mobile applications to boost their resume and develop their career. Maya is motivated to work with an organization where they can contribute to the UX/UI design of mobile applications, apply their skills, and learn from experienced professionals in the field. -List all the pages and screens in the app. Include wireframes for at least 3 of them. +- User Persona 2: + - Liam (20 years old) is a coding bootcamp fellow, currently enrolled in a program to enhance their skills as a software engineer. Liam is actively seeking opportunities where they can apply and develop their front-end development knowledge. Liam is looking to gain experience but is finding it difficult to find these opportunties from searches online. + -## Data Model +### Org +- Persona 1: + - Alex (34 years old) is the owner of a non-profit organization focused on environmental conservation. The organization currently lacks an online presence and needs a website to showcase their mission, projects, and volunteer opportunities. Alex is motivated to find specific tech volunteers who can help build a professional and engaging website for their organization, allowing them to reach a wider audience and increase community involvement. + +- User Persona 2: + - Emily (28 years old) is the owner of a non-profit organization that develops mobile applications to address community needs. They are in the testing phase of their latest app and need to find specific tech volunteers who can help test and provide feedback on the mobile application. Emily's motivation is to ensure the app functions well, identifies potential bugs, and receives valuable user feedback to improve its usability and performance. + + +## User Stories +- As a student, I should see a landing page that displays visual and descriptive information about the website before signing up so I know what I'm getting into. +- As a student, I should be able to create a profile that includes information about my skills/technical background and interest. +- As a student I should see a personalized feed of volunteer opportunities that align with my skillset/interests. +- As a student I should be able to apply/register for volunteer opportunities displayed on my feed +- As a student, I should see a dashboard of all the volunteer projects I have applied for. -Describe your app's data model using diagrams or tables +- As an org owner, I should be able to post new volunteer projects, so that I can attract new volutneers. +- As an org owner, I should input a description with tags, and a title to for each project. +- As an org owner, I should see a list volunters/students who have signed up for my project. +- As an org owner, I should approve which of the applied volunteers to volunteer on my posted project. + + + +## Pages/Screens +- Login in +- Registration +- Landing Page +- Profile setup (student) +- Profile setup (org) +- Volunteer Feed Page (students) +- Projects page (org) +List all the pages and screens in the app. Include wireframes for at least 3 of them. -## Endpoints +## Data Model + Endpoints +[Data Model + Endpoints](https://docs.google.com/document/d/1LCH0YufzCk89B7lDG31BQJEKI0AJA0DW-cBulcN2Db4/edit?usp=sharing) List the API endpoints you will need to implement. diff --git a/planning/project_proposal.md b/planning/project_proposal.md index 13f6e1c5..9fa9c5f1 100644 --- a/planning/project_proposal.md +++ b/planning/project_proposal.md @@ -1,23 +1,26 @@ -# Project Proposal - -Pod Members: **Add Pod Members Names** - -## Problem Statement - -Insert your groups problem statement and target audience. - -## Description - -What is the main purpose of your project? What are the key features your site has to offer its users? How will your targeted audience use your website? - -## Expected Features List - -Add a list of your groups's brainstormed features list - -## Related Work - -What similar apps and websites? How will your project stand out from these other websites? - -## Open Questions - -What questions do you still have? What topics do you need to research more for your project? +# Pod members and team name. + * Melyssa, Tom, Kelechi - The KMT Team +# Problem Statement and Target Audience: + * Students find it difficult to find volunteer opportunities in their local area. +# Brief Description: + * The main purpose of our project is to enable students to easily search volunteer opportunities within their location. It will also allow organizations + * in need of volunteers to register volunteer opportunities and recruit volunteers. +# Expected Feature List. + * Home Page + * Account creation + * Student Profile + * Organization Profile + * Search/filtering for areas of interest + * User stats (keep data on the volunteering period) + * Email verification + * Feature that tracks registered opportunities + +# Related Work: What similar apps and websites? How will your project stand out from these other websites? + * VolunteerMatch + * Ours will be specifically tailored towards students and interns. + * Modern and easy-to-use interface + * Provide resources on what it means to be a good volunteer. + +# Open Questions. + * How fo we retrieve data from different organizations in different locations? + * How can we implement email verification? diff --git a/planning/user_stories.md b/planning/user_stories.md index b2dc7385..a6844e9a 100644 --- a/planning/user_stories.md +++ b/planning/user_stories.md @@ -4,22 +4,43 @@ Pod Members: **Add Pod Members Names** ## Problem Statement -Insert your groups problem statement and target audience. +Students find it difficult to find tech volunteer opportunties. ## User Roles -Include at least at least 1, but no more than 3, user roles +- Students: A user who is looking to find tech volunteer opportunities in their industry of interest + +- Tech Orgs : a user who is looking to find helpful skilled volunteers ## User Personas Include at least 2 personas per User Role +### Students +- Persona 1: + - Maya (21 years old) is a college student majoring in Design and aspiring to become a UX/UI designer. They are looking for opportunities to gain hands-on experience in designing mobile applications to boost their resume and develop their career. Maya is motivated to work with an organization where they can contribute to the UX/UI design of mobile applications, apply their skills, and learn from experienced professionals in the field. -## User Stories +- User Persona 2: + - Liam (20 years old) is a coding bootcamp fellow, currently enrolled in a program to enhance their skills as a software engineer. Liam is actively seeking opportunities where they can apply and develop their front-end development knowledge. Liam is looking to gain experience but is finding it difficult to find these opportunties from searches online. + -Include at least 10 user stories. +### Org +- Persona 1: + - Alex (34 years old) is the owner of a non-profit organization focused on environmental conservation. The organization currently lacks an online presence and needs a website to showcase their mission, projects, and volunteer opportunities. Alex is motivated to find specific tech volunteers who can help build a professional and engaging website for their organization, allowing them to reach a wider audience and increase community involvement. -1. **As a [user role], I want to [what], so that [why]** +- User Persona 2: + - Emily (28 years old) is the owner of a non-profit organization that develops mobile applications to address community needs. They are in the testing phase of their latest app and need to find specific tech volunteers who can help test and provide feedback on the mobile application. Emily's motivation is to ensure the app functions well, identifies potential bugs, and receives valuable user feedback to improve its usability and performance. + -## Wireframe (Bonus) +## User Stories +- As a student, I should see a landing page that displays visual and descriptive information about the website before signing up so I know what I'm getting into. +- As a student, I should be able to create a profile that includes information about my skills/technical background and interest. +- As a student I should see a personalized feed of volunteer opportunities that align with my skillset/interests. +- As a student I should be able to apply/register for volunteer opportunities displayed on my feed +- As a student, I should see a dashboard of all the volunteer projects I have applied for. + +- As an org owner, I should be able to post new volunteer projects, so that I can attract new volutneers. +- As an org owner, I should input a description with tags, and a title to for each project. +- As an org owner, I should see a list volunters/students who have signed up for my project. +- As an org owner, I should approve which of the applied volunteers to volunteer on my posted project. -Insert link or image to your group's wireframe. +## Wireframe (Bonus) diff --git a/reflections/reflection2.md b/reflections/reflection2.md index e8eca33e..01f36ebc 100644 --- a/reflections/reflection2.md +++ b/reflections/reflection2.md @@ -1,25 +1,29 @@ # Reflection #2 -Pod Members: **Add Pod Members Names** +Pod Members: Kelechi, Melyssa, Tom ## Reflection Questions * Name at least one successful thing this week. - Add response here + Deployment * What were some challenges you and/or your group faced this week? - Add response here + Webscrapping(populating the database with the webscrapped data), + Cutting down some features + Testing + Debugging * Did you finish all of your tasks in your sprint plan for this week? If you did not finish all of the planned tasks, how would you prioritize the remaining tasks on your list? (i.e over planned, did not know how to implement certain features, miscommunication from the team, had to pivot from original plans, etc.) - Add response here + Yes * Did the resources provided to you help prepare you in planning and executing your capstone project sprint this week? Be specific, what resources did you find particularly helpful or which tasks did you need more support on? - Add response here + Yes If advices count as ressources then i would say the advice we found most particularly helpful was getting help! The task we needed more support on was testing * Which features and user stories would you consider “at risk”? How will you change your plan if those items remain “at risk”? - Add response here + As a student I should see a personalized feed of volunteer opportunities that align with my skillset/interests. + This is largely because we have not populated our database, by monday(our next demo) it would be fixed! diff --git a/volunteerverse-api/.env.template b/volunteerverse-api/.env.template new file mode 100644 index 00000000..81c7fd1b --- /dev/null +++ b/volunteerverse-api/.env.template @@ -0,0 +1,9 @@ +# PORT=3001 +# SECRET_KEY=SOMETHING_SUPER_SECRET_GOES_HERE +# DATABASE_USER=postgres +# DATABASE_PASS=postgres +# DATABASE_HOST=localhost +# DATABASE_PORT=5432 +# DATABASE_NAME=volunteerverse +# BCRYPT_WORK_FACTOR=12 +# ``` \ No newline at end of file diff --git a/volunteerverse-api/.eslintrc.js b/volunteerverse-api/.eslintrc.js new file mode 100644 index 00000000..96ec2a0d --- /dev/null +++ b/volunteerverse-api/.eslintrc.js @@ -0,0 +1,33 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/volunteerverse-api/.gitignore b/volunteerverse-api/.gitignore new file mode 100644 index 00000000..36d57b9b --- /dev/null +++ b/volunteerverse-api/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.env +node_modules + diff --git a/volunteerverse-api/babel.config.js b/volunteerverse-api/babel.config.js new file mode 100644 index 00000000..c26ca735 --- /dev/null +++ b/volunteerverse-api/babel.config.js @@ -0,0 +1,12 @@ +module.exports = + { + "presets": [ + ["@babel/preset-env", { + "targets": { + "node": "current" + } + }], + "@babel/preset-typescript" + ] + } + \ No newline at end of file diff --git a/volunteerverse-api/browser.js b/volunteerverse-api/browser.js new file mode 100644 index 00000000..f964e327 --- /dev/null +++ b/volunteerverse-api/browser.js @@ -0,0 +1,19 @@ +const puppeteer = require('puppeteer'); + +async function startBrowser(){ + let browser; + try { + console.log("Opening the browser......"); + browser = await puppeteer.launch({ + headless: "new" + + }); + } catch (err) { + console.log("Could not create a browser instance => : ", err); + } + return browser; +} + +module.exports = { + startBrowser +}; \ No newline at end of file diff --git a/volunteerverse-api/coverage/clover.xml b/volunteerverse-api/coverage/clover.xml new file mode 100644 index 00000000..cebb41c5 --- /dev/null +++ b/volunteerverse-api/coverage/clover.xml @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/volunteerverse-api/coverage/coverage-final.json b/volunteerverse-api/coverage/coverage-final.json new file mode 100644 index 00000000..ab4bc9ce --- /dev/null +++ b/volunteerverse-api/coverage/coverage-final.json @@ -0,0 +1,8 @@ +{"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/config.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/config.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":3,"column":13},"end":{"line":3,"column":71}},"2":{"start":{"line":4,"column":13},"end":{"line":4,"column":61}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":37}},"4":{"start":{"line":8,"column":19},"end":{"line":8,"column":58}},"5":{"start":{"line":9,"column":19},"end":{"line":9,"column":96}},"6":{"start":{"line":10,"column":19},"end":{"line":10,"column":59}},"7":{"start":{"line":11,"column":19},"end":{"line":11,"column":52}},"8":{"start":{"line":12,"column":23},"end":{"line":12,"column":68}},"9":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"10":{"start":{"line":7,"column":0},"end":{"line":7,"column":16}}},"fnMap":{"0":{"name":"getDatabaseURI","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":30}},"loc":{"start":{"line":7,"column":30},"end":{"line":14,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":20},"end":{"line":3,"column":70}},"type":"cond-expr","locations":[{"start":{"line":3,"column":39},"end":{"line":3,"column":63}},{"start":{"line":3,"column":66},"end":{"line":3,"column":70}}]},"1":{"loc":{"start":{"line":4,"column":26},"end":{"line":4,"column":60}},"type":"binary-expr","locations":[{"start":{"line":4,"column":26},"end":{"line":4,"column":48}},{"start":{"line":4,"column":52},"end":{"line":4,"column":60}}]},"2":{"loc":{"start":{"line":8,"column":19},"end":{"line":8,"column":58}},"type":"binary-expr","locations":[{"start":{"line":8,"column":19},"end":{"line":8,"column":44}},{"start":{"line":8,"column":48},"end":{"line":8,"column":58}}]},"3":{"loc":{"start":{"line":9,"column":19},"end":{"line":9,"column":96}},"type":"cond-expr","locations":[{"start":{"line":9,"column":47},"end":{"line":9,"column":83}},{"start":{"line":9,"column":86},"end":{"line":9,"column":96}}]},"4":{"loc":{"start":{"line":10,"column":19},"end":{"line":10,"column":59}},"type":"binary-expr","locations":[{"start":{"line":10,"column":19},"end":{"line":10,"column":44}},{"start":{"line":10,"column":48},"end":{"line":10,"column":59}}]},"5":{"loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":52}},"type":"binary-expr","locations":[{"start":{"line":11,"column":19},"end":{"line":11,"column":44}},{"start":{"line":11,"column":48},"end":{"line":11,"column":52}}]},"6":{"loc":{"start":{"line":12,"column":23},"end":{"line":12,"column":68}},"type":"binary-expr","locations":[{"start":{"line":12,"column":23},"end":{"line":12,"column":48}},{"start":{"line":12,"column":52},"end":{"line":12,"column":68}}]},"7":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":107}},"type":"binary-expr","locations":[{"start":{"line":13,"column":11},"end":{"line":13,"column":35}},{"start":{"line":13,"column":39},"end":{"line":13,"column":107}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2},"f":{"0":2},"b":{"0":[0,2],"1":[2,2],"2":[2,2],"3":[0,2],"4":[2,2],"5":[2,2],"6":[2,2],"7":[2,2]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/db.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/db.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":42}},"2":{"start":{"line":4,"column":11},"end":{"line":6,"column":2}},"3":{"start":{"line":11,"column":0},"end":{"line":18,"column":3}},"4":{"start":{"line":12,"column":2},"end":{"line":17,"column":null}},"5":{"start":{"line":13,"column":4},"end":{"line":13,"column":49}},"6":{"start":{"line":20,"column":0},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":11},"end":{"line":11,"column":12}},"loc":{"start":{"line":11,"column":35},"end":{"line":18,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":17,"column":null}},{"start":{"line":14,"column":9},"end":{"line":17,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":1,"5":0,"6":2},"f":{"0":1},"b":{"0":[0,1]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/organization.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/organization.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":28}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":47}},"4":{"start":{"line":10,"column":0},"end":{"line":10,"column":40}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"6":{"start":{"line":39,"column":25},"end":{"line":48,"column":6}},"7":{"start":{"line":49,"column":4},"end":{"line":57,"column":null}},"8":{"start":{"line":50,"column":6},"end":{"line":54,"column":9}},"9":{"start":{"line":56,"column":6},"end":{"line":56,"column":18}},"10":{"start":{"line":60,"column":6},"end":{"line":60,"column":62}},"11":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"12":{"start":{"line":62,"column":6},"end":{"line":62,"column":67}},"13":{"start":{"line":65,"column":17},"end":{"line":65,"column":57}},"14":{"start":{"line":66,"column":27},"end":{"line":66,"column":66}},"15":{"start":{"line":67,"column":31},"end":{"line":67,"column":63}},"16":{"start":{"line":68,"column":22},"end":{"line":93,"column":null}},"17":{"start":{"line":104,"column":8},"end":{"line":104,"column":25}},"18":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"19":{"start":{"line":107,"column":23},"end":{"line":120,"column":null}},"20":{"start":{"line":123,"column":26},"end":{"line":123,"column":44}},"21":{"start":{"line":125,"column":4},"end":{"line":134,"column":6}},"22":{"start":{"line":138,"column":37},"end":{"line":142,"column":null}},"23":{"start":{"line":145,"column":3},"end":{"line":145,"column":null}},"24":{"start":{"line":151,"column":23},"end":{"line":166,"column":6}},"25":{"start":{"line":168,"column":4},"end":{"line":168,"column":44}},"26":{"start":{"line":170,"column":24},"end":{"line":177,"column":null}},"27":{"start":{"line":180,"column":4},"end":{"line":180,"column":49}},"28":{"start":{"line":182,"column":4},"end":{"line":185,"column":null}},"29":{"start":{"line":183,"column":6},"end":{"line":183,"column":null}},"30":{"start":{"line":184,"column":6},"end":{"line":184,"column":65}},"31":{"start":{"line":186,"column":4},"end":{"line":186,"column":16}},"32":{"start":{"line":208,"column":25},"end":{"line":210,"column":18}},"33":{"start":{"line":212,"column":4},"end":{"line":212,"column":null}},"34":{"start":{"line":214,"column":22},"end":{"line":216,"column":null}},"35":{"start":{"line":218,"column":4},"end":{"line":228,"column":null}},"36":{"start":{"line":219,"column":21},"end":{"line":223,"column":null}},"37":{"start":{"line":225,"column":6},"end":{"line":225,"column":25}},"38":{"start":{"line":227,"column":6},"end":{"line":227,"column":68}},"39":{"start":{"line":232,"column":22},"end":{"line":234,"column":null}},"40":{"start":{"line":236,"column":4},"end":{"line":243,"column":null}},"41":{"start":{"line":237,"column":21},"end":{"line":239,"column":21}},"42":{"start":{"line":240,"column":6},"end":{"line":240,"column":18}},"43":{"start":{"line":242,"column":6},"end":{"line":242,"column":68}},"44":{"start":{"line":249,"column":6},"end":{"line":249,"column":56}},"45":{"start":{"line":252,"column":22},"end":{"line":254,"column":null}},"46":{"start":{"line":256,"column":4},"end":{"line":256,"column":48}},"47":{"start":{"line":258,"column":4},"end":{"line":284,"column":null}},"48":{"start":{"line":259,"column":6},"end":{"line":262,"column":8}},"49":{"start":{"line":265,"column":6},"end":{"line":281,"column":null}},"50":{"start":{"line":267,"column":30},"end":{"line":267,"column":84}},"51":{"start":{"line":268,"column":23},"end":{"line":272,"column":null}},"52":{"start":{"line":275,"column":8},"end":{"line":275,"column":null}},"53":{"start":{"line":277,"column":8},"end":{"line":277,"column":30}},"54":{"start":{"line":280,"column":8},"end":{"line":280,"column":70}},"55":{"start":{"line":283,"column":6},"end":{"line":283,"column":63}},"56":{"start":{"line":289,"column":27},"end":{"line":291,"column":25}},"57":{"start":{"line":293,"column":33},"end":{"line":295,"column":25}},"58":{"start":{"line":298,"column":4},"end":{"line":298,"column":null}},"59":{"start":{"line":299,"column":4},"end":{"line":299,"column":null}},"60":{"start":{"line":301,"column":35},"end":{"line":301,"column":151}},"61":{"start":{"line":303,"column":4},"end":{"line":303,"column":null}},"62":{"start":{"line":305,"column":4},"end":{"line":305,"column":null}},"63":{"start":{"line":306,"column":4},"end":{"line":336,"column":null}},"64":{"start":{"line":308,"column":6},"end":{"line":308,"column":null}},"65":{"start":{"line":309,"column":21},"end":{"line":313,"column":null}},"66":{"start":{"line":316,"column":6},"end":{"line":316,"column":null}},"67":{"start":{"line":317,"column":6},"end":{"line":317,"column":45}},"68":{"start":{"line":319,"column":11},"end":{"line":336,"column":null}},"69":{"start":{"line":321,"column":29},"end":{"line":321,"column":73}},"70":{"start":{"line":322,"column":6},"end":{"line":322,"column":69}},"71":{"start":{"line":324,"column":6},"end":{"line":324,"column":null}},"72":{"start":{"line":325,"column":21},"end":{"line":329,"column":null}},"73":{"start":{"line":332,"column":6},"end":{"line":332,"column":45}},"74":{"start":{"line":335,"column":6},"end":{"line":335,"column":72}},"75":{"start":{"line":342,"column":19},"end":{"line":356,"column":null}},"76":{"start":{"line":359,"column":4},"end":{"line":361,"column":null}},"77":{"start":{"line":360,"column":6},"end":{"line":360,"column":34}},"78":{"start":{"line":362,"column":4},"end":{"line":362,"column":23}},"79":{"start":{"line":366,"column":19},"end":{"line":379,"column":6}},"80":{"start":{"line":381,"column":33},"end":{"line":381,"column":35}},"81":{"start":{"line":382,"column":4},"end":{"line":388,"column":null}},"82":{"start":{"line":382,"column":38},"end":{"line":382,"column":44}},"83":{"start":{"line":382,"column":38},"end":{"line":382,"column":51}},"84":{"start":{"line":382,"column":34},"end":{"line":382,"column":38}},"85":{"start":{"line":384,"column":24},"end":{"line":384,"column":80}},"86":{"start":{"line":385,"column":6},"end":{"line":385,"column":null}},"87":{"start":{"line":386,"column":6},"end":{"line":386,"column":53}},"88":{"start":{"line":387,"column":6},"end":{"line":387,"column":null}},"89":{"start":{"line":389,"column":4},"end":{"line":389,"column":32}},"90":{"start":{"line":393,"column":18},"end":{"line":393,"column":59}},"91":{"start":{"line":394,"column":19},"end":{"line":394,"column":49}},"92":{"start":{"line":395,"column":16},"end":{"line":395,"column":30}},"93":{"start":{"line":396,"column":4},"end":{"line":398,"column":null}},"94":{"start":{"line":397,"column":6},"end":{"line":397,"column":17}},"95":{"start":{"line":399,"column":4},"end":{"line":399,"column":16}},"96":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}}},"fnMap":{"0":{"name":"(anonymous_8)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":8}},"loc":{"start":{"line":37,"column":3},"end":{"line":135,"column":3}}},"1":{"name":"(anonymous_9)","decl":{"start":{"line":136,"column":2},"end":{"line":136,"column":8}},"loc":{"start":{"line":136,"column":53},"end":{"line":146,"column":3}}},"2":{"name":"(anonymous_10)","decl":{"start":{"line":148,"column":2},"end":{"line":148,"column":8}},"loc":{"start":{"line":148,"column":57},"end":{"line":187,"column":3}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":206,"column":2},"end":{"line":206,"column":8}},"loc":{"start":{"line":206,"column":55},"end":{"line":229,"column":3}}},"4":{"name":"(anonymous_12)","decl":{"start":{"line":231,"column":2},"end":{"line":231,"column":8}},"loc":{"start":{"line":231,"column":58},"end":{"line":244,"column":3}}},"5":{"name":"(anonymous_13)","decl":{"start":{"line":246,"column":2},"end":{"line":246,"column":8}},"loc":{"start":{"line":246,"column":99},"end":{"line":286,"column":3}}},"6":{"name":"(anonymous_14)","decl":{"start":{"line":288,"column":2},"end":{"line":288,"column":8}},"loc":{"start":{"line":288,"column":100},"end":{"line":337,"column":3}}},"7":{"name":"(anonymous_15)","decl":{"start":{"line":341,"column":2},"end":{"line":341,"column":8}},"loc":{"start":{"line":341,"column":54},"end":{"line":363,"column":3}}},"8":{"name":"(anonymous_16)","decl":{"start":{"line":365,"column":2},"end":{"line":365,"column":8}},"loc":{"start":{"line":365,"column":61},"end":{"line":390,"column":3}}},"9":{"name":"(anonymous_17)","decl":{"start":{"line":392,"column":2},"end":{"line":392,"column":8}},"loc":{"start":{"line":392,"column":39},"end":{"line":400,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":63,"column":null}}]},"1":{"loc":{"start":{"line":182,"column":4},"end":{"line":185,"column":null}},"type":"if","locations":[{"start":{"line":182,"column":4},"end":{"line":185,"column":null}}]},"2":{"loc":{"start":{"line":218,"column":4},"end":{"line":228,"column":null}},"type":"if","locations":[{"start":{"line":218,"column":4},"end":{"line":228,"column":null}},{"start":{"line":226,"column":11},"end":{"line":228,"column":null}}]},"3":{"loc":{"start":{"line":236,"column":4},"end":{"line":243,"column":null}},"type":"if","locations":[{"start":{"line":236,"column":4},"end":{"line":243,"column":null}},{"start":{"line":241,"column":11},"end":{"line":243,"column":null}}]},"4":{"loc":{"start":{"line":258,"column":4},"end":{"line":284,"column":null}},"type":"if","locations":[{"start":{"line":258,"column":4},"end":{"line":284,"column":null}},{"start":{"line":282,"column":11},"end":{"line":284,"column":null}}]},"5":{"loc":{"start":{"line":265,"column":6},"end":{"line":281,"column":null}},"type":"if","locations":[{"start":{"line":265,"column":6},"end":{"line":281,"column":null}},{"start":{"line":279,"column":13},"end":{"line":281,"column":null}}]},"6":{"loc":{"start":{"line":267,"column":30},"end":{"line":267,"column":84}},"type":"cond-expr","locations":[{"start":{"line":267,"column":50},"end":{"line":267,"column":72}},{"start":{"line":267,"column":75},"end":{"line":267,"column":84}}]},"7":{"loc":{"start":{"line":306,"column":4},"end":{"line":336,"column":null}},"type":"if","locations":[{"start":{"line":306,"column":4},"end":{"line":336,"column":null}},{"start":{"line":319,"column":11},"end":{"line":336,"column":null}}]},"8":{"loc":{"start":{"line":319,"column":11},"end":{"line":336,"column":null}},"type":"if","locations":[{"start":{"line":319,"column":11},"end":{"line":336,"column":null}},{"start":{"line":334,"column":11},"end":{"line":336,"column":null}}]},"9":{"loc":{"start":{"line":322,"column":25},"end":{"line":322,"column":68}},"type":"cond-expr","locations":[{"start":{"line":322,"column":48},"end":{"line":322,"column":49}},{"start":{"line":322,"column":52},"end":{"line":322,"column":68}}]},"10":{"loc":{"start":{"line":359,"column":4},"end":{"line":361,"column":null}},"type":"if","locations":[{"start":{"line":359,"column":4},"end":{"line":361,"column":null}}]},"11":{"loc":{"start":{"line":396,"column":4},"end":{"line":398,"column":null}},"type":"if","locations":[{"start":{"line":396,"column":4},"end":{"line":398,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":3,"7":3,"8":3,"9":1,"10":2,"11":2,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":2},"f":{"0":3,"1":0,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[1],"1":[1],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0],"11":[0]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/projects.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/projects.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":23}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":65}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":46}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":40}},"5":{"start":{"line":34,"column":25},"end":{"line":41,"column":6}},"6":{"start":{"line":42,"column":4},"end":{"line":42,"column":29}},"7":{"start":{"line":43,"column":4},"end":{"line":51,"column":null}},"8":{"start":{"line":44,"column":6},"end":{"line":48,"column":9}},"9":{"start":{"line":50,"column":6},"end":{"line":50,"column":18}},"10":{"start":{"line":52,"column":18},"end":{"line":63,"column":17}},"11":{"start":{"line":64,"column":19},"end":{"line":72,"column":6}},"12":{"start":{"line":73,"column":4},"end":{"line":73,"column":42}},"13":{"start":{"line":74,"column":19},"end":{"line":74,"column":33}},"14":{"start":{"line":76,"column":4},"end":{"line":78,"column":7}},"15":{"start":{"line":77,"column":6},"end":{"line":77,"column":30}},"16":{"start":{"line":80,"column":4},"end":{"line":80,"column":26}},"17":{"start":{"line":101,"column":18},"end":{"line":101,"column":93}},"18":{"start":{"line":102,"column":4},"end":{"line":102,"column":37}},"19":{"start":{"line":111,"column":24},"end":{"line":111,"column":26}},"20":{"start":{"line":112,"column":26},"end":{"line":112,"column":86}},"21":{"start":{"line":113,"column":4},"end":{"line":113,"column":52}},"22":{"start":{"line":115,"column":4},"end":{"line":119,"column":null}},"23":{"start":{"line":115,"column":37},"end":{"line":115,"column":50}},"24":{"start":{"line":115,"column":37},"end":{"line":115,"column":52}},"25":{"start":{"line":115,"column":33},"end":{"line":115,"column":37}},"26":{"start":{"line":116,"column":22},"end":{"line":116,"column":81}},"27":{"start":{"line":117,"column":6},"end":{"line":117,"column":50}},"28":{"start":{"line":118,"column":6},"end":{"line":118,"column":32}},"29":{"start":{"line":121,"column":4},"end":{"line":121,"column":23}},"30":{"start":{"line":134,"column":18},"end":{"line":134,"column":54}},"31":{"start":{"line":135,"column":19},"end":{"line":135,"column":53}},"32":{"start":{"line":137,"column":4},"end":{"line":175,"column":null}},"33":{"start":{"line":147,"column":10},"end":{"line":147,"column":24}},"34":{"start":{"line":148,"column":19},"end":{"line":148,"column":48}},"35":{"start":{"line":150,"column":8},"end":{"line":150,"column":45}},"36":{"start":{"line":151,"column":24},"end":{"line":165,"column":8}},"37":{"start":{"line":167,"column":6},"end":{"line":173,"column":null}},"38":{"start":{"line":169,"column":8},"end":{"line":172,"column":12}},"39":{"start":{"line":174,"column":6},"end":{"line":174,"column":25}},"40":{"start":{"line":176,"column":4},"end":{"line":176,"column":51}},"41":{"start":{"line":180,"column":18},"end":{"line":180,"column":73}},"42":{"start":{"line":181,"column":19},"end":{"line":181,"column":47}},"43":{"start":{"line":183,"column":4},"end":{"line":194,"column":null}},"44":{"start":{"line":185,"column":6},"end":{"line":185,"column":16}},"45":{"start":{"line":187,"column":25},"end":{"line":187,"column":70}},"46":{"start":{"line":187,"column":55},"end":{"line":187,"column":69}},"47":{"start":{"line":188,"column":23},"end":{"line":191,"column":null}},"48":{"start":{"line":190,"column":10},"end":{"line":190,"column":62}},"49":{"start":{"line":193,"column":6},"end":{"line":193,"column":22}},"50":{"start":{"line":202,"column":18},"end":{"line":202,"column":73}},"51":{"start":{"line":203,"column":19},"end":{"line":203,"column":53}},"52":{"start":{"line":204,"column":17},"end":{"line":204,"column":19}},"53":{"start":{"line":205,"column":4},"end":{"line":210,"column":null}},"54":{"start":{"line":206,"column":6},"end":{"line":208,"column":9}},"55":{"start":{"line":207,"column":8},"end":{"line":207,"column":32}},"56":{"start":{"line":209,"column":6},"end":{"line":209,"column":18}},"57":{"start":{"line":214,"column":18},"end":{"line":214,"column":62}},"58":{"start":{"line":215,"column":19},"end":{"line":215,"column":44}},"59":{"start":{"line":216,"column":17},"end":{"line":216,"column":19}},"60":{"start":{"line":217,"column":4},"end":{"line":219,"column":7}},"61":{"start":{"line":218,"column":6},"end":{"line":218,"column":30}},"62":{"start":{"line":220,"column":4},"end":{"line":220,"column":16}},"63":{"start":{"line":229,"column":18},"end":{"line":229,"column":70}},"64":{"start":{"line":230,"column":23},"end":{"line":230,"column":34}},"65":{"start":{"line":231,"column":19},"end":{"line":231,"column":54}},"66":{"start":{"line":232,"column":4},"end":{"line":232,"column":29}},"67":{"start":{"line":233,"column":27},"end":{"line":233,"column":29}},"68":{"start":{"line":234,"column":4},"end":{"line":239,"column":null}},"69":{"start":{"line":235,"column":6},"end":{"line":237,"column":9}},"70":{"start":{"line":236,"column":8},"end":{"line":236,"column":33}},"71":{"start":{"line":238,"column":6},"end":{"line":238,"column":28}},"72":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}}},"fnMap":{"0":{"name":"(anonymous_8)","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":8}},"loc":{"start":{"line":33,"column":3},"end":{"line":81,"column":3}}},"1":{"name":"(anonymous_9)","decl":{"start":{"line":76,"column":29},"end":{"line":76,"column":30}},"loc":{"start":{"line":76,"column":37},"end":{"line":78,"column":5}}},"2":{"name":"(anonymous_10)","decl":{"start":{"line":87,"column":2},"end":{"line":87,"column":8}},"loc":{"start":{"line":87,"column":49},"end":{"line":87,"column":53}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":93,"column":2},"end":{"line":93,"column":8}},"loc":{"start":{"line":93,"column":47},"end":{"line":93,"column":51}}},"4":{"name":"(anonymous_12)","decl":{"start":{"line":100,"column":2},"end":{"line":100,"column":8}},"loc":{"start":{"line":100,"column":48},"end":{"line":103,"column":3}}},"5":{"name":"(anonymous_13)","decl":{"start":{"line":110,"column":2},"end":{"line":110,"column":8}},"loc":{"start":{"line":110,"column":29},"end":{"line":122,"column":3}}},"6":{"name":"(anonymous_14)","decl":{"start":{"line":129,"column":2},"end":{"line":129,"column":8}},"loc":{"start":{"line":132,"column":18},"end":{"line":177,"column":3}}},"7":{"name":"(anonymous_15)","decl":{"start":{"line":179,"column":2},"end":{"line":179,"column":8}},"loc":{"start":{"line":179,"column":45},"end":{"line":195,"column":3}}},"8":{"name":"(anonymous_16)","decl":{"start":{"line":187,"column":41},"end":{"line":187,"column":42}},"loc":{"start":{"line":187,"column":55},"end":{"line":187,"column":69}}},"9":{"name":"(anonymous_17)","decl":{"start":{"line":189,"column":23},"end":{"line":189,"column":24}},"loc":{"start":{"line":190,"column":10},"end":{"line":190,"column":62}}},"10":{"name":"(anonymous_18)","decl":{"start":{"line":201,"column":2},"end":{"line":201,"column":8}},"loc":{"start":{"line":201,"column":47},"end":{"line":211,"column":3}}},"11":{"name":"(anonymous_19)","decl":{"start":{"line":206,"column":26},"end":{"line":206,"column":27}},"loc":{"start":{"line":206,"column":39},"end":{"line":208,"column":7}}},"12":{"name":"(anonymous_20)","decl":{"start":{"line":213,"column":2},"end":{"line":213,"column":8}},"loc":{"start":{"line":213,"column":32},"end":{"line":221,"column":3}}},"13":{"name":"(anonymous_21)","decl":{"start":{"line":217,"column":24},"end":{"line":217,"column":25}},"loc":{"start":{"line":217,"column":37},"end":{"line":219,"column":5}}},"14":{"name":"(anonymous_22)","decl":{"start":{"line":228,"column":2},"end":{"line":228,"column":8}},"loc":{"start":{"line":228,"column":42},"end":{"line":240,"column":3}}},"15":{"name":"(anonymous_23)","decl":{"start":{"line":235,"column":26},"end":{"line":235,"column":27}},"loc":{"start":{"line":235,"column":39},"end":{"line":237,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":6},"end":{"line":68,"column":34}},"type":"binary-expr","locations":[{"start":{"line":68,"column":6},"end":{"line":68,"column":26}},{"start":{"line":68,"column":30},"end":{"line":68,"column":34}}]},"1":{"loc":{"start":{"line":137,"column":4},"end":{"line":175,"column":null}},"type":"if","locations":[{"start":{"line":137,"column":4},"end":{"line":175,"column":null}}]},"2":{"loc":{"start":{"line":167,"column":6},"end":{"line":173,"column":null}},"type":"if","locations":[{"start":{"line":167,"column":6},"end":{"line":173,"column":null}}]},"3":{"loc":{"start":{"line":183,"column":4},"end":{"line":194,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":4},"end":{"line":194,"column":null}},{"start":{"line":186,"column":11},"end":{"line":194,"column":null}}]},"4":{"loc":{"start":{"line":205,"column":4},"end":{"line":210,"column":null}},"type":"if","locations":[{"start":{"line":205,"column":4},"end":{"line":210,"column":null}}]},"5":{"loc":{"start":{"line":234,"column":4},"end":{"line":239,"column":null}},"type":"if","locations":[{"start":{"line":234,"column":4},"end":{"line":239,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":2},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0,0],"4":[0],"5":[0]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/volunteer.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/models/volunteer.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":47}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":23}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":64}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":51}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":28}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":38}},"6":{"start":{"line":23,"column":19},"end":{"line":23,"column":70}},"7":{"start":{"line":24,"column":29},"end":{"line":24,"column":76}},"8":{"start":{"line":26,"column":4},"end":{"line":36,"column":6}},"9":{"start":{"line":57,"column":25},"end":{"line":65,"column":6}},"10":{"start":{"line":66,"column":4},"end":{"line":74,"column":null}},"11":{"start":{"line":67,"column":6},"end":{"line":71,"column":9}},"12":{"start":{"line":73,"column":6},"end":{"line":73,"column":18}},"13":{"start":{"line":76,"column":30},"end":{"line":77,"column":null}},"14":{"start":{"line":79,"column":4},"end":{"line":81,"column":null}},"15":{"start":{"line":80,"column":6},"end":{"line":80,"column":75}},"16":{"start":{"line":83,"column":27},"end":{"line":85,"column":null}},"17":{"start":{"line":87,"column":28},"end":{"line":87,"column":61}},"18":{"start":{"line":89,"column":18},"end":{"line":102,"column":43}},"19":{"start":{"line":104,"column":19},"end":{"line":110,"column":6}},"20":{"start":{"line":112,"column":62},"end":{"line":112,"column":76}},"21":{"start":{"line":114,"column":26},"end":{"line":115,"column":78}},"22":{"start":{"line":117,"column":27},"end":{"line":121,"column":6}},"23":{"start":{"line":123,"column":25},"end":{"line":123,"column":47}},"24":{"start":{"line":125,"column":4},"end":{"line":127,"column":7}},"25":{"start":{"line":126,"column":6},"end":{"line":126,"column":51}},"26":{"start":{"line":128,"column":4},"end":{"line":137,"column":null}},"27":{"start":{"line":138,"column":4},"end":{"line":147,"column":6}},"28":{"start":{"line":155,"column":18},"end":{"line":155,"column":90}},"29":{"start":{"line":156,"column":19},"end":{"line":156,"column":66}},"30":{"start":{"line":165,"column":18},"end":{"line":165,"column":69}},"31":{"start":{"line":166,"column":19},"end":{"line":166,"column":49}},"32":{"start":{"line":167,"column":19},"end":{"line":167,"column":21}},"33":{"start":{"line":168,"column":4},"end":{"line":170,"column":7}},"34":{"start":{"line":169,"column":6},"end":{"line":169,"column":29}},"35":{"start":{"line":171,"column":4},"end":{"line":171,"column":18}},"36":{"start":{"line":182,"column":18},"end":{"line":182,"column":95}},"37":{"start":{"line":183,"column":19},"end":{"line":183,"column":56}},"38":{"start":{"line":185,"column":31},"end":{"line":185,"column":33}},"39":{"start":{"line":187,"column":4},"end":{"line":191,"column":null}},"40":{"start":{"line":187,"column":37},"end":{"line":187,"column":43}},"41":{"start":{"line":187,"column":37},"end":{"line":187,"column":50}},"42":{"start":{"line":187,"column":33},"end":{"line":187,"column":37}},"43":{"start":{"line":189,"column":22},"end":{"line":189,"column":85}},"44":{"start":{"line":190,"column":6},"end":{"line":190,"column":39}},"45":{"start":{"line":193,"column":4},"end":{"line":193,"column":30}},"46":{"start":{"line":203,"column":18},"end":{"line":203,"column":97}},"47":{"start":{"line":204,"column":19},"end":{"line":204,"column":49}},"48":{"start":{"line":206,"column":4},"end":{"line":208,"column":null}},"49":{"start":{"line":207,"column":6},"end":{"line":207,"column":25}},"50":{"start":{"line":209,"column":4},"end":{"line":209,"column":16}},"51":{"start":{"line":219,"column":18},"end":{"line":219,"column":59}},"52":{"start":{"line":220,"column":19},"end":{"line":220,"column":49}},"53":{"start":{"line":221,"column":22},"end":{"line":221,"column":36}},"54":{"start":{"line":222,"column":4},"end":{"line":224,"column":null}},"55":{"start":{"line":223,"column":6},"end":{"line":223,"column":23}},"56":{"start":{"line":225,"column":4},"end":{"line":225,"column":16}},"57":{"start":{"line":236,"column":27},"end":{"line":236,"column":73}},"58":{"start":{"line":237,"column":4},"end":{"line":239,"column":null}},"59":{"start":{"line":238,"column":6},"end":{"line":238,"column":null}},"60":{"start":{"line":240,"column":18},"end":{"line":245,"column":36}},"61":{"start":{"line":246,"column":19},"end":{"line":246,"column":66}},"62":{"start":{"line":247,"column":4},"end":{"line":247,"column":17}},"63":{"start":{"line":251,"column":40},"end":{"line":252,"column":null}},"64":{"start":{"line":254,"column":4},"end":{"line":256,"column":null}},"65":{"start":{"line":255,"column":6},"end":{"line":255,"column":null}},"66":{"start":{"line":258,"column":18},"end":{"line":259,"column":54}},"67":{"start":{"line":261,"column":19},"end":{"line":261,"column":60}},"68":{"start":{"line":262,"column":4},"end":{"line":262,"column":16}},"69":{"start":{"line":272,"column":21},"end":{"line":272,"column":35}},"70":{"start":{"line":273,"column":28},"end":{"line":273,"column":69}},"71":{"start":{"line":275,"column":4},"end":{"line":282,"column":null}},"72":{"start":{"line":277,"column":28},"end":{"line":277,"column":66}},"73":{"start":{"line":278,"column":8},"end":{"line":280,"column":11}},"74":{"start":{"line":279,"column":10},"end":{"line":279,"column":32}},"75":{"start":{"line":285,"column":30},"end":{"line":285,"column":61}},"76":{"start":{"line":286,"column":4},"end":{"line":286,"column":65}},"77":{"start":{"line":287,"column":4},"end":{"line":291,"column":null}},"78":{"start":{"line":288,"column":6},"end":{"line":290,"column":null}},"79":{"start":{"line":289,"column":8},"end":{"line":289,"column":39}},"80":{"start":{"line":295,"column":4},"end":{"line":295,"column":32}},"81":{"start":{"line":308,"column":16},"end":{"line":308,"column":86}},"82":{"start":{"line":309,"column":17},"end":{"line":309,"column":58}},"83":{"start":{"line":310,"column":2},"end":{"line":312,"column":null}},"84":{"start":{"line":311,"column":4},"end":{"line":311,"column":16}},"85":{"start":{"line":313,"column":2},"end":{"line":313,"column":15}},"86":{"start":{"line":325,"column":16},"end":{"line":325,"column":86}},"87":{"start":{"line":326,"column":17},"end":{"line":326,"column":58}},"88":{"start":{"line":327,"column":2},"end":{"line":329,"column":null}},"89":{"start":{"line":328,"column":4},"end":{"line":328,"column":35}},"90":{"start":{"line":330,"column":2},"end":{"line":330,"column":91}},"91":{"start":{"line":339,"column":16},"end":{"line":348,"column":18}},"92":{"start":{"line":349,"column":17},"end":{"line":349,"column":47}},"93":{"start":{"line":351,"column":2},"end":{"line":351,"column":null}},"94":{"start":{"line":352,"column":2},"end":{"line":354,"column":null}},"95":{"start":{"line":353,"column":4},"end":{"line":353,"column":26}},"96":{"start":{"line":355,"column":2},"end":{"line":355,"column":86}},"97":{"start":{"line":12,"column":0},"end":{"line":12,"column":13}}},"fnMap":{"0":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":8}},"loc":{"start":{"line":22,"column":3},"end":{"line":37,"column":3}}},"1":{"name":"(anonymous_9)","decl":{"start":{"line":47,"column":2},"end":{"line":47,"column":8}},"loc":{"start":{"line":56,"column":3},"end":{"line":148,"column":3}}},"2":{"name":"(anonymous_10)","decl":{"start":{"line":125,"column":33},"end":{"line":125,"column":34}},"loc":{"start":{"line":125,"column":43},"end":{"line":127,"column":5}}},"3":{"name":"(anonymous_11)","decl":{"start":{"line":154,"column":2},"end":{"line":154,"column":8}},"loc":{"start":{"line":154,"column":65},"end":{"line":157,"column":3}}},"4":{"name":"(anonymous_12)","decl":{"start":{"line":164,"column":2},"end":{"line":164,"column":8}},"loc":{"start":{"line":164,"column":52},"end":{"line":172,"column":3}}},"5":{"name":"(anonymous_13)","decl":{"start":{"line":168,"column":24},"end":{"line":168,"column":25}},"loc":{"start":{"line":168,"column":32},"end":{"line":170,"column":5}}},"6":{"name":"(anonymous_14)","decl":{"start":{"line":180,"column":2},"end":{"line":180,"column":8}},"loc":{"start":{"line":180,"column":50},"end":{"line":194,"column":3}}},"7":{"name":"(anonymous_15)","decl":{"start":{"line":202,"column":2},"end":{"line":202,"column":8}},"loc":{"start":{"line":202,"column":48},"end":{"line":210,"column":3}}},"8":{"name":"(anonymous_16)","decl":{"start":{"line":218,"column":2},"end":{"line":218,"column":8}},"loc":{"start":{"line":218,"column":50},"end":{"line":226,"column":3}}},"9":{"name":"(anonymous_17)","decl":{"start":{"line":235,"column":2},"end":{"line":235,"column":8}},"loc":{"start":{"line":235,"column":63},"end":{"line":248,"column":3}}},"10":{"name":"(anonymous_18)","decl":{"start":{"line":249,"column":2},"end":{"line":249,"column":8}},"loc":{"start":{"line":249,"column":65},"end":{"line":263,"column":3}}},"11":{"name":"(anonymous_19)","decl":{"start":{"line":270,"column":2},"end":{"line":270,"column":8}},"loc":{"start":{"line":270,"column":53},"end":{"line":296,"column":3}}},"12":{"name":"(anonymous_20)","decl":{"start":{"line":276,"column":26},"end":{"line":276,"column":31}},"loc":{"start":{"line":276,"column":48},"end":{"line":281,"column":7}}},"13":{"name":"(anonymous_21)","decl":{"start":{"line":278,"column":28},"end":{"line":278,"column":29}},"loc":{"start":{"line":278,"column":40},"end":{"line":280,"column":9}}},"14":{"name":"(anonymous_22)","decl":{"start":{"line":287,"column":30},"end":{"line":287,"column":31}},"loc":{"start":{"line":287,"column":51},"end":{"line":291,"column":5}}},"15":{"name":"(anonymous_23)","decl":{"start":{"line":307,"column":0},"end":{"line":307,"column":6}},"loc":{"start":{"line":307,"column":61},"end":{"line":314,"column":1}}},"16":{"name":"(anonymous_24)","decl":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"loc":{"start":{"line":324,"column":62},"end":{"line":331,"column":1}}},"17":{"name":"(anonymous_25)","decl":{"start":{"line":338,"column":0},"end":{"line":338,"column":6}},"loc":{"start":{"line":338,"column":47},"end":{"line":357,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":null}}]},"1":{"loc":{"start":{"line":109,"column":6},"end":{"line":109,"column":36}},"type":"binary-expr","locations":[{"start":{"line":109,"column":6},"end":{"line":109,"column":28}},{"start":{"line":109,"column":32},"end":{"line":109,"column":36}}]},"2":{"loc":{"start":{"line":206,"column":4},"end":{"line":208,"column":null}},"type":"if","locations":[{"start":{"line":206,"column":4},"end":{"line":208,"column":null}}]},"3":{"loc":{"start":{"line":222,"column":4},"end":{"line":224,"column":null}},"type":"if","locations":[{"start":{"line":222,"column":4},"end":{"line":224,"column":null}}]},"4":{"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":null}},"type":"if","locations":[{"start":{"line":237,"column":4},"end":{"line":239,"column":null}}]},"5":{"loc":{"start":{"line":254,"column":4},"end":{"line":256,"column":null}},"type":"if","locations":[{"start":{"line":254,"column":4},"end":{"line":256,"column":null}}]},"6":{"loc":{"start":{"line":288,"column":6},"end":{"line":290,"column":null}},"type":"if","locations":[{"start":{"line":288,"column":6},"end":{"line":290,"column":null}}]},"7":{"loc":{"start":{"line":310,"column":2},"end":{"line":312,"column":null}},"type":"if","locations":[{"start":{"line":310,"column":2},"end":{"line":312,"column":null}}]},"8":{"loc":{"start":{"line":327,"column":2},"end":{"line":329,"column":null}},"type":"if","locations":[{"start":{"line":327,"column":2},"end":{"line":329,"column":null}}]},"9":{"loc":{"start":{"line":352,"column":2},"end":{"line":354,"column":null}},"type":"if","locations":[{"start":{"line":352,"column":2},"end":{"line":354,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":0,"8":0,"9":3,"10":3,"11":3,"12":1,"13":2,"14":2,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":2,"29":2,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":2,"52":2,"53":2,"54":2,"55":1,"56":1,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":2},"f":{"0":0,"1":3,"2":1,"3":2,"4":0,"5":0,"6":0,"7":0,"8":2,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"b":{"0":[1],"1":[1,1],"2":[0],"3":[1],"4":[0],"5":[0],"6":[0],"7":[0],"8":[0],"9":[0]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/utils/errors.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/utils/errors.ts","statementMap":{"0":{"start":{"line":6,"column":4},"end":{"line":6,"column":12}},"1":{"start":{"line":7,"column":4},"end":{"line":7,"column":27}},"2":{"start":{"line":8,"column":4},"end":{"line":8,"column":25}},"3":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"4":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"5":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"6":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"7":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"8":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"9":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"10":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"11":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"12":{"start":{"line":48,"column":6},"end":{"line":48,"column":null}},"13":{"start":{"line":46,"column":0},"end":{"line":46,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":2},"end":{"line":5,"column":14}},"loc":{"start":{"line":5,"column":45},"end":{"line":9,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":14}},"loc":{"start":{"line":15,"column":37},"end":{"line":17,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":2},"end":{"line":23,"column":14}},"loc":{"start":{"line":23,"column":38},"end":{"line":25,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":2},"end":{"line":31,"column":14}},"loc":{"start":{"line":31,"column":35},"end":{"line":33,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":39,"column":2},"end":{"line":39,"column":14}},"loc":{"start":{"line":39,"column":35},"end":{"line":41,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":47,"column":4},"end":{"line":47,"column":16}},"loc":{"start":{"line":47,"column":48},"end":{"line":49,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":14},"end":{"line":15,"column":37}},"type":"default-arg","locations":[{"start":{"line":15,"column":24},"end":{"line":15,"column":37}}]},"1":{"loc":{"start":{"line":23,"column":14},"end":{"line":23,"column":38}},"type":"default-arg","locations":[{"start":{"line":23,"column":24},"end":{"line":23,"column":38}}]},"2":{"loc":{"start":{"line":31,"column":14},"end":{"line":31,"column":35}},"type":"default-arg","locations":[{"start":{"line":31,"column":24},"end":{"line":31,"column":35}}]},"3":{"loc":{"start":{"line":39,"column":14},"end":{"line":39,"column":35}},"type":"default-arg","locations":[{"start":{"line":39,"column":24},"end":{"line":39,"column":35}}]},"4":{"loc":{"start":{"line":47,"column":16},"end":{"line":47,"column":48}},"type":"default-arg","locations":[{"start":{"line":47,"column":26},"end":{"line":47,"column":48}}]}},"s":{"0":6,"1":6,"2":6,"3":2,"4":4,"5":2,"6":0,"7":2,"8":0,"9":2,"10":0,"11":2,"12":2,"13":2},"f":{"0":6,"1":4,"2":0,"3":0,"4":0,"5":2},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0]}} +,"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/utils/validate.ts": {"path":"/Users/iidowu/Desktop/Capstone Project/site-capstone-volunteerverse/volunteerverse-api/src/utils/validate.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":3,"column":14},"end":{"line":4,"column":79}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":79}},"3":{"start":{"line":25,"column":25},"end":{"line":25,"column":30}},"4":{"start":{"line":12,"column":23},"end":{"line":23,"column":1}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":81}},"6":{"start":{"line":14,"column":12},"end":{"line":14,"column":81}},"7":{"start":{"line":15,"column":2},"end":{"line":22,"column":5}},"8":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"9":{"start":{"line":17,"column":4},"end":{"line":21,"column":null}},"10":{"start":{"line":18,"column":6},"end":{"line":20,"column":8}},"11":{"start":{"line":25,"column":9},"end":{"line":25,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":14},"end":{"line":3,"column":15}},"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":79}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":23},"end":{"line":12,"column":24}},"loc":{"start":{"line":12,"column":84},"end":{"line":23,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":19},"end":{"line":15,"column":20}},"loc":{"start":{"line":15,"column":28},"end":{"line":22,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":79}},"type":"binary-expr","locations":[{"start":{"line":4,"column":2},"end":{"line":4,"column":16}},{"start":{"line":4,"column":20},"end":{"line":4,"column":48}},{"start":{"line":4,"column":52},"end":{"line":4,"column":79}}]},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":14,"column":81}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":14,"column":81}}]},"2":{"loc":{"start":{"line":17,"column":4},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":21,"column":null}}]},"3":{"loc":{"start":{"line":19,"column":43},"end":{"line":19,"column":76}},"type":"cond-expr","locations":[{"start":{"line":19,"column":54},"end":{"line":19,"column":71}},{"start":{"line":19,"column":74},"end":{"line":19,"column":76}}]}},"s":{"0":2,"1":2,"2":34,"3":2,"4":2,"5":6,"6":0,"7":6,"8":34,"9":34,"10":2,"11":2},"f":{"0":34,"1":6,"2":34},"b":{"0":[34,34,34],"1":[0],"2":[2],"3":[2,0]}} +} diff --git a/volunteerverse-api/coverage/lcov-report/base.css b/volunteerverse-api/coverage/lcov-report/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/volunteerverse-api/coverage/lcov-report/block-navigation.js b/volunteerverse-api/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/volunteerverse-api/coverage/lcov-report/favicon.png b/volunteerverse-api/coverage/lcov-report/favicon.png new file mode 100644 index 00000000..c1525b81 Binary files /dev/null and b/volunteerverse-api/coverage/lcov-report/favicon.png differ diff --git a/volunteerverse-api/coverage/lcov-report/index.html b/volunteerverse-api/coverage/lcov-report/index.html new file mode 100644 index 00000000..195ef84a --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 34.93% + Statements + 109/312 +
+ + +
+ 37.68% + Branches + 26/69 +
+ + +
+ 25.45% + Functions + 14/55 +
+ + +
+ 36% + Lines + 108/300 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
94.44%17/1883.33%15/18100%2/294.44%17/18
src/models +
+
26.11%70/26815.38%6/3913.63%6/4427.13%70/258
src/utils +
+
84.61%22/2641.66%5/1266.66%6/987.5%21/24
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/prettify.css b/volunteerverse-api/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/volunteerverse-api/coverage/lcov-report/prettify.js b/volunteerverse-api/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/volunteerverse-api/coverage/lcov-report/sort-arrow-sprite.png b/volunteerverse-api/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 00000000..6ed68316 Binary files /dev/null and b/volunteerverse-api/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/volunteerverse-api/coverage/lcov-report/sorter.js b/volunteerverse-api/coverage/lcov-report/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/volunteerverse-api/coverage/lcov-report/src/config.ts.html b/volunteerverse-api/coverage/lcov-report/src/config.ts.html new file mode 100644 index 00000000..4df6bfd0 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/config.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/config.ts + + + + + + + + + +
+
+

All files / src config.ts

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 87.5% + Branches + 14/16 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +162x +  +2x +2x +2x +  +2x +2x +2x +2x +2x +2x +2x +  +  + 
require("dotenv").config() //dotenv package to parse the environment variables from the .env file
+ 
+export const PORT = process.env.PORT ? Number(process.env.PORT) : 3001;
+export const SECRET_KEY = process.env.SECRET_KEY || "secret";
+export const BCRYPT_WORK_FACTOR = 13;
+ 
+export function getDatabaseURI(){
+    const dbUser = process.env.DATABASE_USER || "postgres"
+    const dbPass = process.env.DATABASE_PASS ? encodeURI(process.env.DATABASE_PASS) : "postgres"
+    const dbHost = process.env.DATABASE_HOST || "localhost"
+    const dbPort = process.env.DATABASE_PORT || 5432
+    const dbProdName = process.env.DATABASE_NAME || "volunteerverse"
+    return process.env.DATABASE_URL || `postgresql://${dbUser}:${dbPass}@${dbHost}:${dbPort}/${dbProdName}`
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/db.ts.html b/volunteerverse-api/coverage/lcov-report/src/db.ts.html new file mode 100644 index 00000000..954f3361 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/db.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/db.ts + + + + + + + + + +
+
+

All files / src db.ts

+
+ +
+ 85.71% + Statements + 6/7 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 85.71% + Lines + 6/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +222x +2x +  +2x +  +  +  +  +  +  +2x +1x +  +  +  +  +  +  +  +2x +  + 
import {Pool} from "pg";
+import { getDatabaseURI } from "./config";
+ 
+const db = new Pool({
+  connectionString: getDatabaseURI(),
+});
+ 
+// db.connect();
+ 
+ 
+db.connect((err: { stack: any }) => {
+  Iif (err) {
+    console.error("connection error", err.stack);
+  } else {
+    // console.log("Successfully connected to postgres database!");
+    
+  }
+});
+ 
+export default db
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/index.html b/volunteerverse-api/coverage/lcov-report/src/index.html new file mode 100644 index 00000000..bf04e49d --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 94.44% + Statements + 17/18 +
+ + +
+ 83.33% + Branches + 15/18 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 94.44% + Lines + 17/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.ts +
+
100%11/1187.5%14/16100%1/1100%11/11
db.ts +
+
85.71%6/750%1/2100%1/185.71%6/7
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/models/index.html b/volunteerverse-api/coverage/lcov-report/src/models/index.html new file mode 100644 index 00000000..3484aaca --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/models/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/models + + + + + + + + + +
+
+

All files src/models

+
+ +
+ 26.11% + Statements + 70/268 +
+ + +
+ 15.38% + Branches + 6/39 +
+ + +
+ 13.63% + Functions + 6/44 +
+ + +
+ 27.13% + Lines + 70/258 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
organization.ts +
+
30.92%30/9710%2/2020%2/1031.91%30/94
projects.ts +
+
8.21%6/730%0/80%0/168.69%6/69
volunteer.ts +
+
34.69%34/9836.36%4/1122.22%4/1835.78%34/95
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/models/organization.ts.html b/volunteerverse-api/coverage/lcov-report/src/models/organization.ts.html new file mode 100644 index 00000000..162454df --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/models/organization.ts.html @@ -0,0 +1,1288 @@ + + + + + + Code coverage report for src/models/organization.ts + + + + + + + + + +
+
+

All files / src/models organization.ts

+
+ +
+ 30.92% + Statements + 30/97 +
+ + +
+ 10% + Branches + 2/20 +
+ + +
+ 20% + Functions + 2/10 +
+ + +
+ 31.91% + Lines + 30/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +4022x +2x +2x +  +  +  +  +  +2x +2x +2x +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +3x +3x +  +  +  +  +  +1x +  +  +  +2x +2x +1x +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import db from "../db";
+import bcrypt from "bcrypt";
+import {
+  BadRequestError,
+  ExpressError,
+  UnauthorizedError,
+} from "../utils/errors";
+ 
+import { BCRYPT_WORK_FACTOR } from "../config";
+import { Volunteer } from "./volunteer";
+import { validateFields } from "../utils/validate";
+/**
+ * @todo: change get org by email function or refactor
+ */
+export class Organization {
+  /**
+   * Convert a user from the database into a user object that can be viewed publically.
+   * Don't show user's password
+   *
+   *
+   * @param {Organization} organization - user from database
+   * @returns public organization
+   */
+ 
+ 
+  static async register(creds: {
+    email: string;
+    password: string;
+    orgName: string;
+    founders: string;
+    orgDescription: string;
+    logoUrl?: string;
+    orgWebsite: string;
+    userType: string;
+ 
+ 
+  })
+  {
+    const requiredInfo = [
+      "orgName",
+      "orgDescription",
+      "email",
+      "logoUrl",
+      "userType",
+     "password",
+     "founders",
+    "orgWebsite",
+    ];
+    try {
+      validateFields({
+        required: requiredInfo,
+        obj: creds,
+        location: "org registration",
+      });
+    } catch (error) {
+      throw error;
+    }
+ 
+    const existingOrganizationWithEmail =
+      await Organization.fetchOrganizationByEmail(creds.email);
+    if (existingOrganizationWithEmail) {
+      throw new BadRequestError(`Duplicate email: ${creds.email}`);
+    }
+ 
+    const salt = await bcrypt.genSalt(BCRYPT_WORK_FACTOR);
+    const hashedPassword = await bcrypt.hash(creds.password, salt);
+    const normalizedOrgEmail = creds.email.toLowerCase().trim();
+    const orgResult = await db.query(
+      `INSERT INTO organizations (
+        organization_name,
+        organization_description,
+        organization_email,
+       logo_url,
+       founders,
+       website
+      )
+      VALUES ($1, $2, $3, $4, $5, $6)
+      RETURNING id,
+      organization_name,
+                organization_description,
+                organization_email,
+               logo_url,
+               founders,
+               website
+               `,
+      [
+        creds.orgName,
+        creds.orgDescription,
+        normalizedOrgEmail,
+        creds.logoUrl,
+        creds.founders,
+        creds.orgWebsite,
+      ]
+    );
+    
+    const {
+      id,
+      organization_email,
+      organization_name,
+      logo_url,
+      founders,
+      organization_description,
+      website,
+    } = orgResult.rows[0];
+    console.log(orgResult.rows[0], organization_name)
+    
+    const authResult = await db.query(
+      `INSERT INTO authentication (
+        email,
+        password,
+        user_type
+      )
+      VALUES ($1, $2, $3)
+      RETURNING  
+      email,
+      password,
+      user_type
+      `,
+ 
+      [normalizedOrgEmail, hashedPassword, "organization"]
+    );
+ 
+    const { user_type } = authResult.rows[0];
+ 
+    return {
+      id: id,
+      email: organization_email,
+      orgName: organization_name,
+      orgDescription: organization_description,
+      logoUrl: logo_url,
+      founders: founders,
+      userType: user_type,
+      orgWebsite: website,
+    };
+  }
+  static async fetchInterestedVolunteersByEmail(email) {
+    // returns volunteer info based on email
+    const interestedVolunteersInfo = await db.query(
+      `SELECT *
+         FROM interested_volunteers
+         WHERE  email = $1`,
+      [email.toLowerCase()]
+    );
+ 
+   return interestedVolunteersInfo.rows[0]
+  }
+ 
+  static async fetchOrganizationByEmail(org_email: string) {
+    // this is querying the organization table, going through the rows to find the
+    // item(that is access it) in the bracket(email in this case)
+    const org_result = await db.query(
+      `SELECT
+        id,
+        organization_name AS "orgName",
+        organization_description AS "orgDesc",
+        organization_email AS "email",
+        logo_url AS "imageUrl",
+        founders
+           FROM organizations
+           WHERE  organization_email = $1`, // this does to filtering to make sure we are being
+      // specific to the item in the bracket we are looking for
+      // by checking if the item we passed in is equal to the row info already
+      // in the table
+      [org_email.toLowerCase()] // and this is assigning whatever is in the bracket to the row
+      // in that table after we find it
+    );
+ 
+    console.log("org res", org_result.rows);
+ 
+    const auth_result = await db.query(
+      `SELECT 
+        
+        user_type as "userType"
+        
+           FROM  authentication
+           WHERE  email = $1`,
+      [org_email.toLowerCase()]
+    );
+ 
+    console.log("auth res", auth_result.rows[0]);
+ 
+    if (org_result.rows.length) {
+      console.log("returning org user: ", { ...org_result.rows[0], userType: "organization" })
+      return { ...org_result.rows[0], userType: "organization" };
+    }
+    return null;
+  }
+ 
+  // static async createOrganizationProject (projectInfo) {
+  //   console.log("project info in create function: ", projectInfo)
+  // const result = await db.query(
+  //   `INSERT INTO projects(
+  //     org_id,
+  //     project_name,
+  //     project_description,
+  //     image_url,
+  //     requested_people,
+  //     approved_people)
+  //   VALUES ($1, $2, $3, $4, $5, $6)
+ 
+  //    RETURNING  org_id, project_name, project_description, image_url, requested_people, approved_people`,
+  //   [projectInfo.org_id , projectInfo.project_name,projectInfo.project_description,projectInfo.image_url,projectInfo.requested_people,projectInfo.approved_people])
+ 
+  //   return result.rows[0]
+  // }
+  static async toggleStateOfOrgProject(projectId, orgId) {
+ 
+    const activeResult = await db.query(`SELECT active FROM projects
+    WHERE id = $1 `,
+      [projectId])
+ 
+    console.log("active result", activeResult.rows[0].active)
+ 
+    const orgResult = await db.query(
+      `SELECT * FROM projects WHERE org_id = $1 AND id = $2`,
+      [orgId, projectId]
+    )
+    if (orgResult.rows.length !== 0) {
+      const result = await db.query(
+        `UPDATE "projects" SET "active" = $1 
+                   WHERE "id" = $2 AND "org_id" = $3
+                   RETURNING *`,
+        [!activeResult.rows[0].active, projectId, orgId]
+      );
+      return result.rows;
+    } else {
+      throw new UnauthorizedError("Organization/Project not found");
+    }
+  }
+ 
+  static async deleteOrganizationProject(project_id, orgId) {
+    const orgResult = await db.query(
+      `SELECT * FROM projects WHERE org_id = $1 AND id = $2`,
+      [orgId, project_id]
+    );
+    if (orgResult.rows.length !== 0) {
+      const result = await db.query(
+        `DELETE FROM "projects" WHERE "id" = $1`,
+        [project_id]);
+      return true;
+    } else {
+      throw new UnauthorizedError("Organization/Project not found");
+    }
+  }
+ 
+  static async updateApprovedVolunteers(approved, email, project_id, org_id, initial_approval_state) {
+    // to check if the volunteer exist(if this does interestedVoluteersInfo will be populated)
+    const interestedVolunteersInfo =
+      await this.fetchInterestedVolunteersByEmail(email);
+ 
+    // to check if the project and( / for the )org exists if it does orgResult will be populated
+    const orgResult = await db.query(
+      `SELECT * FROM projects WHERE org_id = $1 AND id = $2`,
+      [org_id, project_id]
+    );
+    console.log("orgResult is here", orgResult);
+    // to check if the volunteer exist
+    if (interestedVolunteersInfo.length !== 0) {
+      console.log(
+        "the info of the volunteer if they exist",
+        interestedVolunteersInfo
+      );
+ 
+      // to check if the project and( / for the )org exists 
+      if (orgResult.rows.length !== 0) {
+        // handles setting initial approval state and toggling given approval state
+        const approvalState = approved === null ? initial_approval_state : !approved
+        const result = await db.query(
+          `UPDATE "interested_volunteers" SET "approved" = $1 
+                     WHERE "email" = $2 AND "project_id" = $3
+                     RETURNING *`,
+          [approvalState, email, project_id]
+ 
+        );
+        console.log("updating approved works!", result.rows)
+ 
+        return result.rows[0];
+ 
+      } else {
+        throw new UnauthorizedError("Organization/Project not found");
+      }
+    } else {
+      throw new UnauthorizedError("Volunteer Email not found");
+    }
+ 
+  }
+ 
+  static async incrementAndDecrementApprovedVolunteers(email, projectId, orgId, initialApprovalState) {
+    const approvedResult = await db.query(`SELECT approved FROM interested_volunteers 
+                              WHERE project_id = $1 AND email = $2`,
+      [projectId, email])
+ 
+    const approvedPeopleResult = await db.query(`SELECT approved_people FROM projects
+                               WHERE id = $1 AND org_id = $2`,
+      [projectId, orgId])
+ 
+ 
+    console.log("approvedResult", approvedResult.rows[0])
+    console.log("approvedPeopleResult", approvedPeopleResult.rows[0])
+    
+    const approvedVolunteerState = await this.updateApprovedVolunteers(approvedResult.rows[0].approved, email, projectId, orgId, initialApprovalState )
+ 
+    console.log("bringing volunteer state into incre/decre works!", approvedVolunteerState.approved)
+ 
+    console.log("approvedPeopleohhhhhh", approvedPeopleResult.rows[0].approved_people)
+    if (approvedVolunteerState.approved === true) {
+ 
+      console.log("here works!", approvedVolunteerState.approved)
+      const result = await db.query(
+        `UPDATE "projects" SET "approved_people" = $1 
+         WHERE "org_id" = $2 AND "id" = $3
+         RETURNING *`,
+        [approvedPeopleResult.rows[0].approved_people + 1, orgId, projectId]
+ 
+      );
+      console.log(" the if in incre/decre works!", approvedVolunteerState.approved)
+      return approvedVolunteerState.approved;
+ 
+    } else if (approvedVolunteerState.approved === false) {
+      // reset number of approved back to 0 if number becomes negative
+      let numberOfApproved = approvedPeopleResult.rows[0].approved_people;
+      numberOfApproved = numberOfApproved < 0 ? 0 : numberOfApproved;
+ 
+      console.log("approved is false", typeof approvedPeopleResult.rows[0].approved_people)
+      const result = await db.query(
+        `UPDATE "projects" SET "approved_people" = $1 
+            WHERE "org_id" = $2 AND "id" = $3
+            RETURNING *`,
+        [approvedPeopleResult.rows[0].approved_people - 1, orgId, projectId]
+ 
+      );
+      return approvedVolunteerState.approved;
+ 
+    } else {
+      throw new BadRequestError("Volunteer increment/decrement failed");
+    }
+  }
+ 
+ 
+ 
+  static async fetchAllOrganizationProjectsById(org_id) {
+    const result = await db.query(
+      // make sure this matches spelling in the table too!!
+      `SELECT 
+       id,
+       org_id AS "orgId", 
+       project_name AS "title",
+       project_description AS "description",
+       image_url as "imageUrl",
+       requested_people as "requestedPeople",
+       approved_people as "approvedPeople",
+       created_at as "createdAt",
+       active
+       FROM projects
+       WHERE  org_id = $1`,
+      [org_id]
+    );
+ 
+    Iif (!result) {
+      throw new BadRequestError();
+    }
+    return result.rows;
+  }
+ 
+  static async fetchInterestedVolunteersByProjectId(projectId) {
+    const result = await db.query(
+      // make sure this matches spelling in the table too!!
+      // if this was insert, we would have assigned the data from insomnia
+      //to it but since it is select, we would be taking the data under the rows from
+      //the table we said
+      `SELECT
+      email, approved
+       FROM interested_volunteers
+       WHERE  project_id = $1`,
+      [projectId]
+      // then project_id will then equal what we put in and then using that we can filter
+      // what we want from the table!
+      //which we then assign to result back in the route and then convert to json.
+    );
+ 
+    const interestedVolunteers = []
+    for await (const volunteerInfo of result.rows) {
+      // for each volunteer, we add an additional approved field
+      const volunteer = await Volunteer.getVolunteerByEmail(volunteerInfo.email);
+      console.log("retrieved volunteer: ", volunteer)
+      volunteer["approved"] = volunteerInfo.approved;
+      interestedVolunteers.push(volunteer)
+    }
+    return interestedVolunteers;
+  }
+ 
+  static async getOrgById(orgId: number) {
+    const query = `SELECT * FROM organizations WHERE id=$1`;
+    const result = await db.query(query, [orgId]);
+    const org = result.rows[0];
+    Iif (org) {
+      return org;
+    }
+    return null;
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/models/projects.ts.html b/volunteerverse-api/coverage/lcov-report/src/models/projects.ts.html new file mode 100644 index 00000000..3a24e324 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/models/projects.ts.html @@ -0,0 +1,808 @@ + + + + + + Code coverage report for src/models/projects.ts + + + + + + + + + +
+
+

All files / src/models projects.ts

+
+ +
+ 8.21% + Statements + 6/73 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/16 +
+ + +
+ 8.69% + Lines + 6/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242  +2x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import e from "express";
+import db from "../db";
+import { validateFields } from "../utils/validate";
+import { BadRequestError, NotFoundError } from "../utils/errors";
+import { Organization } from "./organization";
+import { Volunteer } from "./volunteer";
+export interface ProjectCardProp {
+  id: number,
+  title: string,
+  orgName: string,
+  founders: string,
+  orgUrl?: string,
+  description: string,
+  createdAt: string | number,
+  imageUrl: string,
+  requestedVolunteers: number,
+  approvedVolunteers: number,
+  tags: string[],
+}
+export class Projects {
+  /**
+   * Inserts a project and the info into the database
+   * @param projectInfo
+   */
+  static async registerProject(projectInfo: {
+    orgId: number;
+    name: string;
+    desc: string;
+    imageUrl?: string;
+    requestedPeople: number;
+    tags: string[];
+    orgName: string;
+  }) {
+    const requiredInfo = [
+      "orgId",
+      "name",
+      "desc",
+      "requestedPeople",
+      "tags",
+      "orgName",
+    ];
+    console.log(projectInfo);
+    try {
+      validateFields({
+        required: requiredInfo,
+        obj: projectInfo,
+        location: "project registration",
+      });
+    } catch (error) {
+      throw error;
+    }
+    const query = `INSERT into projects 
+    (
+      org_id, 
+      project_name, 
+      project_description,
+      image_url,
+      requested_people,
+      org_name, 
+      approved_people
+      )
+    VALUES($1,$2,$3,$4,$5,$6, $7)
+    RETURNING *`;
+    const result = await db.query(query, [
+      projectInfo.orgId,
+      projectInfo.name,
+      projectInfo.desc,
+      projectInfo.imageUrl || null,
+      projectInfo.requestedPeople,
+      projectInfo.orgName,
+      0
+    ]);
+    console.log("made query in projects");
+    const { id } = result.rows[0];
+ 
+    projectInfo.tags.forEach((tag) => {
+      this.insertTag(id, tag);
+    });
+ 
+    return result.rows[0];
+  }
+ 
+  /**
+   * Get a list of volunteers that are interested in specific project
+   * @param id
+   */
+  static async getInterestedVolunteers(id: number) {}
+ 
+  /**
+   * Get a list of approved volunteers for a specific project
+   * @param id
+   */
+  static async getApprovedVolunteers(id: number) {}
+ 
+  /**
+   * Insert a project and corresponding tag into the project_tags table
+   * @param id
+   * @param tag
+   */
+  static async insertTag(id: number, tag: string) {
+    const query = `INSERT into project_tags(project_id, tag_name) VALUES ($1,$2) RETURNING *`;
+    await db.query(query, [id, tag]);
+  }
+ 
+  /**
+   * Get's all projects from database with info 
+   * (currently only for volunteers ) 
+   * @returns 
+   */
+  static async getAllProjects() : Promise<ProjectCardProp[]>{
+    const allProjects = []
+    const allProjectIds = (await db.query(`SELECT project_id FROM project_tags`)).rows;
+    console.log("project ids found", allProjectIds);
+ 
+    for await (const {project_id} of allProjectIds) {
+      const project = await this.fetchProjectByProjectId(project_id, "volunteer");
+      console.log("retrieved project: ", project);
+      allProjects.push(project);
+    }
+ 
+    return allProjects;
+  }
+ 
+  /**
+   * Returns project information given the project id
+   * (using the ProjectCardProp)
+   * @param id
+   */
+  static async fetchProjectByProjectId(
+    projectId: number,
+    userType: string,
+    email?: string
+  ) : Promise<ProjectCardProp> {
+    const query = `SELECT * FROM projects WHERE id=$1`;
+    const result = await db.query(query, [projectId]);
+    //destructure to extract important info about project
+    Iif (result.rows.length > 0) {
+      const {
+        id,
+        org_id,
+        project_name,
+        project_description,
+        created_at,
+        image_url,
+        requested_people,
+        approved_people,
+      } = result.rows[0];
+      const tags = await this.getProjectTags(id);
+      const { organization_name, founders, website, organization_description, logo_url } =
+        await Organization.getOrgById(org_id);
+      let projectCard = {
+        id: id,
+        orgName: organization_name,
+        orgDescription: organization_description,
+        orgLogoUrl: logo_url,
+        founders: founders,
+        orgUrl: website,
+        title: project_name,
+        description: project_description,
+        createdAt: created_at,
+        imageUrl: image_url,
+        requestedVolunteers: requested_people,
+        approvedVolunteers: approved_people,
+        tags: tags,
+      };
+ 
+      Iif (userType == "volunteer") {
+        // includes interested field only for volunteers
+        projectCard["interested"] = await Volunteer.expressedInterest(
+          projectId,
+          email
+          );
+      }
+      return projectCard;
+    }
+    throw new BadRequestError("Project not found");
+  }
+ 
+  static async getProjectsWithTag(tag: string) {
+    const query = `SELECT project_id FROM project_tags WHERE tag_name=$1`;
+    const result = await db.query(query, [tag]);
+ 
+    if (result.rows.length === 0) {
+      // Return an empty array if no projects are found with the given tag
+      return [];
+    } else {
+      const projectIds = result.rows.map((row: any) => row.project_id);
+      const projects = await Promise.all(
+        projectIds.map((projectId: number) =>
+          this.fetchProjectByProjectId(projectId, "volunteer")
+        )
+      );
+      return projects;
+    }
+  }
+ 
+  /**
+   * Get the tags of a project
+   * @param projectId
+   */
+  static async getProjectTags(projectId: number) {
+    const query = `SELECT tag_name FROM project_tags WHERE project_id=$1`;
+    const result = await db.query(query, [projectId]);
+    const tags = [];
+    Iif (result) {
+      result.rows.forEach((row: any) => {
+        tags.push(row.tag_name);
+      });
+      return tags;
+    }
+  }
+ 
+  static async getAllProjectTags() {
+    const query = `SELECT DISTINCT tag_name FROM project_tags`;
+    const result = await db.query(query, []);
+    const tags = [];
+    result.rows.forEach((row: any) => {
+      tags.push(row.tag_name);
+    });
+    return tags;
+  }
+ 
+  /**
+   * searches through the projects table - filtering by a search term
+   * @param term
+   * @returns array of projects results
+   */
+  static async searchProjects(term: string) {
+    const query = `SELECT * FROM projects WHERE project_name ILIKE $1`;
+    const searchTerm = `%${term}%`;
+    const result = await db.query(query, [searchTerm]);
+    console.log(result.rows);
+    const projectResults = [];
+    Iif (result) {
+      result.rows.forEach((row: any) => {
+        projectResults.push(row);
+      });
+      return projectResults;
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/models/volunteer.ts.html b/volunteerverse-api/coverage/lcov-report/src/models/volunteer.ts.html new file mode 100644 index 00000000..a6a75e47 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/models/volunteer.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for src/models/volunteer.ts + + + + + + + + + +
+
+

All files / src/models volunteer.ts

+
+ +
+ 34.69% + Statements + 34/98 +
+ + +
+ 36.36% + Branches + 4/11 +
+ + +
+ 22.22% + Functions + 4/18 +
+ + +
+ 35.78% + Lines + 34/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +3592x +2x +2x +2x +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +3x +3x +  +  +  +  +  +1x +  +  +2x +  +  +2x +1x +  +  +1x +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +1x +  +  +1x +  +  +  +  +  +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { BCRYPT_WORK_FACTOR } from "../config";
+import db from "../db";
+import { ExpressError, BadRequestError } from "../utils/errors";
+import { validateFields } from "../utils/validate";
+import bcrypt from "bcrypt";
+import { Projects } from "./projects";
+ 
+interface VolunteerInterface{
+ 
+}
+ 
+export class Volunteer {
+ 
+  // Static method to make a volunteer object
+  static async createPublicVolunteer(volunteer: {
+    id: number;
+    email: string;
+    first_name: string;
+    last_name: string;
+    bio: string;
+    image_url: string;
+  }) {
+    const skills = await this.fetchAllVolunteerSkills(volunteer.email);
+    const approvedProjects = await this.getApprovedProjects(volunteer.email);
+ 
+    return {
+      id: volunteer.id,
+      firstName: volunteer.first_name,
+      lastName: volunteer.last_name,
+      email: volunteer.email,
+      bio: volunteer.bio,
+      imageUrl: volunteer.image_url,
+      skills: skills,
+      approvedProjects: approvedProjects,
+      userType: "volunteer",
+    };
+  }
+ 
+ 
+ 
+  //interface??? could be useful to define types
+ 
+  /**
+   * Register volunteer with their information in the database
+   * @param volunteerInfo
+   */
+  static async register(volunteerInfo: {
+    email: string;
+    password: string;
+    firstName: string;
+    lastName: string;
+    imageUrl?: string;
+    bio: string;
+    skills: string[];
+    userType: string;
+  }) {
+    const requiredInfo = [
+      "email",
+      "password",
+      "firstName",
+      "lastName",
+      "bio",
+      "skills",
+      "userType",
+    ];
+    try {
+      validateFields({
+        required: requiredInfo,
+        obj: volunteerInfo,
+        location: "user registration",
+      });
+    } catch (error) {
+      throw error;
+    }
+ 
+    const existingVolunteer = await this.fetchVolunteerByEmail(
+      volunteerInfo.email
+    );
+    if (existingVolunteer != null) {
+      throw new BadRequestError(`Duplicate email: ${volunteerInfo.email}`);
+    }
+ 
+    const hashedPassword = await bcrypt.hash(
+      volunteerInfo.password,
+      BCRYPT_WORK_FACTOR
+    );
+    const normalizedEmail = volunteerInfo.email.toLowerCase();
+ 
+    const query = `INSERT INTO volunteers(
+      email,
+      first_name,
+      last_name,
+      bio,
+      image_url
+    )
+    VALUES ($1, $2, $3, $4, $5)
+    RETURNING id,
+                  email,            
+                  first_name AS "firstName", 
+                  last_name AS "lastName",
+                  bio,
+                  image_url as "imageUrl"`;
+ 
+    const result = await db.query(query, [
+      normalizedEmail,
+      volunteerInfo.firstName,
+      volunteerInfo.lastName,
+      volunteerInfo.bio,
+      volunteerInfo.imageUrl || null,
+    ]);
+ 
+    const { id, email, firstName, lastName, bio, imageUrl } = result.rows[0];
+ 
+    const queryPassword = `INSERT into authentication (email, password, user_type) 
+    VALUES($1, $2, $3) RETURNING id, email, password,user_type as "userType"`;
+ 
+    const passwordResult = await db.query(queryPassword, [
+      normalizedEmail,
+      hashedPassword,
+      volunteerInfo.userType,
+    ]);
+ 
+    const { userType } = passwordResult.rows[0];
+ 
+    volunteerInfo.skills.forEach((skill) => {
+      this.insertSkill(volunteerInfo.email, skill);
+    });
+    console.log({
+      id: id,
+      email: email,
+      firstName: firstName,
+      lastName: lastName,
+      imageUrl: imageUrl,
+      bio: bio,
+      skills: volunteerInfo.skills,
+      userType: userType,
+    })
+    return {
+      id: id,
+      email: email,
+      firstName: firstName,
+      lastName: lastName,
+      imageUrl: imageUrl,
+      bio: bio,
+      skills: volunteerInfo.skills,
+      userType: userType,
+    };
+  }
+ 
+  /**
+   * Adds a skill corresponding with the volunteer in the volunteer_skills database
+   */
+ 
+  static async insertSkill(emailInput: string, skillInput: string) {
+    const query = `INSERT into volunteer_skills(email, skill) VALUES ($1, $2) RETURNING *`;
+    const result = await db.query(query, [emailInput, skillInput]);
+  }
+ 
+  /**
+   * Gets all the skills logged for the volunteer
+   * @param email
+   */
+ 
+  static async fetchAllVolunteerSkills(email: string) {
+    const query = `SELECT skill FROM volunteer_skills WHERE email=$1`;
+    const result = await db.query(query, [email]);
+    const skills = [];
+    result.rows.forEach((row) => {
+      skills.push(row.skill);
+    });
+    return skills;
+  }
+ 
+  /**
+   * Get all the projects the volunteer has applied for or expressed interest in
+   * @param email
+   * @returns
+   */
+ 
+  static async getInterestedProjects(email: string) {
+    // retrieve all project ids for a given user
+    const query = `SELECT project_id FROM interested_volunteers WHERE email=$1 and approved=$2`;
+    const result = await db.query(query, [email, false]);
+    // getting all interested projects
+    const interestedProjects = [];
+    
+    for await (const {project_id} of result.rows) {
+      // for each project id, retrieve the project object for a volunteer
+      const project = await Projects.fetchProjectByProjectId(project_id, "volunteer");
+      interestedProjects.push(project);
+    }
+ 
+    return interestedProjects;
+  }
+ 
+  /**
+   * Get all the currently approved projects for a specific student
+   * @param email
+   * @returns
+   */
+ 
+  static async getApprovedProjects(email: string) {
+    const query = `SELECT project_id FROM interested_volunteers WHERE email=$1 AND approved=TRUE`;
+    const result = await db.query(query, [email]);
+ 
+    Iif (result) {
+      return result.rows;
+    }
+    return null;
+  }
+ 
+  /**
+   * Fetch a volunteer in the database by email
+   * @param email
+   * @returns volunteer if found, null if not
+   */
+ 
+  static async fetchVolunteerByEmail(email: string) {
+    const query = `SELECT * FROM volunteers WHERE email=$1`;
+    const result = await db.query(query, [email]);
+    const volunteer = result.rows[0];
+    if (volunteer) {
+      return volunteer;
+    }
+    return null;
+  }
+ 
+  // add a check to make sure that the user type IS volunteer (middleware). do the same for organization
+ 
+  /**
+   * When a volunteer expresses interest in a project, log it into database
+   * @param projectId
+   * @param email
+   */
+  static async expressInterest(projectId: number, email: string) {
+    const volunteerCheck = await this.expressedInterest(projectId, email);
+    Iif (volunteerCheck) {
+      throw new BadRequestError("Already expressed interest")
+    }
+    const query = ` INSERT into interested_volunteers(email, project_id, approved) 
+                    VALUES ($1,$2,$3) 
+                    RETURNING 
+                          email,
+                          project_id as "projectId", 
+                          approved`;
+    const result = await db.query(query, [email, projectId, null]);
+    return true ;
+  }
+  static async expressUninterest(projectId: number, email: string) {
+    // first check if user hasn't already expressed interest
+    const existingInterestedVolunteer = await db.query(
+      `SELECT * FROM interested_volunteers WHERE email=$1`, [email]
+    )
+    Iif (existingInterestedVolunteer.rows > 0) {
+      throw new BadRequestError("User is already not interested")
+    }
+    // then remove volunteer from table
+    const query = ` DELETE FROM interested_volunteers
+                    WHERE project_id=$1 AND email=$2`;
+ 
+    const result = await db.query(query, [projectId, email]);
+    return true;
+  }
+ 
+  /**
+   * 
+   * @param email 
+   * @returns ranked projects based on a volunteers skills tags
+   */
+  static async getVolunteersProjectFeed(email: string) {
+    // needs error catching to avoid server breaking (long-term: needs code refactoring)
+    const projects = new Set<any>();
+    const volunteerSkills = await this.fetchAllVolunteerSkills(email);
+ 
+    await Promise.all(
+      volunteerSkills.map(async (tag: string) => {
+        const tagProjects = await Projects.getProjectsWithTag(tag);
+        tagProjects.forEach((project) => {
+          projects.add(project); // Use add() to add unique project objects to the Set
+        });
+      })
+    )
+ 
+    // add remaing projects to the end 
+    const remainingProjects = await Projects.getAllProjects()
+    console.log("found remaining Projects: ", remainingProjects);
+    remainingProjects.forEach((remainingProject) => {
+      Iif (!projects.has(remainingProject)){
+        projects.add(remainingProject);
+      }
+    })
+ 
+    // get all remaining projects and return them 
+ 
+    return Array.from(projects);
+  }
+ 
+ 
+ 
+ 
+/**
+ * Returns a boolean indicating whether a volunteer has expressed interest in a specific project
+ * @param projectId 
+ * @param email 
+ * @returns boolean
+ */
+static async expressedInterest(projectId:number, email:string){
+  const query = `SELECT * FROM interested_volunteers WHERE email=$1 AND project_id=$2`;
+  const result = await db.query(query, [email, projectId]);
+  Iif (result.rows[0]){
+    return true;
+  }
+  return false;
+}
+ 
+/**
+ * Returns a boolean indicating whether a volunteer was approved for a specific project
+ * @param projectId 
+ * @param email 
+ * @returns boolean
+ * @throws BadRequestError
+ */
+ 
+static async checkStatusProject(projectId:number, email:string){
+  const query = `SELECT * FROM interested_volunteers WHERE email=$1 AND project_id=$2`;
+  const result = await db.query(query, [email, projectId]);
+  Iif (result.rows[0]){
+    return result.rows[0].approved;
+  }
+  throw new BadRequestError(`${email} has not expressed interest in project ${projectId}`);
+}
+ 
+/**
+ * returns volunteer info from the volunteers table 
+ * @param email email of the volunteer
+ * @returns all columns from the volunteer table
+ */
+static async getVolunteerByEmail(email : string){
+  const query = `SELECT 
+  id,
+  bio,
+  email,
+  first_name as "firstName",
+  last_name as "lastName",
+  image_url as "imageUrl"
+ 
+  FROM volunteers 
+  WHERE email=$1`;
+  const result = await db.query(query, [email]);
+ 
+  console.log("fetching volunteer by email: ", result.rows)
+  Iif (result.rows.length > 0){
+    return result.rows[0];
+  }
+  throw new BadRequestError(`no volunteer exists with the following email: ${email}`);
+ 
+}
+ 
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/utils/errors.ts.html b/volunteerverse-api/coverage/lcov-report/src/utils/errors.ts.html new file mode 100644 index 00000000..a97fdcd8 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/utils/errors.ts.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for src/utils/errors.ts + + + + + + + + + +
+
+

All files / src/utils errors.ts

+
+ +
+ 78.57% + Statements + 11/14 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 50% + Functions + 3/6 +
+ + +
+ 78.57% + Lines + 11/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +552x +  +  +  +  +6x +6x +6x +  +  +  +  +  +2x +  +4x +  +  +  +  +  +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +2x +  +2x +  +  +  +  +  +  + 
export class ExpressError extends Error {
+  public message: string;
+  public status: number;
+ 
+  constructor(message: string, status: number) {
+    super();
+    this.message = message;
+    this.status = status;
+  }
+}
+ 
+/** 400 BAD REQUEST error. */
+  
+export class BadRequestError extends ExpressError {
+  constructor(message = "Bad Request") {
+    super(message, 400)
+  }
+}
+ 
+/** 401 UNAUTHORIZED error. */
+ 
+export class UnauthorizedError extends ExpressError {
+  constructor(message = "Unauthorized") {
+    super(message, 401)
+  }
+}
+ 
+/** 403 Forbidden error. */
+ 
+export class ForbiddenError extends ExpressError {
+  constructor(message = "Forbidden") {
+    super(message, 403)
+  }
+}
+ 
+/** 404 NOT FOUND error. */
+ 
+export class NotFoundError extends ExpressError {
+  constructor(message = "Not Found") {
+    super(message, 404)
+  }
+}
+ 
+/** 422 Unprocessable Entity error */
+ 
+export class UnprocessableEntityError extends ExpressError {
+    constructor(message = "Unprocessable Entity") {
+      super(message, 422)
+    }
+  }
+ 
+ 
+ 
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/utils/index.html b/volunteerverse-api/coverage/lcov-report/src/utils/index.html new file mode 100644 index 00000000..34c17212 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/utils/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 84.61% + Statements + 22/26 +
+ + +
+ 41.66% + Branches + 5/12 +
+ + +
+ 66.66% + Functions + 6/9 +
+ + +
+ 87.5% + Lines + 21/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
errors.ts +
+
78.57%11/140%0/550%3/678.57%11/14
validate.ts +
+
91.66%11/1271.42%5/7100%3/3100%10/10
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov-report/src/utils/validate.ts.html b/volunteerverse-api/coverage/lcov-report/src/utils/validate.ts.html new file mode 100644 index 00000000..6176a643 --- /dev/null +++ b/volunteerverse-api/coverage/lcov-report/src/utils/validate.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/utils/validate.ts + + + + + + + + + +
+
+

All files / src/utils validate.ts

+
+ +
+ 91.66% + Statements + 11/12 +
+ + +
+ 71.42% + Branches + 5/7 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +262x +  +2x +34x +  +  +  +  +  +  +  +2x +  +6x +6x +34x +34x +2x +  +  +  +  +  +  +2x + 
import { UnprocessableEntityError } from "./errors";
+ 
+const isNil = (value: any): boolean =>
+  value === null || typeof value === "undefined" || String(value).trim() === "";
+ 
+interface ValidateFieldsOptions {
+  required: string[];
+  obj: Record<string, any>;
+  location?: string;
+}
+ 
+const validateFields = ({ required, obj, location }: ValidateFieldsOptions): void => {
+ 
+  Iif (!obj) throw new UnprocessableEntityError(`Missing object for validation.`);
+  required.forEach((item) => {
+    console.log("item: ", obj[item])
+    if (isNil(obj[item])) {
+      throw new UnprocessableEntityError(
+        `Required field - ${item} missing${location ? ` at ${location}` : ""}`
+      );
+    }
+  });
+};
+ 
+export { validateFields, isNil };
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/coverage/lcov.info b/volunteerverse-api/coverage/lcov.info new file mode 100644 index 00000000..d0108b1f --- /dev/null +++ b/volunteerverse-api/coverage/lcov.info @@ -0,0 +1,542 @@ +TN: +SF:src/config.ts +FN:7,getDatabaseURI +FNF:1 +FNH:1 +FNDA:2,getDatabaseURI +DA:1,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +LF:11 +LH:11 +BRDA:3,0,0,0 +BRDA:3,0,1,2 +BRDA:4,1,0,2 +BRDA:4,1,1,2 +BRDA:8,2,0,2 +BRDA:8,2,1,2 +BRDA:9,3,0,0 +BRDA:9,3,1,2 +BRDA:10,4,0,2 +BRDA:10,4,1,2 +BRDA:11,5,0,2 +BRDA:11,5,1,2 +BRDA:12,6,0,2 +BRDA:12,6,1,2 +BRDA:13,7,0,2 +BRDA:13,7,1,2 +BRF:16 +BRH:14 +end_of_record +TN: +SF:src/db.ts +FN:11,(anonymous_0) +FNF:1 +FNH:1 +FNDA:1,(anonymous_0) +DA:1,2 +DA:2,2 +DA:4,2 +DA:11,2 +DA:12,1 +DA:13,0 +DA:20,2 +LF:7 +LH:6 +BRDA:12,0,0,0 +BRDA:12,0,1,1 +BRF:2 +BRH:1 +end_of_record +TN: +SF:src/models/organization.ts +FN:26,(anonymous_8) +FN:136,(anonymous_9) +FN:148,(anonymous_10) +FN:206,(anonymous_11) +FN:231,(anonymous_12) +FN:246,(anonymous_13) +FN:288,(anonymous_14) +FN:341,(anonymous_15) +FN:365,(anonymous_16) +FN:392,(anonymous_17) +FNF:10 +FNH:2 +FNDA:3,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +DA:1,2 +DA:2,2 +DA:3,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:15,2 +DA:39,3 +DA:49,3 +DA:50,3 +DA:56,1 +DA:60,2 +DA:61,2 +DA:62,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:104,1 +DA:105,1 +DA:107,1 +DA:123,1 +DA:125,1 +DA:138,0 +DA:145,0 +DA:151,1 +DA:168,1 +DA:170,1 +DA:180,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:186,0 +DA:208,0 +DA:212,0 +DA:214,0 +DA:218,0 +DA:219,0 +DA:225,0 +DA:227,0 +DA:232,0 +DA:236,0 +DA:237,0 +DA:240,0 +DA:242,0 +DA:249,0 +DA:252,0 +DA:256,0 +DA:258,0 +DA:259,0 +DA:265,0 +DA:267,0 +DA:268,0 +DA:275,0 +DA:277,0 +DA:280,0 +DA:283,0 +DA:289,0 +DA:293,0 +DA:298,0 +DA:299,0 +DA:301,0 +DA:303,0 +DA:305,0 +DA:306,0 +DA:308,0 +DA:309,0 +DA:316,0 +DA:317,0 +DA:319,0 +DA:321,0 +DA:322,0 +DA:324,0 +DA:325,0 +DA:332,0 +DA:335,0 +DA:342,0 +DA:359,0 +DA:360,0 +DA:362,0 +DA:366,0 +DA:381,0 +DA:382,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:389,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:399,0 +LF:94 +LH:30 +BRDA:61,0,0,1 +BRDA:182,1,0,1 +BRDA:218,2,0,0 +BRDA:218,2,1,0 +BRDA:236,3,0,0 +BRDA:236,3,1,0 +BRDA:258,4,0,0 +BRDA:258,4,1,0 +BRDA:265,5,0,0 +BRDA:265,5,1,0 +BRDA:267,6,0,0 +BRDA:267,6,1,0 +BRDA:306,7,0,0 +BRDA:306,7,1,0 +BRDA:319,8,0,0 +BRDA:319,8,1,0 +BRDA:322,9,0,0 +BRDA:322,9,1,0 +BRDA:359,10,0,0 +BRDA:396,11,0,0 +BRF:20 +BRH:2 +end_of_record +TN: +SF:src/models/projects.ts +FN:25,(anonymous_8) +FN:76,(anonymous_9) +FN:87,(anonymous_10) +FN:93,(anonymous_11) +FN:100,(anonymous_12) +FN:110,(anonymous_13) +FN:129,(anonymous_14) +FN:179,(anonymous_15) +FN:187,(anonymous_16) +FN:189,(anonymous_17) +FN:201,(anonymous_18) +FN:206,(anonymous_19) +FN:213,(anonymous_20) +FN:217,(anonymous_21) +FN:228,(anonymous_22) +FN:235,(anonymous_23) +FNF:16 +FNH:0 +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:20,2 +DA:34,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:50,0 +DA:52,0 +DA:64,0 +DA:73,0 +DA:74,0 +DA:76,0 +DA:77,0 +DA:80,0 +DA:101,0 +DA:102,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:121,0 +DA:134,0 +DA:135,0 +DA:137,0 +DA:147,0 +DA:148,0 +DA:150,0 +DA:151,0 +DA:167,0 +DA:169,0 +DA:174,0 +DA:176,0 +DA:180,0 +DA:181,0 +DA:183,0 +DA:185,0 +DA:187,0 +DA:188,0 +DA:190,0 +DA:193,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:209,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:220,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:238,0 +LF:69 +LH:6 +BRDA:68,0,0,0 +BRDA:68,0,1,0 +BRDA:137,1,0,0 +BRDA:167,2,0,0 +BRDA:183,3,0,0 +BRDA:183,3,1,0 +BRDA:205,4,0,0 +BRDA:234,5,0,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src/models/volunteer.ts +FN:15,(anonymous_8) +FN:47,(anonymous_9) +FN:125,(anonymous_10) +FN:154,(anonymous_11) +FN:164,(anonymous_12) +FN:168,(anonymous_13) +FN:180,(anonymous_14) +FN:202,(anonymous_15) +FN:218,(anonymous_16) +FN:235,(anonymous_17) +FN:249,(anonymous_18) +FN:270,(anonymous_19) +FN:276,(anonymous_20) +FN:278,(anonymous_21) +FN:287,(anonymous_22) +FN:307,(anonymous_23) +FN:324,(anonymous_24) +FN:338,(anonymous_25) +FNF:18 +FNH:4 +FNDA:0,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:2,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:12,2 +DA:23,0 +DA:24,0 +DA:26,0 +DA:57,3 +DA:66,3 +DA:67,3 +DA:73,1 +DA:76,2 +DA:79,2 +DA:80,1 +DA:83,1 +DA:87,1 +DA:89,1 +DA:104,1 +DA:112,1 +DA:114,1 +DA:117,1 +DA:123,1 +DA:125,1 +DA:126,1 +DA:128,1 +DA:138,1 +DA:155,2 +DA:156,2 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:171,0 +DA:182,0 +DA:183,0 +DA:185,0 +DA:187,0 +DA:189,0 +DA:190,0 +DA:193,0 +DA:203,0 +DA:204,0 +DA:206,0 +DA:207,0 +DA:209,0 +DA:219,2 +DA:220,2 +DA:221,2 +DA:222,2 +DA:223,1 +DA:225,1 +DA:236,0 +DA:237,0 +DA:238,0 +DA:240,0 +DA:246,0 +DA:247,0 +DA:251,0 +DA:254,0 +DA:255,0 +DA:258,0 +DA:261,0 +DA:262,0 +DA:272,0 +DA:273,0 +DA:275,0 +DA:277,0 +DA:278,0 +DA:279,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:295,0 +DA:308,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:313,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:328,0 +DA:330,0 +DA:339,0 +DA:349,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:355,0 +LF:95 +LH:34 +BRDA:79,0,0,1 +BRDA:109,1,0,1 +BRDA:109,1,1,1 +BRDA:206,2,0,0 +BRDA:222,3,0,1 +BRDA:237,4,0,0 +BRDA:254,5,0,0 +BRDA:288,6,0,0 +BRDA:310,7,0,0 +BRDA:327,8,0,0 +BRDA:352,9,0,0 +BRF:11 +BRH:4 +end_of_record +TN: +SF:src/utils/errors.ts +FN:5,(anonymous_0) +FN:15,(anonymous_1) +FN:23,(anonymous_2) +FN:31,(anonymous_3) +FN:39,(anonymous_4) +FN:47,(anonymous_5) +FNF:6 +FNH:3 +FNDA:6,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:2,(anonymous_5) +DA:1,2 +DA:6,6 +DA:7,6 +DA:8,6 +DA:14,2 +DA:16,4 +DA:22,2 +DA:24,0 +DA:30,2 +DA:32,0 +DA:38,2 +DA:40,0 +DA:46,2 +DA:48,2 +LF:14 +LH:11 +BRDA:15,0,0,0 +BRDA:23,1,0,0 +BRDA:31,2,0,0 +BRDA:39,3,0,0 +BRDA:47,4,0,0 +BRF:5 +BRH:0 +end_of_record +TN: +SF:src/utils/validate.ts +FN:3,(anonymous_0) +FN:12,(anonymous_1) +FN:15,(anonymous_2) +FNF:3 +FNH:3 +FNDA:34,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:34,(anonymous_2) +DA:1,2 +DA:3,2 +DA:4,34 +DA:12,2 +DA:14,6 +DA:15,6 +DA:16,34 +DA:17,34 +DA:18,2 +DA:25,2 +LF:10 +LH:10 +BRDA:4,0,0,34 +BRDA:4,0,1,34 +BRDA:4,0,2,34 +BRDA:14,1,0,0 +BRDA:17,2,0,2 +BRDA:19,3,0,2 +BRDA:19,3,1,0 +BRF:7 +BRH:5 +end_of_record diff --git a/volunteerverse-api/data/BrowserMetrics-spare.pma b/volunteerverse-api/data/BrowserMetrics-spare.pma new file mode 100644 index 00000000..98fc2c0b Binary files /dev/null and b/volunteerverse-api/data/BrowserMetrics-spare.pma differ diff --git a/volunteerverse-api/data/Default/Affiliation Database b/volunteerverse-api/data/Default/Affiliation Database new file mode 100644 index 00000000..abe2219f Binary files /dev/null and b/volunteerverse-api/data/Default/Affiliation Database differ diff --git a/volunteerverse-api/data/Default/Affiliation Database-journal b/volunteerverse-api/data/Default/Affiliation Database-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/AutofillStrikeDatabase/LOCK b/volunteerverse-api/data/Default/AutofillStrikeDatabase/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/AutofillStrikeDatabase/LOG b/volunteerverse-api/data/Default/AutofillStrikeDatabase/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/BudgetDatabase/LOCK b/volunteerverse-api/data/Default/BudgetDatabase/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/BudgetDatabase/LOG b/volunteerverse-api/data/Default/BudgetDatabase/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/0f1fe855708d18eb_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/0f1fe855708d18eb_0 new file mode 100644 index 00000000..29900b1b Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/0f1fe855708d18eb_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/12ee9a61d22b5b08_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/12ee9a61d22b5b08_0 new file mode 100644 index 00000000..711fff2e Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/12ee9a61d22b5b08_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/22a801d73d18c5cb_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/22a801d73d18c5cb_0 new file mode 100644 index 00000000..f280223e Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/22a801d73d18c5cb_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/38c043c91b0f1696_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/38c043c91b0f1696_0 new file mode 100644 index 00000000..66079367 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/38c043c91b0f1696_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/3927d01dabced938_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/3927d01dabced938_0 new file mode 100644 index 00000000..12d923ca Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/3927d01dabced938_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/3ead64064c6967d3_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/3ead64064c6967d3_0 new file mode 100644 index 00000000..2f1ef2e8 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/3ead64064c6967d3_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/520acbfb43357e0e_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/520acbfb43357e0e_0 new file mode 100644 index 00000000..37270d37 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/520acbfb43357e0e_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/5e3fb2c7c665a698_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/5e3fb2c7c665a698_0 new file mode 100644 index 00000000..41578373 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/5e3fb2c7c665a698_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/692b687c7726c10c_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/692b687c7726c10c_0 new file mode 100644 index 00000000..627f2380 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/692b687c7726c10c_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/6992d94687a6772c_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/6992d94687a6772c_0 new file mode 100644 index 00000000..cef520b0 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/6992d94687a6772c_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/6a3a222106fcc88b_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/6a3a222106fcc88b_0 new file mode 100644 index 00000000..6546e9d5 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/6a3a222106fcc88b_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/82f9582737f6d5cc_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/82f9582737f6d5cc_0 new file mode 100644 index 00000000..39505935 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/82f9582737f6d5cc_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/85486acbcab2f1bb_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/85486acbcab2f1bb_0 new file mode 100644 index 00000000..56e08390 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/85486acbcab2f1bb_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/8a2f9eb9d131aacb_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/8a2f9eb9d131aacb_0 new file mode 100644 index 00000000..745992be Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/8a2f9eb9d131aacb_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/8f87e4e2533fdb21_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/8f87e4e2533fdb21_0 new file mode 100644 index 00000000..aa68e0d9 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/8f87e4e2533fdb21_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/915abea796a2edf1_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/915abea796a2edf1_0 new file mode 100644 index 00000000..862242e5 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/915abea796a2edf1_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/9a70009913b8cfbc_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/9a70009913b8cfbc_0 new file mode 100644 index 00000000..e0a3fbf7 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/9a70009913b8cfbc_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/9e0b8a7cdd1f3f37_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/9e0b8a7cdd1f3f37_0 new file mode 100644 index 00000000..439351d5 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/9e0b8a7cdd1f3f37_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/a47274a910a34d50_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/a47274a910a34d50_0 new file mode 100644 index 00000000..b404083b Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/a47274a910a34d50_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/acbe36d719621424_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/acbe36d719621424_0 new file mode 100644 index 00000000..436dcc41 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/acbe36d719621424_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/ae81f4d89be86833_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/ae81f4d89be86833_0 new file mode 100644 index 00000000..ef4dea60 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/ae81f4d89be86833_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/b24513bc6a7186b2_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/b24513bc6a7186b2_0 new file mode 100644 index 00000000..6be26fd1 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/b24513bc6a7186b2_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/b53c072b7d362e3f_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/b53c072b7d362e3f_0 new file mode 100644 index 00000000..ba8cdc54 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/b53c072b7d362e3f_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/cc7a314dab19f303_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/cc7a314dab19f303_0 new file mode 100644 index 00000000..a16a8a2c Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/cc7a314dab19f303_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/cdae9c903d7c0974_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/cdae9c903d7c0974_0 new file mode 100644 index 00000000..aaa187b2 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/cdae9c903d7c0974_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/d82dd7744f7244ae_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/d82dd7744f7244ae_0 new file mode 100644 index 00000000..c7dd6248 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/d82dd7744f7244ae_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/f4f68564c752f589_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/f4f68564c752f589_0 new file mode 100644 index 00000000..3b3c2a22 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/f4f68564c752f589_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/feb512e356bb65b0_0 b/volunteerverse-api/data/Default/Cache/Cache_Data/feb512e356bb65b0_0 new file mode 100644 index 00000000..9ae45ee4 Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/feb512e356bb65b0_0 differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/index b/volunteerverse-api/data/Default/Cache/Cache_Data/index new file mode 100644 index 00000000..79bd403a Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/index differ diff --git a/volunteerverse-api/data/Default/Cache/Cache_Data/index-dir/the-real-index b/volunteerverse-api/data/Default/Cache/Cache_Data/index-dir/the-real-index new file mode 100644 index 00000000..8654decc Binary files /dev/null and b/volunteerverse-api/data/Default/Cache/Cache_Data/index-dir/the-real-index differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/0ce24c34997bcab6_0 b/volunteerverse-api/data/Default/Code Cache/js/0ce24c34997bcab6_0 new file mode 100644 index 00000000..259fcbfa Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/0ce24c34997bcab6_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/2cb3f6c638fffc4a_0 b/volunteerverse-api/data/Default/Code Cache/js/2cb3f6c638fffc4a_0 new file mode 100644 index 00000000..2acb2141 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/2cb3f6c638fffc4a_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/4ffa74d404e6ae74_0 b/volunteerverse-api/data/Default/Code Cache/js/4ffa74d404e6ae74_0 new file mode 100644 index 00000000..a3ae3a5e Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/4ffa74d404e6ae74_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/7afc0e25a0147261_0 b/volunteerverse-api/data/Default/Code Cache/js/7afc0e25a0147261_0 new file mode 100644 index 00000000..5634176d Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/7afc0e25a0147261_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/994c40d4a2c069a9_0 b/volunteerverse-api/data/Default/Code Cache/js/994c40d4a2c069a9_0 new file mode 100644 index 00000000..144ea002 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/994c40d4a2c069a9_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/a9aadc546beaef0c_0 b/volunteerverse-api/data/Default/Code Cache/js/a9aadc546beaef0c_0 new file mode 100644 index 00000000..409b993b Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/a9aadc546beaef0c_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/b84917e44506284b_0 b/volunteerverse-api/data/Default/Code Cache/js/b84917e44506284b_0 new file mode 100644 index 00000000..c6e1788d Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/b84917e44506284b_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/c8a5b2e9655455ea_0 b/volunteerverse-api/data/Default/Code Cache/js/c8a5b2e9655455ea_0 new file mode 100644 index 00000000..0ffb91c6 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/c8a5b2e9655455ea_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/e1a92d987e2b9d13_0 b/volunteerverse-api/data/Default/Code Cache/js/e1a92d987e2b9d13_0 new file mode 100644 index 00000000..b53e758b Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/e1a92d987e2b9d13_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/ed8dc03052160523_0 b/volunteerverse-api/data/Default/Code Cache/js/ed8dc03052160523_0 new file mode 100644 index 00000000..d98137f7 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/ed8dc03052160523_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/f6060e1c0d5cce41_0 b/volunteerverse-api/data/Default/Code Cache/js/f6060e1c0d5cce41_0 new file mode 100644 index 00000000..a7fe7f77 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/f6060e1c0d5cce41_0 differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/index b/volunteerverse-api/data/Default/Code Cache/js/index new file mode 100644 index 00000000..79bd403a Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/index differ diff --git a/volunteerverse-api/data/Default/Code Cache/js/index-dir/the-real-index b/volunteerverse-api/data/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 00000000..daac9a00 Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/volunteerverse-api/data/Default/Code Cache/wasm/index b/volunteerverse-api/data/Default/Code Cache/wasm/index new file mode 100644 index 00000000..79bd403a Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/wasm/index differ diff --git a/volunteerverse-api/data/Default/Code Cache/wasm/index-dir/the-real-index b/volunteerverse-api/data/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 00000000..f19f448d Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/volunteerverse-api/data/Default/Code Cache/webui_js/index b/volunteerverse-api/data/Default/Code Cache/webui_js/index new file mode 100644 index 00000000..79bd403a Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/webui_js/index differ diff --git a/volunteerverse-api/data/Default/Code Cache/webui_js/index-dir/the-real-index b/volunteerverse-api/data/Default/Code Cache/webui_js/index-dir/the-real-index new file mode 100644 index 00000000..57d81f8e Binary files /dev/null and b/volunteerverse-api/data/Default/Code Cache/webui_js/index-dir/the-real-index differ diff --git a/volunteerverse-api/data/Default/Cookies b/volunteerverse-api/data/Default/Cookies new file mode 100644 index 00000000..daa01238 Binary files /dev/null and b/volunteerverse-api/data/Default/Cookies differ diff --git a/volunteerverse-api/data/Default/Cookies-journal b/volunteerverse-api/data/Default/Cookies-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/DIPS b/volunteerverse-api/data/Default/DIPS new file mode 100644 index 00000000..82c4ba7c Binary files /dev/null and b/volunteerverse-api/data/Default/DIPS differ diff --git a/volunteerverse-api/data/Default/DIPS-journal b/volunteerverse-api/data/Default/DIPS-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/DawnCache/data_0 b/volunteerverse-api/data/Default/DawnCache/data_0 new file mode 100644 index 00000000..d76fb77e Binary files /dev/null and b/volunteerverse-api/data/Default/DawnCache/data_0 differ diff --git a/volunteerverse-api/data/Default/DawnCache/data_1 b/volunteerverse-api/data/Default/DawnCache/data_1 new file mode 100644 index 00000000..035d06d9 Binary files /dev/null and b/volunteerverse-api/data/Default/DawnCache/data_1 differ diff --git a/volunteerverse-api/data/Default/DawnCache/data_2 b/volunteerverse-api/data/Default/DawnCache/data_2 new file mode 100644 index 00000000..c7e2eb9a Binary files /dev/null and b/volunteerverse-api/data/Default/DawnCache/data_2 differ diff --git a/volunteerverse-api/data/Default/DawnCache/data_3 b/volunteerverse-api/data/Default/DawnCache/data_3 new file mode 100644 index 00000000..5eec9735 Binary files /dev/null and b/volunteerverse-api/data/Default/DawnCache/data_3 differ diff --git a/volunteerverse-api/data/Default/DawnCache/index b/volunteerverse-api/data/Default/DawnCache/index new file mode 100644 index 00000000..31b1725e Binary files /dev/null and b/volunteerverse-api/data/Default/DawnCache/index differ diff --git a/volunteerverse-api/data/Default/Extension Rules/000003.log b/volunteerverse-api/data/Default/Extension Rules/000003.log new file mode 100644 index 00000000..f7187670 Binary files /dev/null and b/volunteerverse-api/data/Default/Extension Rules/000003.log differ diff --git a/volunteerverse-api/data/Default/Extension Rules/CURRENT b/volunteerverse-api/data/Default/Extension Rules/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension Rules/LOCK b/volunteerverse-api/data/Default/Extension Rules/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Extension Rules/LOG b/volunteerverse-api/data/Default/Extension Rules/LOG new file mode 100644 index 00000000..5f2d87e8 --- /dev/null +++ b/volunteerverse-api/data/Default/Extension Rules/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.153 8803 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension Rules since it was missing. +2023/07/25-11:18:13.295 8803 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension Rules/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension Rules/MANIFEST-000001 b/volunteerverse-api/data/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Extension Rules/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Extension Scripts/000003.log b/volunteerverse-api/data/Default/Extension Scripts/000003.log new file mode 100644 index 00000000..4acb4c8d Binary files /dev/null and b/volunteerverse-api/data/Default/Extension Scripts/000003.log differ diff --git a/volunteerverse-api/data/Default/Extension Scripts/CURRENT b/volunteerverse-api/data/Default/Extension Scripts/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension Scripts/LOCK b/volunteerverse-api/data/Default/Extension Scripts/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Extension Scripts/LOG b/volunteerverse-api/data/Default/Extension Scripts/LOG new file mode 100644 index 00000000..0b30db7d --- /dev/null +++ b/volunteerverse-api/data/Default/Extension Scripts/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.298 8803 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension Scripts since it was missing. +2023/07/25-11:18:13.514 8803 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension Scripts/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension Scripts/MANIFEST-000001 b/volunteerverse-api/data/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Extension State/000003.log b/volunteerverse-api/data/Default/Extension State/000003.log new file mode 100644 index 00000000..b248f536 Binary files /dev/null and b/volunteerverse-api/data/Default/Extension State/000003.log differ diff --git a/volunteerverse-api/data/Default/Extension State/CURRENT b/volunteerverse-api/data/Default/Extension State/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension State/LOCK b/volunteerverse-api/data/Default/Extension State/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Extension State/LOG b/volunteerverse-api/data/Default/Extension State/LOG new file mode 100644 index 00000000..db6f8bb2 --- /dev/null +++ b/volunteerverse-api/data/Default/Extension State/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.597 8803 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension State since it was missing. +2023/07/25-11:18:13.707 8803 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Extension State/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Extension State/MANIFEST-000001 b/volunteerverse-api/data/Default/Extension State/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Extension State/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Favicons b/volunteerverse-api/data/Default/Favicons new file mode 100644 index 00000000..e7549e53 Binary files /dev/null and b/volunteerverse-api/data/Default/Favicons differ diff --git a/volunteerverse-api/data/Default/Favicons-journal b/volunteerverse-api/data/Default/Favicons-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Feature Engagement Tracker/AvailabilityDB/LOCK b/volunteerverse-api/data/Default/Feature Engagement Tracker/AvailabilityDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Feature Engagement Tracker/AvailabilityDB/LOG b/volunteerverse-api/data/Default/Feature Engagement Tracker/AvailabilityDB/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Feature Engagement Tracker/EventDB/LOCK b/volunteerverse-api/data/Default/Feature Engagement Tracker/EventDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Feature Engagement Tracker/EventDB/LOG b/volunteerverse-api/data/Default/Feature Engagement Tracker/EventDB/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/GPUCache/data_0 b/volunteerverse-api/data/Default/GPUCache/data_0 new file mode 100644 index 00000000..d76fb77e Binary files /dev/null and b/volunteerverse-api/data/Default/GPUCache/data_0 differ diff --git a/volunteerverse-api/data/Default/GPUCache/data_1 b/volunteerverse-api/data/Default/GPUCache/data_1 new file mode 100644 index 00000000..035d06d9 Binary files /dev/null and b/volunteerverse-api/data/Default/GPUCache/data_1 differ diff --git a/volunteerverse-api/data/Default/GPUCache/data_2 b/volunteerverse-api/data/Default/GPUCache/data_2 new file mode 100644 index 00000000..c7e2eb9a Binary files /dev/null and b/volunteerverse-api/data/Default/GPUCache/data_2 differ diff --git a/volunteerverse-api/data/Default/GPUCache/data_3 b/volunteerverse-api/data/Default/GPUCache/data_3 new file mode 100644 index 00000000..5eec9735 Binary files /dev/null and b/volunteerverse-api/data/Default/GPUCache/data_3 differ diff --git a/volunteerverse-api/data/Default/GPUCache/index b/volunteerverse-api/data/Default/GPUCache/index new file mode 100644 index 00000000..6077d33c Binary files /dev/null and b/volunteerverse-api/data/Default/GPUCache/index differ diff --git a/volunteerverse-api/data/Default/History b/volunteerverse-api/data/Default/History new file mode 100644 index 00000000..da83cf7d Binary files /dev/null and b/volunteerverse-api/data/Default/History differ diff --git a/volunteerverse-api/data/Default/History-journal b/volunteerverse-api/data/Default/History-journal new file mode 100644 index 00000000..e17328d6 Binary files /dev/null and b/volunteerverse-api/data/Default/History-journal differ diff --git a/volunteerverse-api/data/Default/Local Storage/leveldb/000003.log b/volunteerverse-api/data/Default/Local Storage/leveldb/000003.log new file mode 100644 index 00000000..889762f5 Binary files /dev/null and b/volunteerverse-api/data/Default/Local Storage/leveldb/000003.log differ diff --git a/volunteerverse-api/data/Default/Local Storage/leveldb/CURRENT b/volunteerverse-api/data/Default/Local Storage/leveldb/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Local Storage/leveldb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Local Storage/leveldb/LOCK b/volunteerverse-api/data/Default/Local Storage/leveldb/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Local Storage/leveldb/LOG b/volunteerverse-api/data/Default/Local Storage/leveldb/LOG new file mode 100644 index 00000000..b81e4aca --- /dev/null +++ b/volunteerverse-api/data/Default/Local Storage/leveldb/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.295 2a07 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Local Storage/leveldb since it was missing. +2023/07/25-11:18:13.418 2a07 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Local Storage/leveldb/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Local Storage/leveldb/MANIFEST-000001 b/volunteerverse-api/data/Default/Local Storage/leveldb/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Local Storage/leveldb/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Login Data b/volunteerverse-api/data/Default/Login Data new file mode 100644 index 00000000..1f12184f Binary files /dev/null and b/volunteerverse-api/data/Default/Login Data differ diff --git a/volunteerverse-api/data/Default/Login Data For Account b/volunteerverse-api/data/Default/Login Data For Account new file mode 100644 index 00000000..1f12184f Binary files /dev/null and b/volunteerverse-api/data/Default/Login Data For Account differ diff --git a/volunteerverse-api/data/Default/Login Data For Account-journal b/volunteerverse-api/data/Default/Login Data For Account-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Login Data-journal b/volunteerverse-api/data/Default/Login Data-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Network Action Predictor b/volunteerverse-api/data/Default/Network Action Predictor new file mode 100644 index 00000000..9619fc69 Binary files /dev/null and b/volunteerverse-api/data/Default/Network Action Predictor differ diff --git a/volunteerverse-api/data/Default/Network Action Predictor-journal b/volunteerverse-api/data/Default/Network Action Predictor-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Network Persistent State b/volunteerverse-api/data/Default/Network Persistent State new file mode 100644 index 00000000..c38a4fe3 --- /dev/null +++ b/volunteerverse-api/data/Default/Network Persistent State @@ -0,0 +1 @@ +{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374694006352","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"server":"https://accounts.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374694801454","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"server":"https://ogs.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374694838973","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"server":"https://apis.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374695087592","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"server":"https://fonts.gstatic.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374695460145","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"server":"https://adservice.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374694873901","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"network_stats":{"srtt":69637},"server":"https://content-autofill.googleapis.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374695250121","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"network_stats":{"srtt":73986},"server":"https://www.gstatic.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374725455134","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"network_stats":{"srtt":53611},"server":"https://play.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13337374695327114","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false],"network_stats":{"srtt":61453},"server":"https://www.google.com","supports_spdy":true}],"supports_quic":{"address":"10.22.17.5","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G"}}} \ No newline at end of file diff --git a/volunteerverse-api/data/Default/PersistentOriginTrials/LOCK b/volunteerverse-api/data/Default/PersistentOriginTrials/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/PersistentOriginTrials/LOG b/volunteerverse-api/data/Default/PersistentOriginTrials/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Preferences b/volunteerverse-api/data/Default/Preferences new file mode 100644 index 00000000..1e9ba9a2 --- /dev/null +++ b/volunteerverse-api/data/Default/Preferences @@ -0,0 +1 @@ +{"account_tracker_service_last_update":"13334782693396647","ack_existing_ntp_extensions":true,"alternate_error_pages":{"backup":true},"apps":{"shortcuts_arch":"x86_64","shortcuts_version":7},"autocomplete":{"retention_policy_last_version":115},"autofill":{"orphan_rows_removed":true},"browser":{"has_seen_welcome_page":false},"commerce_daily_metrics_last_update_time":"13334782693377559","countryid_at_install":21843,"dips_timer_last_update":"13334782693270333","domain_diversity":{"last_reporting_timestamp":"13334782693790687"},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"115.0.5790.98"},"gaia_cookie":{"changed_time":1690309094.007673,"hash":"2jmj7l5rSw0yVb/vlWAYkK/YBwk=","last_list_accounts_data":"[\"gaia.l.a.r\",[]]"},"gcm":{"product_category_for_subtypes":"com.googlechromefortesting.macosx"},"google":{"services":{"consented_to_sync":false,"signin_scoped_device_id":"d7efe704-31a7-456e-8e57-015e871e2517"}},"intl":{"selected_languages":"en-US,en"},"invalidation":{"per_sender_topics_to_handler":{"1013309121859":{},"8181035976":{}}},"media":{"device_id_salt":"FDD0BFAAE15C2D197A2C629327068794","engagement":{"schema_version":5}},"ntp":{"num_personal_suggestions":2},"password_manager":{"passwords_grouping_info_requested":true},"privacy_sandbox":{"anti_abuse_initialized":true,"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":26,"content_settings":{"enable_quiet_permission_ui_enabling_method":{"notifications":1},"exceptions":{"accessibility_events":{},"anti_abuse":{},"app_banner":{},"ar":{},"auto_select_certificate":{},"automatic_downloads":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"client_hints":{"https://www.google.com:443,*":{"last_modified":"13334782694136631","setting":{"client_hints":[9,10,11,13,14,16,23,25]}}},"clipboard":{},"cookies":{},"durable_storage":{},"fedcm_active_session":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"get_display_media_set_select_all_screens":{},"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"insecure_private_network":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"legacy_cookie_access":{},"local_fonts":{},"media_engagement":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"password_protection":{},"payment_handler":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"popups":{},"private_network_chooser_data":{},"private_network_guard":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{"https://www.google.com:443,*":{"last_modified":"13334782694152549","setting":{"lastEngagementTime":1.3334782694152544e+16,"lastShortcutLaunchTime":0.0,"pointsAddedToday":3.0,"rawScore":3.0}}},"sound":{},"ssl_cert_decisions":{},"storage_access":{},"subresource_filter":{},"subresource_filter_data":{},"third_party_storage_partitioning":{},"top_level_storage_access":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"115.0.5790.98","creation_time":"13334782693056674","exit_type":"Crashed","last_engagement_time":"13334782694152543","last_time_obsolete_http_credentials_removed":1690309153.279662,"last_time_password_store_metrics_reported":1690309123.279542,"managed":{"banner_state":1},"managed_user_id":"","name":"Person 1","were_old_google_logins_removed":true},"safebrowsing":{"event_timestamps":{},"metrics_last_log_time":"13334782693"},"segmentation_platform":{"device_switcher_util":{"result":{"labels":["NotSynced"]}},"last_db_compaction_time":"13334630399000000"},"sessions":{"event_log":[{"crashed":false,"time":"13334782693072974","type":0}],"session_data_status":1},"signin":{"allowed":true},"supervised_user":{"metrics":{"day_id":154337}},"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"web_apps":{"did_migrate_default_chrome_apps":["MigrateDefaultChromeAppToWebAppsGSuite","MigrateDefaultChromeAppToWebAppsNonGSuite"],"last_preinstall_synchronize_version":"115"},"webauthn":{"touchid":{"metadata_secret":"zk8/yiaDN8fV3nML7fzO0QRceXM39XlQiSzx5swVItc="}}} \ No newline at end of file diff --git a/volunteerverse-api/data/Default/PreferredApps b/volunteerverse-api/data/Default/PreferredApps new file mode 100644 index 00000000..7d3a4259 --- /dev/null +++ b/volunteerverse-api/data/Default/PreferredApps @@ -0,0 +1 @@ +{"preferred_apps":[],"version":1} \ No newline at end of file diff --git a/volunteerverse-api/data/Default/README b/volunteerverse-api/data/Default/README new file mode 100644 index 00000000..545cc627 --- /dev/null +++ b/volunteerverse-api/data/Default/README @@ -0,0 +1 @@ +Chromium settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Chromium defined APIs. \ No newline at end of file diff --git a/volunteerverse-api/data/Default/Reporting and NEL b/volunteerverse-api/data/Default/Reporting and NEL new file mode 100644 index 00000000..91e889e7 Binary files /dev/null and b/volunteerverse-api/data/Default/Reporting and NEL differ diff --git a/volunteerverse-api/data/Default/Reporting and NEL-journal b/volunteerverse-api/data/Default/Reporting and NEL-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Secure Preferences b/volunteerverse-api/data/Default/Secure Preferences new file mode 100644 index 00000000..cc064a6f --- /dev/null +++ b/volunteerverse-api/data/Default/Secure Preferences @@ -0,0 +1 @@ +{"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"events":[],"first_install_time":"13334782693110847","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13334782693110847","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover great apps, games, extensions and themes for Chromium.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"page_ordinal":"n","path":"/Users/mcristino/.cache/puppeteer/chrome/mac-115.0.5790.98/chrome-mac-x64/Google Chrome for Testing.app/Contents/Frameworks/Google Chrome for Testing Framework.framework/Versions/115.0.5790.98/Resources/web_store","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate"],"explicit_host":["chrome://resources/*","chrome://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"events":[],"first_install_time":"13334782693111421","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13334782693111421","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"index.html","name":"Chromium PDF Viewer","offline_enabled":true,"permissions":["chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write"]}],"version":"1"},"path":"/Users/mcristino/.cache/puppeteer/chrome/mac-115.0.5790.98/chrome-mac-x64/Google Chrome for Testing.app/Contents/Frameworks/Google Chrome for Testing Framework.framework/Versions/115.0.5790.98/Resources/pdf","preferences":{},"regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"A50509BB89EE6798B93061244B1046F7EBF28AD872F97CC8036F861ED517ADF3"},"default_search_provider_data":{"template_url_data":"42B6C62087B3B67E891A7E9EB5080C4655E757AB38EB1B4A325BAF38E333A2BE"},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"CEFB82825F83FA4555DF67BB6D45A7F05FC9F3FF643170A8EFE24C5AEFB88B69","mhjfbmdgcfjbbpaeojofohoefgiehjai":"2F20EEF7F18F2BF92D00ADCEEEB1C04070A3B7461CEF01B780FFE9561D7AC735"}},"google":{"services":{"account_id":"AF05F7FC8FCFB5A22FBC09D0BF2ED739F3B2A5C7F30BE3AAC66ADEBCD8691746","last_account_id":"472E6302FFBDE0CB2513A820051B6AE5E14E0FA8B21BA23D4D6F5039F2C493D0","last_username":"8750ECD2EC8061915E27BB9C145FD68551499BE68AE26F5BCA0091741F646E32"}},"homepage":"83BE16728AE5A9FF5F48822D80E568ABDF2805DC20FEFFDBE561BD270E4877FF","homepage_is_newtabpage":"2B818A2C34D93C3F468E6C0E742E2F31E4B2DF4382B3BB2E9309B745A3D1C622","media":{"storage_id_salt":"388717A2DFCDDDF6D3C3AC45F619D413450E936619198B6E5CB48E77428E9A5B"},"pinned_tabs":"6484ABAB1252AD407D53FE8062181B96BBA6FB818895A21D4C689530881C0577","prefs":{"preference_reset_time":"6FB47999C65778445F450D16D1C6BF47746BCDE634DFE242E2981DA925B8B388"},"safebrowsing":{"incidents_sent":"C69B6BE26FC6C8AB79BF89FCF97340DBB95A9F384D592FBE738EB29FC8DF8779"},"search_provider_overrides":"E858CB954BFB97CD9A815153B71DCD58CD068CB8AD136CC493685AFB0EF982EC","session":{"restore_on_startup":"4BFC1935DF05BE6D9F69E13C7F70850E211BB78700482C7F9857E21D6E64E7D0","startup_urls":"FA854473A0FAC0C30C53FCA67FA8856D37B5367E55AF01B3EDD209C4A3AA7605"}},"super_mac":"70138496CE55136A282FBC847F3AE3E3E86CF8453CD75850DA25AB3514DD0263"}} \ No newline at end of file diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SegmentInfoDB/LOCK b/volunteerverse-api/data/Default/Segmentation Platform/SegmentInfoDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SegmentInfoDB/LOG b/volunteerverse-api/data/Default/Segmentation Platform/SegmentInfoDB/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SignalDB/LOCK b/volunteerverse-api/data/Default/Segmentation Platform/SignalDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SignalDB/LOG b/volunteerverse-api/data/Default/Segmentation Platform/SignalDB/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SignalStorageConfigDB/LOCK b/volunteerverse-api/data/Default/Segmentation Platform/SignalStorageConfigDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Segmentation Platform/SignalStorageConfigDB/LOG b/volunteerverse-api/data/Default/Segmentation Platform/SignalStorageConfigDB/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Session Storage/000003.log b/volunteerverse-api/data/Default/Session Storage/000003.log new file mode 100644 index 00000000..8c39cfac Binary files /dev/null and b/volunteerverse-api/data/Default/Session Storage/000003.log differ diff --git a/volunteerverse-api/data/Default/Session Storage/CURRENT b/volunteerverse-api/data/Default/Session Storage/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Session Storage/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Session Storage/LOCK b/volunteerverse-api/data/Default/Session Storage/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Session Storage/LOG b/volunteerverse-api/data/Default/Session Storage/LOG new file mode 100644 index 00000000..f5c96f1d --- /dev/null +++ b/volunteerverse-api/data/Default/Session Storage/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.297 3a03 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Session Storage since it was missing. +2023/07/25-11:18:13.535 3a03 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Session Storage/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Session Storage/MANIFEST-000001 b/volunteerverse-api/data/Default/Session Storage/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Session Storage/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Sessions/Session_13334782695578830 b/volunteerverse-api/data/Default/Sessions/Session_13334782695578830 new file mode 100644 index 00000000..190445bd Binary files /dev/null and b/volunteerverse-api/data/Default/Sessions/Session_13334782695578830 differ diff --git a/volunteerverse-api/data/Default/SharedStorage b/volunteerverse-api/data/Default/SharedStorage new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Shortcuts b/volunteerverse-api/data/Default/Shortcuts new file mode 100644 index 00000000..8314c05c Binary files /dev/null and b/volunteerverse-api/data/Default/Shortcuts differ diff --git a/volunteerverse-api/data/Default/Shortcuts-journal b/volunteerverse-api/data/Default/Shortcuts-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Site Characteristics Database/000003.log b/volunteerverse-api/data/Default/Site Characteristics Database/000003.log new file mode 100644 index 00000000..46580fb8 Binary files /dev/null and b/volunteerverse-api/data/Default/Site Characteristics Database/000003.log differ diff --git a/volunteerverse-api/data/Default/Site Characteristics Database/CURRENT b/volunteerverse-api/data/Default/Site Characteristics Database/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Site Characteristics Database/LOCK b/volunteerverse-api/data/Default/Site Characteristics Database/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Site Characteristics Database/LOG b/volunteerverse-api/data/Default/Site Characteristics Database/LOG new file mode 100644 index 00000000..c38b81af --- /dev/null +++ b/volunteerverse-api/data/Default/Site Characteristics Database/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.071 14003 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Site Characteristics Database since it was missing. +2023/07/25-11:18:13.154 14003 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Site Characteristics Database/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Site Characteristics Database/MANIFEST-000001 b/volunteerverse-api/data/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Sync Data/LevelDB/000003.log b/volunteerverse-api/data/Default/Sync Data/LevelDB/000003.log new file mode 100644 index 00000000..2b778f4b Binary files /dev/null and b/volunteerverse-api/data/Default/Sync Data/LevelDB/000003.log differ diff --git a/volunteerverse-api/data/Default/Sync Data/LevelDB/CURRENT b/volunteerverse-api/data/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Sync Data/LevelDB/LOCK b/volunteerverse-api/data/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Sync Data/LevelDB/LOG b/volunteerverse-api/data/Default/Sync Data/LevelDB/LOG new file mode 100644 index 00000000..e5f57381 --- /dev/null +++ b/volunteerverse-api/data/Default/Sync Data/LevelDB/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.131 f203 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Sync Data/LevelDB since it was missing. +2023/07/25-11:18:13.253 f203 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/Sync Data/LevelDB/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/Sync Data/LevelDB/MANIFEST-000001 b/volunteerverse-api/data/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/Top Sites b/volunteerverse-api/data/Default/Top Sites new file mode 100644 index 00000000..1c2e6493 Binary files /dev/null and b/volunteerverse-api/data/Default/Top Sites differ diff --git a/volunteerverse-api/data/Default/Top Sites-journal b/volunteerverse-api/data/Default/Top Sites-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/TransportSecurity b/volunteerverse-api/data/Default/TransportSecurity new file mode 100644 index 00000000..1166abaf --- /dev/null +++ b/volunteerverse-api/data/Default/TransportSecurity @@ -0,0 +1 @@ +{"sts":[{"expiry":1721845094.863626,"host":"5EdUoB7YUY9zZV+2DkgVXgho8WUvp+D+6KpeUOhNQIM=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1690309094.863631},{"expiry":1721845094.006482,"host":"8/RrMmQlCD2Gsp14wUCE1P8r7B2C5+yE0+g79IPyRsc=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1690309094.006487},{"expiry":1721845094.801631,"host":"+ccWXqaoHJ9hfuXbleKV6FQUrBlyXAJ31BdqjNQJpHs=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1690309094.801635}],"version":2} \ No newline at end of file diff --git a/volunteerverse-api/data/Default/Trust Tokens b/volunteerverse-api/data/Default/Trust Tokens new file mode 100644 index 00000000..bfae4dda Binary files /dev/null and b/volunteerverse-api/data/Default/Trust Tokens differ diff --git a/volunteerverse-api/data/Default/Trust Tokens-journal b/volunteerverse-api/data/Default/Trust Tokens-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/Visited Links b/volunteerverse-api/data/Default/Visited Links new file mode 100644 index 00000000..654fb1f3 Binary files /dev/null and b/volunteerverse-api/data/Default/Visited Links differ diff --git a/volunteerverse-api/data/Default/Web Data b/volunteerverse-api/data/Default/Web Data new file mode 100644 index 00000000..335d09b5 Binary files /dev/null and b/volunteerverse-api/data/Default/Web Data differ diff --git a/volunteerverse-api/data/Default/Web Data-journal b/volunteerverse-api/data/Default/Web Data-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/commerce_subscription_db/LOCK b/volunteerverse-api/data/Default/commerce_subscription_db/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/commerce_subscription_db/LOG b/volunteerverse-api/data/Default/commerce_subscription_db/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/coupon_db/LOCK b/volunteerverse-api/data/Default/coupon_db/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/coupon_db/LOG b/volunteerverse-api/data/Default/coupon_db/LOG new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/heavy_ad_intervention_opt_out.db b/volunteerverse-api/data/Default/heavy_ad_intervention_opt_out.db new file mode 100644 index 00000000..514e4324 Binary files /dev/null and b/volunteerverse-api/data/Default/heavy_ad_intervention_opt_out.db differ diff --git a/volunteerverse-api/data/Default/heavy_ad_intervention_opt_out.db-journal b/volunteerverse-api/data/Default/heavy_ad_intervention_opt_out.db-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/power_bookmarks/PowerBookmarks.db b/volunteerverse-api/data/Default/power_bookmarks/PowerBookmarks.db new file mode 100644 index 00000000..89a8c3f4 Binary files /dev/null and b/volunteerverse-api/data/Default/power_bookmarks/PowerBookmarks.db differ diff --git a/volunteerverse-api/data/Default/power_bookmarks/PowerBookmarks.db-journal b/volunteerverse-api/data/Default/power_bookmarks/PowerBookmarks.db-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/shared_proto_db/000003.log b/volunteerverse-api/data/Default/shared_proto_db/000003.log new file mode 100644 index 00000000..48c3e2e1 Binary files /dev/null and b/volunteerverse-api/data/Default/shared_proto_db/000003.log differ diff --git a/volunteerverse-api/data/Default/shared_proto_db/CURRENT b/volunteerverse-api/data/Default/shared_proto_db/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/shared_proto_db/LOCK b/volunteerverse-api/data/Default/shared_proto_db/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/shared_proto_db/LOG b/volunteerverse-api/data/Default/shared_proto_db/LOG new file mode 100644 index 00000000..b7ac313a --- /dev/null +++ b/volunteerverse-api/data/Default/shared_proto_db/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.706 13503 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/shared_proto_db since it was missing. +2023/07/25-11:18:13.791 13503 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/shared_proto_db/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/shared_proto_db/MANIFEST-000001 b/volunteerverse-api/data/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/Default/shared_proto_db/metadata/000003.log b/volunteerverse-api/data/Default/shared_proto_db/metadata/000003.log new file mode 100644 index 00000000..3c672cba Binary files /dev/null and b/volunteerverse-api/data/Default/shared_proto_db/metadata/000003.log differ diff --git a/volunteerverse-api/data/Default/shared_proto_db/metadata/CURRENT b/volunteerverse-api/data/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 00000000..7ed683d1 --- /dev/null +++ b/volunteerverse-api/data/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/shared_proto_db/metadata/LOCK b/volunteerverse-api/data/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/Default/shared_proto_db/metadata/LOG b/volunteerverse-api/data/Default/shared_proto_db/metadata/LOG new file mode 100644 index 00000000..6c1839cd --- /dev/null +++ b/volunteerverse-api/data/Default/shared_proto_db/metadata/LOG @@ -0,0 +1,2 @@ +2023/07/25-11:18:13.513 13503 Creating DB /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/shared_proto_db/metadata since it was missing. +2023/07/25-11:18:13.618 13503 Reusing MANIFEST /Users/mcristino/capstone/site-capstone-volunteerverse/volunteerverse-api/data/Default/shared_proto_db/metadata/MANIFEST-000001 diff --git a/volunteerverse-api/data/Default/shared_proto_db/metadata/MANIFEST-000001 b/volunteerverse-api/data/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 00000000..18e5cab7 Binary files /dev/null and b/volunteerverse-api/data/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/volunteerverse-api/data/DevToolsActivePort b/volunteerverse-api/data/DevToolsActivePort new file mode 100644 index 00000000..cad90004 --- /dev/null +++ b/volunteerverse-api/data/DevToolsActivePort @@ -0,0 +1,2 @@ +64720 +/devtools/browser/fa5e85ab-3fdf-444f-a516-6acc8f5d3b37 \ No newline at end of file diff --git a/volunteerverse-api/data/GrShaderCache/data_0 b/volunteerverse-api/data/GrShaderCache/data_0 new file mode 100644 index 00000000..a79308f9 Binary files /dev/null and b/volunteerverse-api/data/GrShaderCache/data_0 differ diff --git a/volunteerverse-api/data/GrShaderCache/data_1 b/volunteerverse-api/data/GrShaderCache/data_1 new file mode 100644 index 00000000..cb7e2b42 Binary files /dev/null and b/volunteerverse-api/data/GrShaderCache/data_1 differ diff --git a/volunteerverse-api/data/GrShaderCache/data_2 b/volunteerverse-api/data/GrShaderCache/data_2 new file mode 100644 index 00000000..dd6e294e Binary files /dev/null and b/volunteerverse-api/data/GrShaderCache/data_2 differ diff --git a/volunteerverse-api/data/GrShaderCache/data_3 b/volunteerverse-api/data/GrShaderCache/data_3 new file mode 100644 index 00000000..5eec9735 Binary files /dev/null and b/volunteerverse-api/data/GrShaderCache/data_3 differ diff --git a/volunteerverse-api/data/GrShaderCache/index b/volunteerverse-api/data/GrShaderCache/index new file mode 100644 index 00000000..e2d6d69f Binary files /dev/null and b/volunteerverse-api/data/GrShaderCache/index differ diff --git a/volunteerverse-api/data/Last Version b/volunteerverse-api/data/Last Version new file mode 100644 index 00000000..7fbaf422 --- /dev/null +++ b/volunteerverse-api/data/Last Version @@ -0,0 +1 @@ +115.0.5790.98 \ No newline at end of file diff --git a/volunteerverse-api/data/Local State b/volunteerverse-api/data/Local State new file mode 100644 index 00000000..7f3b29f7 --- /dev/null +++ b/volunteerverse-api/data/Local State @@ -0,0 +1 @@ +{"chrome_labs_new_badge_dict":{"chrome-refresh-2023":-1},"hardware_acceleration_mode_previous":true,"legacy":{"profile":{"name":{"migrated":true}}},"management":{"platform":{"enterprise_mdm_mac":4}},"network_time":{"network_time_mapping":{"local":1.690309100211795e+12,"network":1.690309100372e+12,"ticks":93808100530.0,"uncertainty":10073809.0}},"optimization_guide":{"model_store_metadata":{}},"policy":{"last_statistics_update":"13334782693038076"},"privacy_budget":{"generation":10,"selected":"0"},"profile":{"info_cache":{"Default":{"active_time":1690309093.291441,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_26","background_apps":false,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Person 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13334782693056560"},"profile_network_context_service":{"http_cache_finch_experiment_groups":"Experiment_Triple_Key_20201001 None None None"},"session_id_generator_last_value":"158162751","shutdown":{"num_processes":0,"num_processes_slow":0,"type":0},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13334782693031098","max_tabs_per_window":2,"reloads_external":0,"reloads_proactive":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":1},"uninstall_metrics":{"installation_date2":"1690309092"},"user_experience_metrics":{"client_id2":"118a54d4-8a0e-4d7a-82ba-6c757808efad","client_id_timestamp":"1690309093","log_record_id":1,"low_entropy_source3":5596,"machine_id":11242980,"pseudo_low_entropy_source":2785,"session_id":0,"stability":{"browser_last_live_timestamp":"13334782692896931","saved_system_profile":"CPT1xqUGEhYxMTUuMC41NzkwLjk4LTY0LWRldmVsGKCbgKYGIgVlbi1VUyoSCghNYWMgT1MgWBIGMTMuNC4xMl8KBng4Nl82NBCAgAIiDk1hY0Jvb2tQcm8xNiwxKAEwgBw4wBFCCggAEAAaADIAOgBlAAAAQGoWCgxHZW51aW5lSW50ZWwQ7Y0kGBAgAIIBAIoBAKoBBng4Nl82NLABAUoKDXyirOwVz6AjoUoKDSJ+QhMV3xdKP0oKDSZ/Fh0V3xdKP0oKDXZvR58V3xdKP0oKDXsIt/gV9PRHPUoKDQYIV2UVWuV7N0oKDRY/0z8VTJywJ0oKDVLu1TYV3xdKP0oKDRfKWYYV3xdKP0oKDTvAzIsV3xdKP0oKDfXSXOQVOOHkrEoKDf64lTAV3xdKP0oKDTw9SdoV3xdKP0oKDSkACJAV3xdKP0oKDW1I7fMV3xdKP0oKDUI+eFwVj6iPj0oKDbX1+E8VO50fnEoKDWpDNl8VXsGZ90oKDVJTptUV3xdKP0oKDagUkz8V3xdKP0oKDQtDfsAVbWSnL0oKDevv460VFA/M4UoKDTr4WdsV3xdKP0oKDX6WEEgV3xdKP0oKDYWwGXoV3xdKP0oKDfX/reEV3xdKP0oKDcFgnO4VzBsTIEoKDZK3V7MV3xdKP1AAYgBqDAgAEAAYACAGOABAAIABoJuApgaYAQD4AdwrgAL///////////8BiAIAkgIkMTE4YTU0ZDQtOGEwZS00ZDdhLTgyYmEtNmM3NTc4MDhlZmFkqALhFbICiAFkHjnSN+KtfsWIACp+yLBsC4+9L9jALbH+W8+HRnQ0Ou5qLX8qfizFGQzbCUy0VBNUH43yymV+G99sKg1jdx59eUuqaR4MRo3nbDVib9lBYbHUxbfsg20kyEBE/rUQh9I3RETquoXfL9bGCqarE8bwOQvdol8OC8Bj623d6BJXNoSLuP9M8w1d","saved_system_profile_hash":"9811E9F0A31EB6D13CA273C96C593F1828355142","stats_buildtime":"1689369332","stats_version":"115.0.5790.98-64-devel"}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/volunteerverse-api/data/ShaderCache/data_0 b/volunteerverse-api/data/ShaderCache/data_0 new file mode 100644 index 00000000..d76fb77e Binary files /dev/null and b/volunteerverse-api/data/ShaderCache/data_0 differ diff --git a/volunteerverse-api/data/ShaderCache/data_1 b/volunteerverse-api/data/ShaderCache/data_1 new file mode 100644 index 00000000..035d06d9 Binary files /dev/null and b/volunteerverse-api/data/ShaderCache/data_1 differ diff --git a/volunteerverse-api/data/ShaderCache/data_2 b/volunteerverse-api/data/ShaderCache/data_2 new file mode 100644 index 00000000..c7e2eb9a Binary files /dev/null and b/volunteerverse-api/data/ShaderCache/data_2 differ diff --git a/volunteerverse-api/data/ShaderCache/data_3 b/volunteerverse-api/data/ShaderCache/data_3 new file mode 100644 index 00000000..5eec9735 Binary files /dev/null and b/volunteerverse-api/data/ShaderCache/data_3 differ diff --git a/volunteerverse-api/data/ShaderCache/index b/volunteerverse-api/data/ShaderCache/index new file mode 100644 index 00000000..9bfe4586 Binary files /dev/null and b/volunteerverse-api/data/ShaderCache/index differ diff --git a/volunteerverse-api/data/Variations b/volunteerverse-api/data/Variations new file mode 100644 index 00000000..a157215f --- /dev/null +++ b/volunteerverse-api/data/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/volunteerverse-api/data/first_party_sets.db b/volunteerverse-api/data/first_party_sets.db new file mode 100644 index 00000000..b15f505c Binary files /dev/null and b/volunteerverse-api/data/first_party_sets.db differ diff --git a/volunteerverse-api/data/first_party_sets.db-journal b/volunteerverse-api/data/first_party_sets.db-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/data/segmentation_platform/ukm_db b/volunteerverse-api/data/segmentation_platform/ukm_db new file mode 100644 index 00000000..9a968aee Binary files /dev/null and b/volunteerverse-api/data/segmentation_platform/ukm_db differ diff --git a/volunteerverse-api/data/segmentation_platform/ukm_db-journal b/volunteerverse-api/data/segmentation_platform/ukm_db-journal new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/dist/app.js b/volunteerverse-api/dist/app.js new file mode 100644 index 00000000..7481d200 --- /dev/null +++ b/volunteerverse-api/dist/app.js @@ -0,0 +1,23 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.app = void 0; +const express_1 = __importDefault(require("express")); +exports.app = (0, express_1.default)(); +const config_1 = require("./config"); +const cors_1 = __importDefault(require("cors")); +const morgan_1 = __importDefault(require("morgan")); +const volunteer_1 = require("./routes/volunteer"); +exports.app.use((0, cors_1.default)()); +exports.app.use(express_1.default.json()); +exports.app.use((0, morgan_1.default)("dev")); +exports.app.use("/volunteer", volunteer_1.volunteerRoutes); +exports.app.get('/', (req, res) => { + res.send('Hello World!'); +}); +exports.app.listen(config_1.PORT, () => { + return console.log(`Express is listening at http://localhost:${config_1.PORT}`); +}); +//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/volunteerverse-api/dist/app.js.map b/volunteerverse-api/dist/app.js.map new file mode 100644 index 00000000..973f2fa4 --- /dev/null +++ b/volunteerverse-api/dist/app.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8B;AACjB,QAAA,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AAC7B,qCAAgC;AAGhC,gDAAuB;AACvB,oDAA2B;AAE3B,kDAAqD;AAErD,WAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAA;AACf,WAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AACvB,WAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,EAAC,KAAK,CAAC,CAAC,CAAA;AAEtB,WAAG,CAAC,GAAG,CAAC,YAAY,EAAE,2BAAe,CAAC,CAAA;AAEtC,WAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,WAAG,CAAC,MAAM,CAAC,aAAI,EAAE,GAAG,EAAE;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,4CAA4C,aAAI,EAAE,CAAC,CAAC;AACzE,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/volunteerverse-api/index.js b/volunteerverse-api/index.js new file mode 100644 index 00000000..8151b2dc --- /dev/null +++ b/volunteerverse-api/index.js @@ -0,0 +1,8 @@ +const browserObject = require('./browser'); +const scraperController = require('./pageController'); + +//Start the browser and create a browser instance +let browserInstance = browserObject.startBrowser(); + +// Pass the browser instance to the scraper controller +scraperController(browserInstance) diff --git a/volunteerverse-api/insertProjectData.js b/volunteerverse-api/insertProjectData.js new file mode 100644 index 00000000..5e755457 --- /dev/null +++ b/volunteerverse-api/insertProjectData.js @@ -0,0 +1,69 @@ +const db = require("../volunteerverse-api/dist/src/db"); +const fs = require("fs"); + +async function insertData() { + try { + const jsonData = fs.readFileSync("projects.json", "utf-8"); + // Parse the JSON into an array of objects + const dataArray = JSON.parse(jsonData); + + // Insert each object in the array into the database + for (const dataObj of dataArray) { + const { + projectTitle, + problem, + action, + founder, + technologies, + website, + image, + externalLink, + } = dataObj; + + console.log('current object', projectTitle) + let links = ""; + + if (!projectTitle) { + continue; + } + + const query1 = ` + INSERT into projects(org_name, project_name, project_description, image_url, external_link, public_email) VALUES ($1, $2, $3, $4, $5, $6) RETURNING * + `; + const values = [ + projectTitle, + projectTitle, + problem + action, + image, + externalLink, + "externalproject@volunteerverse123" + ]; + let results = await db.query(query1, values); + + const query2 = `UPDATE projects SET external=$1` + await db.query(query2, [true]) + + try { + technologies.forEach((tag) => { + insertProjectTags(projectTitle, results.rows[0].id, tag); + }); + + console.log(links); + } catch (error) { + continue; + } + } + console.log("populated"); + } catch (error) { + console.log(error); + } +} + +async function insertProjectTags(name, project_id, tag) { + try { + const query = `INSERT into project_tags(project_name, tag_name, project_id) VALUES ($1, $2, $3) RETURNING *`; + await db.query(query, [name, tag.toLowerCase(), project_id]); + } catch (error) {} +} + +insertData(); diff --git a/volunteerverse-api/jest.config.js b/volunteerverse-api/jest.config.js new file mode 100644 index 00000000..c6c33b98 --- /dev/null +++ b/volunteerverse-api/jest.config.js @@ -0,0 +1,18 @@ +// /** @type {import('ts-jest').JestConfigWithTsJest} */ +// module.exports = { +// preset: 'ts-jest', +// testEnvironment: 'node', +// }; + +module.exports = { + "roots": [ + "/src" + ], + "testMatch": [ + "**/__tests__/**/*.+(ts|tsx|js)", + "**/?(*.)+(spec|test).+(ts|tsx|js)" + ], + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest" + }, +} \ No newline at end of file diff --git a/volunteerverse-api/package-lock.json b/volunteerverse-api/package-lock.json new file mode 100644 index 00000000..93e56bc9 --- /dev/null +++ b/volunteerverse-api/package-lock.json @@ -0,0 +1,9174 @@ +{ + "name": "volunteerverse-api", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "volunteerverse-api", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/bcrypt": "^5.0.0", + "@types/node": "^20.4.2", + "@types/supertest": "^2.0.12", + "bcrypt": "^5.1.0", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.17.1", + "jsonwebtoken": "^9.0.1", + "morgan": "^1.10.0", + "nodemon": "^3.0.1", + "pg": "^8.11.1", + "puppeteer": "^20.9.0", + "react-icons": "^4.10.1", + "ts-node-dev": "^2.0.0" + }, + "devDependencies": { + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-typescript": "^7.22.5", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.3", + "@types/morgan": "^1.9.4", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "babel-jest": "^29.6.1", + "eslint": "^8.44.0", + "jest": "^29.6.1", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "dependencies": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", + "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/morgan": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", + "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + }, + "node_modules/@types/superagent": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", + "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", + "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.0", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/type-utils": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", + "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", + "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", + "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", + "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", + "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "@types/json-schema": "^7.0.11", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "eslint-scope": "^5.1.1", + "semver": "^7.5.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", + "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.0.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "node_modules/babel-jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-bidi": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", + "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.460", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz", + "integrity": "sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz", + "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/formidable/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.1", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz", + "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", + "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/pg": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", + "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.1", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", + "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz", + "integrity": "sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "cosmiconfig": "8.2.0", + "puppeteer-core": "20.9.0" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/puppeteer-core": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", + "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", + "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", + "dependencies": { + "agent-base": "^7.0.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamx": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", + "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", + "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/volunteerverse-api/package.json b/volunteerverse-api/package.json new file mode 100644 index 00000000..17163b37 --- /dev/null +++ b/volunteerverse-api/package.json @@ -0,0 +1,49 @@ +{ + "name": "volunteerverse-api", + "version": "1.0.0", + "description": "", + "main": "dist/app.js", + "scripts": { + "start": "ts-node-dev src/app.ts", + "build": "tsc", + "lint": "eslint . --ext .ts", + "test": "jest --coverage", + "populate": "node insertProjectData.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-typescript": "^7.22.5", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/jest": "^29.5.3", + "@types/morgan": "^1.9.4", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "babel-jest": "^29.6.1", + "eslint": "^8.44.0", + "jest": "^29.6.1", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "typescript": "^5.1.6" + }, + "dependencies": { + "@types/bcrypt": "^5.0.0", + "@types/node": "^20.4.2", + "@types/supertest": "^2.0.12", + "bcrypt": "^5.1.0", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.17.1", + "jsonwebtoken": "^9.0.1", + "morgan": "^1.10.0", + "nodemon": "^3.0.1", + "pg": "^8.11.1", + "puppeteer": "^20.9.0", + "react-icons": "^4.10.1", + "ts-node-dev": "^2.0.0" + } +} diff --git a/volunteerverse-api/pageController.js b/volunteerverse-api/pageController.js new file mode 100644 index 00000000..f44ee0e7 --- /dev/null +++ b/volunteerverse-api/pageController.js @@ -0,0 +1,14 @@ +const pageScraper = require('./pageScraper'); +async function scrapeAll(browserInstance){ + let browser; + try{ + browser = await browserInstance; + await pageScraper.scraper(browser); + + } + catch(err){ + console.log("Could not resolve the browser instance => ", err); + } +} + +module.exports = (browserInstance) => scrapeAll(browserInstance) \ No newline at end of file diff --git a/volunteerverse-api/pageScraper.js b/volunteerverse-api/pageScraper.js new file mode 100644 index 00000000..b93687d7 --- /dev/null +++ b/volunteerverse-api/pageScraper.js @@ -0,0 +1,144 @@ +const db = require("../volunteerverse-api/dist/src/db"); +const fs = require("fs"); + +//const { validateFields } = require("../volunteerverse-api/src/utils/validate"); + +const scraperObject = { + url: "https://www.democracylab.org/projects", + async scraper(browser) { + let page = await browser.newPage(); + console.log(`Navigating to ${this.url}...`); + await page.goto(this.url); + + // load the page + for (let i = 0; i <= 5; i++) { + console.log(i); + await page.waitForSelector("#MainController > div.SectionBody > div.FindProjectsController-root.container > div > div.ProjectCardContainer.col > div:nth-child(4) > div > button"); + await page.click( + "#MainController > div.SectionBody > div.FindProjectsController-root.container > div > div.ProjectCardContainer.col > div:nth-child(4) > div > button" + ); + await page.waitForTimeout(5000); + } + + // list of the urls of each of the project cards + let urls = await page.$$eval( + ".ProjectCardContainer.col .ProjectCard-root > a", + (links) => { + links = links.map((el) => el.href); + return links; + } + ); + + console.log(urls); + + // Loop through each of those links, open a new page instance and get the relevant data from them + let pagePromise = (link) => + new Promise(async (resolve, reject) => { + let dataObj = {}; // object that will hold the information about a single project + let newPage = await browser.newPage(); + await newPage.goto(link); + + dataObj["externalLink"] = link; + + dataObj["projectTitle"] = await scrapeDataWithSelector( + newPage, + "div.Profile-top-details > h1" + ); + + dataObj["problem"] = await scrapeDataWithSelector( + newPage, + "#AboutProject-tabs-tabpane-proj-details > div.markdown-container >p " + ); + + let descriptionText = await newPage.$$eval( + "#AboutProject-tabs-tabpane-proj-details > div > div.markdown-container", + (desc) => { + desc = desc.map((el) => el.textContent); + return desc; + } + ); + + dataObj["action"] = descriptionText; + + dataObj["founder"] = await scrapeDataWithSelector( + newPage, + "div.AboutProject-staff.AboutProject-secondary-section > div > div > div > a:nth-child(2)" + ); + + let technologies = await newPage.$$eval( + "div.AboutProject-technologies > span", + (tags) => { + tags = tags.map((el) => el.textContent); + return tags; + } + ); + + dataObj["technologies"] = technologies; + + dataObj["website"] = await scrapeDataWithSelector( + newPage, + ".AboutProject-url-text > a" + ); + + try { + dataObj["image"] = await newPage.$eval( + "div.container.Profile-root > div > div > div > div.Profile-top-logo > img", + (el) => el.src + ); + } catch (error) { + dataObj["image"] = null; + } + + try { + // Wait for the element with class "IconLink-root" to appear on the page + await newPage.waitForSelector(".IconLink-root"); + + // Extract contact information using $$eval + const contactInformation = await newPage.$$eval( + ".IconLink-root", + (elements) => + elements.map((e) => ({ + platform: e.querySelector( + ".IconLink-right > p.IconLink-topText" + ).textContent, + link: e.querySelector("a").href, + })) + ); + + // Store the results in the dataObj + dataObj["contactInfo"] = contactInformation; + } catch (error) { + console.error("Error occurred while scraping:", error); + dataObj["contactInfo"] = null; + } + + resolve(dataObj); + + await newPage.close(); + }); + + projects = []; + for (link in urls) { + let currentPageData = await pagePromise(urls[link]); + // scrapedData.push(currentPageData); + console.log(currentPageData); + projects.push(currentPageData); + } + + // saves the array of projects as a JSON + fs.writeFile("projects.json", JSON.stringify(projects), (err) => { + if (err) throw err; + console.log("file saved"); + }); + }, +}; + +async function scrapeDataWithSelector(newPage, selector) { + try { + return await newPage.$eval(selector, (el) => el.textContent); + } catch (error) { + return null; + } +} + +module.exports = scraperObject; diff --git a/volunteerverse-api/projects.json b/volunteerverse-api/projects.json new file mode 100644 index 00000000..736cf7fe --- /dev/null +++ b/volunteerverse-api/projects.json @@ -0,0 +1 @@ +[{"externalLink":"https://www.democracylab.org/projects/1290","projectTitle":"Inkwell. eBook platform","problem":"Inkwell is an innovative e-book web platform and mobile application designed to provide education development support to underprivileged communities. In many developing countries, millions of children and adults do not have access to quality education due to a lack of resources and funding. This can have a significant negative impact on their ability to read, write and perform basic math operations, which are essential skills for success in life.\r\nResearch has shown that poverty and a lack of access to education can also increase the risk of developing mental health problems. Without access to education, individuals may struggle to acquire the knowledge and skills necessary to lead a fulfilling life and contribute to their communities. This can lead to feelings of hopelessness, frustration, and isolation, which can cause mental health issues.","action":["Inkwell seeks to address these challenges by providing an affordable and accessible platform for individuals and communities to access quality e-book resources. Our platform offers a wide range of e-books and educational materials on various topics. We believe that everyone deserves access to high-quality education and that education is the key to breaking the cycle of poverty. Through Inkwell, we aim to empower individuals and communities to take control of their education and achieve their full potential. By providing affordable and accessible education resources, we hope to contribute to the development of a more equitable and prosperous world for all."],"founder":"Ioan Flaviu Zsoldos","technologies":["JavaScript","Django","React","Python","Express","HTML","PostgreSQL","SQL","Node.js","Figma","Tailwind"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fflaviufllaviu%40gmail.com%2FnewFile.jpeg_1685573621.4585605.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Inkwell-Project-E-book-Platform"},{"platform":"Project link","link":"https://inkwellhub.com/"},{"platform":"Facebook","link":"https://www.facebook.com/profile.php?id=100093294993277"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/inkwell-ebook/"}]},{"externalLink":"https://www.democracylab.org/projects/1164","projectTitle":"VIRTUAL AGRO-COMMERCE ECOSYSTEM SOFTWARE","problem":"Lack of infrastructure and resources to support the development of integrated and efficient value chains in the agriculture sector in Africa\r\nLimited access to markets and financial resources due to high risk nature of agriculture.\r\nInadequate transportation and storage infrastructure\r\nLack of investment in modern technology and techniques\r\nLack of access to education, extension services, and information for farmers\r\nLimits on farmers' ability to improve productivity and profitability\r\nClimate change and land degradation as challenges to sustainable agricultural development in Africa.","action":["Use of precision agriculture technologies, such as sensors, drones, and remote sensing, to collect data on crop health, soil conditions, and weather patterns.\nThe integration of Internet of Things (IoT) technology to improve data collection, sharing and analysis in agriculture.\nThis data can be analyzed to optimize planting and harvesting times, improve water and fertilizer management, and identify pests and diseases early.\nThe use of data analytics to improve decision-making and predict livestock and crop yields.\nDigital platforms and mobile apps can connect farmers with markets, extension services, and financial resources, improving access to information and resources.","Promote Agricultural productivity\r\nProtect investor’s funds\r\nPromote Agricultural investment and security\r\nPromote resource connectivity and access to market\r\nPromote trade transparency\r\nGenerate data and promote data-driven decision making and policies.\r\nEliminate waste of farm produce.\r\nAttract youth into agriculture\r\nCreate new jobs in agriculture\r\nPromote farm’s profit\r\nPromote food affordability\r\nPromote Farmer’s education and adoption of innovation.\r\nExplore Export market\r\nPromote investment in agricultural Infrastructure (agro-processing and store zones) via communal ownership.\r\nEase of entry and exit into agricultural investment."],"founder":"Chinonyelum Mbanefo","technologies":["JavaScript","Vue.js","PHP","MySQL","React","Python","Express","HTML","SQL Server","Java","Node.js","Figma","Flutter"],"website":"cubeseed.com.ng","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmbanefochinonyelum%40gmail.com%2FnewFile.jpeg_1675501042.0180776.jpeg","contactInfo":[{"platform":"LinkedIn","link":"http://linkedin.com/company/cubeseed-africa"}]},{"externalLink":"https://www.democracylab.org/projects/1043","projectTitle":"PolicyEngine","problem":"Developed countries collect a third of GDP in taxes and distribute a tenth of GDP in cash transfers, and both of these numbers are rising. But when it comes to understanding current policies or designing new ones, policymakers and the public are often in the dark.","action":["We build free, open-source software to compute the impact of public policy. We start with a microsimulation model of the tax and benefit system (think TurboTax built to compute hundreds of thousands of households at once), built in Python and yaml. Then we serve those computations as an API, and build a web app to let anyone design customizable reforms and find the impacts on society (poverty, inequality, and the budget) and individual households. Our app also serves as a tax and benefit calculator under current law. Ours is the only open source model of the tax-benefit system in the country.","We're proud of what we've built, but we have a long ways to go to realize our full vision. Here are some areas we're developing:\n\nAdding more state income tax models; currently we've completed eight.\nAdding more benefit programs, like Temporary Assistance for Needy Families and the Child Care Development Fund.\nAugmenting, extrapolating, and otherwise enhancing the data; we've applied machine learning techniques to do this in the UK, and need to translate that process to the US.\nApp enhancements to make the product more user-friendly.\nGetting the word out! We've improved our own understanding from developing and using PolicyEngine, and we think everyone from members of Congress to the public can do the same.\n"],"founder":"Max Ghenis","technologies":["React","Python","Flask"],"website":"policyengine.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmghenis%40gmail.com%2FnewFile.jpeg_1690942381.3191068.jpeg","contactInfo":[{"platform":"GitHub","link":"http://github.com/policyengine"},{"platform":"Slack","link":"https://join.slack.com/t/policyengine-group/shared_invite/zt-1i9jpin5f-JLe~ob__MAK4OoycHk7GCQ"},{"platform":"Twitter","link":"http://twitter.com/ThePolicyEngine"},{"platform":"Facebook","link":"http://facebook.com/PolicyEngine"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/ThePolicyEngine"}]},{"externalLink":"https://www.democracylab.org/projects/1346","projectTitle":"Altruvir","problem":"There are many non-profits that are lacking in their web development, online marketing presence, and overall reach.","action":["We provide these non-profits with access to skilled volunteers from corporations with VTO policies.","\nThe current application I've built needs more tinkering to be able to support corporations more.\n"],"founder":"Vikram Dimba","technologies":["Wordpress"],"website":"altruvir.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fvikramdimba%40gmail.com%2FnewFile.jpeg_1691367657.940336.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1232","projectTitle":"The Climate Tech Handbook","problem":"The climate tech movement is exploding.","action":["The Climate Tech Handbook is a \"community source of truth\" to collect and organize all of the best technologies, organizations, and resources available.\nIn addition to traditional journalism methods, we use AI and Machine Learning to facilitate the collection and understanding of the latest developments.\nThere are already well structured data available in many places across the web.","There are opportunities for high tech and low tech skills.\nHigh tech: use available machine learning libraries to create a ChatGPT bot trained on all the available data that we've sourced.\nLow tech: contribute markdown articles to make it accessible for all"],"founder":"Jacob Caggiano","technologies":["JavaScript","Python","HTML","TypeScript"],"website":"climatetechhandbook.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Faccounts%40mapseed.org%2FnewFile.jpeg_1682474301.0429726.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/climate-tech-handbook"},{"platform":"chat.climatetechhandbook.com","link":"https://chat.climatetechhandbook.com/"}]},{"externalLink":"https://www.democracylab.org/projects/1245","projectTitle":"Treetracker ","problem":"More than 700 million people live below the extreme poverty line. Their food, income and future is directly dependant on the land they live. Unjust economical dynamics, climate change, desperation and bad agricultural practices are depleting putting more and more pressure on people and the environment they utilise to survive. The lack of incentives to reforest or move to agroforestry practices are driving deforestation globally and hindering positive change.","action":["By providing a mechanism that allows direct financial incentives for farmers and the rural populations to restore depleted landscapes we see a chance to effectively direct biodiversity finance to create an ecological economy.","Our growing open source community needs more support and leadership to accelerate the creation of a versatile software system that allows restoration finance to fairly reach the communities that need it the most. Greenstand has developed a micro services based infrastructure to track individual trees and tokenise their environmental impact in order to provide a transparent impact proof in form of a digital environmental asset (token). We need help to continue developing this amazing mechanism.\r\nWe have over 5 million tree captures and almost 10.000 users on our platform already. For the next scaling phase the complete software needs to be further developed."],"founder":"Sebastian Gärtner","technologies":["Android","React","iOS","PostgreSQL"],"website":"greenstand.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsg%40esea.co.tz%2FnewFile.jpeg_1682056696.8982306.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Greenstand"},{"platform":"Slack","link":"https://greenstand.slack.com/"},{"platform":"greenstand.gitbook.io/engineering/","link":"https://greenstand.gitbook.io/engineering/"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/greenstand.org"}]},{"externalLink":"https://www.democracylab.org/projects/834","projectTitle":"Model.earth","problem":"We're focused on finding and creating Open Footprint tools that are easy to integrate with maps and A.I. generated images based on locations and local goods and services. Our data sources include the United Nations and the US EPA.","action":["We're integrating visualizations and tools that connect people to jobs and innovations focused on improving air quality, green energy, clean water, local farming & healthy environments.","We're creating embeddable tools for visualizing and comparing impacts using UN Comtrade and US EPA data to identify trends in global trade and local production for Open Footprint visualization using the Replicate.com API to manage generative AI images with jQuery, NextJS React and GitHub Actions."],"founder":"Loren Heyns","technologies":["React","Web","Python","JavaScript","Node.js","HTML","TypeScript","PostgreSQL","C#","SQL Server","ASP.NET"],"website":"model.earth","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Floren%40dreamstudio.com%2FnewFile.jpeg_1674792155.786994.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/modelearth/localsite"},{"platform":"GitHub","link":"https://github.com/modelearth/community-data"},{"platform":"model.earth/io/coders/","link":"https://model.earth/io/coders/"},{"platform":"model.earth/community/projects","link":"https://model.earth/community/projects"},{"platform":"Twitter","link":"https://twitter.com/EPA"},{"platform":"comtradeplus.un.org/Visualization/Labs","link":"https://comtradeplus.un.org/Visualization/Labs"},{"platform":"Facebook","link":"https://www.facebook.com/EPA"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/us-epa"}]},{"externalLink":"https://www.democracylab.org/projects/1161","projectTitle":"HackDays - Visualize activities by web3 technologies","problem":"Civic Tech relies heavily on volunteer efforts but unfortunately, these contributions are not always easily translated into monetary compensation. While coding contributions can be tracked on sites like GitHub, other contributions such as design, project management, event planning, and management are difficult to quantify. Additionally, many civic tech projects take time to yield tangible benefits for society, making it challenging to reward those who were instrumental in the early stages of development.","action":["Our solution utilizes web3 technology to bring transparency and visibility to the contributions of individuals and teams working on civic tech projects. By utilizing this technology, project owners can easily distribute tasks and manage their team's efforts. Additionally, it allows for transparency in the flow of funds, enabling funders to support the project with confidence and giving contributors a voice in how those funds are allocated.","We are developing a system where tokens can be earned through participation in events and projects."],"founder":"Hal Seki","technologies":["TypeScript","Node.js"],"website":"hackdays.notion.site/hackdays/HackDays-Community-b4f87cf528694d3aa4539724be523511","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1674921439.5958996.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/hackdays-io/"}]},{"externalLink":"https://www.democracylab.org/projects/1244","projectTitle":"Peer Support Software ","problem":"People need access to Peer Support services. Peer Recovery Specialist need access to software to help them work with their clients.","action":["Software to facilitate Peer Support and help Peer Recovery Specialist be more efficient and effective in their work.\nThis is a FreeSource/OpenSource project.","Research end-user needs from the prospective of the Peer (individual seeking help) , the Peer Support Specialist, and the organizations that serves the community."],"founder":"joel gilbert","technologies":["Django","Python","PostgreSQL","C","Figma"],"website":"Owcsc.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjoelgilbert7%40yahoo.com%2FnewFile.jpeg_1682007359.1681414.jpeg","contactInfo":[{"platform":"Facebook","link":"https://www.facebook.com/profile.php?id=100089566356915&mibextid=ZbWKwL"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/one-world-community-support-center/"}]},{"externalLink":"https://www.democracylab.org/projects/1296","projectTitle":"Research for FOSS Projects","problem":"FOSS start-up projects need an affordable platform to conduct their projects. Team communication, scheduling, collaboration, project PM, and shared knowledge repository are all critical to the success of the group.\r\nCreating the ideal remote Environment to facilitate the best quality team work to great useful products for our communities is our goal.","action":["The solution is to research and develop the Nextcloud platform to serve the needs of FOSS projects.\nThat includes the following:\r\n-Research NC and all its functionality\r\n-Research the needs of DemocracyLab and other FOSS projects\r\n-Research and engage the NC user community\r\n-Develop the best ways to utilize NC and OpenProject\r\n-Creating helpful explainer videos to be shared with the NC and FOSS community\r\n-Create Apps for Nextcloud to help FOSS projects","The project roster is full Thank you\r\nForm this team of Research and Developers on a Nextcloud instance (circle group)\r\nProject Charter Meeting including project outline and team agreements"],"founder":"joel gilbert","technologies":["PHP","Figma"],"website":"owcsc.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjoelgilbert7%40yahoo.com%2FnewFile.jpeg_1689182195.5453846.jpeg","contactInfo":[{"platform":"Discord channel OWCSC","link":"https://discord.gg/snh52VMKDm"}]},{"externalLink":"https://www.democracylab.org/projects/1162","projectTitle":"vitto.ai","problem":"The sedentary lifestyle brought about by online work and study has become a widespread problem, causing various health issues. Sitting for long periods can cause back pain, neck strain, and obesity, as well as reduced energy levels, decreased concentration, and increased stress levels. Many individuals are not aware of the negative effects of a sedentary lifestyle or may not have the time or resources to incorporate physical activity into their daily routine. This issue has significant consequences for both individuals and society as a whole, with the burden on healthcare systems likely to increase as the number of people with sedentary-related health problems continues to rise.","action":["Our solution is a video-based app that promotes good health habits through the mirroring effect. Users watch short video clips of people engaging in healthy activities, such as stretching, yoga, or other quick workouts, and are encouraged to follow along and make similar movements. By incorporating these small actions into their daily routine, users can form good habits over time, leading to significant improvements in their overall health and well-being.","To address this issue, we will create a browser extension that reminds users to take breaks and engage in short, healthy movements throughout the day. The app will be easy to use and accessible to all, encouraging people to prioritize their health and well-being. The extension will be customizable, allowing users to choose the type of activity they want to engage in, the frequency of breaks, and the length of the activity. Additionally, the app will provide educational resources on the importance of physical activity and how to incorporate it into one's daily routine. By taking action now, we can help mitigate the negative impact of a sedentary lifestyle and promote a healthier and more active society."],"founder":"Marycel Geneblaza","technologies":["Web","Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmgen2022.ol%40gmail.com%2FnewFile.jpeg_1676536164.9775329.jpeg","contactInfo":[{"platform":"discord.gg/uGUnWKFBes","link":"https://discord.gg/uGUnWKFBes"},{"platform":"Trello","link":"https://trello.com/invite/b/lg1roNwV/ATTI6fdab5858bd15ad8e2b3fc06e601cfcb8FDFF66C/vittoai-democracy-lab"},{"platform":"Set an initial call","link":"https://calendly.com/genhouseproject/30min"},{"platform":"Know vitto.ai","link":"https://app.pitch.com/app/presentation/4cac96ce-0d81-4168-97ed-5870ebb6c358/e864fd2a-7bb0-48b1-99e8-56ae6c4b9164"},{"platform":"Figma","link":"https://www.figma.com/file/EJedY94ma3UnF65JK7lBF0/vitto.ai-version-1.0?node-id=286-176&t=2dyNc0qOtCYt519i-0"}]},{"externalLink":"https://www.democracylab.org/projects/903","projectTitle":"Saveit","problem":"Traditional education does not typically teach students about the ins and outs of personal finance.","action":["Provide teens and young adults with a elearning game to help them learn about managing their money."],"founder":"Matt Buckingham","technologies":["JavaScript","React","Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmbuck2273%40yahoo.com%2FnewFile.jpeg_1642127704.905447.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/playsaveit"},{"platform":"Slack","link":"https://join.slack.com/t/saveit-group/shared_invite/zt-1f4pwjl3n-~EKp1Q9RRroe75HXgcqGOA"}]},{"externalLink":"https://www.democracylab.org/projects/356","projectTitle":"ShelterApp","problem":"Shelter App has resources for Youth across US and resources for everyone in few west coast cities. We are looking to expand our resource database to add more resources across the country.","action":[],"founder":"Raj Lanka","technologies":["JavaScript","Android","React","iOS","MongoDB","Node.js"],"website":"www.shelterapp.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fshelterappinfo%40gmail.com%2FnewFile.jpeg_1668142061.3373885.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ShelterApp/"},{"platform":"Slack","link":"http://shelterapp.slack.com/"},{"platform":"Facebook","link":"https://www.facebook.com/shelterappinfo/"},{"platform":"Twitter","link":"https://twitter.com/ShelterAppInfo"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/shelterapp"},{"platform":"App Links","link":"https://shelterapp.org/"},{"platform":"KNKX Article","link":"https://www.knkx.org/post/app-seeks-help-homeless-people-connect-shelter-services"}]},{"externalLink":"https://www.democracylab.org/projects/1168","projectTitle":"TrashMob.eco","problem":"The world is drowning in decades of litter. It's a problem so big that no one person or government can fix it. We need millions of boots on the ground, supported by local governments and businesses to rectify this situation.","action":["We're building a web site and a mobile app that allows community members to create adhoc litter cleanup events. TrashMob.eco members in the area will be notified when an event is scheduled and partners (governments, businesses, other orgs) will be enlisted to help with the logistics. We also handle the liability waivers needed in the US, and are looking to provide starter kits (bucket, litter grabber, gloves, safety vest, garbage bags) to members.","We are currently live with our web site built in ASP.NET Core (C#) and ReactJS (Typescript), but have many additional features we want to implement.\r\nWe are currently preparing to launch our mobile app, written in .NET MAUI (Blazor/C#), but the functionality is quite basic, and we have lots of features to build out."],"founder":"Joe Beernink","technologies":["Android","React","Web","iOS","ASP.NET","SQL Server","C#","TypeScript","Figma"],"website":"www.trashmob.eco","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1676102354.9985702.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/TrashMob-eco/TrashMob"},{"platform":"Twitter","link":"https://twitter.com/TrashMobEco"},{"platform":"Facebook","link":"https://www.facebook.com/trashmob.eco"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/trashmob-eco/"},{"platform":"YouTube","link":"https://www.youtube.com/@trashmob1392"}]},{"externalLink":"https://www.democracylab.org/projects/1343","projectTitle":"My Democracy","problem":"Our political system is wrestling with a trust crisis. A staggering 80% of Americans do not trust the government to do what’s right, and 47% of voters feel they can't influence their government. Current tools for civic engagement are far from effective, leaving individuals struggling to reach out to their representatives. Advocacy organizations' impersonal form emails further exacerbate the disconnect. The result is a profound gap in our democracy where public sentiment is underrepresented in policy decisions. This situation amplifies the need for a platform that streamlines civic engagement, fostering efficiency and transparency while enhancing communication between citizens and their officials.","action":["My Democracy, an innovative Web3 AI platform, transforms civic engagement by facilitating secure, transparent communication between constituents and elected officials. Using advanced AI, we help users craft personalized, effective messages, and accurately identify the right officials to address their concerns. We also offer interactive features like token-gated town halls, ensuring accessibility for constituents and providing crucial insights for officials. In essence, My Democracy bridges the gap in civic participation, promoting a more informed and interactive democracy.","Firstly, we need to advance our initial website, MyDemocracy.App, built on Bubble.io's no-code platform. A significant task ahead is enhancing the ChatGPT AI system's functionality to assist constituents in drafting compelling emails. Next, we must prioritize security, implementing robust measures to safeguard constituent information. For sending out emails, we'll leverage programs like Sendgrid to directly reach elected officials on behalf of our users. Correctly identifying elected officials based on constituent location is also critical. To ensure accuracy, we'll refine our system for identification and validation. Additionally, we'll build databases to verify constituents' data, maintaining the integrity of our user base.\nLastly, we'll design features for advocacy organizations to create unique \"take action\" requests, increasing the platform's versatility and reach. Each step solidifies our platform, making it an indispensable tool for modern civic engagement."],"founder":"Jared Busker","technologies":[],"website":"mydemocracy.app","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjared%40busker.consulting%2FnewFile.jpeg_1691173410.5336058.jpeg","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/MyDemocracyApp"}]},{"externalLink":"https://www.democracylab.org/projects/81","projectTitle":"Orcasound - Listen for Whales","problem":"The salmon-seeking orcas, icons of the Pacific Northwest, are teetering on extinction. They need the best of tech-for-good applied to restoring their supply of salmon from California to Alaska and mitigating other impacts in their habitat, especially underwater noise pollution.","action":["We began with the challenge of building an end-to-end audio live-streaming solution to make it easy to listen for whales through the Orcasound network of underwater microphones (\"hydrophones\") in orca habitat. The orcanode code generates the audio data streams and the orcasite repo holds a web app for playback that \"just works\" in any browser and scales efficiently.\nFrom the beginning, we have benefited greatly from the amazing all-volunteer hackathon community -- mainly through the organizational efforts of DemocracyLab and Microsoft Garage with generous support from Microsoft's AI for Earth program and Amazon Activate.\nOur long-term motivation is to make the Orcasound web app and our other projects into a more-and-more effective suite of conservation tools. Along the way, we are trying to be as open, modular, and foresightful as possible in the hope that what we build for orcas will help bioacousticans and conservationists study and save other species around the planet.","Would you like to help save the orcas and contribute to open source software?\nOrcasound has a growing number of projects to which you can contribute. We are super-friendly, daily communication happens on Slack (link to your right!), and there are weekly virtual meetings where you can introduce yourself and hear what others are doing.\nTo get started, read the Volunteer Handbook to learn about Orcasound's motivations and high-priority projects. Check out our Trello roadmap to learn what's currently being worked on and hopeful future features.\nDevelopers interested in contributing code, introduce yourself in the #dev-general Slack channel. Get info on projects from our Github repos!\r\nUX/UI Designers go ahead and introduce yourself in the #UX-general Slack channel and check out our current work in the UX Team Documents Google Folder!\r\nProject Managers, Scientists, Hardware Engineers and everyone else who wish to contribute can introduce yourself in the #general Slack channel!"],"founder":"Scott Veirs","technologies":["Web","Wordpress","Python","Shell","JavaScript","PostgreSQL","React","Figma","Adobe Creative Suite","C#","TypeScript","R","Vue.js"],"website":"orcasound.net","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsveirs%40gmail.com%2Forca-dorsal-spray-square.png_1537376768.1992114.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/orcasound"},{"platform":"Google Drive","link":"https://drive.google.com/drive/u/0/folders/10zgnh8wxoP9zdrRLaU3GGQXjmc8jqw9C"},{"platform":"Slack","link":"https://join.slack.com/t/orcasound/shared_invite/zt-1jr7te193-ObLYcTxx4s7SO7EA9kmcaw"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/orcasound/"},{"platform":"Facebook","link":"https://www.facebook.com/OrcasoundApp/"},{"platform":"Instagram","link":"https://www.instagram.com/orcasoundapp/"},{"platform":"Twitter","link":"https://twitter.com/orcasoundapp"},{"platform":"Live-listening app","link":"http://live.orcasound.net/"},{"platform":"Hacker Hall of Fame!","link":"http://www.orcasound.net/hacker-hall-of-fame/"},{"platform":"Roadmap (Trello board)","link":"https://trello.com/b/wBg0qhss/orcasound-roadmap"},{"platform":"Volunteer Handbook","link":"https://drive.google.com/file/d/1GHuylE3qPm2UAyUA_f1yOtMgutBpXF6V/view?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/979","projectTitle":"Your Priorities","problem":"Trust in democracy as practiced in the real world is declining. Our democratic infrastructure has already been partly digitized, creating a public square consisting of large-scale social media platforms, in an uncontrolled, unregulated way, giving bad actors easy access to the functioning of our democracies.","action":["Many believe technology has undermined our faith in debate online; instead, our work shows open-source nonprofit innovations in technology restoring trust in democratic deliberation and institutions. Originating in one of the world’s oldest democracies, Iceland, projects like Better Reykjavik, Engage at the Scottish Parliament, and City Challenge Oakland have allowed our platform to enjoy constant productive evolution and development since 2008. A fully mature deliberation platform, road tested in 45 countries.","As an established working platform in Iceland and numerous countries across Europe, the need for volunteer support in open source engineering is ongoing and episodic, as projects with the Scottish Parliament, World Bank, the City of Vienna, and others evolve with their respective situations on the ground. Contact us by email at citizens@citizens.is and we will get you established on our Slack channel and utilize contributions from you that match your skill set and specific areas of interest.\nIn our efforts to grow our presence in the Western Hemisphere, we need support on building marketing and fundraising campaigns, aimed at reaching 100s of small communities across North America. We also seek help navigating and mastering systems of tenders/bidding/procurement at the civic, state and federal levels."],"founder":"Robert Bjarnason","technologies":["Node.js","Figma","TypeScript","PostgreSQL","Redis","Flask","Web","JavaScript","Python"],"website":"citizens.is/your-priorities-features-overview/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Frobert%40citizens.is%2FnewFile.jpeg_1647431686.2738237.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/CitizensFoundation/your-priorities-app"},{"platform":"Slack","link":"https://join.slack.com/t/citizens-foundation/shared_invite/zt-16ipkc4hz-3Txj5M1h8T9dYK1haofApw"},{"platform":"GitHub","link":"https://github.com/CitizensFoundation/your-priorities-app/issues"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/citizens-foundation-global"},{"platform":"Twitter","link":"https://twitter.com/CitizensFNDN"},{"platform":"Facebook","link":"https://www.facebook.com/Citizens.is/"}]},{"externalLink":"https://www.democracylab.org/projects/639","projectTitle":"Smart city planning","problem":"As discussed in the article by David Ory at https://medium.com/zephyrfoundation/osmnx-software-badge-3e206db65825, a key feature of a travel model is an explicit representation of space. OpenStreetMap has been a theoretically-appealing option for creating travel model base maps. Practically, however, OpenStreetMap has not been useful for at least the following reasons:","action":["OpenStreetMap (OSM) is a free, open-source, editable map website that can provide free downloads. osm2gmns, as a data conversion tool, can directly convert the OSM map data to node and link network files in the GMNS format. Users can convert and model drivable, walkable, railway, or aeroway networks with a few lines of Python code.\nThe related package net2cell aims to help users automatically generate hybrid (macroscopic, mesoscopic and microscopic) transportation networks to accommodate different modelling need.\r\nhttps://asu-trans-ai-lab.github.io/website_openlayer_4GMNS/\r\nhttps://pypi.org/project/net2cell/\r\nWe also hope to create trip demand based on the grid network and POI (point of interest).\r\nhttps://github.com/asu-trans-ai-lab/grid2demand","\nTest users: Three packages of osm2gmns, net2cell, grid2demand need to be systematically tested in the different subareas, multiple modes and cities, in combination or separately.\nData visualization. Our current QGIS and NEXTA version is at https://github.com/asu-trans-ai-lab/QGIS_NeXTA4GMNS\nDevelopers are needed for integrating this set of tools to simulators such as AB streets, MATSIM or SUMO.\n\nRelated youtube videos:\r\nhttps://www.youtube.com/watch?v=xEdrbuiOozs\r\nBuilding and Visualizing a Model from Scratch with OSM2GMNS and QGIS, contributed by Rachel Dai, a high school student at Arizona\r\nhttps://www.youtube.com/watch?v=6hoYJtEaTn4\r\nQGIS Visualization for GMNS Traffic Signal Data, contributed by Fan Yu, ASU graduate student"],"founder":"Xuesong Zhou","technologies":["Python","Web"],"website":"osm2gmns.readthedocs.io/en/latest/index.html","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fxzhou99%40gmail.com%2FnewFile.jpeg_1609819332.1771302.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/jiawei92/OSM2GMNS"},{"platform":"GitHub","link":"https://github.com/jiawei92/osm2gmns"},{"platform":"Slack","link":"https://join.slack.com/t/newworkspace-lzq5620/shared_invite/zt-kv2ogf9c-Sl8oPxLAbqNkWEpwQdPj2w"},{"platform":"GitHub","link":"https://github.com/jiawei92/osm2gmns"},{"platform":"ASU Transportation + AI Team","link":"https://github.com/asu-trans-ai-lab"}]},{"externalLink":"https://www.democracylab.org/projects/991","projectTitle":"Patient Health History Record System","problem":"This project aims to model and develop a Data Lake (repository that contains structured,\r\nsemi-structured and unstructured data) for data from patients in the healthcare\r\nsystem. This Data Lake contains both relational databases and unstructured data (result\r\nof image exams) and semi-structured data (XML files that are exported by equipment)\r\nthat make up the patient's history. The planning is for this Data Lake to be accessed via\r\nmobile application and via the Web. The Data Lake will be powered by both doctors,\r\nlaboratories, and the patient himself. Doctors will be able to access the patient's entire\r\nlife in a clear, safe and fast way. Thus, if the patient changes doctors, all of their\r\ninformation remains available in an integrated manner. Doctors will be able to exchange\r\nvital patient information with each other via the system.","action":[". An example would be a patient\r\nwho finds out he has diabetes and needs his nutritionist to reevaluate his diet. Within\r\nminutes the patient would have access to a new diet sent by his nutritionist. In an\r\nemergency, the patient, even unconscious, could have his data released via the doctor's\r\nID, taking responsibility for the access in an extraordinary way. If the patient so wished,\r\nhe could obtain prognoses about probable diseases that he could develop based on\r\nanalysis of the data of his health history through the application of Artificial Intelligence\r\ntechniques. In addition to the clear advantages for the patient, the government would\r\nhave a much more reliable and secure mass of data to carry out its analyzes for the\r\npublic health policies adopted. In cases of emergencies such as pandemics, the\r\ngovernment could quickly and safely know the groups of risks that would have to be\r\ninsured and their current situation.","Computer systems based on patient information need precision, which is not the current\r\nreality. The storage services in the health area, in most cases, when they exist, are not\r\nreliable. The big problem with electronically storing medical files is the standard that\r\neach healthcare professional uses. In view of these problems, we propose to develop a\r\nway to store patient information, quickly and safely, without modifying the original data\r\nregarding its format. The project aims to create a System based on the Data Lake\r\nconcept that can be accessed by cell phone application and web-based systems. Data\r\nLake would be powered by the patient himself, doctors and the public health\r\nsystem. The patient could delegate this function to someone they trust if they have any\r\nlimitations. In the case of data feeding by the patient, he inserts each procedure done\r\nthrough the cell phone or if you prefer by the computer"],"founder":"Jose Alexandro Acha Gomes","technologies":["MySQL","PostgreSQL"],"website":"www.youtube.com/watch?v=r7qdLgcSo38&feature=youtu.be","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Falexandroacha%40hotmail.com%2FnewFile.jpeg_1650027405.242131.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Alexandroacha"},{"platform":"devpost.com/alexandroacha","link":"https://devpost.com/alexandroacha"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/jose-alexandro-acha-gomes-415b00198/"}]},{"externalLink":"https://www.democracylab.org/projects/1310","projectTitle":"TherapistCat","problem":"Many people feel lonely or unhappy but they don't get enough help. They might don't want to go outside because they feel depressed. Or they might want to have a pet but don't have time/money to take good care of them. I hope this TherapistCat can cure those people and make them happy!","action":["Build an emotional care app with a cat therapist."],"founder":"Xiao Zhao","technologies":["iOS","Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fxiaozhaowork%40gmail.com%2FnewFile.jpeg_1690527342.546908.jpeg","contactInfo":[{"platform":"Trello","link":"https://trello.com/invite/b/unev5Rti/ATTI8c5b356836c531a3873615e0007c1c94D90BBD8D/therapistcat"}]},{"externalLink":"https://www.democracylab.org/projects/1","projectTitle":"DemocracyLab","problem":"Systemic change requires a shift in power. That means that a top-down approach to social innovation won’t produce the equitable outcomes society needs.","action":["DemocracyLab is building online infrastructure to empower the technology for good movement. We are creating an online hub for civic innovation that uses marketplace dynamics to allocate effort, resources, and attention.\nThe result of our work will be an increase in transparency, participation and collaboration within the tech-for-good movement. We believe this will spur the evolution of new social innovations capable of addressing society’s most significant challenges.\nDemocracyLab is a 501(c)(3) nonprofit organization. Our platform is built using the MIT Open Source license.","We have proven our concept and are now working to scale and sustain our impact. To get involved, please review this Start Here Guide."],"founder":"Mark Frischmuth","technologies":["Django","React","Python","JavaScript","HTML","PostgreSQL","Web","Figma","Salesforce"],"website":"democracylab.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1571934135.9478498.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/DemocracyLab/CivicTechExchange"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1RRoBzLZYfKWttufIgDgKrpaTLD07viO8?usp=sharing"},{"platform":"Slack","link":"https://join.slack.com/t/democracylab-org/shared_invite/zt-naiuht9j-UA~AQLEB5mklIFccg_NRCA"},{"platform":"Trello","link":"https://trello.com/b/lRIPH9Yd"},{"platform":"Twitter","link":"https://twitter.com/DemocracyLab"},{"platform":"Figma","link":"https://www.figma.com/file/WADcmVjJh5ARVoZ09xlpfdFN/DemocracyLab?node-id=630%3A953"},{"platform":"Facebook","link":"https://www.facebook.com/DemocracyLab"},{"platform":"Public Calendar","link":"https://calendar.google.com/calendar/u/0/embed?src=c_668gq5k3f1vin50adeqj45d6mk@group.calendar.google.com&ctz=America/Los_Angeles"},{"platform":"GeekWire Article","link":"https://www.geekwire.com/2018/can-tech-government-innovate-together-social-good-inside-new-effort-change-tide/"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/democracylab"},{"platform":"Instagram","link":"https://www.instagram.com/democracylaborg/"},{"platform":"Start Here Guide","link":"https://docs.google.com/document/d/1BqNqG-fTJKg5eZ1AmDNn9lIPfWewZN37Yi9pRNIsvDs/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1250","projectTitle":"Civil Pursuit","problem":"How can thousands of people across the city, state, and country discuss tough political issues productively - meaning discussions converging to solutions they all support - rather than the polarization and gridlock we see from politics today.","action":["We are building a deliberation tool.\r\nDemo\r\nCivil pursuit is a tool for large scale deliberative discussion. Discussions proceed through steps, and rounds.\nThis is one of the tools that EnCiv a 501(c)(3) is building for productive democratic discourse online.","For the tool the we have now, we need a UI/UX redesign, and we need to add a step for grouping items.\r\nWe need to move to Storybook 7 (from 4) for interactive react component testing and interactions.\r\nWe are adding a new step to the discussion process, where people combine similar items, before ranking and proceeding further."],"founder":"David Fridley","technologies":["React","Express","MongoDB","Node.js","Figma"],"website":"github.com/EnCiv/civil-pursuit","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdavidfridley%40enciv.org%2FnewFile.jpeg_1690220517.0713437.jpeg","contactInfo":[{"platform":"GitHub","link":"http://github.com/EnCiv/civil-pursuit"},{"platform":"docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link","link":"https://docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link"}]},{"externalLink":"https://www.democracylab.org/projects/486","projectTitle":"Nonprofit Circle (formerly Nonprofit Exchange Hub)","problem":"Through 2 events from Seattle Tech4Good talking with nonprofits, it was determined, especially in this time of COVID, nonprofits frequently have lack of resources.","action":["We determined an exchange hub of goods, information and connections will benefit all nonprofits as well as the communities they serve. Nonprofits and individuals will be able to view and post goods to lend or donate. Nonprofits will be able to list their profile, create a list of needs, create a list of goods willing to donate or lend, create a list of services offered.\nTECH STACK: Typescript, NestJs, ReactJs, Material UI, Postgres, Docker, Websockets, GCP","We are in active development, UI/UX/Design, and branding.\nWe are using Google Drive, Asana and Slack for communication. These platforms are open to members of the team (e.g. by invitation only)."],"founder":"Joel Meyers","technologies":["Web","PostgreSQL","React","JavaScript","Figma","TypeScript"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjoel%40democracylab.org%2FnewFile.jpeg_1597767616.341887.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Nonprofit-Exchange-Hub/web-app"}]},{"externalLink":"https://www.democracylab.org/projects/996","projectTitle":"TrashAI","problem":"The trash research community needs a simple way to run batches of images through machine learning to identify trash and quickly get annotations. CALTRANS also needs to survey roads for trash using images.","action":["Simple web app for uploading images of trash and getting back annotations and bounding boxes.","We are looking for front-end developers to help improve the UI and add new features.\nWe need to improve the accuracy of our model for identifying trash."],"founder":"Dan Fey","technologies":["Vue.js","Python"],"website":"www.trashai.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Ffeydanm%40gmail.com%2FnewFile.jpeg_1650512650.3913221.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/code4sac/trash-ai"},{"platform":"GitHub","link":"https://github.com/code4sac/trash-ai"}]},{"externalLink":"https://www.democracylab.org/projects/boston-ul","projectTitle":"Urban League Heat Pump Accelerator","problem":"Supporting communities chosen by ULEM which are designated as Massachusetts 2020 Environmental Justice Populations for factors including i) Minority population, ii) Income, and iii) English isolation, with most areas associated with two or more factors. Among the challenges faced by residents in these communities is unequal access to green incentive programs that can help residents to weatherize their homes, reduce their utility bills, and increase their resiliency and health outcomes. One of the most important elements in these programs is the availability of support for the installation of Air Source Heat Pumps (ASHP) which could improve cooling for residents in the summer, offset the high cost of heating in the winter, and reduce associate existing electric and fossil fuel costs for already income-challenges communities.","action":["Through this project and its grant the Urban League plans to hire folks to engage in outreach to homeowners in traditionally underserved communities so they are aware of and can access incentives and resources to convert their HVAC to environmentally friendly air source heat pumps. This will help the Commonwealth reach its goals in the Massachusetts Clean Energy and Climate Plan. It will also reduce the cost of heating and cooling homes for residents in these communities, keeping more of their money in the community and reducing reliance on volatile natural gas or home heating oil prices.\r\nA key element of this project is to confirm the project feasibility, establish the necessary stakeholder understandings and partner framework, and produce data driven understanding of awareness, interest, and potential impact."],"founder":"Sean Sada","technologies":[],"website":"www.ulem.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fssada%40codeforamerica.org%2FnewFile.jpeg_1658363803.435631.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/codeforboston/urban-league-heat-pump-accelerator"},{"platform":"cfb-public.slack.com/archives/C03QW1GTJHW","link":"https://cfb-public.slack.com/archives/C03QW1GTJHW"},{"platform":"GitHub","link":"https://github.com/orgs/codeforboston/projects/5"},{"platform":"Twitter","link":"https://twitter.com/CodeForBoston"},{"platform":"Instagram","link":"https://www.instagram.com/codeforboston/"}]},{"externalLink":"https://www.democracylab.org/projects/openmontana","projectTitle":"Open Montana","problem":"Despite Montana's constitutionally guaranteed \"right to know\", it's remarkably difficult for citizens, activists, and journalists to find out what is happening inside their government. This lack of accessibility makes it more difficult to influence important government actions affecting the people, environment, and economy of Montana.","action":["The Council Data Project (CDP) transcribes videos from government meetings and makes them searchable, queueing up videos to the point where search terms occur and adding information about votes and actions that took place. CDP has been implemented for the City of Missoula, and we now intend to create instances for the Montana state government and other cities in Montana.Open Montana is currently being operated as a program of DemocracyLab.","The Council Data Project's Cookie Cutter Deployment makes it easy to spin up a new instance. The Missoula instance took ~20 hours to get up and running. We will deploy other instances and display all of them at www.openmontana.org.The next step will be to create CDP instances for the Montana state government, and for the cities of Billings, Great Falls, Bozeman, Helena, Butte, and Kalispell. We will then need to implement a global search feature covering all child instances.We also need to be thinking about strategies to increase awareness and engage stakeholders in state and city governments.To join the conversation about the ongoing work , click the Slack link and join the #open-montana channel. Thank you!"],"founder":"Mark Frischmuth","technologies":["JavaScript","React","Python","TypeScript"],"website":"www.openmontana.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1662587149.7574794.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/OpenMontana"},{"platform":"Slack","link":"https://join.slack.com/t/missoulatech/shared_invite/zt-a0zyyr1x-8LjjN~ZNkTBWDBJy0i1Png"},{"platform":"Twitter","link":"https://twitter.com/OpenMontana"},{"platform":"Montana State Legislature Videos","link":"http://sg001-harmony.sliq.net/00309/Harmony/en/View/RecentEnded/20220422/-1"},{"platform":"CDP \"Cookie Cutter\" Deployment Repo","link":"https://github.com/CouncilDataProject/cookiecutter-cdp-deployment"}]},{"externalLink":"https://www.democracylab.org/projects/1157","projectTitle":"Quizzy.News - A daily trivia game","problem":"“Less than 20 percent of U.S. teens report reading a book, magazine or newspaper daily for pleasure, while more than 80 percent say they use social media every day, according to research published by the American Psychological Association.”","action":["Using Figma, we have designed a responsive web app giving users a quiz-game of 5 questions, refreshed daily, about global and national news stories published in the last 24 hours. This will encourage users to be up-to-date with the news and to read further from reputable sources.","If you are interested in developing this, check out the extended brief on this notion page:\r\nhttps://www.notion.so/Brief-31ac2327eab54629acaf39e05504cfdb\nWe are looking for someone who can use both React and Contentful to develop this."],"founder":"Emily Lange","technologies":["React","Figma"],"website":"quizzy.news","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Flange.emi%40gmail.com%2FnewFile.jpeg_1676650186.0243258.jpeg","contactInfo":[{"platform":"Trello","link":"https://trello.com/b/cxRvktwg/quizzynews"},{"platform":"Figma","link":"https://www.figma.com/file/vG348IA2plE5sBvZsaC86X/Quizzy.News-%40-EARTH-A-THON?node-id=0-1&t=DLwM4SvzXGoDGyvD-0"}]},{"externalLink":"https://www.democracylab.org/projects/385","projectTitle":"Pie for Providers","problem":"Pie for Providers helps small child care providers and families claim the government funding for which they are already eligible. Today, 85% of eligible children do not claim this funding. This means families struggle to afford care and child care providers - small, women-owned businesses - do not get paid for their work. The current public health crisis threatens to wipe out 30%+ of child care businesses, making this project even more urgent.","action":["We’re building a Rails and React app to help child care providers claim and manage their subsidy funding. The product is an add-on to the child care management software that childcare providers already use. It takes basic data (e.g. attendance, child rosters) and uses it to help providers proactively manage their monthly billing process with the state.","We need great volunteer developers, designers, data and policy analysts, and marketers to make this vision a reality. You can learn more at our Github and reach out to learn about contributing. https://github.com/pieforproviders/pieforproviders"],"founder":"Chelsea Sprayregen","technologies":["JavaScript","React","Web","Ruby on Rails","Ruby","Figma"],"website":"www.pieforproviders.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fkate%40katelovescode.com%2FnewFile.jpeg_1592931473.0115125.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/pieforproviders/pieforproviders"},{"platform":"pie-for-providers.slack.com","link":"http://pie-for-providers.slack.com/"},{"platform":"GitHub","link":"https://github.com/pieforproviders/pieforproviders"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/pieforproviders/"},{"platform":"Product Roadmap and Domain Intro","link":"https://docs.google.com/document/d/124uXr7GqQvSB7amTDoAjVyPyu4Pb-Wg1G4XL8t74pEI/edit#"}]},{"externalLink":"https://www.democracylab.org/projects/226","projectTitle":"Clearviction","problem":"Nearly one in four people in Washington State have been involved in the criminal justice system. Washington recently enacted the New Hope Act that makes it easier for people with past criminal records to have their convictions vacated. Conviction vacation removes significant barriers to housing and employment, improving the chances of successful reentry into society and making recidivism less likely.","action":["We analyzed the process of conviction vacation in Washington state, and have identified opportunities to use technology to streamline the process. We are investigating the feasibility of a Turbo Tax style interface to simplify this process, and then e-filing the forms in counties where it is permitted.","Please complete the following form so we can connect and see if you're a good fit for Clearviction!\r\nhttps://airtable.com/shrxijhXBMlzrnaeX\nDO NOT CLICK \"Volunteer\" above to volunteer for this project."],"founder":"Seamus Brugh","technologies":["JavaScript","React","Web"],"website":"www.clearviction.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Ftomaszegarra%40clearviction.org%2FnewFile.jpeg_1687410667.670767.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/openseattle/clearviction"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/clearviction"},{"platform":"Twitter","link":"https://twitter.com/Clearviction"},{"platform":"Facebook","link":"https://www.facebook.com/clearviction"}]},{"externalLink":"https://www.democracylab.org/projects/110","projectTitle":"FareStart Data Warehousing Pilot","problem":"FareStart is a non-profit, social enterprise organization that operates job placement and training programs benefiting individuals experiencing poverty, homelessness and other barriers to employment. We serve almost 300 youth and adults annually, generate approx. 50% of our own revenue, and more than 90% of our graduates are employed within 90 days (+88% are still employed 6 months later).","action":["The goal of this project is to export data from multiple systems into a data warehouse will allow for scalable data storage, flexible data manipulation and approachable data consumption.","See Scope Doc for more info"],"founder":"Maxx Kaplan","technologies":["JavaScript","Python","SQL"],"website":"www.farestart.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmaxx.kaplan%40farestart.org%2FFS-logo-badge-sm+png.png_1552276553.2087266.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/FarestartTechVolunteers/DataWarehousingPilot"},{"platform":"farestarttech-ug01020.slack.com","link":"https://farestarttech-ug01020.slack.com/"}]},{"externalLink":"https://www.democracylab.org/projects/1160","projectTitle":"YourState","problem":"State and local elections are becoming more and more important and many Americans don't know who their local officials are and what they stand for.","action":["YourState consolidates lists of anybody's electable representatives, and provides a platform for people to learn who their best representative could be, why, and when to vote for them.","Get a better idea of who our users are, and how we can make it easier for them to learn about their representatives.\r\nDesign and develop an MVP."],"founder":"Matt Buckingham","technologies":["Django","React","PostgreSQL"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmbuck2273%40yahoo.com%2FnewFile.jpeg_1674798300.0503948.jpeg","contactInfo":[{"platform":"Trello","link":"https://trello.com/b/LPcV82d5/yourstate"}]},{"externalLink":"https://www.democracylab.org/projects/657","projectTitle":"VRMS - Volunteer Relationship Management System","problem":"Organizations need a way to engage, support and retain volunteers as well as measure the impact the volunteers are making in the organization.","action":["VRMS (Volunteer Relationship Management System) is a browser-based software tool created by Hack for LA (HfLA) to offer curated management and matching of project and volunteer experiences. VRMS will further volunteer software development organizations' goals of creating pro-social software and developing the tech sector workforce, doing so by collecting and using relevant data to automate repetitive tasks, enable self-service profile management, match volunteers with projects, identify professional development opportunities, and surface insights to improve organizational effectiveness.","Product Roadmap\r\nv0.3 (production): Alpha release proving concept of event check-ins based off database of users, projects, and events\r\nv0.4 (development): MVP release adding Magic link login, user onboarding automation, API endpoints for some project data, admin reports downloadable as CSV, and data model expansion\r\nv0.5: Self-service meeting time and project profile management, user profile management, and additional API endpoints\r\nv0.6: Self-service one-off event scheduling, event calendars, and additional API endpoints\r\nv1.0 will include all other features to accommodate a single organization, the prerequisites to pursuing multitenancy: automations for project access control, user notification system, third party identity sign-in, enhanced admin reporting, and an enhanced responsive UI that presents additional data on devices with large displays.\nThe roadmap from v1.0 to v2.0 will expand VRMS to support multiple volunteer organizations."],"founder":"Olivia Chiong","technologies":["React","Express","MongoDB","Node.js"],"website":"www.vrms.io/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fcivictechindex%40hackforla.org%2FnewFile.jpeg_1614128239.4493644.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/hackforla/VRMS"},{"platform":"Slack","link":"https://hackforla.slack.com/archives/CRGH5HM0Q"},{"platform":"GitHub","link":"https://github.com/hackforla/VRMS/projects/2"},{"platform":"VRMS project page on Hack for LA","link":"https://www.hackforla.org/projects/vrms"}]},{"externalLink":"https://www.democracylab.org/projects/foodoasis-councils","projectTitle":"Hack for LA: Food Oasis | LA Neighborhood Councils","problem":"LA Neighborhood Councils advocate on issues like homelessness, housing, land use, emergency preparedness, public safety, parks, transportation, and sustainability. They also provide local expertise and a local voice on the delivery of City services to their communities.","action":["Adding the Food Oasis tool to the neighborhood council's website will provide a way for local council members to identify active food pantries and meal services available to their constituents who are experiencing food insecurity.","VOLUNTEERS MUST BE CURRENT MEMBERS OF HACK FOR LA, THE LOS ANGELES BRIGADE OF CODE FOR AMERICA. ** DUE TO AN INFLUX OF INTEREST IN THE PROJECT, RECRUITMENT FOR FOOD OASIS HAS BEEN SUSPENDED. PLEASE CHECK BACK FOR NEW ROLES. **"],"founder":"Stacey Rebekah Scott","technologies":[],"website":"www.foodoasis.net/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsscott%40codeforamerica.org%2FnewFile.jpeg_1661209741.9874337.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/hackforla/food-oasis/projects/8"}]},{"externalLink":"https://www.democracylab.org/projects/802","projectTitle":"Minority Programmers Association - Career Development dApp","problem":"Minorities do not have access to adequate resources and software engineering proves to a fast track to upward mobility. We are building a soliution where anyone can get free (and even paid in cryptocurrency) education, mentorship, and work. Whether its through incubation of their own startups, working on real projects through our consultancy portal or participating in the community through our chapter DAOs or governance system.","action":["Creating a decentralized ecosystem powered by blockchain that allows minorities to acquire skills, work, mentorship, careers, community and innovate and bring access to capital. All while incentivizing beneficial actions to the community.","UI/UX Designers need to design validation flows\r\nSolidity developers are needed for smart contract\r\nReact developers are needed for front end\r\nNoSQL / Javascript backend developers\r\nBizDev\r\nMarketing\r\nNFT artists\r\nHackathon organizing\r\nCommunity Growth\r\nDeveloper Relations\r\nQ/A\r\nDevOps"],"founder":"Shot K","technologies":["React","Python","HTML","MongoDB","Figma","Rust"],"website":"minorityprogrammers.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1628084711.053824.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/MinorityProgrammers/"},{"platform":"discord.com/invite/NhCq4Y6AQV","link":"https://discord.com/invite/NhCq4Y6AQV"},{"platform":"Reddit","link":"https://www.reddit.com/r/MinorityProgrammers"},{"platform":"Twitter","link":"https://twitter.com/minorityprogram"},{"platform":"Facebook","link":"https://www.facebook.com/MinorityProgrammers"},{"platform":"Instagram","link":"https://www.instagram.com/minorityprogrammers/"},{"platform":"Whitepaper","link":"http://minorityprogrammers.org/whitepaper"},{"platform":"LinkedIn","link":"https://linkedin.com/company/minority-programmers/"},{"platform":"Medium","link":"https://medium.com/minority-programmers"},{"platform":"MPA Internship Certification","link":"https://opensea.io/MinorityProgrammers/minority-programmers-internship-certification"},{"platform":"Linktree","link":"https://linktr.ee/minorityprogrammers"}]},{"externalLink":"https://www.democracylab.org/projects/1179","projectTitle":"ChatVE","problem":"Online extremism undermines elections and democratic systems, by polarising societies and inciting violent insurrection.\r\nIn Nigeria, the 2014 elections were postponed because of Boko Haram attacks across the north of the country. Extremist incitement is again ramping up ahead of the country’s 2023 elections. Violent extremism is not only a Nigerian problem: similar extremist campaigns have derailed democratic processes everywhere from Burkina Faso and the Central African Republic of Mali and Niger.\r\nHow can we leverage technology advancement to build early warning/detection tools, actor watch lists, lexicons for monitoring/analysis, Digi-reporting/helpline tools, and social media campaigns to help mitigate electoral violence and extremism?","action":["ChatVE is an AI chatbot that can be integrated into the web, WhatsApp, Twitter, Facebook or other online platforms to provide quick conversational information through text or text-to-speech to fact check in real time, report violence, and educate voters. Using the Large Language Model (LLM), ChatVE fact checking algorithm can assess the credibility of claims and provide interpretable valid evidence that explains why a certain claim is considered as factually true or fake.\nFact-checking with ChatVE enables user to debunking false claims and supporting the true ones, confronting the threat of disinformation that may polarise societies and inciting violent insurrection.\nOther features of ChatVE include:\nToxic Comment Scoring: Countering violent extremism and radicalization social media by identifying and flagging toxic language.\r\nai-Report: to report violent act witness anonymously.\r\nSentiment Analysis:\r\nCustomer Service Automation: Reply to FAQs faster.\r\nConversational AI:","Voter education (VE) is necessary to ensure that all stakeholders; men, women, and youths alike understand their rights, the political system, the contests they are being asked to decide, and how and where to vote. For an election to be successful and democratic, voters must be sufficiently knowledgeable and well-informed to cast ballots and to participate meaningfully in the voting process. VE is even more critical in curbing election-related conflict or violence. The information age has changed the general attention span, which is narrowing due to the amount of information that is presented to the public. People now have more things to focus on, and often focus on things of interest for short periods of time."],"founder":"Israel Olatunji Tijani","technologies":["JavaScript","Django","Python","Web","Node.js","Firebase"],"website":"bot.dialogflow.com/53033b75-e37a-421a-ba90-2584b3b1cf7f","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fholatung9010%40gmail.com%2FnewFile.jpeg_1684305629.6999104.jpeg","contactInfo":[{"platform":"GitHub","link":"http://www.github.com/holatung"},{"platform":"Twitter","link":"https://www.twitter.com/ChatVE_"},{"platform":"Twitter","link":"https://www.twitter.com/Holatung"},{"platform":"Figma","link":"https://www.figma.com/proto/Q8SYRii3hKgBdkpc8dsWYW/ChatVE?type=design&node-id=225-1599&scaling=min-zoom&page-id=1%3A3&starting-point-node-id=225%3A1599"}]},{"externalLink":"https://www.democracylab.org/projects/218","projectTitle":"A/B Street","problem":"Many cities around the world effectively depend on driving cars, which get stuck in traffic jams, harm the environment, and can pose serious danger to pedestrians and cyclists. Active transportation like walking, biking, and public transit and denser zoning policies can solve these problems, but proposals to improve these often face great public resistance. This is partly caused by people not understanding proposals or visualizing the long-term vision of greener cities.","action":["A/B Street is a game that models any city's traffic infrastructure in detail -- including sidewalks, turn lanes, parking, traffic signals, etc -- and simulates cars, bikes, buses, and pedestrians moving through it. Players can reallocate existing road space (convert a general car lane to a bus lane) and edit intersections (convert a traffic signal to have a pedestrian-only scramble cycle), then run a detailed A/B test to explore the impact on all people. Proposals in the game can be used to communicate all directions between transportation agencies, cycling advocacy groups, and the general public.\nThe A/B Street project also encompasses work on 15-minute neighborhoods and zoning, and tools to aid OpenStreetMap volunteers.","A/B Street has been actively developed since June 2018. Help is needed from software engineers, designers, data scientists, and transportation advocacy groups. As of December 2020, current work is focused on:\n\n\nunderstanding how upzoning can create 15-minute neighborhoods\n\n\nexpanding to more cities besides Seattle, by generating traffic demand models based on population demographics\n\n\nimporting sidewalk and cycle-path data from OpenStreetmap\n\n\nworking around low-quality and missing data for road/intersection geometry, traffic signal timing, and parking\n\n\nSee https://dabreegster.github.io/abstreet/project/roadmap.html for details."],"founder":"Dustin Carlino","technologies":["Web","Figma","Rust"],"website":"github.com/dabreegster/abstreet","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdabreegster%40gmail.com%2FnewFile.jpeg_1580427744.9183474.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/dabreegster/abstreet"},{"platform":"docs.google.com/presentation/d/1hb7DSJMgpSX-FNPJTZnEDM3P7pot8bz1LfJDL3Toj68/edit?usp=sharing","link":"https://docs.google.com/presentation/d/1hb7DSJMgpSX-FNPJTZnEDM3P7pot8bz1LfJDL3Toj68/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1288","projectTitle":"History Shapers","problem":"Like so many others living in the U.S., we are sickened by far too many injustices across the country - be it social or environmental. While many community organizers achieve so much, there just isn’t enough change happening. It is why we set out on a research mission to understand the problem. It turns out that people find it difficult to navigate the activism space and as a result, not enough of society is taking action. There is little civic change when there is little civic engagement.","action":["Fixing the growing injustices in the U.S. will require a massive number of people to take action (locally + consistently). History Shapers is a paradigm shift in how communities can address their most pressing needs together. It will be the first mobile app to include ALL social and environmental injustices and ALL the different ways to take action ALL in one centralized hub for activism, powered by a community that ALL want to make a change.\nWe are reinventing the future of social media. It has to date been designed for profit and data collection, NOT for social impact. We are “connected” yet live in an increasingly fragmented and inequitable landscape where injustices, gun violence, and environmental crises are all growing rapidly. WHAT IF social media could replace hate speech, toxic comments, misinformation, and time sunk scrolling (all obstacles to progress) with achieving progress quickly - fixing injustices together - one action at a time?","We are looking for at least one Product Designer to help with UI design of the mobile app. There will also be opportunities to do UX research and usability testing when needed."],"founder":"Mathilde Verdier","technologies":["Sketch","Marvel"],"website":"www.historyshapers.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fverdier.mathilde%40gmail.com%2FnewFile.jpeg_1684676261.8621383.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/874","projectTitle":"Proof of humanity authentication for digital services","problem":"Charlottesville expects to have several hundred refugees move here in the upcoming months in coordination with the International Rescue Committee. There are several groups in town such as the Piedmont Housing Alliance and AimCville that want to provide services to these community members and we at Codeforcville.org would like to provide a landing spot for non-profits to track needs and deliver services directly to the people who need help. Providing digital web-based tools that respect the privacy and difficult situations (especially common in this case) is essential. We don't want to authenticate users based on things like birth certificates, or SSN#s, or even their names or photos which could potentially be used in nefarious ways.","action":["BrightID is an authentication tool designed to provide proof-of-unique humanity and anti-Sybil infrastructure to existing applications. BrightID does this without storing potentially hazardous information such as SSN#s, email address, or other biometric data and can meet our users in a secure way.\nDrupal is a popular CMS frequently used in community and government contexts and addresses internationalization and ADA accessibility - two of the cornerstones of successful institutional releases. We want to build interfaces in Drupal that may be ported in to fintech and web3 projects using BrightID, Ceramic and other tools.\nSolution here is both short-term technical and long term-ideation. Technically we'd like to see a small module in Drupal to leverage the BrightID API. We would then like to spend some time discussing a longer term strategy and what tools we should focus on to build the next layer of tools - considering the Ceramic Network tools as well as IPFS.io backends","We need to review the Drupal module tools and find the simplest way to integrated BrightID - bonus points for integration that doesn't require an additional module or that leverages existing tools (custom fields perhaps)\nWe should make sure our solution is multi-lingual & provide some templates for more languages\nWork with the BrightID team to add our project to their registry. Potentially add a layer for filtering by BrightID group\nDevelop plan for web3 & Ceramic integration to move forward.\nAmple user testing!\nWrite documentation!"],"founder":"anson parker","technologies":["React","Python","JavaScript","Node.js","PostgreSQL","TypeScript","Drupal","PHP","Wordpress","Figma"],"website":"docs.google.com/document/d/1QUMjECDYNwXvp7MExBtsiCsGB97AWInK5kgrTclVeZg/edit#","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fadp6j%40virginia.edu%2FnewFile.jpeg_1634085575.480596.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/code-for-charlottesville"},{"platform":"communityinviter.com/apps/codeforcville/join-code-for-cville-on-slack","link":"https://communityinviter.com/apps/codeforcville/join-code-for-cville-on-slack"},{"platform":"Twitter","link":"https://twitter.com/codeforcville"},{"platform":"Our main project page","link":"https://docs.google.com/document/d/1QUMjECDYNwXvp7MExBtsiCsGB97AWInK5kgrTclVeZg/edit#"}]},{"externalLink":"https://www.democracylab.org/projects/1224","projectTitle":"Piedmont Native Plants Database","problem":"The Albemarle County Environmental Services runs a database called “Piedmont Native Plants Database”, which keeps track of plants that thrive in our local area. Due to retirements, the department no longer has database admins who are also developers, and so there is a need for a no-code CRUD app to replace the existing solution.","action":["An open source web app that serves citizens, teachers, scientists and anyone looking to learn more about the local flora. The app should be made in a way that would allow other Environmental Services departments across the US to make use of it if needed.\nThe County of Albemarle needs a simple CRUD web app to keep track of native plants of the Piedmont area.\nThe app needs to do as follows:\r\nAllow people to browse through the plants database.\r\nAllow people to submit a new plant (DB Entry).\r\nAllow people to submit an edit to database entry.\r\nAllow for an admin to edit the database.\r\nAllow for an admin to approve/deny database entry/edit.","We are looking for web developers with experience shipping web apps, and people with some level of comfort with React.js\nWe need to create a front end for app\r\nconnect DB/backend to front end\r\ntest web app\r\npublish web app\r\ncreate landing page for web app"],"founder":"Vital Boisset","technologies":["MySQL","React","Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1678822188.8409114.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/code-for-charlottesville/piedmont-native-plants-db"}]},{"externalLink":"https://www.democracylab.org/projects/1285","projectTitle":"Salam.chat","problem":"We are solving the problem of people trying to get holy text information without citations, or without access to a mosque or books. Additionally we are solving the language barrier and access to religious scholars by allowing individuals to search religious text for themselves.","action":["Learn Islam more easily. An AI based chatbot powered by the Quran & Hadith.","\nconvert model to langchain\nmarketing support\nQA testing\nfront end development\nrefine product, get users\nfigure out donation strategy\n"],"founder":"Shot K","technologies":["JavaScript","React","Python","TypeScript","Flask","Figma"],"website":"salam.chat","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1684216023.4169106.jpeg","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/salamchat_"},{"platform":"Newsletter","link":"https://salam.chat/subscrib"},{"platform":"Website","link":"https://salam.chat/"},{"platform":"Donate","link":"https://salam.chat/donate"}]},{"externalLink":"https://www.democracylab.org/projects/502","projectTitle":"iSeaTree","problem":"Right now, there are 2 critical issues impacting our pandemic-cloistered communities:","action":["After launching V4 (December 2022) we plan to focus on the following:\n\nAdd more game-play elements, including:\n\n\na zone game play strategy where kids can earn badges for collecting data on trees in their local area.\na 'identify bark' game badge strategy.\na 'identify a leaf' and 'identify a pine needle' game badge strategy\nadd more strategy to the 'identification' ranking challenge\n\n\nAdd more curriculum.\n\n-Work directly with local educators to create curriculum and strategy that makes 'iSeaTree' a tool work best for their remote learning challenges.\n\nDesign and Develop the 'Tree Wizard' feature\n\n\nTree Wizard is our graphic-based GUI menu for helping new users manually evaluate and identify trees (a 'hands-on' learning option instead of the user relying solely on our 'TreeBot' AI).\npopulate our json filter list\ncreate custom art for the info menus and identification tiles\nimplement feature (with slight redesign of the 'add Tree' page)\n","If you are interested in joining our team, you can learn more at our Github and our main website.\nPublic Git: https://github.com/TreeMama/iSeaTree-React-Prototype\r\nWebsite: www.treemama.org"],"founder":"Arielle Simmons-Steffen","technologies":["React","TypeScript"],"website":"treemama.org/the-tech-treehouse/iseatree/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Ftreemamasea%40gmail.com%2FnewFile.jpeg_1597694417.3446445.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/TreeMama/iSeaTree-React-Prototype"},{"platform":"Slack","link":"https://app.slack.com/client/T019AKHLA3U/C019GQZU55J"},{"platform":"Website (with Marketing videos)","link":"https://treemama.org/the-tech-treehouse/iseatree/"}]},{"externalLink":"https://www.democracylab.org/projects/997","projectTitle":"Virtual Hospital For Beneficiaries in Africa","problem":"We noticed how difficult it is for remote and underserved communities in Africa to access quality healthcare as well as receive continuous care. Mainly because of the distance between communities and hospitals. Non-availability of skilled personnel like doctors and specialists is also a huge issue. Situation was worse during the Covid pandemic as hospitals were inaccessible for those with other conditions and some were in isolation because of Covid itself.","action":["Our solution is to build a Virtual Hospital with a portal at every primary health clinic managing to provide access to doctors and specialists.","We currently need volunteer developers with Cloud(AWS), backend, frontend, Android or full stack experience. The volunteers will be required to help build the backend for a Virtual Hospital that could be  deployed to remote areas where traditional hospitals are either unreachable or unaffordable. The Virtual Hospital will consist of the following modules:\n\nPatient Application\nNurse Application\nVirtual Doctor Application\nCommunity Health Worker/Caregiver Application.\nWhatsapp Chatbot\n\nParticipants will be required to give at least 10 hours a week to the project."],"founder":"Jonathan Tagarisa","technologies":["JavaScript","React","Web","PostgreSQL","TypeScript","Node.js","Redis","Figma","Tailwind"],"website":"www.healthgatewayafrica.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjontag2000%40yahoo.com%2FnewFile.jpeg_1650548457.8150916.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/morehumaninternet/virtual-hospitals-africa"}]},{"externalLink":"https://www.democracylab.org/projects/1143","projectTitle":"Cartridge OCR with Tech4Tracing","problem":"T4T aims to augment the capabilities of actors involved in arms and ammunition identification and tracing globally, by creating automated and accurate tools to lower the costs of doing this work, increase the number of actors who could contribute, and empower qualified actors to disrupt illicit arms and ammunition trafficking, bring perpetrators of armed violence to justice, and contribute to safer societies.\r\nT4T’s work has the following objectives:","action":["Through our ongoing projects and partnerships we are\n\ndeveloping AI systems that can capture and catalogue small-caliber ammunition\ndeveloping a master headstamp database for identification and tracking the wide variety of small-caliber ammunition available today\nengaging in development partnerships exploring the digitization and recognition of munitions\n\nOur projects are open-source and can be found on github at https://github.com/Tech4Tracing","Please refer to our open issues on github for a variety of open tasks. Contact robert.sim@tech4tracing.org for onboarding information."],"founder":"Robert Sim","technologies":["Flask"],"website":"tech4tracing.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1672964264.1108894.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Tech4Tracing"},{"platform":"Slack","link":"https://tech4tracing.slack.com/"},{"platform":"Twitter","link":"https://twitter.com/tech4tracing"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/tech4tracing/"}]},{"externalLink":"https://www.democracylab.org/projects/227","projectTitle":"Turn the Bus - education App for low-income kids in India","problem":"One of the biggest causes of intergenerational poverty in developing nations today is the lack of access to high quality education in low income rural areas, in the local languages. The rising availability of smartphones and internet access at low cost can be leveraged to change that.","action":["Turn the Bus is building and deploying on-line educational content for 15-25 year old students, localized for underprivileged and rural students in Bihar -- one of the most disadvantaged and densely populated states of India.\nWe leverage excellent students in the local community (those who aced the Board exams last year) to create educational videos. This video content is currently distributed via YouTube and our Turn the Bus Android App.\nWe are enhancing our smartphone app and our video content with various AI/ML and AR/VR tools, to make this content accessible to hundreds of thousands of children in Bihar, India.\nWe have a partnership on the ground with the World Bank and State Government funded Jeevika, which gives us access directly to the student communities. We are the only edTech provider to provide High School content in Hindi via a nonprofit model.","We have created and deployed the Turn the Bus Android App and Web App. We will be enhancing this to motivate students who do not have access to any other school or college to prepare for their Board exams at the Grade 12 level. Experience in gamification, AR/VR, various AI/ML tools or Open edX and Python could add value to this project.\nThere are many projects - and we welcome skills of the following types - technical, website design and development , marketing/CRM, design and program management."],"founder":"Bratati Ghosh","technologies":["Python","Django","Android","Amazon DynamoDB","JavaScript","Salesforce","Balsamiq","React","Joomla"],"website":"www.turnthebus.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fbghosh%40turnthebus.org%2Flogo.png_1568421221.7625089.png","contactInfo":[{"platform":"turn-the-bus.slack.com","link":"http://turn-the-bus.slack.com/"},{"platform":"Trello","link":"https://trello.com/b/q3WRi8Xk/turn-the-bus"},{"platform":"Demo Mov file","link":"https://drive.google.com/file/d/1BMajI11N1jGvmF3aIvs4InZrM4e_4Yvg/view?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1309","projectTitle":"Undebates","problem":"Whether it's the school board, or the student council, it's hard for people to get to know the candidates, and it's hard to get media coverage if you aren't running for president. Also, it's hard to get to know the candidates through written platforms, just watching them answer a few questions has a big impact.","action":["Undebates is a tool that automatically produces what look like interactive video debates by automatically interviewing candidates through their web browser. Democratically run organizations can create their own Undebates with a few simple steps, and there is a backend data interface for integrating government election data and generating Undebates at national scale.\nSee Undebates","Create a marketing program to promote Undebates to democratically run organizations - like college student councils."],"founder":"David Fridley","technologies":["React","MongoDB","Node.js","Figma"],"website":"cc.enciv.org/undebates","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdavidfridley%40enciv.org%2FnewFile.jpeg_1689979860.8118196.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/EnCiv/undebate-ssp"},{"platform":"docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link","link":"https://docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link"}]},{"externalLink":"https://www.democracylab.org/projects/281","projectTitle":"EnCiv","problem":"The communications algorithms used by for profit social media are great for making money, but are a disaster for democracy and our polarization and gridlock are the result.","action":["EnCiv is a web portal for productive democratic discourse, at large scale - across the country, and within communities. And it can include everyone and lead discussions to conclusions and solutions. It’s built on long studied and proven communications practices (not algorithms) for in-person dialog and deliberation - taken online and automated.\nIt’s like taking that room of 1000 people and sitting them around small tables and guiding them through talking and listening to each other.\nWe have to do this one step at a time, and in 2019 we created Undebates, a way to automatically interview candidates and collect their answers together into an interactive debate format. For the 2020 elections we worked with Ballotpedia.org who called it Candidate Conversations launched it for elections across the country. see: https://ballotpedia.org/Candidate_Conversations","It's a lot and we are breaking the problem down into a group of projects of projects.\nCivil Pursuit is how 1000s of people deliberate and reach a conclusion on tough questions.\r\nUndebate is a tool for automating the process of video interviewing candidates and generating an interactive debate web app to help voters decide.\r\nUndebate Self Service Portal opens Undebates up to any democratically run organization that wants to do their own.\r\nUnpoll is how 1000s of people agree on a few questions to ask the candidates\nWe are 100% remote."],"founder":"David Fridley","technologies":["JavaScript","React","Web","MongoDB","Node.js","Figma"],"website":"github.com/EnCiv","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdavidfridley%40enciv.org%2FnewFile.jpeg_1633394617.148445.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/EnCiv"},{"platform":"forms.gle/YmrHsE6Yrw36vY1i7","link":"https://forms.gle/YmrHsE6Yrw36vY1i7"},{"platform":"Trello","link":"https://trello.com/b/x6rw0hJn/enciv-dev"},{"platform":"Pitch Video","link":"https://youtu.be/Tb2u0h_IUGc"},{"platform":"MVP Demo - Nov 5, 2019 San Francisco District Attorney race","link":"https://cc.enciv.org/san-francisco-district-attorney"},{"platform":"New UI concepts from HackToGiveThanks","link":"https://www.figma.com/proto/knovkb6ex8ewhVuS3lSJvy/Untitled?node-id=9%3A100&scaling=min-zoom"}]},{"externalLink":"https://www.democracylab.org/projects/1298","projectTitle":"FlowFree - A safe space to share","problem":"The goal is to create an environment where people can openly and freely discuss their concerns, seek support, and receive advice without fear of prejudice or potential harm.","action":["Introducing our web-based meeting platform - a confidential and safe space for open, prejudice-free conversations. Connect anonymously with counselors and peers in the workplace. Share struggles, seek advice, and receive support without fear of judgment. Flexible session durations empower you to control your time. Break free from workplace stigma and access accessible support anytime, anywhere. Join us in fostering a supportive, inclusive environment where you can connect, be vulnerable, and grow together.","Seeking out-of-the-box web developers and UX/UI designers to create an online platform. White-label it for corporations. We have a vision and design foundation, but need skilled developers to bring it to life. Join us in crafting a unique and user-friendly platform. Let's revolutionize online meetings and provide customizable solutions for businesses."],"founder":"Matt Bamber","technologies":[],"website":"www.unifygiving.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmatt.bamber%40outlook.com%2FnewFile.jpeg_1687971687.695499.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1301","projectTitle":"Civic Engagement Data Visualization","problem":"Research shows that routine jury service has positive long-range effects on civic engagement: people who serve on a jury are more likely to vote (long-term, not just once!), talk with their neighbors about community issues, and report greater confidence in the judicial system. Researchers identified deliberation as the key factor driving these positive effects (jurors must think critically, weigh a common pool of evidence, and discuss a case with people who think differently from themselves). At the same time, Civic Genius is one of a few orgs that runs deliberative democracy programming, where we guide communities to deliberate on public policy issues and work across ideological differences toward common ground solutions. We want to use the research on juries to encourage more elected officials and communities to use deliberation as a means of collaborative problem-solving, but currently the only way to access that research is by reading a book.","action":["A creative and accessible visualization would be a fantastic tool for us to use when we present the idea of deliberation to communities. We work with a wide range of partners -- including elected officials at every level of government, community leaders, community members, business leaders, etc.) -- and want to equip them with something that clearly makes the connection between the research on jury deliberation and the possibilities/benefits of public policy deliberation.","Turn data into a public-facing visualization. Our university research partner has agreed to share his team's data."],"founder":"Jillian Youngblood","technologies":["Wordpress","Adobe Creative Suite"],"website":"www.ourcivicgenius.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjillian%40ourcivicgenius.org%2FnewFile.jpeg_1689090690.7437484.jpeg","contactInfo":[{"platform":"civicgeniusju-p5r2854.slack.com/archives/C05G3BFSCK1","link":"https://civicgeniusju-p5r2854.slack.com/archives/C05G3BFSCK1"},{"platform":"Twitter","link":"https://twitter.com/civicgenius"},{"platform":"Facebook","link":"https://www.facebook.com/civicgenius"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/civicgenius/"},{"platform":"Research Background","link":"https://jurydemocracy.la.psu.edu/writings/"},{"platform":"Instagram","link":"https://www.instagram.com/civicgenius/"}]},{"externalLink":"https://www.democracylab.org/projects/1240","projectTitle":"A Youth-Friendly,Gender-aware chatbot/AI for civic education","problem":"Keywords: Civic Education, Youth-Led Political Activisim, Civic Engagement SkillsCivic Knowledge and Participation in DemocracyThe Fundamental Question is : How do they participate if they do not know how to participate ?","action":["Therefore, CIVIC EDUCATION Matters There should be Fun and Interactive way to Learn and practice these (Female Role Models) :-History and Basics of Constitution-Foundation of Basic Political System-Practice of Politics and political affairs-Role of the Country in world affairs -Role of Civil Society -Information on Entry Points for Youth-Situational/ Social Analysis-Consensus-Building-Advocate for themselves-Sharing Information -Utilize Technology-Volunteerism","Build a chatbot/AI that provides information on political processes and civic duties in an engaging and gender-inclusive manner. The chatbot can use natural language processing to answer questions and provide feedback on users' (youths) understanding of political concepts particularly on the a) History and basics of constitution, b) Foundation of basic political system, c) Practice of political affairs, d) Role of tthe country in world affairs, e) Role of civil society, f) and Information on entry points for youth. The chatbot/AI can also provide information on how to get involved in political activism. There are 6 specific civic engagement skills that are aimed to develop in youth through this learning platform, namely,1. Situational Analysis 2. Consensus-Building3 Advocate for themselves (Youth)4 Sharing Information5 Utilize TechnologyRecruitment: Web Designer, coder, digital security expert, expert on Civic Engagement Curicular Development, Art/Graphic Designer, translator"],"founder":"Fathima Najiya","technologies":[],"website":"www.chrysaliscatalyz.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhi%40ocf.tw%2FnewFile.jpeg_1681361384.8572521.jpeg","contactInfo":[{"platform":"Project Description","link":"https://docs.google.com/presentation/d/1ofb7iT1pxb9CLGSD-9d0A1DlSXDv6ACn/edit?usp=sharing&ouid=114940497549798109592&rtpof=true&sd=true"}]},{"externalLink":"https://www.democracylab.org/projects/149","projectTitle":"Banana App","problem":"Want to be part of the Banana App team this coming hackaton? Visit BananaApp.org/volunteer to sign up! We’d love to help you set up your environment before you join us so you have everything ready before Saturday!","action":["Concept\r\nOur mobile-based project \"Banana App\" will provide supermarkets/groceries/produce-stands/restaurants a time-sensitive platform to donate bananas/produce/foods that are considered not aesthetically-pleasing for market display or sale but still edible and in good condition.\nVerified no-to-low-income clients/homeless individuals will be able to register using our app. Upon completion and approval of the application, the user can accept and pick up these donations.","To allow us to onboard you more efficiently, please fill-out our volunteers application form at https://bit.ly/3rjaHAN. Please check your spam or promotions for email from our domain thebegoodproject.org."],"founder":"Apollo Rimando","technologies":["JavaScript","PostgreSQL","Web","Ruby","Figma","Android","iOS","TypeScript","React"],"website":"www.thebegoodproject.org/bananaapp","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fapollor%40thebegoodproject.org%2FnewFile.jpeg_1590964112.9258466.jpeg","contactInfo":[{"platform":"Free Banana Project","link":"https://www.thebegoodproject.org/bananaapp"},{"platform":"Live Demo","link":"https://the-banana-app.netlify.com/"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/begoodproject/"},{"platform":"Slides","link":"https://docs.google.com/presentation/d/1eeBF9R0NvO13wzDK81FxtUv16I32bJIg009TcFS-kF8/edit#slide=id.p"}]},{"externalLink":"https://www.democracylab.org/projects/1091","projectTitle":"RCVis","problem":"The website is not screenreader-accessible","action":["Making at least some (preferably all) of the visualizations friendly to screenreader-users","Adapt the visualizations to be screenreader-friendly"],"founder":"Armin Samii","technologies":["Django"],"website":"rcvis.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fartoonie%40gmail.com%2FnewFile.jpeg_1665682786.8907053.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/artoonie/rcvis"},{"platform":"GitHub","link":"https://github.com/artoonie/rcvis/issues"},{"platform":"Twitter","link":"https://twitter.com/rcvisdotcom"}]},{"externalLink":"https://www.democracylab.org/projects/1166","projectTitle":"Visualizing Climate Collections","problem":"The U.S. government is producing valuable environmental and climate documentation at overwhelming volumes. So how can we help everyday users navigate to find data and documents relevant to them?","action":["Let's build some dashboards and visualizations to help reader find out about the content of climate collections!"],"founder":"Jamie Joyce","technologies":[],"website":"archive.org/details/democracys-library","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fthesocietylibrary%40gmail.com%2FnewFile.jpeg_1675462658.3174925.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/800","projectTitle":"One Democracy","problem":"Democracy is crumbling. There is a need to quantify geographic consensus and thus enable traditionally disenfranchised communities to efficiently impact public affairs.","action":["Streamline public communication on all politics, from municipal up to federal, by distilling vastly disjointed sources of information (bills, meetings, judicial, elections, special interests, etc) into one easy and convenient interface.\nVerified voters and appointed officials come together through regional forums and surveys that provide a transparent and structured alternative to current social media platforms.\nData management is supplemented by local agencies/interns/volunteers, while sustainable revenue is generated by hosting digital government services and subscription based tools for grassroots campaigns.\nWe hope to leverage/partner with relevant CivicTech efforts to develop a unified solution to digital democracy.\nLearn more by watching our demo video @ https://bit.ly/3ztY5sL (please include a note when requesting access)","Initial UX/UI is already complete, along with sitemap architecture outline. We have partial tracking for state/municipal: bills, lobbying & campaign spending, public official information. Also developed bot learning for custom summaries, topic association, relevant agencies, revision history, and users can verify voter status upon registration\nCurrent needs:\n\nRecruit team of developers, data scientists, designers, and managers\nRefine roadmap and timeline for Alpha, Beta development\nDevelop interactive front end (React, JS) for Alpha with robust admin portal and new backend\nDetermine security and user privacy measures\nContinuously identify and integrate relevant APIs from gov't and other CivicTech projects\n"],"founder":"David Schutt","technologies":["JavaScript","React"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1627679559.8688767.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/OneDemocracy"},{"platform":"mail.google.com/chat/u/0/#chat/space/AAAAretE9DA","link":"https://mail.google.com/chat/u/0/#chat/space/AAAAretE9DA"},{"platform":"bit.ly/3ztY5sL","link":"https://bit.ly/3ztY5sL"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/david-schutt-5667881a0/"}]},{"externalLink":"https://www.democracylab.org/projects/978","projectTitle":"MinorityProgrammers - DAO","problem":"Our main motivation for creating a DAO\r\n-A central dashboard for newcomers to look at and understand what is happening to the organization as a whole\r\n-Move funds away from the custody of the Minority Programmers administrators and into the people\r\n-Delegate funds (payouts, grant money, investment) in a programmatic way with a clear audit trail and no single point of failure (especially with Multi-sig wallet)\r\n-Making an official name in the Web3 space. We are already building all our applications with some form of Web3 infrastructure, coming up with in-house applications, consulting, doing NFT drops, organizing Web3 hackathons, all day everyday. Transitioning to complete DAO lets the world know we are officially a Web3 organization.\r\n-Serving as an on-chain resume for the work and reputation of members\r\n-Streamline into reputation-based system to incentivize users to be later integrated into career development dApp","action":["We are building a Decentralized Autonomous Organization powered by the blockchain where hiring, payroll, fund delegating, new investments, and all business processes are done transparently (with level of role-based access for sensitive information)\nIn order to do this, we need to bring people from all fields to come together, leverage existing DAO tools, build our own tools, and incentivize actors to continue to build to the ecosystem, manging our own community, and build dApps that add value to the Web3 ecosystem.\r\nAdditional steps to decentralization:\r\n-Lower initial barrier to entry to governance voting\r\n-Hiring Staff Across the World\r\n-Creating MPA Chapters, Continental, National, Regional, Statewide, .....\r\n-Utilization of L2s and gasless governance\r\n-Cross-chain approach to dApps\r\n-Putting other orgs in key positions at MPA\n\nInstitute role-based nft badges\r\n-broadening recruitment funnels\r\n-translating & localizing apps\r\n-DAO run scholarships\r\n-free educational materials\n","-Recruit dedicated governors that the organization is currently lacking to support the DAO, especially social media, grant/proposal writers, DevOps engineers, Quality Assurance, Data Scientists, Mobile Developers, SCRUM certified project managers, Senior Developers, Legal & Compliance, and Accounting\r\n-Developing strategic partnerships with Social impact organizations in the Web3 space\r\n-Fostering project based learning, guided learning, and mentorship through existing commuication channels like discord\r\n-Source funding from organizations looking to build dapps, support diversity, support DAOs, and recruit developers"],"founder":"Shot K","technologies":["JavaScript","Wordpress","Webflow","Python","Amazon DynamoDB","Swift","HTML","TypeScript","PostgreSQL","React","Go","Firebase","Ruby","Django","Figma","MongoDB","Rust"],"website":"minorityprogrammers.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fpresident%40minorityprogrammers.org%2FnewFile.jpeg_1647436685.6058772.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/MinorityProgrammers/"},{"platform":"discord.gg/4vdtmQqz6d","link":"https://discord.gg/4vdtmQqz6d"},{"platform":"Facebook","link":"https://www.facebook.com/MinorityProgrammers"},{"platform":"Join Meeting Link","link":"https://calendly.com/minorityprogrammers/join?month=2021-09"},{"platform":"The DAO","link":"https://snapshot.org/#/minorityprogrammers.eth"},{"platform":"Medium","link":"https://medium.com/minority-programmers"},{"platform":"Instagram","link":"https://www.instagram.com/minorityprogrammers/"},{"platform":"Telegram","link":"https://t.me/+Na5wOnGlqnM2ZGZh"},{"platform":"LinkedIn","link":"https://linkedin.com/company/minority-programmers/"},{"platform":"Linktree","link":"https://linktr.ee/minorityprogrammers"},{"platform":"DAO Proposal","link":"https://www.programmers.one/"},{"platform":"YouTube","link":"https://youtube.com/c/minorityprogrammers"},{"platform":"LinkedIn","link":"https://linkedin.com/company/minority-programmers/"},{"platform":"Harmony DAO Proposal","link":"https://talk.harmony.one/t/minority-programmers-dao"},{"platform":"Twitter","link":"https://twitter.com/minorityprogram"},{"platform":"NEAR Hacker House Linktree","link":"https://nearhacks.com/"},{"platform":"Web App / Website","link":"https://www.minorityprogrammers.org/"}]},{"externalLink":"https://www.democracylab.org/projects/1184","projectTitle":"TRULLY.AFRICA","problem":"The spread of disinformation and information disorder by online extremists has caused confusion and a decline in civic participation among Nigerians, leading to conflict and violence that is actively costing unnecessary money. Young people cannot exercise their civic rights due to the horrible mess and confusion caused by disinformation and misinformation. There is no platform for verifying information breakdown and sharing it in order to orient their circle against extremist misinformation.","action":["We are poised to empower young people everywhere to stop the spread of misinformation and fake news by online extremists as we know it, by narrowing down the frustration and displeasure people have in trusting information they receive, thus affecting their civic participation. We believe Nigerians need access to a digital platform that provides an easy, reliable, and independent channel to identify fake news and misinformation that is meant to make them lose trust in democracy and their civic participation. TRULLY helps young people to be defenders and embracers of democracy. Our solution will give young people the power to evaluate information and information sources especially those from online platforms, spread by extremists by promoting Transparency, Accountability, and Civic participation. The platform will be an open platform for a wide range of perspectives so that young people from Nigeria, all over the world can take action on the misinformation and Information disorder.","1 Development and deployment of the platform within three months.\r\n2. Partnership with reputable fact-checking organizations to provide support for the platform.\r\n3. Implementation of a sustainable business model to fund the platform's operation.\r\n4 Partnerships with relevant stakeholders, including government agencies, civil society organizations, and media organizations, to promote the platform and increase user engagement."],"founder":"Ruhamah Ifere","technologies":["JavaScript","React","Web","MongoDB","Node.js","Figma","Tailwind"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fruhamahifere%40yahoo.com%2FnewFile.jpeg_1677157761.207843.jpeg","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/trullyafrica?t=agJwuokaI9dbVe6u1s1JbQ&s=09"}]},{"externalLink":"https://www.democracylab.org/projects/905","projectTitle":"Genadrop","problem":"Before genadrop artists had to pay developers to render their art stifling their creative process to generate art. Then they also had to pay developers to mint their art as NFTs. Now it is common for artists to get < 10% of an NFT drop instead of 100%","action":["Genadrop is a no code solution for artists to create, mint, and sell their generative art as NFTs across multiple blockchains.","\nWe need marketing, qa testers, additional developers to release this product to production. We also need insight on to where to ship this first of the kind product. We are shipping to the Algorand blockchain. We also need new artists to get onboarding into the platform.\n"],"founder":"Shot K","technologies":["Express","React","Figma","Rust","TypeScript","JavaScript","Firebase","Node.js","Adobe Photoshop","Adobe Illustrator","Python","Framer"],"website":"genadrop.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fpresident%40minorityprogrammers.org%2FnewFile.jpeg_1682727527.894194.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/codingshot/genadrop"},{"platform":"discord.gg/4vdtmQqz6d","link":"https://discord.gg/4vdtmQqz6d"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/minority-programmers/"},{"platform":"Website","link":"https://www.genadrop.com/"},{"platform":"Documentation","link":"https://genadrop.com/docs"},{"platform":"GenaDrop LinkedIn","link":"https://www.linkedin.com/company/genadrop"},{"platform":"Genadrop Linktree","link":"https://linktr.ee/Genadrop"},{"platform":"Reddit","link":"https://www.reddit.com/r/genadrop/"},{"platform":"Twitter","link":"https://twitter.com/genadrop"}]},{"externalLink":"https://www.democracylab.org/projects/230","projectTitle":"ClimateTree","problem":"About","action":["Present and Future Needs\nNortheastern University (NEU) Advanced Software Development will finish an MVP of the site by the end of April 2020. Their seminar takes place on Tuesdays from 3pm to 6pm - you are welcome to join us to understand where we are. We need:\n\n\nOn-going support from software developers (front/back/full) to administrate the site, debug features, and add features.\n\n\nCloud Hosting Sponsorship to power our microservices and website\n\n\nUX/UI Design Advice\n\n\nBeta testers (climate organizations and other interested citizens)\n\n\nFundraising Brainstorming\n\n"],"founder":"Greg Schundler","technologies":["JavaScript","React","PostgreSQL","MongoDB","Node.js"],"website":"www.climatetree.wiki","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fgregschundler%40gmail.com%2FnewFile.jpeg_1584067861.0775373.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/climatetree"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1ynky2NJFD4KbW0UPD-FAipNQiRNM6ewJ?usp=sharing"},{"platform":"cs6510-asd.slack.com","link":"http://cs6510-asd.slack.com/"}]},{"externalLink":"https://www.democracylab.org/projects/1238","projectTitle":"Record and Analyze Anonymous Incidents of Sexual Bribery","problem":"Keywords: Sexual bribery; Open platform building; Data collection\r\nSexual Bribery is a prevalent issue in most communities. Centre for Equality and Justice (CEJ) Sri Lanka has conducted 4 research studies to identify and record incidents and prevalence of sexual bribery within different communities (Female-Headed Households in war-affected areas, military widows, Muslim women, and health and justice sectors). In order to advocate for law and policy changes, there needs to be more evidence-based lobbying and research. However, it is difficult to collect such cases due to the sensitivity of the topic. Victims are reluctant to come forward with their experiences due to various reasons, including social stigma, potential repercussions from the perpetrators, and lack of knowledge or assistance.","action":["Need an open, digital platform where the public can submit their experiences of sexual bribery anonymously. This data will be automatically analyzed to show gender breakdown, provinces and sectors where sexual bribery is prevalent. After this step, if the complainant wishes to seek legal action, helplines, and outline of legal steps that can be taken to take action, will be provided in this platform.","In order to record such cases without repercussions to the victims, CEJ would like to propose an online digital platform where victims or witnesses of sexual bribery can upload and share their experiences anonymously. The platform would also analyze the data collected through the platform, Eg:- Gender breakdown of victims/perpetrators; The sectors where sexual bribery is most prevalent; Geographical areas where sexual bribery is most prevalent; Communities where sexual bribery has most affected; LGBTQI, sex workers, female-headed households etc. After this step, if the complainant wishes to seek legal action, helplines, and outline of legal steps that can be taken to take action, will be provided in this platform.\r\nRecruitment: Designer, coder, digital security expert, expert on sexual bribery/sextortion, note taker, translator"],"founder":"Ashmidha Pathmanathan","technologies":[],"website":"cejsrilanka.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhi%40ocf.tw%2FnewFile.jpeg_1681286224.8780077.jpeg","contactInfo":[{"platform":"Project Description","link":"https://docs.google.com/document/d/1wTyDcQglJvam8mufRSX2C_WbxxZrHusxMdOLbE-wHBk/edit?usp=sharing"},{"platform":"Facebook","link":"https://www.facebook.com/CEJ.SL/"},{"platform":"Instagram","link":"https://www.instagram.com/cej_srilanka/?hl=en"}]},{"externalLink":"https://www.democracylab.org/projects/1098","projectTitle":"ICD Code Map","problem":"The intended program will provide some very basic functions/processes to map between ICD10-ICD11 codes/terms used in hospital diagnoses for health care providers as outlined terms/codes.","action":["ICD CODE MAP project functionality written in PL/SQL will make sure that the data inserted in the health care database is correct and compliant with the ICD-CM code structure.\nICD CODE MAP will operate as a liaison between the third-party data collection systems and the central database storage for ICD-CM code repositories.\nIn the US, an expected implementation/transition year for ICD10 to ICD11 has been given in 2025, but if clinical modification is determined to be needed (Similar to ICD-10-CM), ICD-11 implementation might begin around the year 2027.\nDatabase Solutions will be implemented using the following technologies,\r\nOracle DB, PL/SQL, etc.\nAccording to the latest articles by experts The new code set could be implemented in the U.S. as early as 2023. (https://icd10monitor.medlearn.com/preparing-for-the-inevitable-icd-11/)","Current Objectives:\n\nTesting the initial ideation and advancements through discussion and internet search about the project-related topics.\nThe initial steps require designing a database based on ICD-10-CM/ICD-11-CM data and the EHR model and then implementing a database script based on the initial requirement (Script required to be updated accordingly in the future if any changes are needed at the front-end as well as back-end)\nTechnologies used, PL/SQL, Oracle DB, ER Designer, etc.\n\nProspective Objectives (Require expert volunteer help):\n\nImplementing front-end tasks including integrating data with the third-party information system\nImplementing back-end tasks (includes 3rd party integration module)\nTechnologies used (TBD)\n"],"founder":"Harshal Rasal","technologies":["SQL","Oracle"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fharshalrasal007%40gmail.com%2FnewFile.jpeg_1671769261.810993.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1237","projectTitle":"Know Your Parliament","problem":"Keywords:Parliament, Profile Tracking, ElectionA Proposal By Fira Tiyasning Tri Utari - Youth Active Fellows from IndonesiaProblem Statement1. The limitations of source of information about parliament members performance affects the public trust with parliament and political parties.2. Lack of understanding about parliament function, society problems, and society needs can be effect to the policies decision making and implementation3. Parliament performance should be one of long term best practices to ensure the quality of political actions and democracy.","action":["Program Goals and Objectives The Goals of this project is to provide comprehensive information about parliament members performance before and after election that can contribute to public trust and appreciation to the candidate's work.Need a digital record to ensure the performance of parliament members that can contribute to the public trust and appreciation for legislative work. Objectives:1. Providing database of the candidates profile, background, and social contribution2. Updating their works, political will, and best practice as their performance in parliament3. Providing a space to society to appreciate and criticize their performance.","Activities-Research about the profile of parliament candidates for 2024 election-Develop Interview and research tools for the candidate to complete the resume/CV-Platform development and design-Independent research to the profile of the candidate, Interview the candidate, legitimate the information-Input the candidate profile to the KYP Platform-Publishing and Promotion-Monitoring and evaluationRecruitment:Website Developer, Designer, Data Security Researcher, Politics and Law Researcher, Data Scientist"],"founder":"Fira Tiyasning Tri Utari","technologies":[],"website":"docs.google.com/document/d/1pMIrrNNYxac1RO_xviSUSgdONTCOpJQwW1yz5LaDEKo/edit","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhi%40ocf.tw%2FnewFile.jpeg_1681281581.4890468.jpeg","contactInfo":[{"platform":"Project Description","link":"https://docs.google.com/document/d/1pMIrrNNYxac1RO_xviSUSgdONTCOpJQwW1yz5LaDEKo/edit"}]},{"externalLink":"https://www.democracylab.org/projects/148","projectTitle":"Continueli","problem":"Environmental problems require global coordination, but that coordination is needs to be broken down and understood at local levels. Continueli puts global environmental mitigation into local context and lets people understand how their contributions to environmentalism supports global solutions.","action":[],"founder":"Kyle Conyers","technologies":["MySQL","React","Express","HTML","MongoDB","Node.js"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fconyersky%40Gmail.com%2Fenviralg.jpg_1557349768.6484685.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/kyleconyers/continueli"},{"platform":"Trello","link":"http://trello/"}]},{"externalLink":"https://www.democracylab.org/projects/1159","projectTitle":"Kingdom Foundation","problem":"In 2020, the fashion industry took a harsh downfall for the traditional business models and unfortunate market conditions. We saw huge problems such as:","action":["In partnership with the United Nations Global Compact (UNGC), we are implementing the 17 Sustainable Development Goals and Ten Principles in our organizational practices and product developments. Kingdom is pending a Certified B Corp status to assume accountability of the business practices conducted in the fashion industry. Marginalized communities are the most affected in several fashion ecosystems, and we plan to adopt the following actions:\n\nElimination of poverty\nLess water usage\nProfits donated\nCommunity governance\nData ownership\nAnti-corruption workplace\nLess energy\nReforestation\nSupport for local creators and SMBs\n\nTo create an equitable and lasting future, we are starting with humanity's long-term problems by first investing in people."],"founder":"Jonathan Coach","technologies":["JavaScript","Node.js","Figma","Framer"],"website":"www.kingdomperiod.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjcoach19%40gmail.com%2FnewFile.jpeg_1674799729.6159863.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/company/kingdomlabs"},{"platform":"Discord","link":"https://discord.gg/ENUNFdJZ29"}]},{"externalLink":"https://www.democracylab.org/projects/1183","projectTitle":"CollAction","problem":"Our vision is to solve all collective action problems in the world, such as climate change. We believe in a positive, bottom-up approach. We do so by making it simple and enjoyable for users to take part in CrowdActions: sustainable (monthly) challenges. Therefore, CollAction connects people to make positive impact together - Power to the Crowd! We believe this is the only way to reach a crowd that crosses cities, countries and continents. Therefore, our mission is to make doing good fun and easy!","action":["Offering a social platform that makes it fun & easy to take part in positive habit change through challenges. Our platform connects 'activators' with 'the crowd'. Activators host challenges from start to end. The crowd joins because of the social aspect: doing fun challenges with friends, family, neighbours and colleagues.","We have a rapidly growing team of 30+ opensource developers so our professional designer cannot keep up with the pace of implementation. Therefore we're searching for professional designers that have experience with Figma, or are very eager to learn Figma, and are strongly motivated to support our cause."],"founder":"Tom Siebring","technologies":["JavaScript","Android","Web","iOS","Express","MongoDB","Figma","Flutter"],"website":"www.collaction.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fit%40collaction.org%2FnewFile.jpeg_1677142402.857034.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/CollActionteam/collaction_app"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1osJryT1qVClJfJ9Ng_FMjEnr6-luHX3W?usp=share_link"},{"platform":"Slack","link":"https://join.slack.com/t/collaction-team/shared_invite/zt-1puqhmlf7-6tTrPAj~~n3Y6xpS4nxkkQ"},{"platform":"GitHub","link":"https://github.com/CollActionteam/product-feature"},{"platform":"Figma","link":"https://www.figma.com/file/dYFW0QF7Fg10dpSIxA3wQb/CollAction-App?node-id=36%3A114"},{"platform":"Twitter","link":"https://twitter.com/CollAction_org"},{"platform":"Facebook","link":"https://www.facebook.com/collaction.org/"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/stichting-collaction"},{"platform":"Instagram","link":"https://www.instagram.com/collaction_org"}]},{"externalLink":"https://www.democracylab.org/projects/787","projectTitle":"Collaboration App For Teachers in Developing Countries","problem":"Quality education is fundamental to the development and advancement of every society. Many developing countries do not have strong educational programs, thus hindering their development. Due to lack of financial support, there is limited technological support for the unique problems that these societies must overcome.","action":["By investing in the capacity of educators, the overall quality of education increases and so will the quality of life in the society. Education ends poverty.\nP4H works with the boards of education in developing countries to help facilitate teacher certifications through long term training and teacher conferences.\r\nThe P4H Teach App aims to help the facilitation of these teacher certifications and conferences through creating a platform where P4H staff and teachers can collaborate, track certification processes, and share important resources.\nBy assisting with the teacher certification and P4H teacher conferences, the app will provide accessible information for teachers in countries like Haiti and Nicaragua so they can create better lesson plans, enhance teacher knowledge, and empower the next generation of students. This app will be another step toward ending poverty!","A bare-bones web app has already been created with a back-end written in Python and uses API of two open source softwares: Canvas (LMS) and Rocket Chat.\r\nThese two apps are used to help with the messaging and resource facilitation aspects of the app.\nThe app itself is a cross between LinkedIn and Canvas. It allows teachers to post updates and message one another, while also allowing admins at P4H to track their teacher certification process and provide updates for them. All of this is simplified for the user to avoid confusion by putting all the info they need in one user friendly place.\nNext steps:\n\nImplement Angular frontend framework into web app.\nCreate frontend of mobile app with any technology stack (Flutter, React Native, etc.), which will utilize the current backend.\n"],"founder":"Logan Cundiff","technologies":["JavaScript","HTML","Angular","Flask"],"website":"p4hglobal.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Flcundiff%40ufl.edu%2FnewFile.jpeg_1625517927.9316301.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Gator-Bytes-Foundation/p4hApp/"},{"platform":"Slack","link":"https://join.slack.com/t/p4hteach/shared_invite/zt-160rf89tz-jH57f6Lio_Z7PACf0bTLPQ"},{"platform":"GitHub","link":"https://github.com/Gator-Bytes-Foundation/p4hApp/issues"},{"platform":"Facebook","link":"https://www.facebook.com/P4HGlobal"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/3316633/admin/"}]},{"externalLink":"https://www.democracylab.org/projects/1046","projectTitle":"The Acht Code ","problem":"Today, supply chains are facing multiple problems. Due to its inherent complexity, this process encounters various hurdles in each of its steps. From manufacturing, retailing and transportation ...etc, it can be hard to visualize the entire process. In addition, these logistical issues are negatively affecting the environment in ways we are truly starting to perceive the weight of now.","action":["That's why this project is an initiative to help companies maximize the efficiency of their supply chain while taking into consideration sustainability objectives and the company's goals.\nIf you are a professional who is interested in the idea of the project or a student seeking to gain more experience, please don't hesitate to join the team and create the change!"],"founder":"Rawan Rwehny","technologies":[],"website":"www.linkedin.com/company/the-acht-code/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Frawan.rhy%40gmail.com%2FnewFile.jpeg_1661362808.5625167.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/company/the-acht-code/"}]},{"externalLink":"https://www.democracylab.org/projects/179","projectTitle":"OpenSidewalks","problem":"People want information about sidewalks they can trust! Sidewalks provide a primary mode of travel that supports nearly all other travel options and especially active transportation, but there is no open, consistent data about where sidewalks are, curb ramps, signals, lighting, all the things that make complete streets more walkable, accessible and pleasant.","action":["We have an open data specification at https://github.com/OpenSidewalks/OpenSidewalks-Schema, and contribute to an ecosystem of open tools to help people and organizations collect and use the data.","Many actions from UX/UI for user applications and collection apps, to data collection, to data quality assessments, to data schema documentation. All are welcome!"],"founder":"Anat Caspi","technologies":["JavaScript","Node.js","React","PostgreSQL","Python","MySQL","Wordpress"],"website":"opensidewalks.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fuwtcat%40uw.edu%2FTASKAR+LOGO_UW+CSE.png_1564270973.3670976.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/OpenSidewalks/OpenSidewalks-Schema"},{"platform":"GitHub","link":"https://github.com/OpenSidewalks/OpenSidewalks-Schema"},{"platform":"Slack","link":"https://join.slack.com/t/opensidewalks/shared_invite/zt-ywzwe4ld-6FNJIu9FNDdv1arSN0uotA"},{"platform":"Twitter","link":"https://twitter.com/OpenSidewalks"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/37521880/"}]},{"externalLink":"https://www.democracylab.org/projects/98","projectTitle":"Open Source Ecology","problem":"The mission of Open Source Ecology (OSE) is to create the open source economy.","action":[],"founder":"Jennifer Silves","technologies":["Web","Python","Arduino","HTML","JavaScript","C++","C"],"website":"wiki.opensourceecology.org/wiki/Main_Page","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FOpen+Source+Ecology.jpg_1546372946.8907.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ose"},{"platform":"GitHub","link":"https://github.com/OSE/documentation"},{"platform":"wiki.opensourceecology.org/wiki/Development_Team_Log","link":"https://wiki.opensourceecology.org/wiki/Development_Team_Log"},{"platform":"Jitsi link/meetings Tuesdays at noon","link":"https://meet.jit.si/OpenSourceEcology"},{"platform":"TEDTalk- 2011","link":"https://youtu.be/zIsHKrP-66s"},{"platform":"YouTube Channel","link":"https://www.youtube.com/user/marcinose"},{"platform":"Open Source Ecology website","link":"https://www.opensourceecology.org/"},{"platform":"OSE Pattern LAnguage wiki page","link":"https://wiki.opensourceecology.org/wiki/Pattern_Language"},{"platform":"CNC Universal Axis wiki page","link":"https://wiki.opensourceecology.org/wiki/Universal_CNC_Axis"},{"platform":"OSE Dev Log wiki page","link":"https://wiki.opensourceecology.org/wiki/Development_Team_Log"},{"platform":"D3D Printer wiki page","link":"https://wiki.opensourceecology.org/wiki/D3D"}]},{"externalLink":"https://www.democracylab.org/projects/14","projectTitle":"Hey Duwamish River Cleanup Project","problem":"A community of residents and stakeholders who are monitoring the cleanup of toxic waste in Seattle's Duwamish River.","action":[],"founder":"Jacob Caggiano","technologies":["JavaScript","React","Python"],"website":"heyduwamish.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fadmin%40democracylab.org%2FHey+Duwamish%21.png_1522387694.7116098.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/mapseed/platform"},{"platform":"Slack","link":"https://openseattle.slack.com/messages/heyduwamish/"}]},{"externalLink":"https://www.democracylab.org/projects/58","projectTitle":"Mapseed","problem":"Mapseed is a platform that allows anyone to tell geographic stories with visual data to drive community engagement. You can build a map story and use beautiful styling with a call to action for collecting donations, contacting representatives, attending an event, or any other type of action you want constituents to perform for your cause.","action":[],"founder":"Jacob Caggiano","technologies":["JavaScript","React","Python"],"website":"mapseed.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FMapseed.png_1524513561.7715015.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/mapseed/platform"},{"platform":"Rough demo","link":"https://pbdemo.mapseed.org/"}]},{"externalLink":"https://www.democracylab.org/projects/1239","projectTitle":"Youth Good Governance & Active Citizenship Project","problem":"Keywords: Youth Leadership, Good Governance, Strong Democracy & Anti-Corruption.","action":["The Anti-corruption & Transparency initiatives through engaging youth in the Indo-Pacific (ACTIVE Youth) program is the best approach and way forward to bring together like-minded youths who are very passionate about fighting corruption. The Youth Good Governance and Active Citizenship project aims at empowering and capacitating youths in the educational institutions to be champions of anti-corruption in their families, communities, local districts, province and country as a whole. All in all, together we stand to stop the corrupt practices which have already become a culture in Papua New Guinea and in the Indo-Pacific countries.","PROJECT OBJECTIVE(S)\r\n1.To encourage citizens(youth, students, teachers, others)to acquire information through short anti-corruption videos via their smartphones, thus capacitating them to be advocates of anti-corruption.\r\n2.To feed information on principles of Good Governance, Government System, government development policies and plans to the 4 secondary schools in National Capital District (NCD) and Central Province, Port Moresby and 1 tertiary institution (University of Goroka) for increased knowledge to be advocates and champions to fight against corruption.\r\n3.The agency(PSSPNGCAI) becomes a role model and independent agency to keep a watch for corrupt practices in the government systems, institutions, organizations and others.\r\n4.Partner with Youth led NGOs and work in collaboration with them to address corruption and governance issues that are affecting PNG’s growth and progress.\nRecruitment:\r\nProject Coordinator, Project officer, video grapher, video producer, content creator."],"founder":"Open Culture Foundation OCF","technologies":[],"website":"www.facebook.com/PSSPNGCAINC","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhi%40ocf.tw%2FnewFile.jpeg_1681282409.55306.jpeg","contactInfo":[{"platform":"PSSPNG CAI- Project Summary","link":"https://drive.google.com/file/d/14S4eN4HTUOh3j7ESKQS8gkHOqhE4JBmX/view?usp=share_link"}]},{"externalLink":"https://www.democracylab.org/projects/1241","projectTitle":"Shared Platform for Youth & Women Politics and Governance","problem":"Keywords: Youth & Women Political Engagement, Governance Projects & Research, Find different Ideas & Knowledge (Governance, Politics)","action":["Clubbing Youths & women Leaders Projects/Research on Good Governance across Sri Lanka.\n•To Create a platform where Youths & Women Leaders across the country can showcase their Project/Research, work in collaboration and/or get new project Ideas to Present their needs and changes from good governance\n•The Platform allow you to upload their projects, get inspired from others idea, praise people behind the project that you like, post your questions and share your knowledge, get connected with new people with the same spark of all ages and professions.","Recruitment:\r\nWeb Designer/Developer, Coder, digital security expert, Art/Graphic Designer, translator, Political & Governance reseacher, Project Coordinator"],"founder":"Open Culture Foundation OCF","technologies":[],"website":"www.facebook.com/cpartsputtalam","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhi%40ocf.tw%2FnewFile.jpeg_1681362083.2903864.jpeg","contactInfo":[{"platform":"Project Description","link":"https://docs.google.com/presentation/d/1RfW5Cbp-nRnl1kRmbrCvK1ReLFN-Icqz/edit?usp=share_link&ouid=111846540507858084772&rtpof=true&sd=true"}]},{"externalLink":"https://www.democracylab.org/projects/1292","projectTitle":"Meet Democracy","problem":"Currently, citizen participation platform are not easy to put in place for cities and communities and required a lot of financial and human investments.","action":["Our goal is to make community development easy. We intend to democratize community participation by making it accessible to all. We recognize the importance of having access to a democratic and trustworthy platform. Give your community citizens the freedom to express themselves.","We have an easy Saas platform that allow any size community to launch their citizen participation plaform"],"founder":"Karim Semmoud","technologies":["JavaScript","Vue.js","PostgreSQL","Ruby on Rails","Ruby","Bootstrap"],"website":"meetdemocracy.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fkarim.semmoud%40gmail.com%2FnewFile.jpeg_1685095335.6014466.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/netoum"},{"platform":"Facebook","link":"https://www.facebook.com/meetdemocracy"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/meet-democracy/"}]},{"externalLink":"https://www.democracylab.org/projects/hawaii","projectTitle":"Code for Hawaii <> Hawaii Zoning Atlas","problem":"Before the pandemic, 42% of Hawaii's population was already living in poverty or paycheck to paycheck. With recent inflation, that figure is likely now close to the majority. Meanwhile the median home price here rose 21% last year to reach $875,000. The median income in Hawaii is no longer sufficient to qualify for a mortgage on the median home, creating a persistent and pernicious class barrier between renters and homeowners. The Census estimates that 14,500 people left the state last year, or 1% of the population. Most leavers are young and educated in characteristic brain drain, citing the cost of living as a chief reason. There is scientific consensus that land use regulations contribute to housing unaffordability. In April, scholars at the University of Hawaii found that the burden of these regulations in Hawaii is by far the highest in the country. Disclaimer: All Code for America volunteers must be 18 or older and reside in the United States","action":["Atlas volunteers are currently parsing hundreds of pages of county land use ordinances to extract key data. The proposed intervention is to host this data on a public website in the form of an interactive online map. The map will explain the rules that govern what can and can’t be built on every parcel in the state and the impact of those rules on housing availability and affordability.The Hawaii Zoning Atlas takes as its model the Connecticut Zoning Atlas, which began by providing original research and data analysis of land use regulations in the state. This research served as the foundation for a coalition of civic, nonprofit, and advocacy organizations that a) educated the public on land use and zoning issues, b) developed policy solutions, and c) successfully advocated for the adoption of those solutions in their 2021 state legislative session.","Recruit these team members to join the project: - Research volunteers (no technical experience required, join us on Monday's https://www.meetup.com/Code-for-Hawaii/events/) - Coordinate a team of developers that includes a web mapping developer to create the site and map respectfully - Spatial Data Analyst- Coalition Organizer: Identifying, contacting & interviewing stakeholders. Demoing tool and collecting feedback. Ongoing communication."],"founder":"Hawaii Zoning Atlas","technologies":[],"website":"www.zoningatlas.org/hawaii","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1663877240.6429331.jpeg","contactInfo":[{"platform":"Slack","link":"https://join.slack.com/share/enQtMzg3MTIwMzkwNjE5NC1jMjViYTg0ZTFhMTFhZmNmZjhlOTg3NmM2YmQyZjU2ZjM1ODIwZTFhMDM3ODQ1YzlmOTYwYThmN2Y2NjY3M2Y2"}]},{"externalLink":"https://www.democracylab.org/projects/66","projectTitle":"Activist Mirror","problem":"The Activist Mirror (AM) is online and ready to use. Give it a try and help us think about next steps! The project is designed to help people better understand how social change happens and how they could use their skills and interests to help see their potential roles. Based on their answers to eight brief multiple choice questions, users learn whether they are a Change Agent, Citizen, Reformer or Rebel. Additionally, users are shown four patterns from the Liberating Voices pattern language that are most relevant to them. The Activist Mirror has been released (in English, Spanish, and Italian) and a few hundred people have tried it.","action":["Our next step is integrating the languages for which we already have translations, first Japanese, then Arabic, Chinese, Vietnamese, Russian, and French — not necessarily in that order. We also would like to improve the user interface, integrate more patterns into the system, and think of new extensions. We would also love some assistance marketing the tool.","The actions at this point include:\r\n(1) incorporating existing translations into the code\r\n(2) coming up with more translations\r\n(3) doing data analysis with the results\r\n(4) incorporating more patterns into the system\r\n(5) thinking of new extensions — e.g. suggestions for activist projects based on people's input"],"founder":"Douglas Schuler","technologies":["JavaScript","PHP","MySQL","Web"],"website":"labs.publicsphereproject.org/am","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdouglas%40publicsphereproject.org%2Ffor-democracy-lab.png_1533432158.4867682.png","contactInfo":[{"platform":"Activist Mirror","link":"https://labs.publicsphereproject.org/am"},{"platform":"Liberating Voices pattern language","link":"https://www.publicsphereproject.org/patterns/lv"}]},{"externalLink":"https://www.democracylab.org/projects/111","projectTitle":"OpenSidewalks: Let's evaluate curriculum","problem":"There are no good maps or routers for pedestrians. Routers treat all travelers like slow moving cars, not taking into account important needs and preferences. OpenSidewalks and AccessMap are changing that.\r\nPedestrians want maps that allow us to choose between streets with and without sidewalks, that let us select routes that are not polluted and busy with very fast street traffic. For people with disabilities, knowledge about the infrastructure is crucial for successful trips. It's the difference between choosing routes that have curb ramps and decent connectivity in sidewalks, versus getting stuck in rubble, impossibly elevated hills or impassable infrastructure.\r\nOpenSidewalks helps define, collect, and promote data for pedestrians via the OpenStreetMap platform, where millions of contributors create high-quality map data. We work with municipal, state and USDOT data. Once on OSM, these data can be used downstream by routers and transportation/urban planners for informed decisions.","action":["Mapping infrastructure for all kinds of mappers, requires some knowledge. Help us design material that covers both the social and technical aspect of collecting good data for accessibility.","Creating easy mapping infrastructure\r\nCreating trackable edits to the map\r\nAdd good instructions for mappers\r\nDeploying web-based tools to facilitate mapping parties"],"founder":"Anat Caspi","technologies":[],"website":"www.opensidewalks.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fnbolten%40gmail.com%2FOpenSidewalks-LogoWhite.png_1552600336.4567637.png","contactInfo":[{"platform":"OpenSidewalks website","link":"https://www.opensidewalks.com/"}]},{"externalLink":"https://www.democracylab.org/projects/993","projectTitle":"Food Healers App","problem":"Global problems of ill health, world hunger, climate breakdown and ecological destruction are difficult to solve within our current institutional framework and socioeconomic system. If we wait for governments to solve these problems, it will be too late. If we wait for individual actions to solve these problems, it will be too little. Our only way forward is to act as a community, to deploy our singular ability to work together among millions and billions of us to achieve a common goal.","action":["Create an offers/needs network on an App, to connect those who have the ability to give healthy food, with those who need healthy food. With the use of location, Givers can post up vegan food for gifting, and Receivers can then claim and retrieve the food within their area. The Offers Tab would feature a Calendar, where Givers can set a certain date, time and location of where gifted food can be retrieved. The Needs Tab would be for posting up Food/Supply Needs to be visible within a set radius (15mi, 30mi, 50mi, 100mi, WorldWide) for Givers to donate/contribute within their means.","Create App to facilitate the implementation of Food Healers objectives. Once created, App can be downloaded by the Community to create an offers/needs network for global outreach. The Main Event for Food Healers is World Food Healers Day, which is planned for Saturday November 19th, 2022. World Food Healers day is the day after the UN Climate Change meeting, COP-27, Nov 7-18, ends in Sharm El-Sheikh, Egypt. The purpose of World Food Healers Day is to raise global awareness and initiate massive global action in relation to the interconnected challenges of climate breakdown and global hunger. With the help of Co-Conveners, such as PETA, Food For Life Global, Food Not Bombs, and Food Revolution Network, we aim to gain enough pledges to feed every human being on planet earth a healthy, nutritious, whole-foods, plant-based Universal meal so that we make serious inroads into eradicating hunger and experiencing the power of healing foods on that day."],"founder":"Sailesh Rao","technologies":["Android","iOS","MongoDB","Wordpress","Flutter"],"website":"foodhealers.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fvega%40climatehealers.org%2FnewFile.jpeg_1650508405.4268465.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/FoodHealers/FoodHealers"},{"platform":"Google Drive","link":"https://drive.google.com/drive/u/3/folders/1tsJ5rqV07fL1qGBJ8RsZwhBsXYhKbvxP"},{"platform":"Slack","link":"https://join.slack.com/t/climatehealers/shared_invite/zt-17bgialba-azXFO9qyDOqTKzEkXaN_Mg"},{"platform":"Trello","link":"https://trello.com/b/XTzhisXg/food-healers"},{"platform":"Figma","link":"https://www.figma.com/files/recent?fuid=1097642319519880415"},{"platform":"Twitter","link":"https://twitter.com/climatehealers"},{"platform":"Facebook","link":"https://www.facebook.com/climatehealers"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/climate-healers"}]},{"externalLink":"https://www.democracylab.org/projects/178","projectTitle":"EMPOWER ","problem":"On average, every minute in the United States, nearly 24 people per minute are physically abused by an intimate partner. This equates to more than 12 million women and men in just one year. Fear, shame, humiliation and low self-esteem experienced by DV victims are some aspects that prevent them from having the courage to reach out to organizations that may be helpful to them. The empower app would do that by helping DV victims specifically identify easy, confidential and discreet resources that can help them understand and learn about resources that may be available and close to them geographically to help provide logical options for them to put together a plan a safe escape. Future prospects of the app include:","action":[],"founder":"Nagham Ailabouni","technologies":["Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FEmpower.png_1564420976.3157694.png","contactInfo":[{"platform":"docs.google.com/presentation/d/15WTKFpZuV-fHbx6zAWT2KFpWgBOuATb8_u4b6M3YcrY/edit?usp=sharing","link":"https://docs.google.com/presentation/d/15WTKFpZuV-fHbx6zAWT2KFpWgBOuATb8_u4b6M3YcrY/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/57","projectTitle":"PINION","problem":"WELCOME TO PINION!\r\nPinion is a new platform & community where you can easily vote and constructively engage on issues and pending legislation you care about, share your vote to social media if you like, view results, and track your leaders to see how they are representing your interests.\r\nTHE VISION – “TINDER FOR POLITICS MEETS WIKIPEDIA FOR PUBLIC OPINION”\r\nOur vision is for Pinion to be THE global democracy platform, where any significant piece of legislation can benefit from open, public engagement and intelligent discussion that fosters civic participation and political progress. Imagine a platform (website & mobile app) where you can easily find and engage on pending legislation that is being developed and voted on by your representatives. And where you can propose ideas, make comments or suggestions, and ask questions that engage your community.","action":[],"founder":"Douglas Pierce","technologies":["Web","Android","iOS","Axure","SQL Server","Figma","JavaScript","React"],"website":"www.pinionvote.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2FScott%40PinionVote.com%2FnewFile.jpeg_1588975979.352421.jpeg","contactInfo":[{"platform":"Facebook","link":"https://www.facebook.com/PinionVote"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/pinion-vote/?viewAsMember=true"},{"platform":"Twitter","link":"https://twitter.com/Pinion_Vote"}]},{"externalLink":"https://www.democracylab.org/projects/1101","projectTitle":"[D3s] Everywhere! | Deep Data Detectives Initiative ","problem":"DO NOT APPLY IF YOU DO NOT MEET OUR REQUIREMENTS. ONLY APPLICANTS WITH RESUMES ARE CONSIDERED!","action":["Deep Data Detectives is Prize Winner in the Designing for Digital Thriving Challenge hosted by @ideo @riotgames @FairPlayA @CooneyCenter @hopelab @scefdn. It consists of three pilots: D3 Adventures (Fall 2022), [D3s] Everywhere!, an AI-driven Game-Play App (Winter 2023) and D3 Queens Adventures (Sprint 2023). The goal is to activate collective action, build equity in economic opportunities and create sustainable communities with the help of Artificial Intelligence.\nWe serve 'untapped' individuals and groups (vulnerable, marginalized, underserved, underrepresented, BIPOC)","Development Stage"],"founder":"Luisa Bracamonte","technologies":["Android","React","Python","iOS"],"website":"nxtwavefounders.com/d3-adventures","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhello%40nxtwavefounders.com%2FnewFile.jpeg_1675547202.9925458.jpeg","contactInfo":[{"platform":"MEDIA","link":"https://nxtwavefounders.com/media"},{"platform":"D3 Adventures Website","link":"https://deepdatadetectives.com/"}]},{"externalLink":"https://www.democracylab.org/projects/582","projectTitle":"Democracy 3.0","problem":"Democracy 1.0 was direct democracy. It existed mainly in the ancient Athenian city-state and a few Swiss cantons. It didn’t scale.","action":["Likely you haven't heard of Democracy 3.0, though you may have come across Participatory Budgeting, which is a subset of tools in the Democracy 3.0 toolkit. In fact, these ideas are being experimented with in most every democracy around the world. Though small and modest today, we believe they represent a great hope for the future.\nWe have software projects in the works to pull together some of the best features of the dozens of existing projects in this space today. We are looking for people who can help design, build, polish and scale these tremendously exciting platforms to drive the future of democracy.\nMilestones ahead include 1) publish showcase and lessons of experiments around the world 2) launch of novel platform that brings together best-of-breed and addresses prior shortcomings and 3) pilot programs within a diverse set of environments to prove out benefits and work out kinks before expansion.","We have already gathered insights from wide-ranging fields, assembled a product roadmap, and built an MVP. The next stage is to run Pilot Programs in a variety of environments and measure the impact against a pre-defined set of objectives around community involvement, trust in decision making, and organization cohesion and cooperation."],"founder":"Forceof Good","technologies":["JavaScript","PHP","MySQL","Laravel","Figma"],"website":"www.deegov.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fforcesofgood%40protonmail.com%2FnewFile.jpeg_1605485741.5458481.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1293","projectTitle":"Unpoll","problem":"How do 1000's of people work together to figure out what ~4 question to ask the candidates in an undebate?","action":["Unpoll is a tool for leading people through a discussion process that converges to an agreement. See the working prototype\nThis is one of the tools that EnCiv a 501(c)(3) is building for productive democratic discourse online.","The current tool needs to be simplified - with the \"topic\" portion removed, just focusing on 2 questions.\r\nWe need to implement the backend algorithm the keeps track of individual groupings, and determines the democratically agreed on groupings of questions for the next round.\r\nWe need to implement rounds - where if there have been enough people in the previous round, a person is asked to go through another round - considering the highest ranked ~10% of the statements from the previous round."],"founder":"David Fridley","technologies":["React","MongoDB","Node.js"],"website":"unmob.herokuapp.com/unpoll","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdavidfridley%40enciv.org%2FnewFile.jpeg_1685570548.5781336.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/EnCiv/unpoll"},{"platform":"docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link","link":"https://docs.google.com/forms/d/e/1FAIpQLSee58BUiy12dtloG9pLITsELcNldIwXcEtCotV9r95BZJSIVA/viewform?usp=sf_link"}]},{"externalLink":"https://www.democracylab.org/projects/1286","projectTitle":"App development and project management - Social Impact focus","problem":"Under the umbrella of our main project Unify Giving (application connecting donors directly to those experiencing homelessness) we are also creating some other impactful initiatives. Drinkease is currently being designed by two UX/UI designers and we're looking for a developer to come on board and help build it. It's focused on drinking habits in the UK and hope to instill good habits for users to drink aware and reduce consumption.","action":["Drinkease will send reminders every hour of a night out to a user to remind to drink water, write notes (morning memory) and mark themselves on a scale of 1-10 of how drink they feel. People will sporadically have to take a selfie drinking water to unlock other features in the app like friend mapping (friends using the app on a night out too) and exclusive offers and discounts with partnering establishments for those who are using the app properly to keep them drinking water.","We need a dev (or a few) to come on board and work with the designers to create the application."],"founder":"Matt Bamber","technologies":[],"website":"unifygiving.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1684769335.453876.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/company/unify-giving/"}]},{"externalLink":"https://www.democracylab.org/projects/571","projectTitle":"San Diego Voter's Voice","problem":"Currently, campaign finance information for candidates running for local offices as well as money spent by outside groups to support or defeat them is not readily accessible to the public. When the amount of money being spent as well as the source is not known, voters feel disenfranchised by the election process. Making campaign finance data easy to find and read will increase public trust and confidence in the election process.","action":["Create a website that can easily communicate the campaign contributions and expenditures for each local candidate. Similar websites have been created at the national level, such as opensecrets.org, but nothing exists for the local levels.\nOur current goal is to finish the website for San Diego. After this is completed we will discuss further about making sure that every city is able to use this website for their local candidates.","We have created a majority of the site but are looking for additional volunteers to finish up the last of the issues. We are tracking the issues on the github repository located here https://github.com/opensandiego/sdvv-frontend/labels/priority_1.0. All issues labeled priority_1.0 are issues that we are trying to finish quickly."],"founder":"Tommy Stone","technologies":["JavaScript","Python","Angular"],"website":"sdvotersvoice.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1602517880.613833.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/opensandiego/sdvv-frontend/"},{"platform":"osd-slack-auto-invite.herokuapp.com/","link":"https://osd-slack-auto-invite.herokuapp.com/"},{"platform":"GitHub","link":"https://github.com/orgs/opensandiego/projects/7"}]},{"externalLink":"https://www.democracylab.org/projects/386","projectTitle":"Remote Elderly Home Care via Privacy Preserving Surveillance","problem":"COVID19 isolated at home many of us, including our elderly parents and grandparents. Not being able to check on them regularly elevates the risks that they are exposed to such as falls, gas leaks, flooding, fire and others.","action":["Ambianic.ai is an end-to-end Open Source Ambient Intelligence project that removes the stigma associated with surveillance systems by implementing privacy preserving algorithms in three critical layers:\nPeer-to-Peer Remote access\r\nLocal device AI inference and training\r\nLocal data storage\r\nAmbianic.ai observes a target environment and alerts users for events of interest. Data us only available to homeowners and their family. User data is never sent to any third party cloud servers.\nHere is a blog post that goes into the reasons why we started this project: https://blog.ambianic.ai/2020/02/05/pnp.html\nAnd here is a technical deep dive article published in WebRTCHacks. It clarifies that it is absolutely possible to build a privacy preserving surveillance system, despite popular cloud vendors making us believe that all user data belongs safely on their cloud servers: https://webrtchacks.com/private-home-surveillance-with-the-webrtc-datachannel/","Ambianic.ai has 3 main components:\nAmbianic.ai Edge: a Python application designed to run on an IoT Edge device such as a Raspberry Pi or a NUC. It attaches to video cameras and other sensors to gather input. It then runs inference pipelines using AI models that detect events of interest such as objects, people and other triggers.\r\nAmbianic.ai UI: A Progressive Web App written in Javascript using Vue.js and other front end frameworks to deliver an intuitive timeline of events to the end user.\r\nAmbianic.ai PnP: A plug-and-play framework that allows Ambianic UI and Ambianic Edge to discover each other seamlessly and communicate over secure peer-to-peer protocol using WebRTC APIs.\nWe need to work on these major areas:\nRecruit volunteers in the home care community to test the system and provide feedback\r\nSelect more models to address open use cases such as fall detection, gas leaks and others\r\nWork on implementing Federated Learning infrastructure to fine tune initial pre-trained models."],"founder":"Yana Vasileva","technologies":["JavaScript","Python"],"website":"ambianic.ai/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fyana.vasileva%40ambianic.ai%2FnewFile.jpeg_1588826587.1454613.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ambianic"},{"platform":"Quick Start Guide","link":"https://docs.ambianic.ai/users/quickstart/"}]},{"externalLink":"https://www.democracylab.org/projects/797","projectTitle":"Co-Creation Nation (CCN)","problem":"DO NOT APPLY IF YOU DON'T MEET OUR REQUIREMENTS. ONLY APPLICANTS WITH RESUMES ARE CONSIDERED.","action":["We are developing tools and technologies to support the work of under-funded founders of color, nonprofits and rural municipalities leaders who are facing economic and social barriers. Our goal is to foster vibrant economies, create local jobs and accelerate economic mobility.","At Co-Creation, we want to bring a unique experience by re-imaging civic engagement in the context of economic mobility. We advocate for unbiased algorithms and amplify data privacy in under-resourced communities to confront inequality through our proprietary \"Human Equity-Centered Design\" Approach.\nTHANK YOU FOR YOUR INTEREST IN CO-CREATION NATION."],"founder":"Luisa Bracamonte","technologies":["Salesforce","Web","JavaScript","SQL Server","MySQL","HTML","Adobe Creative Suite","Figma"],"website":"nxtwavefounders.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1627314004.1032214.jpeg","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/FoundersNxt"}]},{"externalLink":"https://www.democracylab.org/projects/446","projectTitle":"FindHello","problem":"There are many actors in the nonprofit space that help resettled refugees at varying stages of integration into American society and their new communities. It can be difficult at times for refugees to identify where to go for help, particularly as their relationship with the nine formal resettlement agencies transitions. In addition, many grassroots, faith-based and community-based organizations that offer critical support to resettled refugee families lack the opportunity to share best practices and solutions across geographies with other similar organizations that could improve the livelihoods of resettled refugees throughout the U.S.\r\n​\r\nBy increasing access to existing services from nonprofits and community-based organizations, resettled refugees will be better able to navigate the complex infrastructure of government and nonprofit services and move towards self-sufficiency after experiencing displacement.","action":["FindHello is an app that was created by USAHello with support from UNHCR to address the needs of immigrants, refugees and asylum seekers in the US.\nIt serves as a national database of immigrant resources with a user friendly map application to allow immigrants and service provides easy access to the available resources in their area.","We are seeking volunteers in engineering (Django/Python, Ionic, Angular) and data management (resource verification and research) to assist with the maintenance and improvement of the the database and application."],"founder":"Collin Stevens","technologies":["Django","Python","PostgreSQL","AngularJS"],"website":"find.usahello.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fcollin%40usahello.org%2FnewFile.jpeg_1594255949.3918538.jpeg","contactInfo":[{"platform":"find.usahello.org","link":"http://find.usahello.org/"},{"platform":"Twitter","link":"https://twitter.com/usahello_org"},{"platform":"Facebook","link":"https://www.facebook.com/USAHello.org/"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/usahello"}]},{"externalLink":"https://www.democracylab.org/projects/1252","projectTitle":"Municipal Court Warrant Recall for the Homeless","problem":"Missouri passed Senate Bill 1606, which says that h-less people will be arrested and charged with a Class C misdemeanor for camping or sleeping on state property. If local police do not enforce this law, the local government may lose funding for h-less projects, housing, counseling services, job training, and food stamps. Before 1/1/23, the police picked up h-less and moved them around to other locales. The police mostly gave up on arresting h-less because it took the police hours to process a person. Then the municipal courts would let the h-less go back to the streets. Outstanding warrants inhibit h-less from getting jobs, housing and services. Many h-less have outstanding low-level warrants.","action":["Cooperation between Outreach Workers, police and courts could streamline the housing/counseling process. Police and/or Outreach Worker could query the sheriff/courts to establish the number of outstanding warrants the h-less person had. Assurances could be made that the h-less person would not be arrested.","Since SB 1606 was passed, the police are forced to arrest h-less. They query databases of warrants. The low-level warrants could easily be recalled by courts if a system were to be installed. The judges would like it because the h-less person would be properly served and the court's case load would be reduced. The backlog of warrants would be reduced. The police would like it because the unpleasant duty of arresting h-less on state property would be reduced. It turns out that Kansas City does not have enough jail beds to accommodate all the h-less who are arraigned. The Outreach Workers would like it because it would streamline their acquisition of client identification, removal of warrant fear and placement into housing that coordinates with police and courts."],"founder":"William Kirby","technologies":[],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1684338966.7395074.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1104","projectTitle":"ALDAYA","problem":"Amplify the voices of indigenous peoples of Brazil.\r\nWe are bridging the indigenous wisdom of native peoples of Brazil with mainstream cultures in order to first create awareness of their traditions, knowledge and needs, and secondly to raise financial resources to support the preservation of their memories, traditions and territories through artistic entrepreneurship.","action":["Create a philanthropic shop with art made by indigenous peoples as a means to tell their stories, create personal relationships with native peoples. bring awareness to who they are as peoples, as culture, as sovereign communities.","Sell indigenous arts, share a blog with stories about the indigenous peoples of Brazil, and create a channel for donations for projects that support economic autonomy through art in indigenous communities."],"founder":"Marina Szarfarc","technologies":[],"website":"www.aldaya.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmarina%40aldaya.org%2FnewFile.jpeg_1670887722.2455997.jpeg","contactInfo":[{"platform":"Instagram","link":"https://www.instagram.com/al.daya/"},{"platform":"Facebook","link":"https://www.facebook.com/aldaya.org/"}]},{"externalLink":"https://www.democracylab.org/projects/908","projectTitle":"SEEDS Regenerative Shopping Assistant","problem":"Thank you for what you are doing ♥\r\n######################################\r\nNOTE: This is a DAO (a decentralized autonomous organization) where you are encouraged to be proactive and approach team members independently. Below is our collaboration platform where you are very welcome.:\r\nhttps://www.notion.so/seeds-explorers/Co-creating-a-Regenerative-World-1a80dc8b81a84fae956979bdae7a0480","action":["The product will be a service empowering the RDGs (Regenerative Development Goals) with two main functions, connected to the blockchain with a reputation score system. A web browser extension that shows the consumer the ecological footprint of the manufacturer when shopping online, so that the consumer can make a conscious decision when buying. The manufacturer will have detailed information about their ecological scoring from the public databases, which will help them evaluate and optimize their manufacturing processes.\nCustomer side:\r\nA web browser extension that shows the user the ecological footprint of the manufacturer when shopping online, so that the user can make a conscious decision when buying. The Users get rewarded with Seeds when they install the shopping assistant extension and every time they purchase a sustainable or regenerative product.","Manufacturer side:\nThe manufacturer will have detailed information about their ecological scoring from the public databases, which will help them evaluate and optimize their manufacturing processes. Subsequently, they will have the opportunity to join the SEEDS RDG ranking and support regenerative campaigns proposed by the SEEDS community in the blockchain to move up in the RDG ranking.\r\nThe data concerning manufacturers' sustainability or regeneration reputation is pulled from various public databases via API (e.g. the SDG database from the United Nations) and can be life updated by the SEEDS citizen around the world.\nEach role is needed multiple times for the other features and products of the larger product family ♥\nHigh-Level needs:\n\nBack-end and Front-Development\nData analysts\nAI and Big Data\nMarketing\nCreate a repository and connect to open public databases\nDevelop the minimum viable web browser extension\nDeliver a MVP\nReceive Gratitude ♥\n"],"founder":"Nadim Hamdan","technologies":[],"website":"www.joinseeds.earth","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsupnad2002%40gmail.com%2FnewFile.jpeg_1642196092.101539.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/JoinSEEDS/"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1zkg3Q36X6EJS2Ev7aoDcMXLSY8Mq85yU?usp=sharing"},{"platform":"discord.gg/F33FnF2eB7","link":"https://discord.gg/F33FnF2eB7"},{"platform":"www.notion.so/seeds-explorers/Co-creating-a-Regenerative-World-1a80dc8b81a84fae956979bdae7a0480","link":"https://www.notion.so/seeds-explorers/Co-creating-a-Regenerative-World-1a80dc8b81a84fae956979bdae7a0480"},{"platform":"Facebook","link":"https://www.facebook.com/joinseeds/"},{"platform":"Product Requierment Document","link":"https://docs.google.com/document/d/16_jyOZaPmJ0JLzmMbHZGaJa5-taitFMPeMpShAZ32WI/edit#"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/14755835"},{"platform":"Figma","link":"https://figma.com/proto/5H2fq6UfQGUhQrzP6XcMFY/SEEDS?node-id=10%3A47&scaling=scale-down&page-id=0%3A1&starting-point-node-id=4%3A11"},{"platform":"Twitter","link":"https://mobile.twitter.com/SEEDSeconomy"}]},{"externalLink":"https://www.democracylab.org/projects/388","projectTitle":"MediLinkUp: eHealth in Africa ","problem":"The poor health information system has been identified as a major challenge in the health-care system in many developing countries across Africa.","action":["Electronic medical records (EMRs) or electronic health records (EHR) have been shown as an important tool to improve access to patient information and vital in ensuring improved patient care. However, this tool has not been widely implemented/adopted across Africa yet.\n“Build an Intelligence artificial method to learn from the data, to analyze and to detect COVID-19 symptoms and diagnose patients. The learned model allows us to classify COVID-19 cases.”\nEnd-user: A simple, user-friendly, and cost-effective software to assist African medical and healthcare professionals to manage disease cases, analyze data, and to provide quality patient care across Africa.","We plan to:\nBuild a website to collect populate medical data, symptoms of patients who stayed in critical care units, search data, cases, deaths, demographics, clinical measurement, intervention, billing, medical history dictionary, pharmacotherapy, clinical laboratory test and geospatial data views for all regions.\nCreate a large data lake epidemiology data and identify\nManage the database, making it usable to other researchers while taking care of privacy concerns.\nBuild an IA method to learn from the data and detect early some symptoms and help to detect, prevent, and care.\nEvaluate IA method"],"founder":"Dr. GARBA Moussa","technologies":["Python","MongoDB","Flask"],"website":"sites.google.com/view/medilinkup/home","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmoussagarba2000%40yahoo.fr%2FnewFile.jpeg_1588925816.2313948.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/garbamoussa/MediLinkUp"}]},{"externalLink":"https://www.democracylab.org/projects/112","projectTitle":"Town hall project","problem":"We are increasing lawmaker accessibility, as part of that we ask every person running for office to take a pledge to hold at least 4 town halls a year","action":[],"founder":"Megan Riel-Mehan","technologies":["JavaScript","React"],"website":"Townhallproject.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FTHP_logo_horizontal_simple.png_1552882893.6652284.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/townhallproject"},{"platform":"blog post on package publishing","link":"http://www.meganrielmehan.com/methods-and-notes/publishing-a-connected-react-redux-app-as-installable-component"},{"platform":"npm submission form","link":"https://www.npmjs.com/package/thp-submission"},{"platform":"design doc","link":"https://projects.invisionapp.com/share/XRUZ88SH4ET#/screens/310378227_Home_Screen_nav_search"},{"platform":"nav update","link":"https://docs.google.com/presentation/d/1WHJUzdaSoEF7fvCHVfZg06zKiweXxoNQXJKDa0rM080/edit?usp=sharing"},{"platform":"current embedded submission form","link":"https://townhallproject.com/#submit"},{"platform":"internal submission form","link":"https://townhallsubmission.herokuapp.com/"}]},{"externalLink":"https://www.democracylab.org/projects/7","projectTitle":"Northwest Health Career Path - Diversity in Health Sciences","problem":"The current healthcare system faces a large underrepresentation of health professionals who are from and represent the communities they serve. There are a vast number of outreach programs throughout the Washington, Wyoming, Alaska, Montana and Idaho (WWAMI) region striving to bring minorities who are underrepresented in the health care fields toward college level training in the health sciences. However, although it has been shown that outreach programs are most successful when they work together to form a “pipeline”, there are not at this point any systematic efforts being done to encourage these programs to work together and take a more coordinated approach.","action":["Are you someone who has a passion for making a difference? Please join us in our goal of making our healthcare system more equitable by bringing rural and underrepresented students into the healthcare professions. Our project is twofold. We are conducting an environmental scan to gather comprehensive data on local and regional outreach programs, camps and organizations that support underrepresented students. As this data is gathered, we are making this information available to students through an easily navigable website map. We would love your help in this work!","We hope to collect and distribute the data that will help these programs gain a clearer view of what is happening in their area, identify gaps in programming and find ways to bridge those gaps. We also plan to create opportunities for programs to come together and share their knowledge on how to remove the barriers that underrepresented students face in moving forward with their dreams. Our project will work to map the current landscape of where, how, and at what levels health sciences outreach projects are functioning in both Seattle and the WWAMI region. We will then translate this information onto a user-friendly website platform that can be easily accessed by students, volunteers, advisors, and program administrators. We are currently nearing the end of the design phase and are transitioning into the development phase. We are looking specifically for developers with experience with Docker."],"founder":"Tyrah (She/Her/Hers) Gullette","technologies":["JavaScript","React","Web","MongoDB","Go","Node.js"],"website":"nwhealthcareerpath.uw.edu","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1582783803.3724551.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/wwami-pipeline"},{"platform":"Technical Documentation (as of July 2018)","link":"https://docs.google.com/document/d/140ZTh7l4hvfdnejuhj0XpEgm9t85DOmm8QygACUBQao/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1249","projectTitle":"Early Release Calculator","problem":"In 2018, legislation was passed granting several concessions to incarcerated individuals, the most interesting of which was time off for participation in qualifying non-recidivism activities. Largely the Bureau of Prisons has stonewalled. We don't understand. This is too complicated. We don't have the systems to track this new information. We don't have the people to implement these new processes. We don't know what you mean by this. We don't know what you mean by that. Let's talk about this. Let's have review periods. Let's refine this. Let's hear from more people. We're worried about how this could be taken the wrong way. Etc.","action":["The First Step Act is easily 25,000 words over 60+ pages depending on formatting. There are 40 amendments. There are dozens of parts, chapters, sub paragraphs, roman numerals and plenty of other linguistic officiousness. But at the very very core of the bill is an algorithm that can be implemented in one function with one loop that produces one number--an early release date. That's an app. It should be an app that is in the hands of every person behind bars, their friends and family, parole officers, lawyers, law firms, judges, and all the other parties that work in and around the courtroom. We have the prototype. It works. The original legislators have been made aware of this. We have applied to several institutes for funding. We just need to take the mvp to version 2.0.","If a hybrid mobile programmer that code the Android and IOS launchers that essentially lead to the lowest common denominator of apps you can download in both app stores--html, css, and other code supported by mainstream browsers could produce the next version of this we would have something real we could really put in the real hands of the people we're really talking to about making this Calculator ubiquitous. We want it everywhere. Are you that mobile programmer who can make a gigantic difference in thousands of real lives?"],"founder":"Don Sutton","technologies":[],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Flivefor10%40yahoo.com%2FnewFile.jpeg_1683744549.4223177.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/77","projectTitle":"Ready Set Vote","problem":"How It Works\r\nWhen you go to the site you can pull up a copy of your ballot by entering your address. Then you select the organizations you trust to see their recommendations. As you go through each race, one by one, you weigh those recommendations. When you've made a decision you mark your pick. At the end, you have a personalized ballot cheat sheet you can use to help you fill out your ballot. And if you'd like, you can share that cheat sheet with others.","action":[],"founder":"Joseph Peha","technologies":["JavaScript","React","Express","MongoDB","TypeScript","Node.js"],"website":"readysetvote.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdarryl.banks%40gmail.com%2FReady-Set-Vote---highRes.png_1557617077.9890902.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/ReadySetVote"},{"platform":"Google Drive","link":"https://drive.google.com/open?id=1ObApLz2WMISnV-To0Ypb91ZAGj-XBye8"},{"platform":"Slack","link":"https://readysetvote2.slack.com/"},{"platform":"app.zenhub.com/workspaces/main-workspace-5d62002a05bd430001e75182/board?repos=176017615","link":"https://app.zenhub.com/workspaces/main-workspace-5d62002a05bd430001e75182/board?repos=176017615"},{"platform":"Trello Board - User Stories","link":"https://trello.com/b/afEMhseE/ready-set-vote-2018-user-stories,"},{"platform":"Hackathon Demo","link":"http://silken-champion-253618.appspot.com/"},{"platform":"Animated GIF Overview","link":"https://drive.google.com/file/d/1O0IE27QVSokF-5Ynw2oSFiV4zJMT3m2p/view?usp=sharing"},{"platform":"Geekwire Article on Ready Set Vote","link":"https://www.geekwire.com/2016/site-helps-voters-navigate-complex-ballot-creating-election-cheat-help-endorsements/"}]},{"externalLink":"https://www.democracylab.org/projects/771","projectTitle":"WiseCourage Project (formerly WinWisely and GetCourageNow)","problem":"Elections count. But history repeatedly shows that they are absolutely insufficient without the presence of a robust growing nonviolent civil resistance (NVR) movement. Eg. With a big Dem. Party majority & FDR, it still took the threat of a General Strike to pass the New Deal, & much NVR in the 60s to pass the Civil Rights and Voting rights laws. Yet NVR in the US is almost non-existent, despite our being on the verge of a fascist coup which again history has proven can best be prevented by a powerful NVR movement. Therefore,the problem is how can we use tech to finally be able to catalyze MORAL COURAGE at scale: to embolden & recruit the massive numbers of courageous resisters needed to eg to shut down cities, states,Wall Street, etc. to force passage of strong voter rights protection laws, make the rich pay their fair share, shut down fossil fuel industry, prevent nuclear war etc. How can we transform 7-9M liberals into 7-9M courageous activists--resistors & resistor supporters?","action":["We have our first tool ready to test now. For best understanding, see our one pager at bit.ly/gcn-1p with links to 1) foundational research proving that mass nonviolent civil resistance is best proven strategy to prevent fascist coups, & overthrow them; 2) our 3 minute animation & 10 min video demo demonstrating how our software would work, 3) reviews from top organizers, and 4) our FAQ. Our solution is to provide free tools, one for orientation meetings, & one integrated\"Take Action\" tab of any nonviolent civil resistance strategy-based campaign. Both tools are \"ladders of courage building engagement,\" combining for the first time ever 3 proven action motivators, able to essentially catalyze or unleash MORAL COURAGE at scale--and thereby recruit the massive numbers of courageous volunteers & their supporters that electoral as well as nonviolent resistance campaigns today urgently need to have a realistic chance to win, to save democracy & the planet in the little time we have left.","Cofounder openings: (can be virtual)\n\n(Co-Director title): help find nonviolent resistance campaigns eager to beta test our tools (one is already ready to test); &find social media cofounder for crowdfunding; $5000 available to the first campaign we choose\nExper'd UX researcher &/or designer\nLine up (when minimal funding arrives), halftime sr. level GO or Node.JS programmer willing to finish either of two 2/3 finished efforts begun by two prior top notch engineers, one in Node JS, other in GO w/ much security\nAn exp'd Project Mgr.\nAlternatively, programmer capable of rapidly prototyping a testable MVP beta (for the Take Action Tab use described in our demo) &\na compatible frontend developer.\r\nNOTE: $14k Funding is available (in escrow) from a foundation and a few donors upon achieving a testable beta.\n\nThe project lead, Gary Krane, PhD, is the fulltime volunteer fundraiser with a half time research/outreach co director to assist him."],"founder":"Gary Krane PhD","technologies":["Python","Go","SQL","Node.js","Django","PHP","Wordpress","Ruby on Rails","MySQL","HTML","JavaScript","Flutter","Salesforce"],"website":"GetCourageNow.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fgary%40getcouragenow.org%2FnewFile.jpeg_1641877270.8591619.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/amplify-edge"},{"platform":"GitHub","link":"http://github.com/"},{"platform":"Telegram.com","link":"http://telegram.com/"},{"platform":"ASANA.com","link":"http://asana.com/"},{"platform":"Twitter","link":"http://twitter.com/GetCourageNow"},{"platform":"Facebook","link":"http://facebook.com/GetCourageNow"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/garyk1/"},{"platform":"Project Coordinator/Cofunder's resume","link":"http://bit.ly/GaryKraneResume"},{"platform":"GetCourageNow one pager with demo links","link":"https://docs.google.com/document/d/1SwS86WxJJVX8XKAVUHV1ozvvgo2bkMt3960N6TAu1VM/edit"},{"platform":"GetCourageNow FAQ","link":"https://docs.google.com/document/d/1G2M4WUzw9e34BoxNue6wuhi91BwvpglUnjdzOE_iZxw/edit"}]},{"externalLink":"https://www.democracylab.org/projects/911","projectTitle":"FediPress","problem":null,"action":["\nWordpress runs approximatively the 43,1% of the entire web (2021 statistics)\nActivityPub is a W3C standard able to inter-connect (federate) servers through a pretty easy to implement protocol (Fediverse)\n\nThe idea is to create a plugin which enables direct relationships between WordPress websites (inbox/outbox). This will allow admins to automatise collaborations with other projects and users to find related projects, news, events, places... jumping directly from one website to another.\r\nThe plugin will be easily installable through the WordPress market for free with zero technical knowledge and will potentially reduce the need of 3rd parties centralised or decentralised services (DLT). It will also allow to schedule posts on most common social networks (Telegram, Fb, Tw...) and push the adoption of federated ones (Mastodon, Mobilizon, Pixelfed...).","\nClarify which kind of relationships websites could establish and which ones can makes sense to automatise\nDesign the UI/UX of the plugin dashboard\nDevelop the plugin to include different use cases\n"],"founder":"Francesco OpenForFuture","technologies":["PHP","Wordpress"],"website":"openforfuture.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Ffra%40openforfuture.org%2FnewFile.jpeg_1642246264.1617525.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/695","projectTitle":"Tech2Live","problem":"DID YOU KNOW?\r\nIn the United States, more than 10 million adults experience domestic violence annually.\r\nThe two most pressing concerns for survivors of abuse are the need for safe housing and the need for economic resources to maintain safety.\r\nDomestic violence survivors encounter many problems that affect their finances and their housing. Many survivors struggle to find steady employment if they are a victim of violence at home or stalking and harassment at their workplace. Without steady employment, it can be difficult for survivors to obtain the funds needed to exit the situation. Additionally, they may have poor credit or rental history which would directly affect their search for housing. If they do have housing, survivors can lose access to subsidized or affordable housing if the abuser is committing certain policy violations. Landlords can also evict victims due to repeated calls to the police or damage to the property caused by the abuser.","action":["Tech2Live is using technology to create a secure portal that will connect organizations with survivors to provide them with their essential needs, such as housing, finances, exit planning, evidence planning, and counseling. Through this portal, organizations can allow coordinators and advocates to control funds, issue virtual & physical cards, generate reports, and more. This resource aims to equip survivors with crucial benefits that are needed to survive and will focus on housing and allocating economic resources, which are two of the most pressing issues for survivors of domestic violence. Using technology, we can connect survivors to organizations to help provide essential resources.","Design and develop a portal to connect domestic violence survivors with organizations and resources. Utilizing research on domestic violence and through information provided by other organizations, we will work to validate the problem statement. The research will continue to be conducted to understand the problem and its feasibility by working directly with organizations and survivors to determine their most critical needs. Once we determine these core features, we will create an MVP based on the research and conduct testing on the prototype. We will interact directly with survivors and organizations to receive their feedback and further iterate the product. We will revise and continue to work on the product until it is ready for production. In the production stage, we will implement and validate the product. It is crucial that survivors and organizations are working closely with the team to ensure the product will be beneficial to those who need it."],"founder":"⚫ Emre Caglar","technologies":[],"website":"tech2live.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Femrecaglar%40gmail.com%2FnewFile.jpeg_1670473287.2030842.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ecaglar/DemocracyLab-SoS"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1801VEC3gQsINcL8rsCJwjQulmnxxG_Af?usp=sharing"},{"platform":"Slack","link":"http://tech2live.slack.com/"},{"platform":"Trello","link":"https://trello.com/democracylabsos/home"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/tech2live/"}]},{"externalLink":"https://www.democracylab.org/projects/1036","projectTitle":"Stonewall Directory","problem":"Partially Designed Web App Needs to be Launched!","action":["The 2022 Midterms are around the corner, and we need to launch a beta MVP as soon as possible. After the election, we can expand the product.\nThe alpha version of this product will have:\r\n-A secure back end database with accounts for representatives of each grassroots organization which they can use to update their org's profile in the directory.\r\n-A modern front end that is a public-facing, searchable directory of participating organizations.\r\n-Is scalable to include more organizations and more features as the product grows.","We have:\r\n-A partial design in the form of mid-fidelity, annotated wireframes for the mobile view of the app (link to clickable demo attached)\r\n-A Google Sheets database of organizations\r\n-Excellent user and market research documentation\r\n-A great cause!\nWe need:\r\n-Designers who can bring the design aspects of this project across the line, using the mid-fidelity wireframes as a jumping off point\r\n-Engineers who can build (or get good practice building) a secure backend with multiple authenticated users of the same user type (not including site admin, which is a separate user type)\r\n-Engineers who can tie the back end database with an easily usable front end leveraging the work of the project's designers\r\n-A finished solution that works just as well on mobile as it does on desktop"],"founder":"Ryan Basham","technologies":[],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fpolitics%40ryanbasham.com%2FnewFile.jpeg_1659483910.3189657.jpeg","contactInfo":[{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1ci00zm4gpyqORYP2j_HNjMhh5GtWC6BA?usp=sharing"},{"platform":"Twitter","link":"https://twitter.com/ryanbasham"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/ryanbasham/"},{"platform":"Clickable Mobile Demo (InVision)","link":"https://invis.io/RD12XAPLTYBX"},{"platform":"Instagram","link":"https://www.instagram.com/ryanbasham/"}]},{"externalLink":"https://www.democracylab.org/projects/1228","projectTitle":"ConsensUS","problem":"Low civic engagement among youth spreads polarization and misinformation crippling national politics. Many young adults want to get involved but lack the information, support, and explicit opportunities. Only half of youth say they are “as well-informed as most people”and only 40% say they feel well-qualified to participate in politics. This speaks to a lack of systemic, developmental support for youth to develop as voters and civic actors and find their voice within democracy.","action":["A web-based and sociable mobile application that provides a simple, intuitive platform to track the United States legislative agenda and activities of elected officials. The aim is to deliver the information in an interactive and visually-engaging manner to encourage users to make a daily habit out of tracking the political agenda. The app will keep a profile for each officer and detailed graphic results of their voting history which users will be able to apply many filters on such as year, topic or domestic / foreign. A polling section will present wedge-issues, current bills and their sponsors in Bumble-like profile cards allowing users to swipe and indicate their support. Users will be able to view whether they are a “match” with their representative on the issue item and contact them.","Create a regularly updated database of congressional votes such as from ProPublica API, create a hybrid application with a swipe function, design of representatives profiles"],"founder":"Şahika Aydınol","technologies":[],"website":null,"image":"","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/in/sahika-aydinol/"}]},{"externalLink":"https://www.democracylab.org/projects/1189","projectTitle":"Positive Psychology Mobile App","problem":"Our mental wellness app project aims to empower individuals to take control of their well-being through enhanced features and a user-friendly interface. Our goal is to reach a wider audience and create a safe and inclusive space for promoting mental health. We offer evidence-based tools, techniques, and strategies to help users build resilience, cope with stress, and foster positive habits. Our team is committed to creating a reliable and research-based app that is continuously updated to meet the needs of our users.","action":["A mobile app that includes meditation, journaling, gratitude logging, and affirmations can offer a comprehensive and personalized toolset for promoting positive psychology and mental wellness. By providing access to these techniques on-the-go, users can easily incorporate them into their daily routines, leading to increased engagement and adherence to positive habits. The app can also provide valuable insights and feedback, ultimately leading to improved well-being.","-Conduct an analysis of the current app\r\n-Develop comprehensive layouts and wireframes for the updated app, incorporating new features\r\n-Continuously iterate on designs to ensure optimal user experience\r\n-Create icons and other necessary assets to enhance visual appeal\r\n-Implement effective marketing strategies to promote the app\r\n-Provide development assistance to ensure smooth execution of the project"],"founder":"Jamie Maertens","technologies":["Android","iOS","Figma"],"website":"play.google.com/store/apps/details?id=com.wowsery.freehappiness","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjamiemaertens%40gmail.com%2FnewFile.jpeg_1678072367.4304838.jpeg","contactInfo":[{"platform":"Figma","link":"https://www.figma.com/proto/s7qf6CBRR64ryyKRUxpaiP/FreeHappinessPrototype?scaling=contain&page-id=0%3A1&starting-point-node-id=101%3A15&show-proto-sidebar=1&node-id=101%3A15"}]},{"externalLink":"https://www.democracylab.org/projects/upper-valley","projectTitle":"Code for Upper Valley <> ValleyNet","problem":"Access to high-speed internet is often difficult in rural areas, which presents a great challenge for many employees, students, and business owners. This project aims to evaluate and improve broadband access in rural communities by creating an internet connection speed testing app that organizations can use to enhance their services.","action":["Our app will help bring awareness of internet access speeds on an individual and local level and provide usable data for organizations to use in their work to make improvements."],"founder":"Jennifer Lynn","technologies":["JavaScript","MongoDB","Tailwind","Svelte"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1659128316.0123677.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/codeforUV/ruralnetv2"},{"platform":"Slack","link":"https://join.slack.com/t/codeforuv/shared_invite/zt-1crei0qiu-~obipysspQiZFuCgbbfU~Q"},{"platform":"www.notion.so/codeforuv/Project-Board-Impact-Sprint-4d93a45a1772440e84476b5d7995d68e","link":"https://www.notion.so/codeforuv/Project-Board-Impact-Sprint-4d93a45a1772440e84476b5d7995d68e"},{"platform":"How the App Works","link":"https://www.notion.so/codeforuv/How-the-App-Works-a5f8e3f463694428af8529a6175e3231"}]},{"externalLink":"https://www.democracylab.org/projects/1100","projectTitle":"CiviCue","problem":"Since the dawn of internet, digitalization has resulted in social networks eroding the advertising revenue of original content providers, causing media operators to lose their independence and become a propaganda tool for the powerful, driving societal and political polarization.","action":["\nTo eliminate single point of failure, blockchain technology enables transparent ballot record and establishes public trust\nTo avoid double voting, anonymized voter authentication verifies voter eligibility\nTo address extreme polarization resulting from plurality voting, ranked voting and quadratic voting are introduced to help voter measure intensity of preference.\nTo fight disinformation in post-truth era, gamified quizzes reduce information asymmetry and help voters develop critical thinking capability.\n","Seek sponsorship to execute a referendum in Taiwan on topics of sovereignty and public issues."],"founder":"Nick Chang","technologies":["JavaScript","Android","React","iOS","Express","MongoDB","Node.js"],"website":"civicue.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fnick.h.chang%40gmail.com%2FnewFile.jpeg_1669947891.716244.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/CiviCuexG0V"},{"platform":"Facebook","link":"http://www.facebook.com/civicue"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/civicue/"},{"platform":"YouTube","link":"https://www.youtube.com/watch?v=2uP0T_6Pb1Y"}]},{"externalLink":"https://www.democracylab.org/projects/1233","projectTitle":"For Future","problem":"People are increasingly aware of various existential risks facing humanity, such as pandemics, climate change, bioengineering and advanced AI. Despite this growing consciousness, many feel unable to meaningfully address these threats, as their efforts are often limited to volunteering, donating, and lifestyle changes.","action":["For Future helps people contribute their talent/money/time to solving humanity’s existential risks by connecting them with ventures and individuals working on these issues. It’s like a LinkedIn for your social impact life.\nCurrently, we are an online classifieds/Craigslist for existential risk ventures to post their resourcing needs. In the future, we will be supporting ventures and contributors more directly with services such as crowdfunding, marketing and due diligence","We’ve just released our website to the public and now looking to validate what we’ve built, gain traction and fundraise."],"founder":"Ruby Tang","technologies":["React","Python","Node.js","Firebase"],"website":"forfuture.ventures/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fruby%40forfuture.ventures%2FnewFile.jpeg_1680845823.9785278.jpeg","contactInfo":[{"platform":"nebulous-exception-8ec.notion.site/44869b028e774c73b2f9ccff9d27b4ac?v=7f716234a9414bb5b31a0bd4f83f1adb","link":"https://nebulous-exception-8ec.notion.site/44869b028e774c73b2f9ccff9d27b4ac?v=7f716234a9414bb5b31a0bd4f83f1adb"},{"platform":"Instagram","link":"https://www.instagram.com/forfuture.ventures/"}]},{"externalLink":"https://www.democracylab.org/projects/1242","projectTitle":"Sigma","problem":"Access to basic medical services and reliable medical information is a challenge faced by many people worldwide. This lack of access leads to misconceptions about diseases, healthy habits, and diets. The problem is most prevalent in underdeveloped countries where reliable sources of information are scarce. The issue arises due to a lack of understanding of the information by those who provide it. Being misinformed can lead to confusion, waste of resources, and in some cases, even death. Addressing this problem would significantly improve people's lives by providing them with accurate information and easier access to medical services.","action":["Sigma is a comprehensive health web application that simplifies access to essential medical services and resources right at your fingertips. With Sigma, users can easily locate nearby hospitals, access crucial medical information while filtering out medical misinformation, and find helpful learning resources without leaving the comfort of their devices. It's your one-stop-shop for all your healthcare needs!","Our solution addresses this problem of misinformation in the world of medicine by addressing the problem of misinformation in medicine by providing users with access to reliable and accurate medical information while filtering out medical misinformation. It also offers helpful learning resources to keep users informed and up-to-date with the latest medical information. By giving it’s users easy access to nearby hospitals and medical services as well, Sigma can help users receive prompt and appropriate medical attention, which can prevent them from relying on unverified information and potentially harmful self-treatment."],"founder":"Tobi TheRevolutionary","technologies":["JavaScript","Django","Python","HTML"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1681939391.9875464.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Tobitheprof/sigma"}]},{"externalLink":"https://www.democracylab.org/projects/1186","projectTitle":"Mental Wellness Non-Profit","problem":"Mental health is 24/7 and it is not always possible to get support when we need it","action":["We are a team of a dozen designers building a free app to empower everyone to manage their mental health, via free peer support groups, chats, and mental health resources at anytime. We are looking for help to build the app in flutterflow.io.","This is a volunteer remote position. You can donate as much or as little time as you'd like, even a few hours would help. We are looking for developers who can help us build the app on flutterflow.io, and bring full-stack and front-end experience to help us further grow the product beyond flutterflow's framework."],"founder":"Grace Shen","technologies":["Android","Web","iOS","Figma","Firebase","Flutter"],"website":null,"image":"","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/99","projectTitle":"Public Sphere Project ~~ Migration & Redesign","problem":"The simplest version is that we are migrating from Drupal 6 to Drupal 8. This could mean somewhat of a major redesign, especially if we want to support a pattern repository that helps store and manage pattern language information from our site as well as others.","action":[],"founder":"Douglas Schuler","technologies":["Drupal"],"website":"www.publicsphereproject.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdouglas%40publicsphereproject.org%2F066.media-diversity.Bouquiniste_Paris.jpg_1546288639.5239024.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1095","projectTitle":"International Neighbors Donation System","problem":"International Neighbors — a 501(c)(3) volunteer organization — equips refugee families with the essential living necessities and network opportunities to thrive in Charlottesville, VA. Part of this effort is finding and securing furniture that is being donated in the local area. While International Neighbors' network of volunteers are skilled at finding the furniture they need (primarily on social media), there has not been a standardized intake process for the donations — nor has there been a central repository for all of the donated furniture, or a way for families to claim the items they need. Significant time is spent fielding emails and communicating around the procurement and selection of the furniture. International Neighbors does not warehouse or ship any furniture, so an items must either be ready for delivery when a family's need arises, or the donor is willing to hold onto the piece of furniture until the need arises. All delivery must be handled by the donor.","action":["Code for Charlottesville — a volunteer \"brigade\" of Code for America — seeks to establish a more modernized process by which donors can list their furniture as available to be claimed by families who need them. Primarily this involves streamlining the way donations are listed and later claimed, and introducing more self-service features to increase capacity and standardize communication. The 3 types of stakeholders we have identified are the families who need the donations, the donors listing the donations, and the International Neighbors volunteer staff who are helping coordinate. To ensure that the project is sustainable and easy to integrate into the existing donations process, we believe that a low or no-code option is a sensible approach. To start, we will begin by looking at ways in which we can standardize the listing and claiming process for donations. Once the basic needs are met, we can look at more robust self-service and automation features.","Code for Charlottesville will need to engage with a team of volunteers who are willing to think critically about how to solve this problem. Volunteers with experience in web design, web development, UX design, research, and content strategy would be particularly helpful for this project. Once a team of volunteers has been established, we will work together to identify the appropriate platform to facilitate the intake and display of donated item listings, including the process by which families will claim donated items. While this solution will require digital tools, we will be focusing on creating a system that complements existing workflows, which may be manual. Once we roadmap a technical approach, our group will work with International Neighbors to implement and test the new system, making adjustments as necessary. We will create documentation to ensure that International Neighbors are comfortable managing the system themselves, with a goal of minimal long-term support requirements."],"founder":"Jesse Michel","technologies":["Web"],"website":"www.codeforcville.org/about-us","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjessemicheldesign%40gmail.com%2FnewFile.jpeg_1667962657.1776075.jpeg","contactInfo":[{"platform":"Slack","link":"https://codeforcville.slack.com/"},{"platform":"Full Description","link":"https://docs.google.com/document/d/1AZmeh7Ec8oHhtxnigu4YwsvmkOy9GX_2UJBXswkKYEo/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/534","projectTitle":"Civic Tech Index","problem":"What is The Civic Tech Index? Simply put, it’s a movement to index every useful Civic Tech Open Source project.","action":["So how is this different? We now have a path that :\nOnly takes 1 min or less per project to join the index\nRequires no coding skill\nAnd the index is owned by all who contribute to it","Welcome! Our goal of the project is to create a comprehensive, searchable index of all civic tech open source software projects around the world. We have created the framework and an interest list. We are currently working on building out the website and other marketing tools that demonstrate the power of the index.\nThe Civic Tech Index project is looking for volunteers, specifically developers familiar with React, to help us get to our MVP and beyond.\nContact us through Hack for LA (https://www.hackforla.org/projects/civic-tech-index), we're looking forward to hearing from you!"],"founder":"Olivia Chiong","technologies":["Django","React","PostgreSQL","Figma"],"website":"civictechindex.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fcivictechindex%40hackforla.org%2FnewFile.jpeg_1610518861.8822834.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/civictechindex"},{"platform":"Slack","link":"http://hackforla.slack.com/"},{"platform":"Figma","link":"https://www.figma.com/file/EFoSuj1b9G4aZ7bN8OX8tf/CivicTechIndex---Master-Design-File---3.8.20?node-id=0%3A1"}]},{"externalLink":"https://www.democracylab.org/projects/383","projectTitle":"Inclusive Intake Data Sharing","problem":"Each homeless service provider maintains their own client data for reporting purposes. Individuals experiencing homelessness, are therefore asked the same questions by each service provider they approach for help. Introducing themsleves repeatedly is not just a cold, unfriendly experience; some of the questions are deeply personal and hard to discuss, making the repetition painful.","action":["Most service providers are aware of the duplicate data entry problem, but do not believe a solution exists. However, in a year of consulting, I have yet to talk to an organization that did not get excited about a common data entry solution that i) is easy to use and navigate, ii) could be customized to focus on data fields important their organization, and iii) could, if necessary, transfer information to their current databases.\nIt is my hypothesis that building this solution for service providers will spark adoption. As adoption grows, more individuals will be entered into the system. As more individuals are entered into the system, it becomes more likely that service providers will save time by adopting the shared solution. And, as adoption grows, more data is collected to generate meaningful analysis and drive improved outcomes.","We need to continue to test the hypothesis that this solution will be quickly adopted by service providers. We are beginning to design and build a prototype as proof of concept for several of our non-profit partners. We will expand the conversations to a couple dozen close partners of the initial set, to test the hypothesis that increased adoption will increase the velocity of adoption."],"founder":"Richard Neely","technologies":["Amazon DynamoDB","Figma","Balsamiq"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Frwneely%40gmail.com%2FnewFile.jpeg_1588459359.5423284.jpeg","contactInfo":[{"platform":"Pitch Deck","link":"https://docs.google.com/presentation/d/1r5RECAWQzQ0EaN72ipx4SOrnosG8EzIBTuH7Ia6nzEE/edit#slide=id.g352296ac43_0_1471"}]},{"externalLink":"https://www.democracylab.org/projects/1155","projectTitle":"Velera Foundation","problem":"The main issue with the internet is Centralization. Centralization is the concentration of power and control to a limited central entity and it creates three major worldwide issues that threaten the stability of the world.","action":["Velera Foundation aims to create the first end to end decentralized internet that can create unity between people, machines and the virtual world without any of the negative affects of centralization. We rebuild over nine layers of the internet stack to enable any cyber process to be completed without relying on any centralized infrastructure. Our solution is broken up into three main components Connectivity, Data and Intelligence. Velera’s technology will serve as the nervous system controlling the physical world and creating cyber systems. The three components work to ensure unity and interoperability while providing a process for data driven operations to be completed in a secure, decentralized and scalable manner. The technologies we utilize range from Internet of Things to Blockchain to AI with innovations in each field. Our technology will be available worldwide with plans to enable Smart Cities, Industry 4.0 and provide infrastructure to developing countries.","We have spent three years conducting research and development in all layers of the internet. Our high level architecture has been validated by a team of PhD researchers and has been invited to submit an NSF proposal to the American Seed Fund.\r\nTechnologies involved include:\nRouter hardware, PCB boards, Meshnet Routing, Layered Encryption, Cryptography, Internet Protocols, DRAID, Blockchain, Direct Acyclic Graphs, AI and Semantic Technology."],"founder":"Micah Nkrumah Ardayfio","technologies":[],"website":"velera.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmicah%40velera.io%2FnewFile.jpeg_1674329697.441431.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/company/velera-foundation"}]},{"externalLink":"https://www.democracylab.org/projects/147","projectTitle":"Business to Government Market Efficiency ","problem":"The bidding process for contracts is antiquated, fragmented, imprecise, and unwieldy. Because of this, governments collect fewer bids which translates to higher costs to the public. This has led to information asymmetry among businesses competing for government contracts, which has led to certain firms winning disproportionate share of awards. Because of this, many State and local agencies lack diversity in their procurement. The effect has been well documented, and many agencies are actively seeking solutions to address this discrepancy.","action":[],"founder":"Jon Cochran","technologies":["MySQL","Python","R","SQL Server","Wordpress"],"website":"NA - NEEDED","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjon.cochran%40caerusly.com%2FImage4Democracy.png_1557339613.2038598.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/caeruslyai"},{"platform":"?","link":"http:/?"},{"platform":"Slack","link":"https://app.slack.com/client/TE5JUMUSU/DLW72PLRL"},{"platform":"?","link":"http:/?"},{"platform":"caerusly-demo.herokuapp.com/","link":"https://caerusly-demo.herokuapp.com/"},{"platform":"MARVELL APP LINK ","link":"https://marvelapp.com/1i8dg52g/screen/61651892"}]},{"externalLink":"https://www.democracylab.org/projects/ballotnav-vote","projectTitle":"Hack for LA: BallotNav.org","problem":"While possible for voters to drop off their mail-in ballot in person, this information is usually not clearly outlined in one single resource and can at times require voters to log-in or sign-up to view information about their nearest ballot drop-box.","action":["BallotNav is a navigation tool created by Hack for LA will provide reliable and up-to-date information on ballot drop-off locations, directions, times of operation, and election official contact information.","We are currently looking to engage organizations working on voter rights, voter accessibility, and voter engagement. After we secure a partner, we will be looking towards bringing on a Technical Lead that can manage the roadmap for improving upon our existing tool."],"founder":"Karen Coronel","technologies":["SQL Server","Amazon Aurora"],"website":"about.ballotnav.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1659532509.2038436.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/hackforla/ballotnav/projects/7"},{"platform":"hackforla-slack.herokuapp.com/","link":"https://hackforla-slack.herokuapp.com/"}]},{"externalLink":"https://www.democracylab.org/projects/219","projectTitle":"Bottle Cap Log","problem":"There is a global problem with one-use plastic packaging. Many partial solutions exist. Recycling in its current form is unfortunately mostly a feel good effort rather than a system that diverts meaningful amounts of one-use plastic out of city dumps and oceans. Current metrics indicate 70% or more of material put in recycling bins is not actually recycled and ends up as trash.","action":["This project focuses on the current variation in the types of plastic that consumers buy in the form of one-use packaging and even household goods. The goal is to create clean, concentrated, and predictable streams of recyclable plastic that can be efficiently sold as feed stock in commodity markets."],"founder":"Andreas Kolshorn","technologies":["JavaScript","MySQL","Angular","SQL","C#","Wordpress","TypeScript","ASP.NET MVC","SQLite","Figma","Neo4j"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FBottle+Cap+Log.png_1567892106.2219207.png","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/1236","projectTitle":"App to compare latest & past voter list by polling station ","problem":"There is systematic agenda to delete a particular group of voters for we plan to compare latest and old data to gather evidence","action":["When we compare old and latest voter list at each polling station, we will know missing voters and they can be applied to election commission again","A database App that can be used to select polling station and check for unique names in past and latest voter list"],"founder":"Uma Maheswara Rao .","technologies":[],"website":null,"image":"","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/580","projectTitle":"Web3 Training Camp","problem":"The current education system isn't catching up with tech innovation. The gap is significant between what schools teach students and the tech skills they need to compete in an increasingly competitive workforce.","action":["Our foundation is launching a program to train 16-21 year-olds from marginalized communities to work in blockchain and Web3 environments.\nWe're collaborating with the NFL to launch the pilot & the first national cohort of learners in this program. The NFL will share the program in its social media accounts to create visibility, where viewership totals over 100 million.\nIn the metaverse & Web3, a new scenario has emerged that has flipped the power dynamic into the hands of the metaverse builders & the community of users. Web3 & the metaverse have the potential to create a more connected & open digital world where builders, creators and producers actually own their work and can\r\nmonetize it.\nThis program will teach the learners how to build in the metaverse & create marketing campaigns to get exposure for their work. In the end, the learners will be certified developers in one metaverse platform with digital assets in their store.\nHelp us prepare youth for their future of work.","We need assistance with social media, marketing, communications, partnerships and sponsorships for funding."],"founder":"Tammy Lakes, MBA","technologies":[],"website":"www.roicolabs.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Ftlakesbusiness%40gmail.com%2FnewFile.jpeg_1662590960.4731128.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/382","projectTitle":"Vendito","problem":"Micro and SMBs without access to e-commerce have an unfair disadvantage because they belong to minorities like senior or low income communities. There is also a lot of unemployed people who is already using social media and could earn a commission by promoting and selling small businesses products and services.","action":["Enable micro and SMBs without access to e-commerce to sell remotely using only a google for or a chat bot to create their online catalog. We'll then connect them with social sellers, that will act as their affiliates by promoting and selling their products and services.","Raise awareness about the program to onboard businesses and social sellers.\r\nWe’ve validated our social selling business model by onboarding 14 local businesses and 34 social sellers who are already promoting and selling local products and services within their communities. We achieved 54 sales in only 24 hours.\r\nFor the hackathon we are looking for help on something really simple. Program our adobe XD files into generating the microsite out of the business data on the excel file."],"founder":"AnaLizz Pardo","technologies":["Adobe XD"],"website":"www.fuerzacdmx.org/vendito-mvp","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fproveedores%40keyboo.mx%2FnewFile.jpeg_1588340104.3202004.jpeg","contactInfo":[{"platform":"Slack","link":"http://slack/"},{"platform":"YouTube Video Early Prototype","link":"https://www.youtube.com/watch?v=FQWtFozJJS8&t=2s"},{"platform":"How it works (1 minute)","link":"https://youtu.be/OgWYQ_GNPQU"}]},{"externalLink":"https://www.democracylab.org/projects/1152","projectTitle":"Charter Project Africa","problem":"Come help us fight extremism!","action":["Participants will get access to a catalogue of existing open source software solutions and data, as well as support from technical experts for teams to either customise proven tools for Nigeria or to build their own solutions from scratch.\nThe best ideas will win seed-grants to help turn them into real-world solutions, as well as ongoing technical support from a range of partners. Winners will also be invited to participate at a series of digital democracy events in Nigeria later in 2023, and will be showcased internationally on partner websites.\nAll participants (as part of their teams) will need to build an MVP of their product with the following deliverables to be considered adoptable:\r\nCreate a slide deck around your idea\r\nDevelop and pitch functionality for the idea/workability feature to showcase\r\nProvide content updates for your idea\nYour tool must be open source.","Everyone who produces an MVP through the hackathon that is adoptable is eligible to receive:\nRecommendation from DemocracyLab on LinkedIn\r\nTop 2 teams/tools receive:\r\nA seed grant of $1500 for the top 1 team\r\nAWS and/or Google Cloud Voucher for the runner-up\r\nInvitation to International Extremism Conferences in Nigeria\r\nPart ownership of the tool you contribute to and full ownership of tools you create\r\nShowcase completed tool in the Charter Africa, DemocracyLab site ADDO\nRemote Participation\r\nRemote participation is available for applicants outside of Lagos. Participate by uploading your prerequisite solutions through the Democracy Lab platform during the hackathon. Submission information includes:\r\nThe name a solution for the problem statement\r\nThe project description\r\nThe product roadmap\r\nThe Functional Requirements Document\r\nand a landing page to the tool\nAll documents will be reviewed for viability. Successful applicants are eligible to receive recommendation from DemocracyLab on Link"],"founder":"Sarah Gowon","technologies":[],"website":"charter.africa","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsarah%40codeforafrica.org%2FnewFile.jpeg_1673878625.8359191.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/orgs/CodeForAfrica/repositories?page=4&type=all"},{"platform":"Twitter","link":"https://twitter.com/Code4Africa"},{"platform":"Facebook","link":"https://www.facebook.com/CodeForAfrica"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/code-for-africa/mycompany/"}]},{"externalLink":"https://www.democracylab.org/projects/222","projectTitle":"Infoncast Media Platform","problem":"Problem - The Digital Divide- Information Access in Rural Africa.","action":["Our Concept: Enabling digital inclusion.\nBuilding a multimodal platform to enable the creation, management and sharing of content through the Mobile Phone (Basic or Smartphones).\nGoal: Enabling digital inclusion by connecting everyone on the planet.","What we did.\n\n\n\nBuilt informational website using Webflow.\n\n\n\n\nCompleted UX/UI design for Infoncast\n\n\n\n\nDeveloped backend REST API\n\n\n"],"founder":"Vincent Oywak","technologies":[],"website":"infoncast.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fvinzoywak%40hotmail.com%2Finfoncast+logo+v2.png_1569380463.603644.png","contactInfo":[{"platform":"Google Drive","link":"https://drive.google.com/open?id=1LnrgcN36498P7kA5WWwiitBI40HfhT1B"},{"platform":"vinzoywak@hotmail.com","link":"http://vinzoywak@hotmail.com/"},{"platform":"Hacky New Year Presentation","link":"https://docs.google.com/presentation/d/1b46EdgpilEhA10g_sLm9Z9QhOGzPa_lS7ibFUtIAsjI/edit#slide=id.g7c5347135e_0_1"},{"platform":"Figma App Prototype","link":"https://www.figma.com/proto/izk6a0GbWv9yPwgskZIIHY/a-project-infoncast?node-id=72%3A2227&viewport=-851%2C375%2C0.8900418877601624&scaling=min-zoom"}]},{"externalLink":"https://www.democracylab.org/projects/497","projectTitle":"Volin - Connecting skills to startups and businesses","problem":"Startups in Africa have difficulty getting the right skills they need to develop their businesses. Most of these startups don't have the money to employ and pay workers. Most students and skilled youth don't know that startups need interns or volunteers, and the type of help they need.","action":["\nUX , UI\nWordpress Developers\nWork on the website\nComplete the Website using wordpress\nAdd Content on the website\nTest Website\nMake the Website LIVE\n"],"founder":"Paul Mbua","technologies":["Wordpress"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fpaulmbua%40zixtechorganization.org%2FnewFile.jpeg_1597236464.947752.jpeg","contactInfo":[{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1OyC_IsolMTRcEhhhpGYhBLPRfkyiW4Pr?usp=sharing"},{"platform":"Slack","link":"https://zixtech.slack.com/archives/C018WF879K6"}]},{"externalLink":"https://www.democracylab.org/projects/181","projectTitle":"Governance Optimization Firm","problem":"Electorates have substantial barriers to finding trustworthy and meaningful sources of political information. Poor decision-making at the ballot box based on bias or un-contextualized information decouples government political action and voter accountability. These decisions spur higher rates of local corruption, greater cost for municipal bonds, lower voter turnout, signs of weakening political institutions, polarization of the electorate, and the rise of disinformation campaigns.","action":["Utilizing data science and machine learning to derive insights from openly available government data; transforming it into descriptive, predictive, and prescriptive intelligence.","Currently building database but need to work on front/back end development."],"founder":"Nima Sarrafan","technologies":[],"website":"www.turinhorse.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fnima.sarrafan%40turinhorse.com%2Ftransparent.png_1564620201.2601929.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/TurinHorse/Turin"},{"platform":"Google Drive","link":"https://drive.google.com/open?id=1lKYG9L0OzPOF440a3zidsEUs2rMOBron"},{"platform":"Slack","link":"http://turinhorse.slack.com/"}]},{"externalLink":"https://www.democracylab.org/projects/1169","projectTitle":"Pattern Sphere (PS)","problem":"From climate change and environmental degradation to social problems relating to health or inequality, the problems we face today are often described as \"wicked.\" This term describes social and environmental problems that seem to defy \"solutions.\" Often, they are problems that have existed for centuries, involving violence, inequality, disease, environmental degradation, and others. The \"problem\" is that is not one problem, but that our approaches to these problems are inadequate. They aren't adaptive or systematic or conducive to coordination. People don't know where or how to get involved — and they're often closed to people who should be onboard. There are many reasons but it clear that our responses, if we are to make them at all, must be somehow equal to the challenges. Based on our knowledge so far we know about addressing wicked problems is that they will require \"more effectiveness, more accountability, and more democracy.\" And we think that our approach can help.","action":["The pattern and pattern language approach is intended to help us better face and successfully address the significant \"wicked,\" problems that affect us today. Each \"pattern\" is a structured description of successful ideas and actions. Patterns are general, not recipes with precise instructions. They are are adapted by people in different situations to meet their specific needs. This approach is not a cure-all and it is not intended to be replace other approaches. And the online approach that we need has not been developed — or it's missing altogether.\nThe pattern language approach was first presented in A Pattern Language, a book devoted to human habitation that promoted beauty and life. Their book contains 253 patterns, while the book I wrote (with 80+ contributors), Liberating Voices, has 136 patterns each focused on positive social change. We believe that a pattern-based approach that builds on prior work could help address the wicked problems we face today.","Wicked problems can't be addressed by one group of people alone, nor through one pattern language. We envision the Pattern Sphere as an integrated collection of services that support the development and use of patterns and pattern languages that help individuals and, more importantly, groups address social and environmental issues. But for patterns and pattern languages to have any lasting and tangible effects, many things need to be further developed, including federated pattern language repositories, support for collaboration, team workspaces, search capabilities, pattern sharing, etc. Our work thus far on the PS system has been to develop services on an as-needed basis. Currently that means that people can select patterns and comment on them. To adequately develop the PS will require the work of many people. This includes: UI/UX designers, PHP / MySQL programmers, testers, pattern & pattern language experts, community development, and outreach."],"founder":"Douglas Schuler","technologies":["PHP","MySQL"],"website":"labs.publicsphereproject.org/ps","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fdouglas%40publicsphereproject.org%2FnewFile.jpeg_1678750711.8574462.jpeg","contactInfo":[{"platform":"Slack","link":"http://publicsphereproject.slack.com/"},{"platform":"Trello","link":"https://trello.com/w/patternsphere"},{"platform":"Liberating Voices network of patterns, dynamic","link":"https://kumu.io/IIS/liberating-voices#patterns"}]},{"externalLink":"https://www.democracylab.org/projects/585","projectTitle":"Website Redesign","problem":"Our website is currently hosted and operated on a wordpress platform. We worked with a team of designs students at UW to improve the user interface of our website. We do not have the expertise to redesign the entire website with our new design protoype.","action":["Creating a mock website based off the new design / testing it / implementing it."],"founder":"Henry Peterson","technologies":["Wordpress"],"website":"fremontartscouncil.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhenrylarspeterson%40gmail.com%2FnewFile.jpeg_1606270804.959761.jpeg","contactInfo":[{"platform":"Slack","link":"https://app.slack.com/client/T012C741X1C/C012N53T0KV/details"}]},{"externalLink":"https://www.democracylab.org/projects/511","projectTitle":"Twin Cities Talk: Conversations on Police and Policy","problem":"George Floyd was murdered by police on the street in Minneapolis on Memorial Day 2020. The Minneapolis City Council has vowed to defund or disband the Minneapolis Police Department. Similar situations have arisen in cities all across America. Emotions are high and lives are on the line.\r\nHowever, it is difficult to build consensus or popular support for sweeping policy changes. People are yelling and fighting in the streets, and yelling and fighting on social media.\r\nWe need to facilitate productive, honest conversations, and build on the best ideas with the most support. We need to have better tools for talking about these issues where it isn't just the loudest voices or the most privileged voices drowning out the majority.","action":["I plan to use some amazing tools that already exist. Among these are:\n\nPolis (https://pol.is/home) : a platform for building consensus and hosting and analyzing democratic conversations. Polis has been used by democratic movements around the world, including in Taiwan, Seattle, Kentucky, and the UK. Polis is free and open and the core team is interested in helping us with this project.\nDiscourse (https://www.discourse.org/) An improved forum for \"civilized discussion\" online.\nThe Minneapolis City Council and the Minneapolis Charter Commission (http://www2.minneapolismn.gov/charter/index.htm) receive public comment and are amenable to public pressure and data.\r\nIf Minneapolis has success in creating a safe and healthy city while reducing police violence, this can be an example for other cities to follow (or learn from).\n","Build a coalition of stakeholders across a spectrum of the community. Networking and Outreach!\r\nBuild a Polis Conversation : this consists of several \"comments\" that participants can Agree or Disagree with, kind of like a survey. Participants can also submit their own comments. Research and Writing!\r\nDesign the web site to look good, be accessible, and be a good user experience. UXD and Web Design!\r\nAnalyze and interpret and report the data that emerges from the conversation(s). Data visualization and math!\r\nFacilitate the translations of text into the common languages of this region. Project Management and Communication!\nWe are using technology as part of the solution, but this is not a technically complex project. The work will mostly involve communication, design, networking, outreach and project management."],"founder":"Bennie Rosas","technologies":["JavaScript","React"],"website":"tctalk.us","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fben%40aliencyb.org%2FnewFile.jpeg_1598565376.5675576.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ballPointPenguin/tctalk-web.git"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1j9jhaF8gLCKNJZxc24jtm2IGrDyAR8a4?usp=sharing"},{"platform":"gitter.im/pol-is/polis-community","link":"https://gitter.im/pol-is/polis-community"},{"platform":"Trello","link":"https://trello.com/b/Xz9EbZJ0/minneapolis"}]},{"externalLink":"https://www.democracylab.org/projects/1182","projectTitle":"Video call platform for Asylum seekers (as yet unnamed)","problem":"We're a small team building a Zoom-like app specifically for asylum seekers that allows them to communicate, through an interpreter, to their lawyer.","action":["We're building a video call platform to be accessed on laptop, web and mobile.\nWe've partnered with some major asylum/refugee NGOs and have designed a host of features alongside interpreters and translators to meet their needs.\nWe have a simple goal: make the lives of asylum seekers and the interpreters, lawyers and volunteers who support them a little bit easier by building a video-conferencing platform that makes communicating in different languages really easy. Think Zoom with a host of features designed specifically for asylum seekers and interpreters in one good-looking, easy-to-use and forever free program.\nWe're eventually looking at building out the platform to support a network of interpreters, lawyers and volunteers around the world coming together to support asylum seekers remotely.","We're finalising our team before launching into the development phase over the next 3-4 months.\nWe're going to :\n\nDesign a fantastic UX/UI alongside our on-the-ground partners\nBuild a robust back end\nBuild the front end out\nTest, redesign and improve\n"],"founder":"George Jeffreys","technologies":["React","Figma"],"website":null,"image":"","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/505","projectTitle":"Snowpool","problem":"Ski resorts in Washington are located long distances from urban centers. Driving to ski resorts greatly contributes to climate change, however, many skiers and snowboarders want to reduce their carbon footprint. Presently, most resorts do not offer reliable ride share options, such as busses or other forms of mass transit. A rideshare app would help reduce the number of cars traveling to and from ski resorts from major urban areas, (such as Seattle), by encouraging drivers to fill their empty seats.","action":["This platform would connect riders and drivers based on starting location, date, time, and destination. Riders and drivers would register and create profiles, which would display their ratings (received by past trips). Through this platform, skiers and snowboarders would feel empowered to reduce their carbon footprint, while meeting new mountain buddies.","We are creating an interactive, map-based platform where riders can browse potential trips and drivers can browse potential riders. The app would include a map with set pick up locations (e.g. park and rides) and allow drivers and riders to filter based on desired date, time and destination. The map would also indicate the time and distance between rider and driver. There would also be a chat feature for drivers and riders to coordinate details, such as space for gear and number of seats available. The app would also include a link to existing bus services where available."],"founder":"Melanie del Rosario","technologies":["PostgreSQL"],"website":"snowpool-app.herokuapp.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmelanie%40vedaenv.com%2FnewFile.jpeg_1597950540.0267193.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Asimov4/icare"},{"platform":"www.dropbox.com/sh/dvibpbesqlziwcr/AAB6Ovw8wte7akLOEqcrqIRua?dl=0","link":"https://www.dropbox.com/sh/dvibpbesqlziwcr/AAB6Ovw8wte7akLOEqcrqIRua?dl=0"},{"platform":"Slack","link":"https://join.slack.com/t/snowpool/shared_invite/zt-h595hll2-q4R~iQnRVk02o3aPFFIK7g"},{"platform":"GitHub","link":"https://github.com/Asimov4/icare"},{"platform":"Project Code","link":"https://github.com/Asimov4/icare"}]},{"externalLink":"https://www.democracylab.org/projects/425","projectTitle":"Every Voice Engaged","problem":"Every Voice Engaged is a 501(c)3 nonprofit that helps citizens, governments, and nonprofit organizations solve problems that benefit from effective civic engagement. Our deliberation and strategy platform delivers actionable insights by engaging participants in an informed and active discussion. We address complex, multi-dimensional issues where there is no easy answer. Participants work together to discover their common ground. Through this process, participants are more than informed, they are engaged.","action":["Our platform has been deployed in partnership with the Kettering Foundation for over five years. We’re planning to migrate it to open source as we complete a number of infrastructure upgrades. Our transition to a full DevOps pipeline that's deployed on AWS is in the final stages of testing. A number of targeted enhancements that will improve participation in our democracy are in the pipeline.","In this event, we want to make EVE work better with others 😃\nWe have two buckets of tasks: Backend Design and Front End implementation, and each of these buckets has a number of small, discrete tasks which will be determined by the skillsets of our lovely volunteers. We have some juicy work options, any of which we'd be happy to tackle with your help:\nCreate queries for Graphana operational metrics\r\nImplement front-end enhancements\r\nDesign API integration with videoconferencing apps"],"founder":"Gary Green","technologies":["JavaScript","HTML","PostgreSQL","AngularJS","Scala"],"website":"www.everyvoiceengaged.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fgary%40everyvoiceengaged.org%2FnewFile.jpeg_1589772597.4494824.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/EveryVoiceEngaged"},{"platform":"Slack","link":"https://app.slack.com/client/T74CHK7EK/D01AGCCL3JR"},{"platform":"Trello","link":"https://trello.com/b/Ttgwsv3v/democracy-lab-roadmap"},{"platform":"EVE Forum Example Video","link":"https://drive.google.com/file/d/1XuwZ78FPbd0XQsglcCQt0NduX8SOKrdC/view?usp=sharing"},{"platform":"EVE Screenshots for Walk Through","link":"https://drive.google.com/file/d/1Fin_iau1gWZZ_SlhV1JVCzj4MEutuMI_/view?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/899","projectTitle":"The Democracy Straight-Up Project","problem":"It is important to remember that, in a democracy, not all problems are solvable! But, there is mounting evidence that the solvable problems within American democracy are caused by our system of legislation and representation. First, what we call The Big Disconnect, where voters do not feel like they are the authors of their own institutions of self-government. Second, The Under-Representation Problem, where there are far too many constituents for each House Rep. Third, The Campaign Problem, where power and patronage control who gets elected and what they do in office. Most of the issues being addressed by pro-democracy organizations are actually just symptoms of these underlying, but often unacknowledged, causes. For instance, issues of individual freedom, human rights, government boondoggles, bureaucracy, overspending and inefficiency--just to name a few--can all be concretely linked to The Big Disconnect, The Under-Representation Problem, and The Campaign Problem.","action":["We take this truth as self-evident: citizens have a right to vote directly on legislation. We encapsulate this in the phrase, \"My Freedom, My Vote.\" Up until now, Direct Legislation has been seen as theoretically desirable, but impossible to implement. We plan to do the impossible. We are going to build a nation-wide network of District Direct Legislatures (DDL's), one for each of the 435 US Congressional Districts that elects a member of the House of Representatives. In the process of doing this we solve The Big Disconnect. These DDL's are structured to increase apportionment tenfold, thus solving The Under-Representation Problem. And, through a process of Merit-Based Advancement, which is a natural, integral part of Direct Legislation, we will eliminate the need for anyone to mount a political campaign, thus eliminating the need for campaign funds, which eliminates money in politics as well as the out-sized influence of political parties. You're welcome, America!","Setting up Direct Legislatures in all 435 US Congressional Districts will be facilitated by The Democracy Straight-Up Project through an aggressive campaign of promotion, both face-to-face and online. Supporting these efforts will be two websites: one for The Project, which will be mostly static pages for training and orienting participants at different levels and through different phases of the project, and another called The Voting Portal, which will enable voters to join their District Direct Legislature (DDL), vote directly on legislation, and put forward delegates through a process that doesn't involve campaigning. When a DDL is large enough (we estimate about 150,000 members) it will select one of its own members as a candidate for their House Seat, and vote them into office in the general election. This DSUp representative will only have one major 'campaign promise': to vote on the floor of The House, issues by issue, with the majority of the DDL."],"founder":"Don Morgan","technologies":["PHP","MySQL","HTML","PostgreSQL","MongoDB","Ruby on Rails"],"website":"DemocracyStraightUp.Org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1641530921.5376806.jpeg","contactInfo":[{"platform":"docs.google.com/document/d/e/2PACX-1vToce2q2RRUo57xDLu7ZpSdrGcAqGvMoljzpQLMD13BwcIOCuyLqhNmpXvRc3Vsuq5y59Qb8pjUQsVs/pub","link":"https://docs.google.com/document/d/e/2PACX-1vToce2q2RRUo57xDLu7ZpSdrGcAqGvMoljzpQLMD13BwcIOCuyLqhNmpXvRc3Vsuq5y59Qb8pjUQsVs/pub"}]},{"externalLink":"https://www.democracylab.org/projects/806","projectTitle":"COVID Homeless Action Plan","problem":"COVID has cost millions of jobs and may cost up to 11 million homes in the next year. We already have more than half a million unhoused people in the US. Existing systems are inadequate to meet the need that will arise soon. Shelters are already overburdened, since homelessness grew by 3% in 2020 despite eviction moratoriums. States have been given funds to hand out to those who need them, but the limitations and requirements in strictures for the grants make it nearly impossible for the needy to access help. There is not enough publicly-funded space available to house or care for those who are going to lose their homes when the government refuses to extend the eviction moratorium any longer. Many people want to help, but they don't know how to vouchsafe or run background checks on someone they'd allow to stay in their home. People want to be able to give what is needed, but they don't know what to do beyond handing out sandwiches. We need a person-to-person mutual aid app.","action":["The CHAP (COVID Homeless Action Plan) App will provide a way for ordinary people to quickly find people near them who need resources or a place to stay. Placements for housing will be facilitated by social workers from existing organizations who use the app to mediate meetings between hosts and guests. Resources like individual needs (pillows, clothes, bus passes, propane) will be distributed directly from those who want to give from needs they see posted on a map near them, to those in need who have posted their requests on that searchable local map. Unhoused people will also be able to offer their own resources to help others, such as time offered practicing their professional skills, which will allow them to build community and trust - and sharing what they have with other people who need help. This app will remain useful long after the COVID crisis is over, and even longer after we solve homelessness entirely. It's a way for people to support their neighbors freely.","The CHAP App is already outlined by Joe Mabel, a thirty-year software development veteran, as a draft technical specification for a database, combined with some elements of a functional specification for the system as a whole. He has created a basic outline for what the app needs to do and what the tree of functions looks like (I am not a software developer and don't truly understand this part). Joe says that we need about 200-250 hours of software coding from someone who really knows what they're doing. We would greatly appreciate volunteers to contribute coding time to make this happen. We'd like to get this project done as soon as possible, because more people are being evicted even now, when the moratorium is still supposed to be in effect. The need for this app grows more urgent daily. Here is our outline: https://docs.google.com/spreadsheets/d/1EELddW9huf6Doth8tYyYTQI4YkH0wsow26r3XyaTWMk/edit?usp=sharing"],"founder":"Galena White","technologies":[],"website":"www.nwhospitality.org/chap","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1630081620.1868155.jpeg","contactInfo":[{"platform":"GitHub","link":"http://www.github.com/"},{"platform":"Google Drive","link":"https://drive.google.com/drive/u/0/my-drive"},{"platform":"covidhomelessactionplan@gmail.com","link":"http://covidhomelessactionplan@gmail.com/"},{"platform":"airtable.com","link":"http://airtable.com/"},{"platform":"Facebook","link":"https://www.facebook.com/groups/1419292521792588"},{"platform":"docs.google.com/spreadsheets/d/1EELddW9huf6Doth8tYyYTQI4YkH0wsow26r3XyaTWMk/edit?usp=sharing","link":"https://docs.google.com/spreadsheets/d/1EELddW9huf6Doth8tYyYTQI4YkH0wsow26r3XyaTWMk/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/735","projectTitle":"Young Professionals Digital Membership Platform","problem":"We launched a community-focused platform, which included an array of recurring, live events, digital content, and unique programming intending to bridge the gap between community members and relevant opportunities.","action":["Our research has provided a renewed sense of purpose for our organization. Instead of relying on a collection of existing technologies, we need to be the mechanism that directly connects community members with opportunity.\nThe way we continue to grow and actively fulfill our responsibility to our community is by building a proprietary interface, an integrated membership platform, that enables us to more deeply engage and understand how members access resources.\nThe membership platform will give members full control of the type of content, experiences, and resources delivered to them while providing us with the sort of information to help us create more inclusive communities able to meet and serve the most marginalized where they are.","So far, we’ve developed a digital presence through basic websites and online community forums to manage and maintain engagement with those who have already found us. But… we’ve spent the better part of the last year developing a roadmap and the beginnings of a framework to launch an integrated, digital platform, allowing community members to connect with other individuals, as well as educational and career-related opportunities and experiences based on both need and interest.\nWe are using Google Drive, Asana, and Slack for our communications interface and would make these available to anyone joining us in our project.\nWe’re open to suggestions from whoever joins the team on which technologies would best suit this project."],"founder":"Ahmad Corner","technologies":["Figma"],"website":"www.ypcommunities.com","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fcontact%40ypcommunities.com%2FnewFile.jpeg_1619815670.5352778.jpeg","contactInfo":[{"platform":"YPCommunities Website","link":"http://www.ypcommunities.com/"},{"platform":"Facebook","link":"https://www.facebook.com/YPCommunities"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/yp-communities/"}]},{"externalLink":"https://www.democracylab.org/projects/1177","projectTitle":"Citizen Watch","problem":"The project aims to solve the problem of illiteracy when it comes to radicalization of voters, and inciting the poor masses to violence especially during Nigerian elections","action":["Citizen watch is a concept that would target young people, get them to understand what extremism is all about ,help them identify extremist scenarios and have them report these cases for further action."],"founder":"Esele Agboighale","technologies":["Figma"],"website":null,"image":"","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/in/eseleagboighale/"}]},{"externalLink":"https://www.democracylab.org/projects/524","projectTitle":"Dwelling.ly","problem":"The nonprofit Join is currently working to help transition people out of homelessness. However, their system for staying in touch with landlords is currently inadequate.","action":["Create an app with a robust ticketing system to ensure Join staff can connect with their landlords and clients when an issue arises. This will allow Join to provide support and improve success in transitioning people out of homelessness.","If you are interested in helping out on this project please go to www.codeforpdx.org/welcome and fill out the form to connect with our organization."],"founder":"Hugh Harker","technologies":["JavaScript","React","Python","PostgreSQL","Flask"],"website":"github.com/codeforpdx/dwellingly-app","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fhtharker%40gmail.com%2FnewFile.jpeg_1599618044.5971577.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/codeforpdx/dwellingly-app"},{"platform":"Slack","link":"http://codeforpdx.slack.com/"},{"platform":"GitHub","link":"https://github.com/codeforpdx/dwellingly-app/projects/4"},{"platform":"Backend Repo","link":"https://github.com/codeforpdx/dwellinglybackend"}]},{"externalLink":"https://www.democracylab.org/projects/1151","projectTitle":"Community Circle","problem":"In King County in 2022, almost 41,000 people experienced homelessness at some point in the year. The last point-in-time (PIT) count of people experiencing homelessness in 2022 showed that approximately 13,368 individuals experience homelessness at any one time in King County. According to the King County Regional Homelessness Authority, King County shelters at the same time had a 77% utilization rate with around 5,000 beds available. This results in approximately 414,000 bed nights wasted per year in the county. Resource availability has been even more overstrained because of COVID-19 and shelter-in-place orders. During the pandemic, a study reported that tent presence in Seattle increased approximately 50%. The fragmentation among nonprofit and government-developed shelter providers has consistently proven to be the cause of inefficiencies within the provision of homelessness services and served as a barrier to coordinated entry.","action":["Community Circle is a novel web-based platform that uses human-centered design and community co-design to provide real-time shelter availability. The application would include visibility into shelter space availability and the ability for individuals to reserve shelter space. The process of human centered design would establish a user community and a community advisory board in the development of the application, to ensure that the voices of those with lived experience, service providers, and the community drives product development. Through this process, the product and additional features would be refined to ensure fidelity to the user-community's interests. The goal of this process would be an application (accessible in mobile and browser) that would support a user’s creation of a profile and login. The user would have the ability to see which shelters have spaces available and reserve shelter space for the night.","Front End & Back End Development\r\nDeploy Beta with Partners in Seattle\r\nFully Form as 501c3 Organization (rather than Fiscal Sponsorship)\r\nApply and Secure More Braided Grant Funding"],"founder":"Amanda Shi","technologies":["Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Famanda.shi16%40gmail.com%2FnewFile.jpeg_1673645691.002509.jpeg","contactInfo":[{"platform":"LinkedIn","link":"http://www.linkedin.com/in/amandashi16"}]},{"externalLink":"https://www.democracylab.org/projects/803","projectTitle":"Pipeline","problem":"The current job search process is like finding a needle in a haystack, especially for today’s Gen Z’ers. The most current report says that there’s only a 2% chance that a candidate will land an interview after applying for a position online. That’s an average of 250 applicants applying for the same position. And it gets even more challenging. According to, 75% of applicants' resumes are never even opened when they reach a recruiter’s inbox. It’s a frustrating process. It becomes tedious, overwhelming, and causes high anxiety. I know; as a recent graduate myself, I just faced this challenge. Recent graduates can’t find guidance in person or online when they need it the most, so they end up wasting endless hours researching and applying for positions that are not ideal. The way in which people apply is by applying, and then tracking their applications through manually inputting information into spreadsheets. It's inefficient and tiring.","action":["Pipeline is a platform that aims to help job seekers find and land the right job. Pipeline helps applicants streamline the job search process, while cutting the amount of time spent finding relevant jobs.\r\nThe first thing Pipeline does is automate job application tracking, so you don’t have to spend time on tracking your applications in Excel spreadsheets. With our one-click, cross-platform web-scraping, we allow users to centralize their job applications and organize them all in one place. They do not need to manually input any information, reducing the amount of time it takes to manually track applications by over half.\r\nPipeline doesn’t end at automating the application tracking. Over time we aim to realize our mission of streamlining the entire job application process and allow users to centralize their job applications and organize them all in one place. They do not need to manually input any information, reducing the amount of time it takes to manually track applications by half.","We are currently looking for enthusiastic people looking to help change the job search game. We're looking for coders who have backend or frontend experience, including JavaScript, HTML, React, MySQL, Firebase, and AWS to help finish building out our MVP. Self-taught coders and students/recent grads are welcome."],"founder":"Lauren Yoon","technologies":["JavaScript","MySQL","React","HTML","SQL Server","Figma","Firebase"],"website":"mypipeline.io/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Flaurenj.yoon%40gmail.com%2FnewFile.jpeg_1628279718.6824498.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/company/mypipeline/"},{"platform":"Please reach out to me on Linkedin if you're interested!","link":"https://linkedin.com/lauren-yoon11"}]},{"externalLink":"https://www.democracylab.org/projects/sunshine","projectTitle":"North Carolina Open Meeting Toolkit Teams","problem":"In practice, residents face barriers to attending and participating in local government meetings, even when they have the legal right to do so. Put yourself in the position of someone who needs to request time off work to attend a public meeting. Would you know far enough in advance when the issue that concerns you will be on the agenda? If you rely on public transportation, can you attend a Planning Board meeting at 7pm? Did the online responses to COVID make it easier for you to participate, or create new technological barriers? These challenges and many more mean that even when North Carolina's open meetings law gives \"the general public a right to attend official meetings of public bodies,\" that right is not always realized in practice.","action":["Code for the Carolinas developed an Open Meeting Toolkit that allows teams of volunteers to evaluate their local government’s public meetings and to make recommendations. This project scales the impact of the Open Meetings Policy by partners Code for Asheville and Sunshine Request by extending their work throughout North Carolina.","Local Team: Form a local team of about 5 volunteers in your North Carolina community to use the Toolkit to evaluate barriers to participation in your local government meetings.\nAdapt the Toolkit: Adapt the Toolkit for use in your state. Open meetings laws and resources differ by state. We would be happy to collaborate with other civic tech organizations to create a version of the Toolkit for use in your state.\n*All Code for America volunteers must be U.S. residents over 18.\nThe Toolkit is now complete. The project team will only respond to volunteer applications that clearly match the Local Team and Adapt the Toolkit actions described above. All other volunteer applications will be declined, because development of the Toolkit is complete."],"founder":"Code for the Carolinas","technologies":[],"website":"codeforthecarolinas.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1663877047.9902215.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Code-for-the-Carolinas/openmeetingtoolkit"},{"platform":"Slack","link":"https://join.slack.com/t/codeforthecarolinas/shared_invite/zt-ggwi3ynm-f82eIgTN2_CUFxh_6t5hwQ"},{"platform":"GitHub","link":"https://github.com/orgs/Code-for-the-Carolinas/projects/2/views/1"},{"platform":"Open Meeting Toolkit","link":"https://code-for-the-carolinas.github.io/openmeetingtoolkit/"},{"platform":"Asheville Open Meetings Policy","link":"https://openmeetingspolicy.com/"},{"platform":"Hackathon Info Video","link":"https://www.youtube.com/watch?v=MlsUBktuNJE"}]},{"externalLink":"https://www.democracylab.org/projects/906","projectTitle":"Researchathon","problem":"There is great opportunity for institutions and organizations to learn how decentralized governance unlocks human potential. However, blockchain technology, along with decentralized autonomous organizations (DAOs), are often misunderstood. Not enough people in web3 are doing solid research.","action":["We intend to support contributors working on research projects in order to develop meaningful solutions. Our goal for this hackathon is to understand the potential for DAOmocracy.","We are forming a team of leaders to grow and support a community of researchers and builders focused on democratic processes powered by blockchain technology."],"founder":"James Waugh","technologies":["Web"],"website":"researchathon.xyz","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjwaugh19%40gmail.com%2FnewFile.jpeg_1642187498.1887596.jpeg","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/maine-clerks","projectTitle":"Local Election Transparency Project","problem":"Municipal clerks are vital to maintaining free and fair elections. They supervise voter registration, issue absentee ballots, recruit poll workers, count votes, process election results, and oversee all election day operations. Without clerks, our democratic process would cease to function.","action":["In early 2022, state lawmakers introduced a bill seeking to relieve clerks' workload and enhance election transparency by shifting municipal campaign finance duties to the Maine Ethics Commission, which already regulates campaign finance in state and county races. The bill passed the Maine House and Senate with bipartisan support, but was left out of the state budget due to an opaque $1 million estimate for “software upgrades” provided by Civix, a big tech firm who built and currently maintains the Commission’s legacy campaign finance software system.\nAfter the election transparency bill failed, Open Maine brigade members held several informational meetings with MTCCA Legislative Policy Committee Chairperson Patti Dubois to learn how we could help address clerks’ ongoing campaign finance dilemma. As a result of those meetings, our brigade developed technical parameters and UI designs for a web-based municipal campaign finance system.","We are currently developing the back-end of our application using the Ruby on Rails framework. An MVP of our application that can recieve, store and display basic campaign finance data on a publicly available website will be completed by the end of July.\nIn August, we are looking to work with a front-end developer to implement the public-facing portion of our application. Our team could benefit from a front-end developer with experience building browser compliant technologies. HTML/CSS experience is also necessary. This is not a JavaScript heavy application, it will be server-side rendered, and it is not a Single Page Application (SPA). Rails experience a plus, but not necessary."],"founder":"Nathan Bernard","technologies":["HTML","Ruby on Rails","Ruby","Figma","Bootstrap"],"website":"openmaine.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fnbernard%40codeforamerica.org%2FnewFile.jpeg_1658335627.7360575.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/OpenMaine/clerks"},{"platform":"Slack","link":"https://openmaine.slack.com/"},{"platform":"Twitter","link":"https://twitter.com/open_maine"},{"platform":"Facebook","link":"https://www.facebook.com/openmaine/"}]},{"externalLink":"https://www.democracylab.org/projects/525","projectTitle":"Twin Cities Mutual Aid Project","problem":"Due to widespread inequality and food deserts exacerbated by COVID-19 and property damaged in recent uprisings, many Twin Cities residents are in need of assistance with access to food, hygiene products, and other household essentials. Many other residents are newly aware of their own privilege and ability to give. Between established food shelves, community-led pop-ups, school programs, and other avenues, places to find aid or to give time or resources are abundant, but it can be difficult to navigate the sea of websites, social media posts, and other sources of information.","action":["Since June 1, we've been incrementally adding functionality to a map of mutual aid sites, hosted at twin-cities-mutual-aid.org. We've recently also started work on a catalog of resources that aren't place-based and a calendar of events.","Usability improvements to our existing tools need to be made. We're also open to backend improvements, data analysis, eliciting feedback from users, work on social media campaigns to raise awareness about the tool itself and about the need that it clearly highlights, and other support work."],"founder":"Eileen King","technologies":[],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Feileen.arrington.king%40gmail.com%2FnewFile.jpeg_1599614566.552945.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/Twin-Cities-Mutual-Aid/twin-cities-aid-distribution-locations"},{"platform":"Slack","link":"http://tcmap.slack.com/"},{"platform":"The map!","link":"http://twin-cities-mutual-aid.org/"},{"platform":"Our website","link":"http://tcmap.org/"}]},{"externalLink":"https://www.democracylab.org/projects/1103","projectTitle":"More Voter Voices website","problem":"Several cities in the Bay area, including San Francisco and Berkeley, are seeking better electoral methods for empowering voters and providing better representation. One method is known as \"proportional representation,\" which was just passed in Portland OR by a voter referendum in which 58 percent of voters voted in favor. This method offers significant advantages for how to elect legislative bodies, from city councils to school boards. While some cities in the Bay area already use Ranked Choice Voting, there is a variant of RCV called \"proportional ranked choice voting\" that would avoid many of the problems of district-based elections. But not many people understand how it works, so this website would be dedicated to education and information sharing about how proportional ranked choice voting could benefit voters and traditionally disenfranchised communities in the Bay Area and in California","action":["The solution is a website focused on education and information-sharing. This website, MoreVoterVoices.org, will be important for helping to educate the public about alternative voting methods, allowing the sharing of information such as news, documents, maps, FAQs and other info that can be uploaded to the site for the public to access. This website would not need a lot of fancy graphics, just perhaps a logo or banner across the top, and two vertical columns for posting news and information.","Creation of the website for MoreVoterVoices.org. I already have a rough design outline, including which drop-down menus will be needed. I would like to have this website created in WordPress, since I already use WordPress for a personal website and am familiar with how to maintain it. I would like the website to be simple, with a homepage that has perhaps a logo or a banner across the top, two columns on the page that can be used for posting the latest items, and five or six drop-down menus that take the viewer to a few sub-levels of the website. I can provide more details when you are ready."],"founder":"Steven Hill","technologies":["Wordpress"],"website":"MoreVoterVoice.org","image":"","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/StevenHill1776"},{"platform":"Facebook","link":"https://www.facebook.com/StevenHill01"},{"platform":"LinkedIn","link":"https://www.linkedin.com/in/steven-hill-020375a7/"}]},{"externalLink":"https://www.democracylab.org/projects/tulsa-courtbot","projectTitle":"Code for Tulsa <> Court.Bot BC Franklin Law Center UTulsa","problem":"The B.C. Franklin Legal Clinic (BCFLC) launched in the Spring semester of the 2021-2022 school year. The clinic was established by the TU College of Law to serve the North Tulsa area, where there are few law firms, and access to legal services is very challenging for community members. Currently located in the same building as the university’s immigration clinic, eventually the B.C. Franklin Legal Clinic will find a location in North Tulsa, so that it can better serve clients where they are.Clinic organizers worked with students during the first semester of the program on legal cases surrounding housing; the many acute challenges renters in Tulsa face, including the city’s high eviction rate (Tulsa’s eviction rate is the 11th highest in the nation).In addition the clinic’s students (16) studied the historical and systemic legal issues that are at the root of disparities in housing between north (demographically majority Black) and south (demographically majority white) Tulsa.","action":["Now is the perfect opportunity to introduce Courtbot—a text messaging-based service that keeps justice-involved folks informed about updates to their case. In working with community members on their legal cases, students can also use Courtbot as a tool to serve their clients. At the same time, Code for Tulsa and BCFLC can better understand the needs of Courtbot users. In addition, BCFLC can help us measure Courtbot’s current and potential future impact. In this way, Courtbot can be studied and we can document its impact, while the service is used by a greater number of people in the community. BCFLC benefits by (1) giving students & their clients a way to keep track of court case updates, and (2) giving students research & publishing opportunities.","Partnership focus identified need to combine partners/refocus CourtBot to deliver community Pro Se & Family Court solutions. Community feedback to be obtained at forum/focus group hosted with partner TU.\n\nUpdate/rebrand FB page\nUpdate/Rebrand Court.bot to provide a mobile ready UI for OSCN desktop scraper with guided voice actions\nPartner decision tree for UI to prompt and text next steps in Pro-Se top processes\nUpdate scraper (python for Pro Se and certain case sub-types)\n\nVolunteer Opportunities\nBackend:\r\nLooking for a backend engineer who has experience, or would like to gain experience working on a web service integrated with Twilio and AWS Lex and Lambda. An ideal candidate should have experience or understanding in:\r\nPython or similar language\r\nLooking for a frontend engineer who has experience/would like to gain experience working on a web service designed with vanilla JS and CSS. Ideal candidate should understand:\r\nJS\r\nCSS\r\nMobile-first design"],"founder":"Kimberly Fobbs","technologies":["Python"],"website":"court.bot","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1663877361.5010793.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/codefortulsa/courtbot-library"},{"platform":"docs.google.com/document/d/1Gc3EOs0-aVcYecdNq_dr8Tgj8S0-S1t7kfbRkqGErDs/edit","link":"https://docs.google.com/document/d/1Gc3EOs0-aVcYecdNq_dr8Tgj8S0-S1t7kfbRkqGErDs/edit"},{"platform":"Slack","link":"https://app.slack.com/client/T03GE7DGL/C3H126GQP"},{"platform":"Facebook","link":"https://www.facebook.com/OKCourtBot/"},{"platform":"CourtBot discussions and announcements","link":"https://github.com/orgs/codefortulsa/teams/courtbot/discussions"}]},{"externalLink":"https://www.democracylab.org/projects/994","projectTitle":"NWFruit Sustainable Public Orchard ","problem":"WHY THIS MATTERS:\r\nThe NWFruit 6-acre demonstration fruit garden serves as a resource and focal point to unite individuals and groups, forming a community space that is a great equalizer, hosting hands-on activities open to all ages and abilities.","action":["A refresh of our website design and functionality.\nKey focus areas:\r\n-Volunteer interface\r\n-Member portal interface\r\n-Publicity tools\r\n-Calendar widget","Strategize a modern web design for a clear user experience, user flow, and path to engagement.\nLooking for an agile team that includes the following roles for Phase 1 - Research:\r\n-User Design Researchers\r\n-Volunteer Coordinators\r\n-Content Strategists\r\n-Writers"],"founder":"Celeste Frisbee","technologies":["Wordpress"],"website":"nwfruit.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fnwfruitbod%40gmail.com%2FnewFile.jpeg_1650414041.2275214.jpeg","contactInfo":[{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1xM4N9x6OBMAln4rroU-rbeCrBVZAK7oy?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1096","projectTitle":"Peoples Budget Texas PBTX","problem":"Participatory Budgeting (PB) is a democratic process in which community members directly decide how to spend part of a public budget. PB gives ordinary people real decision-making power over real money. The process was first developed in Brazil in 1989, and there are now over 11,000 participatory budgets around the world, most at the municipal level. Most if not all digital productions focused on improving the participatory quality in participatory budgeting are designed by engineers and bureaucrats. This creates a need for digital productions which are simple and easily accessible, participatory budgeting starts at the age of 12 years old, the experience has to be playful and collaborative to engage all age groups and demographics.","action":["Texas began doing participatory budgeting (PB) in 2013 and is the largest participatory democratic exercise in the American South. We are developing a Metaverse PB to service every school, town, district, county and even church and company in Texas. Peoples Budget Texas (PBTX) is a student-led 100% volunteer 501c3 nonprofit organization. We are developing the digital production between Texas, USA and Kerala, India, two very different populations, with the intent of providing a simple and playful product which serves both societies.","We are exploring a variety of mapping products to provide AR, VR, and XR tools for everything from collaborative construction of physical designs and placing on proposal location and geotagging to incorporating public infrastructure locational intelligence and mapping so participants understand data and its meaning. We are currently gathering partners to join our 5 colleges, the city of San Antonio, and the state of Texas."],"founder":"Allen Olson-Urtecho","technologies":[],"website":"www.pbtx.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fallen%40pbtx.org%2FnewFile.jpeg_1668274455.4684505.jpeg","contactInfo":[{"platform":"Twitter","link":"https://twitter.com/PeoplesBudgetTX"},{"platform":"Facebook","link":"https://www.facebook.com/PeoplesBudgetTexas"},{"platform":"LinkedIn","link":"https://www.linkedin.com/company/peoples-budget-texas/"}]},{"externalLink":"https://www.democracylab.org/projects/69","projectTitle":"TruthTree.wiki - The Public Data Visualization Wiki","problem":"TruthTree unites all the world's public data in a data-visualization tool and reference platform that can facilitate data-driven understanding and consensus regarding geography, politics, and culture for geographic entities at all scales.","action":[],"founder":"Greg Schundler","technologies":["Web","JavaScript","Python","C++","SQL","R","Matlab"],"website":"www.truthtree.wiki","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fgregschundler%40gmail.com%2FFavoriteLogo.png_1549327932.87817.png","contactInfo":[{"platform":"GitHub","link":"https://github.com/truthtreeASD"},{"platform":"Google Drive","link":"https://drive.google.com/open?id=14rtsgTuMCuysVsnmC8NjgvQUD_a17HTW"},{"platform":"Slack","link":"https://join.slack.com/t/truthtree/shared_invite/enQtNjIzOTg2NTc4NTkzLTA1Y2M3NWQ2ZWI3N2UxMWYwYzE0MjBmM2I0M2YzNTBkMjkxMTUyODg1ZGViNTgyYTkyNjllNDU3ZmRkODZmMDQ"},{"platform":"Slack ","link":"http://slack/"},{"platform":"Documentation","link":"https://drive.google.com/open?id=14rtsgTuMCuysVsnmC8NjgvQUD_a17HTW"},{"platform":"YouTube Demo & Tech Description ","link":"https://youtu.be/28oBkJRsoas?t=17"},{"platform":"YouTube of \"Vision\"","link":"https://www.youtube.com/watch?v=vK583zYrbBw&t=30s"},{"platform":"Google Slides of \"Vision\" ","link":"https://docs.google.com/presentation/d/18ow4d5kcvWhEsJeVOiaRIcVOq91ZetTffCIvgrShGIk/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/1094","projectTitle":"Tripspal","problem":"Tripspal is creating a platform for tourists to connect with tour guides easily and be able to plan, create solo trips and also connect with other tourists.","action":[],"founder":"DEJI MAGAJI","technologies":["Android","Web","iOS","Figma"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmagajideji%40gmail.com%2FnewFile.jpeg_1667659893.9390576.jpeg","contactInfo":[{"platform":"Slack","link":"https://join.slack.com/t/tripspal/shared_invite/zt-1jcpy64r5-50Iwi6NxBA7mBCN0fQOVhA"}]},{"externalLink":"https://www.democracylab.org/projects/lajc","projectTitle":"Code for Charlottesville <> Legal Aid Justice Center","problem":"The LAJC works with many different groups, all with significant need for help. Nationally, immigrant workers working in farms or agriculture have been most affected by racial injustices at the workplace. Laws are in place to ensure the health and safety of workers at work during COVID-19, with required protections like masks and hand sanitizers, and protocols like social distancing and isolating workers with COVID-19 symptoms. Yet, many employers have violated the legal rights of immigrant workers to protection, neglecting those measures and putting workers’ and their families’ health at risk while terminating employment to those defending their rights.","action":["Legal Aid Justice Center is a nonprofit organization that provides pro-bono legal services to communities in need around the country. The Virginia office wants to provide legal support to immigrant workers in farms and agriculture in the state of Virginia, by informing them of their rights, evaluating the level of protection at their workplace, and defending their rights in case of violations. In this project, we will focus on developing a chatbot in Whatsapp and a mobile-optimized website.The original primary use is to provide accurate information about the legal protection that workers have and how to navigate the system and if desired make a complaint to the respective agencies with or without the help of LAJC.","In August, we are looking to work with volunteers to help support this effort. Our team could benefit from individuals with experience in front-end web design, especially internationalization and mobile-ready design. Back-end data management, focusing on keeping personal information secure. People who either know or can train themselves to use Botsify are welcomed. We want volunteers who are willing to help us design well for the intended community. For next steps start here."],"founder":"Jonathan Kropko","technologies":[],"website":"www.justice4all.org/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjking%40codeforamerica.org%2FnewFile.jpeg_1660325341.8701556.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/code-for-charlottesville/LAJC-expungement"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1wVLCjpFo_O6QqlPaQCNKe3_I0sl_lm7V?usp=share_link"},{"platform":"communityinviter.com/apps/codeforcville/join-code-for-cville-on-slack","link":"https://communityinviter.com/apps/codeforcville/join-code-for-cville-on-slack"},{"platform":"Trello","link":"https://trello.com/b/oVbfJvru/lajc-chatbot"},{"platform":"Start Here Guide","link":"https://docs.google.com/document/d/1G6AS3exnZ7HgWnbf4mXLBiM6j_cnQ6JpTNUGT8socGc/edit?usp=sharing"}]},{"externalLink":"https://www.democracylab.org/projects/830","projectTitle":"Transpare-NC","problem":"At its best, democracy is a messy, public battle where the will of the voters is understood by elected officials who serve the people. Knowing whom elected officials serve or where conflicts lie is of utmost importance for anyone who wants to be informed about how political power works and how to change it. Campaign dollars have the potential to skew that dynamic where little-known people and forces help fund the campaigns of public officials and seek industry or business favors in return. Knowing more about how that works will lead to a more informed electorate and better policy outcomes.","action":["Being able to access timely data around elections and in between will help people make sense of legislation and political races more quickly, easily and intuitively than they can through the Board of Elections website. We are building a dashboard that will allow for intuitive searching and easier access to campaigns and the dollars they raise and spend from those who have the most vested in political outcomes.While this data is currently available through the N.C. State Board of Elections website, it is difficult to get answers to basic questions people might have about campaign finance here, such as: Who are this candidate’s biggest contributors? What industries give the most to North Carolina politicians? During the last election cycle, how much did a candidate spend on certain expenses, such as advertising?","We have built a working prototype but have some data pipeline issues and front-end work to complete before we will be able to formally launch. There is much work to be done on not just displaying data but automating processes and building visuals that will help people make sense of what is happening with campaign finance dollars in their communities."],"founder":"Jeremy Borden","technologies":["React","Python","Node.js"],"website":"www.transpare-nc.org","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1633521352.3039427.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/ncopenpass/CampaignFinance"},{"platform":"code-for-nc-slack-invitations.herokuapp.com/","link":"http://code-for-nc-slack-invitations.herokuapp.com/"},{"platform":"GitHub","link":"https://github.com/ncopenpass/CampaignFinance"},{"platform":"Twitter","link":"https://twitter.com/raleighbrigade?lang=en"},{"platform":"Figma","link":"https://www.figma.com/file/Ga6UbshTN4N1vONCmYpq9b/CF-Dashboard-VO2?node-id=0%3A1"}]},{"externalLink":"https://www.democracylab.org/projects/reimagine911","projectTitle":"Reimagine 911 by Code For America ","problem":"Most calls are not related to a crime in progress, yet today’s 911 police-first model often sends law enforcement officers to handle complex problems beyond their training, such as mental health crises and homelessness. Our 911 system deploys police for many societal ills, including family and behavioral health crises, conflicts in schools, and “quality-of-life” offenses such as public intoxication and panhandling. As a result, police spend much of their time responding to low-level or non-criminal incidents not considered public safety or health emergencies.","action":["If a 911 caller does not need a police response, then 911 should be able to connect them with more appropriate services.\nOur 911 call centers should have the flexibility to send the right response to every call. Police should be dispatched to public safety emergencies, but 911 should also leverage non-law enforcement resources such as social referral programs, non-emergency municipal services, or mental and behavioral health hotlines. Reimagine 911 can help communities identify incoming calls that deserve a different response. By creating a multi-jurisdictional database of standardized 911 calls, we can make diversion opportunities more visible and connect cities that the data shows have similarities across a variety of dimensions.","Since there is no centralized, unified database of 911 calls, that is our starting point. By standardizing open 911 call data we can enable multi-jurisdictional analysis that is not possible today. Standard data across cities will help 911 stakeholders\r\n(1) identify call types that don’t require an armed police response, and\r\n(2) help cities identify their own peers for comparative learning opportunities."],"founder":"Stacey Rebekah Scott","technologies":[],"website":"codeforamerica.org/reimagine911","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fmark%40democracylab.org%2FnewFile.jpeg_1663877299.9314196.jpeg","contactInfo":[{"platform":"Reimagine 911 Notion page","link":"https://cfa.notion.site/The-Reimagine911-Project-879628586a544e4fa3d4900db74a3593"}]},{"externalLink":"https://www.democracylab.org/projects/942","projectTitle":"WAVE (World Alarm and Voting Extension)","problem":"Dear Developer communities,","action":["We are developing the World Alarm and Voting Extension or “WAVE” to be installed on the existing social media platforms e.g. FB, Twitter, Telegram, etc. This useful tool will allow users to make the alarm sound from their voice, text to speech, or recorded sound with setup time and share it on social media.\n\n\nIt is a global top-voted alarming platform. Every day, only one top-voted message e.g., STOP the WAR from users around the world will be alarmed at the same time on their smartphones.\n\n\nThis result will be visualized in a number of supporters with mapping like voting polls. This will send global signals to the World leaders.\n\n\nIn addition, millions of people around the world can send their voice \"Save Ukraine\" to the Ukrainian people who subscribe and can open the loudspeakers from their smartphones and alarm it loudly at the same time with people around the world.\n\n\nWe together can make a big change. Please see the mockup in project files or contact: samparitt@gmail.com","We would like to invite you to join the team. I have a strong belief that we can do something to stop or change the unwanted sound as a result of any bad circumstances by using the power of the voted voice of people around the world.\nThis can be quickly done by\n\ndeveloping a plugin or extension tool installed in the existing social medial platforms e.g., Facebook, Twitter, Telegram, etc.\nsharing this message to the social media developing team who can build the plugin or extension of “WAVE” installed on their social media platforms.\n"],"founder":"Sam Paritt","technologies":["Android","Python","iOS","Java","Processing"],"website":null,"image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fsamparitt%40gmail.com%2FnewFile.jpeg_1646186092.6264858.jpeg","contactInfo":[{"platform":"LinkedIn","link":"https://www.linkedin.com/in/sam-paritt-909257233/"},{"platform":"Facebook","link":"https://www.facebook.com/profile.php?id=100076393411491"},{"platform":"World Alarm and Voting Extension (Pitch)","link":"https://www.youtube.com/watch?v=cqqFDHY--E0"}]},{"externalLink":"https://www.democracylab.org/projects/1086","projectTitle":"Data extraction from scanned image pdf ","problem":"To analyse the voter behaviour, need to extract past election results for which data/tables from scanned image pdf needs to be converted into excel format","action":["If we convert scanned image pdf into excel file, we can analyse the data","Needs python code to deploy in aws for OCR extraction"],"founder":"Uma Maheswara Rao .","technologies":["Python","Flask"],"website":null,"image":"","contactInfo":null},{"externalLink":"https://www.democracylab.org/projects/mid-oh-rpc","projectTitle":"Open Columbus <> TCAT","problem":"As a pedestrian with accessibility needs, I need to be able to navigate sidewalks, avoiding challenges such as raised curbs and raised elevation, based on my mode of transportation. This includes manual wheelchair, motorized wheelchair and cane.As an advocate for accessible technology, I need to be able to provide open GIS data representing sidewalks, crossings, and curbs, in order to allow the creation of web-based solutions and data for stakeholders to make decisions.","action":["Mapping selected neighborhood GIS data using satellite imagery and loading the data into OpenStreetMap, using the Hot Tasking Manager (https://tasks.hotosm.org/). Once completed, the data can be loaded into AcessMap (https://www.accessmap.io/), a navigation web app that provides routes based on the user’s accessibility needs including avoiding raised curbs, steep hills, etc.","Recruit volunteers for mapping sidewalks, crossings, and curbs. Requested time commitment from volunteers: 2-5 hours per week, from early Aug to late Oct."],"founder":"Phil Norman","technologies":[],"website":"www.meetup.com/OpenColumbus/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fseifsekalala%40gmail.com%2FnewFile.jpeg_1659552919.5228972.jpeg","contactInfo":[{"platform":"GitHub","link":"https://github.com/SCODEMeetup/cfa-impact-sprints"},{"platform":"Google Drive","link":"https://drive.google.com/drive/folders/1khXBlByfxKYBVBI2QfAcI-pIsNcKSis3"},{"platform":"Slack","link":"https://opencolumbus.slack.com/archives/C03SN6SK0TW"},{"platform":"GitHub","link":"https://github.com/orgs/SCODEMeetup/projects/16"},{"platform":"Facebook","link":"https://www.facebook.com/opencolumbus"}]},{"externalLink":"https://www.democracylab.org/projects/85","projectTitle":"dossier.","problem":"Hello everyone! my name is Justin I'm the co-founder of Circa Victor and the application that I'm promoting today is Dossier which is a realtime view of the political cycle as it unfolds.","action":["We have built a realtime reporting tool called dossier as a first step.\nWe plan to continue to build tools to help reporters and news organizations get a better understanding of Federal campaign finance.","We need to build relationships with news and media organizations.\nAfter building these relationships, we can work together to jointly report on in-depth data analysis for large and local news teams.\nFeel free to contact me at justin[at]circavictor.com"],"founder":"Justin Hernandez","technologies":["JavaScript","Vue.js","PostgreSQL","Node.js"],"website":"dossier.circavictor.com/","image":"https://democracylab-marlok.s3.amazonaws.com/thumbnails%2Fjustin%40circavictor.com%2F_rzEq_DK_400x400.jpg_1537639059.8141735.jpeg","contactInfo":null}] \ No newline at end of file diff --git a/volunteerverse-api/scraper.js b/volunteerverse-api/scraper.js new file mode 100644 index 00000000..f7c06565 --- /dev/null +++ b/volunteerverse-api/scraper.js @@ -0,0 +1,8 @@ +const browserObject = require('./browser'); +const scraperController = require('./pageController'); + +//Start the browser and create a browser instance +let browserInstance = browserObject.startBrowser(); + +// Pass the browser instance to the scraper controller +scraperController(browserInstance) \ No newline at end of file diff --git a/volunteerverse-api/src/app.ts b/volunteerverse-api/src/app.ts new file mode 100644 index 00000000..d4b5bcf5 --- /dev/null +++ b/volunteerverse-api/src/app.ts @@ -0,0 +1,40 @@ +import express from 'express'; + +import { PORT } from './config'; + +import cors from "cors" +import morgan from "morgan" + + +import { authRoutes } from './routes/auth'; +import { organizationRoutes } from './routes/organization'; +import { volunteerRoutes } from './routes/volunteer'; +import { projectRoutes } from './routes/projects'; +import { requireAuthenticatedUser } from './middleware/security'; +// import { requireAuthenticatedUser } from './middleware/security'; + + +export const app = express(); + +app.use(cors()) +app.use(express.json()) +app.use(morgan("dev")) + +app.use("/auth", authRoutes) +app.use("/volunteer", requireAuthenticatedUser, volunteerRoutes) +app.use("/organization", requireAuthenticatedUser, organizationRoutes) +app.use("/project", projectRoutes) + + + +app.get('/', (req, res) => { + res.send('Hi World Test!'); +}); + +app.listen(PORT, () => { + return console.log(`Express is listening at http://localhost:${PORT}`); +}) + + + + diff --git a/volunteerverse-api/src/config.ts b/volunteerverse-api/src/config.ts new file mode 100644 index 00000000..081db721 --- /dev/null +++ b/volunteerverse-api/src/config.ts @@ -0,0 +1,15 @@ +require("dotenv").config() //dotenv package to parse the environment variables from the .env file + +export const PORT = process.env.PORT ? Number(process.env.PORT) : 3001; +export const SECRET_KEY = process.env.SECRET_KEY || "secret"; +export const BCRYPT_WORK_FACTOR = 13; + +export function getDatabaseURI(){ + const dbUser = process.env.DATABASE_USER || "mcristino" + const dbPass = process.env.DATABASE_PASS ? encodeURI(process.env.DATABASE_PASS) : "postgres" + const dbHost = process.env.DATABASE_HOST || "localhost" + const dbPort = process.env.DATABASE_PORT || 5432 + const dbProdName = process.env.DATABASE_NAME || "volunteerverse" + return process.env.DATABASE_URL || `postgresql://${dbUser}:${dbPass}@${dbHost}:${dbPort}/${dbProdName}` +} + diff --git a/volunteerverse-api/src/db.ts b/volunteerverse-api/src/db.ts new file mode 100644 index 00000000..640ac51f --- /dev/null +++ b/volunteerverse-api/src/db.ts @@ -0,0 +1,21 @@ +import {Pool} from "pg"; +import { getDatabaseURI } from "./config"; + +const db = new Pool({ + connectionString: getDatabaseURI(), +}); + +// db.connect(); + + +db.connect((err: { stack: any }) => { + if (err) { + console.error("connection error", err.stack); + } else { + // console.log("Successfully connected to postgres database!"); + + } +}); + +export default db + diff --git a/volunteerverse-api/src/middleware/security.ts b/volunteerverse-api/src/middleware/security.ts new file mode 100644 index 00000000..9885c8ec --- /dev/null +++ b/volunteerverse-api/src/middleware/security.ts @@ -0,0 +1,60 @@ +import jwt from "jsonwebtoken" +import {validateToken} from "../utils/token" +import {UnauthorizedError, ExpressError} from "../utils/errors" +import {Auth} from "../models/auth" + +export function getJWT(request){ + console.log('GET JWT') + const authToken = request.headers["bearer"]; + console.log("processed token: ", authToken); + if (!authToken || authToken == "undefined" || authToken == "null"){ + console.log("invalid header: ", request.headers) + throw new UnauthorizedError("Invalid header found"); + } + console.log("getting bearer", authToken); + return authToken; +}; + +export async function getUserFromToken(request){ + try{ + const userToken = getJWT(request); + console.log("user token: ", userToken); + const decodedToken = await validateToken(userToken); + if (!decodedToken) + throw new ExpressError("something went wrong", 404) + return decodedToken; + } catch (error){ + if (error instanceof UnauthorizedError){ + throw error + }else{ + console.warn("Unexpected error: ", error); + throw new ExpressError("unexpected error in getUserFromToken function: ", 404); + } + } +} + +export async function requireAuthenticatedUser(request, response, next){ + // if token exists, check user exists + try { + const user = await getUserFromToken(request) + console.log("retrieved user: ", user) + if (!user){ + console.log("access forbidden page"); + return next(new UnauthorizedError); + } + + response.locals.user = user; + console.log("valid users. access granted", user); + return next(); + + } catch (error){ + // otherwise throw error + if (error instanceof UnauthorizedError){ + console.log("Unauthorized user"); + return next(error); + } else{ + console.log("Unexpected error occured trying to verify user"); + return next(error); + } + } +} diff --git a/volunteerverse-api/src/models/auth.ts b/volunteerverse-api/src/models/auth.ts new file mode 100644 index 00000000..ce424e8e --- /dev/null +++ b/volunteerverse-api/src/models/auth.ts @@ -0,0 +1,57 @@ + +import db from "../db" +import { validateFields } from "../utils/validate" +import bcrypt from "bcrypt" +import { UnauthorizedError } from "../utils/errors" +import { Volunteer } from "./volunteer" +import { Organization } from "./organization" + +export class Auth{ + + + static async authenticate(creds: {email:string, password:string}){ + const requiredCreds = ["email", "password"] + console.log("authenticate", requiredCreds) + try{ + validateFields({required:requiredCreds, obj:creds, location:"user authentication"}) + } catch(error) { + throw error + } + + const user = await this.fetchByEmail(creds.email) + console.log("user: ", user) + + if (user){ + const {userType} = user + const isValid = await bcrypt.compare(creds.password, user.password) + if (isValid===true){ + if (userType==="volunteer"){ + const volunteer = await Volunteer.fetchVolunteerByEmail(creds.email) + return await Volunteer.createPublicVolunteer(volunteer) + } + if (userType==="organization"){ + return Organization.fetchOrganizationByEmail(creds.email) + } + } + } + throw new UnauthorizedError("Invalid username/password") + } + + + + static async fetchByEmail(email:string){ + const query = `SELECT * FROM authentication WHERE email=$1` + const result = await db.query(query, [email]) + const user = result.rows[0] + console.log(user) + if (user){ + return { + id: user.id, + email: user.email, + password: user.password, + userType: user.user_type, + } + } + return null + } +} \ No newline at end of file diff --git a/volunteerverse-api/src/models/organization.test.ts b/volunteerverse-api/src/models/organization.test.ts new file mode 100644 index 00000000..80f61f78 --- /dev/null +++ b/volunteerverse-api/src/models/organization.test.ts @@ -0,0 +1,304 @@ +import { Organization } from "./organization"; +import db from "../db"; +import { after, describe, mock } from "node:test"; +import { BadRequestError, UnprocessableEntityError } from "../utils/errors"; +import { BCRYPT_WORK_FACTOR } from "../config"; +import bcrypt from "bcrypt"; +jest.mock(""); + +// // jest.mock("../database", () => { +// // return { +// // database: { +// // query: jest.fn(), +// // }, +// // }; +// // }); + +// describe("Testing fetchOrgByEmail function", async () => { +// const validEmail = "hii@gaffamawfwfil.com"; + +// const mockData = { +// rows: [ +// { +// organization_name: "JelloWorld", +// organization_description: "a compnau duh", +// organization_email: "hii@gaffamawfwfil.com", +// logo_url: "xgxhhsb", +// userType: "organization", +// password: "1234", +// founders: "people", +// } +// ] +// }; + +// beforeAll(() => { +// db.query = jest.fn().mockReturnValue(mockData); +// }); + +// test("it should get email", async function () { +// const result = await Organization.fetchOrganizationByEmail(validEmail); +// expect(result).toStrictEqual({ +// organization_name: "JelloWorld", +// organization_description: "a compnau duh", +// organization_email: "hii@gaffamawfwfil.com", +// logo_url: "xgxhhsb", +// userType: "organization", +// password: "1234", +// founders: "people", +// }); +// }); + + +// test("it should return undefined" , async function () { +// Organization.fetchOrganizationByEmail = jest.fn().mockReturnValue(undefined) +// const invaildEmail = "forhelpgmail.com" +// const result = await Organization.fetchOrganizationByEmail(invaildEmail) +// expect (result).toBeUndefined(); +// }) +// }); + + +// describe("organization registration", () => { +// afterEach(() => { +// jest.clearAllMocks(); +// }); + +// test("should return an error if input does not contain all required fields", async () => { + +// const organizationInfo = { +// orgName : "Helping Hands", +// orgDescription: "", +// email: "", +// logoUrl : "", +// userType : "", +// password :"", +// orgWebsite: "", +// founders : "", +// }; +// expect(Organization.register(organizationInfo)).rejects.toThrow( +// UnprocessableEntityError +// ); +// }); + +// test("can not register a duplicate email", async () => { +// const organizationInfo = { +// orgName : "Helping Hands", +// orgDescription: "a compnau duh", +// email: "forhelp1@gmail.com", +// logoUrl : "https://helpme", +// userType : "organization", +// password :"1234", +// founders : "people", +// orgWebsite: "https://towebsite" +// } + + +// const existingOrganization = { +// organization: { +// id: 1, +// organization_name : "Helping Hands", +// organization_description : "a compnau duh", +// organization_email: "forhelp1@gmail.com", +// logo_url : "https://helpme", +// founders : "people", +// website: "https://towebsite", +// }, +// }; + +// // Mock the behavior of fetchOrganizationByEmail to simulate an existing organization +// Organization.fetchOrganizationByEmail = jest +// .fn() +// .mockReturnValue(existingOrganization); + +// await expect(Organization.register(organizationInfo)).rejects.toThrow( +// new BadRequestError(`Duplicate email: forhelp1@gmail.com`) +// ); +// }); + +// test("registers a new organization successfully", async () => { +// const organizationInfo = { +// orgName : "Helping Hands", +// orgDescription: "a compnau duh", +// email: "forhelpnew@gmail.com ", +// logoUrl : "https://helpme", +// userType : "organization", +// password :"1234", +// founders : "people", +// orgWebsite: "https://towebsite" +// }; + +// const mockResult = { +// rows: [ +// { +// orgName : "Helping Hands", +// orgDescription: "a compnau duh", +// email: "forhelpnew@gmail.com ", +// logoUrl : null, +// userType : "organization", +// founders : "people", +// orgWebsite: "https://towebsite" +// }, +// ], +// }; + + beforeAll(() => { + db.query = jest.fn().mockReturnValue(mockData); + }); + + test("it should get email", async function () { + const result = await Organization.fetchOrganizationByEmail(validEmail); + expect(result).toStrictEqual({ + organization_name: "JelloWorld", + organization_description: "a compnau duh", + organization_email: "hii@gaffamawfwfil.com", + logo_url: "xgxhhsb", + userType: "organization", + password: "1234", + founders: "people", + }); + }); + + + test("it should return undefined" , async function () { + Organization.fetchOrganizationByEmail = jest.fn().mockReturnValue(undefined) + const invaildEmail = "forhelpgmail.com" + const result = await Organization.fetchOrganizationByEmail(invaildEmail) + expect (result).toBeUndefined(); + }) +}); + + +describe("organization registration", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test("should return an error if input does not contain all required fields", async () => { + + const organizationInfo = { + orgName : "Helping Hands", + orgDescription: "", + email: "", + logoUrl : "", + userType : "", + password :"", + orgWebsite: "", + founders : "", + publicEmail : "test@contact.com", + publicNumber : "", + }; + expect(Organization.register(organizationInfo)).rejects.toThrow( + UnprocessableEntityError + ); + }); + + test("can not register a duplicate email", async () => { + const organizationInfo = { + orgName : "Helping Hands", + orgDescription: "a compnau duh", + email: "forhelp1@gmail.com", + logoUrl : "https://helpme", + userType : "organization", + password :"1234", + founders : "people", + orgWebsite: "https://towebsite", + publicEmail : "tacky@contact.com", + publicNumber : "", +} + + + const existingOrganization = { + organization: { + id: 1, + organization_name : "Helping Hands", + organization_description : "a compnau duh", + organization_email: "forhelp1@gmail.com", + logo_url : "https://helpme", + founders : "people", + website: "https://towebsite", + }, + }; + + // Mock the behavior of fetchOrganizationByEmail to simulate an existing organization + Organization.fetchOrganizationByEmail = jest + .fn() + .mockReturnValue(existingOrganization); + + await expect(Organization.register(organizationInfo)).rejects.toThrow( + new BadRequestError(`Duplicate email: forhelp1@gmail.com`) + ); + }); + + test("registers a new organization successfully", async () => { + const organizationInfo = { + orgName : "Helping Hands", + orgDescription: "a compnau duh", + email: "forhelpnew@gmail.com ", + logoUrl : "https://helpme", + userType : "organization", + password :"1234", + founders : "people", + orgWebsite: "https://towebsite", + publicNumber: "1234567890", + publicEmail: "helpers@contact.org", + }; + + const mockResult = { + rows: [ + { + orgName : "Helping Hands", + orgDescription: "a compnau duh", + email: "forhelpnew@gmail.com ", + logoUrl : null, + userType : "organization", + founders : "people", + orgWebsite: "https://towebsite" + }, + ], + }; + + // Mock the fetchOrganizationByEmail method to return null, indicating no duplicate email exists + Organization.fetchOrganizationByEmail = jest.fn().mockResolvedValue(undefined); + + // Create a mock for bcrypt.hash to spy on its usage + const mockHash = jest.spyOn(bcrypt, "hash"); + + db.query = jest.fn().mockReturnValue(mockResult); + const organization = await Organization.register(organizationInfo); + console.log('organizatopm', organization) + +// const { id } = organization +// expect(organization).toEqual(mockResult.rows[0]); +// expect(db.query).toHaveBeenCalledTimes(3); //3 query calls made during the register function if done successfully +// expect(mockHash).toHaveBeenCalledWith( organizationInfo.password, BCRYPT_WORK_FACTOR); +// }); +// }); +// describe("Testing fetchAllOrgProjects function", async () => { +// const validEmail = "hii@gaffamawfwfil.com"; + +// const mockData = { +// project_name: "JelloWorldWebsite", +// project_description: "doing the website of the compnau duh", +// image_url: "xgxhhsb", +// requested_people: 2, +// approved_people: 3, +// created_at: "5:30", + +// }; + +// beforeAll(() => { +// db.query = jest.fn().mockReturnValue(mockData); +// }); + +// test("it should get projects", async function () { +// const result = await Organization.fetchAllOrganizationProjects(validEmail); +// expect(result).toStrictEqual({ +// project_name: "JelloWorldWebsite", +// project_description: "doing the website of the compnau duh", +// image_url: "xgxhhsb", +// requested_people: 2, +// approved_people: 3, +// created_at: "5:30", +// }); +// }); +// }); diff --git a/volunteerverse-api/src/models/organization.ts b/volunteerverse-api/src/models/organization.ts new file mode 100644 index 00000000..93140c8f --- /dev/null +++ b/volunteerverse-api/src/models/organization.ts @@ -0,0 +1,422 @@ +import db from "../db"; +import bcrypt from "bcrypt"; +import { + BadRequestError, + ExpressError, + UnauthorizedError, +} from "../utils/errors"; + +import { BCRYPT_WORK_FACTOR } from "../config"; +import { Volunteer } from "./volunteer"; +import { validateFields } from "../utils/validate"; +/** + * @todo: change get org by email function or refactor + */ +export class Organization { + /** + * Convert a user from the database into a user object that can be viewed publically. + * Don't show user's password + * + * + * @param {Organization} organization - user from database + * @returns public organization + */ + + + static async register(creds: { + email: string; + password: string; + orgName: string; + founders: string; + orgDescription: string; + logoUrl: string; + orgWebsite: string; + publicNumber: string; + publicEmail: string; + userType: string; + }) + { + const requiredInfo = [ + "orgName", + "orgDescription", + "email", + "logoUrl", + "userType", + "password", + "founders", + "publicEmail", + ]; + try { + validateFields({ + required: requiredInfo, + obj: creds, + location: "org registration", + }); + } catch (error) { + throw error; + } + + const existingOrganizationWithEmail = + await Organization.fetchOrganizationByEmail(creds.email); + if (existingOrganizationWithEmail) { + throw new BadRequestError(`Duplicate email: ${creds.email}`); + } + + const salt = await bcrypt.genSalt(BCRYPT_WORK_FACTOR); + const hashedPassword = await bcrypt.hash(creds.password, salt); + const normalizedOrgEmail = creds.email.toLowerCase().trim(); + const orgResult = await db.query( + `INSERT INTO organizations ( + organization_name, + organization_description, + organization_email, + logo_url, + founders, + website, + public_number, + public_email + ) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) + RETURNING id, + organization_name, + organization_description, + organization_email, + logo_url, + founders, + website, + public_number, + public_email + `, + [ + creds.orgName, + creds.orgDescription, + normalizedOrgEmail, + creds.logoUrl, + creds.founders, + creds.orgWebsite, + creds.publicNumber, + creds.publicEmail, + ] + ); + + const { + id, + organization_email, + organization_name, + logo_url, + founders, + organization_description, + website, + public_email, + public_number, + } = orgResult.rows[0]; + console.log(orgResult.rows[0], organization_name) + + const authResult = await db.query( + `INSERT INTO authentication ( + email, + password, + user_type + ) + VALUES ($1, $2, $3) + RETURNING + email, + password, + user_type + `, + + [normalizedOrgEmail, hashedPassword, "organization"] + ); + + const { user_type } = authResult.rows[0]; + + return { + id: id, + email: organization_email, + orgName: organization_name, + orgDescription: organization_description, + logoUrl: logo_url, + founders: founders, + userType: user_type, + orgWebsite: website, + publicEmail: public_email, + publciNUmber: public_number, + }; + } + static async fetchInterestedVolunteersByEmail(email) { + // returns volunteer info based on email + const interestedVolunteersInfo = await db.query( + `SELECT * + FROM interested_volunteers + WHERE email = $1`, + [email.toLowerCase()] + ); + + return interestedVolunteersInfo.rows[0] + } + + static async fetchOrganizationByEmail(org_email: string) { + // this is querying the organization table, going through the rows to find the + // item(that is access it) in the bracket(email in this case) + const org_result = await db.query( + `SELECT + id, + organization_name AS "orgName", + organization_description AS "orgDesc", + organization_email AS "email", + logo_url AS "imageUrl", + founders, + public_email AS "publicEmail", + public_number AS "publicNumber" + FROM organizations + WHERE organization_email = $1`, + // this does to filtering to make sure we are being + // specific to the item in the bracket we are looking for + // by checking if the item we passed in is equal to the row info already + // in the table + [org_email.toLowerCase()] // and this is assigning whatever is in the bracket to the row + // in that table after we find it + ); + + console.log("org res", org_result.rows); + + const auth_result = await db.query( + `SELECT + + user_type as "userType" + + FROM authentication + WHERE email = $1`, + [org_email.toLowerCase()] + ); + + console.log("auth res", auth_result.rows[0]); + + if (org_result.rows.length) { + console.log("returning org user: ", { ...org_result.rows[0], userType: "organization" }) + return { ...org_result.rows[0], userType: "organization" }; + } + return null; + } + + // static async createOrganizationProject (projectInfo) { + // console.log("project info in create function: ", projectInfo) + // const result = await db.query( + // `INSERT INTO projects( + // org_id, + // project_name, + // project_description, + // image_url, + // requested_people, + // approved_people) + // VALUES ($1, $2, $3, $4, $5, $6) + + // RETURNING org_id, project_name, project_description, image_url, requested_people, approved_people`, + // [projectInfo.org_id , projectInfo.project_name,projectInfo.project_description,projectInfo.image_url,projectInfo.requested_people,projectInfo.approved_people]) + + // return result.rows[0] + // } + static async toggleStateOfOrgProject(projectId, orgId) { + + const activeResult = await db.query(`SELECT active FROM projects + WHERE id = $1 `, + [projectId]) + + console.log("active result", activeResult.rows[0].active) + + const orgResult = await db.query( + `SELECT * FROM projects WHERE org_id = $1 AND id = $2`, + [orgId, projectId] + ) + if (orgResult.rows.length !== 0) { + const result = await db.query( + `UPDATE "projects" SET "active" = $1 + WHERE "id" = $2 AND "org_id" = $3 + RETURNING *`, + [!activeResult.rows[0].active, projectId, orgId] + ); + return result.rows[0].active; + } else { + throw new UnauthorizedError("Organization/Project not found"); + } + } + + static async deleteOrganizationProject(project_id, orgId) { + const orgResult = await db.query( + `SELECT * FROM projects WHERE org_id = $1 AND id = $2`, + [orgId, project_id] + ); + if (orgResult.rows.length !== 0) { + // deletes project from table + await db.query(`DELETE FROM "projects" WHERE "id" = $1`, [project_id]); + // deletes project from project_tags + await db.query(`DELETE FROM "project_tags" WHERE "project_id"=$1`, [project_id]); + // deletes projects from interested_volunteers table + await db.query(`DELETE FROM "interested_volunteers" WHERE "project_id"=$1`, [project_id]); + + return true; + } else { + throw new UnauthorizedError("Organization does not have access, or project not found"); + } + } + + static async updateApprovedVolunteers(approved, email, project_id, org_id, initial_approval_state) { + // to check if the volunteer exist(if this does interestedVoluteersInfo will be populated) + const interestedVolunteersInfo = + await this.fetchInterestedVolunteersByEmail(email); + + // to check if the project and( / for the )org exists if it does orgResult will be populated + const orgResult = await db.query( + `SELECT * FROM projects WHERE org_id = $1 AND id = $2`, + [org_id, project_id] + ); + console.log("orgResult is here", orgResult); + // to check if the volunteer exist + if (interestedVolunteersInfo.length !== 0) { + console.log( + "the info of the volunteer if they exist", + interestedVolunteersInfo + ); + + // to check if the project and( / for the )org exists + if (orgResult.rows.length !== 0) { + // handles setting initial approval state and toggling given approval state + const approvalState = approved === null ? initial_approval_state : !approved + const result = await db.query( + `UPDATE "interested_volunteers" SET "approved" = $1 + WHERE "email" = $2 AND "project_id" = $3 + RETURNING *`, + [approvalState, email, project_id] + + ); + console.log("updating approved works!", result.rows) + + return result.rows[0]; + + } else { + throw new UnauthorizedError("Organization/Project not found"); + } + } else { + throw new UnauthorizedError("Volunteer Email not found"); + } + + } + + static async incrementAndDecrementApprovedVolunteers(email, projectId, orgId, initialApprovalState) { + const approvedResult = await db.query(`SELECT approved FROM interested_volunteers + WHERE project_id = $1 AND email = $2`, + [projectId, email]) + + const approvedPeopleResult = await db.query(`SELECT approved_people FROM projects + WHERE id = $1 AND org_id = $2`, + [projectId, orgId]) + + + console.log("approvedResult", approvedResult.rows[0]) + console.log("approvedPeopleResult", approvedPeopleResult.rows[0]) + + const approvedVolunteerState = await this.updateApprovedVolunteers(approvedResult.rows[0].approved, email, projectId, orgId, initialApprovalState) + + console.log("bringing volunteer state into incre/decre works!", approvedVolunteerState.approved) + + console.log("approvedPeopleohhhhhh", approvedPeopleResult.rows[0].approved_people) + if (approvedVolunteerState.approved === true) { + + console.log("here works!", approvedVolunteerState.approved) + const result = await db.query( + `UPDATE "projects" SET "approved_people" = $1 + WHERE "org_id" = $2 AND "id" = $3 + RETURNING *`, + [approvedPeopleResult.rows[0].approved_people + 1, orgId, projectId] + + ); + console.log(" the if in incre/decre works!", approvedVolunteerState.approved) + return approvedVolunteerState.approved; + + } else if (approvedVolunteerState.approved === false) { + // reset number of approved back to 0 if number becomes negative + let numberOfApproved = approvedPeopleResult.rows[0].approved_people; + numberOfApproved = numberOfApproved < 0 ? 0 : numberOfApproved; + + console.log("approved is false", typeof approvedPeopleResult.rows[0].approved_people) + const result = await db.query( + `UPDATE "projects" SET "approved_people" = $1 + WHERE "org_id" = $2 AND "id" = $3 + RETURNING *`, + [numberOfApproved, orgId, projectId] + + ); + return approvedVolunteerState.approved; + + } else { + throw new BadRequestError("Volunteer increment/decrement failed"); + } + } + + + + static async fetchAllOrganizationProjectsById(org_id) { + const result = await db.query( + // make sure this matches spelling in the table too!! + `SELECT + id, + org_id AS "orgId", + project_name AS "title", + project_description AS "description", + image_url as "imageUrl", + requested_people as "requestedPeople", + approved_people as "approvedPeople", + created_at as "createdAt", + active + FROM projects + WHERE org_id = $1`, + [org_id] + ); + + if (!result) { + throw new BadRequestError(); + } + return result.rows; + } + + static async fetchInterestedVolunteersByProjectId(projectId) { + const result = await db.query( + // make sure this matches spelling in the table too!! + // if this was insert, we would have assigned the data from insomnia + //to it but since it is select, we would be taking the data under the rows from + //the table we said + `SELECT + email, approved + FROM interested_volunteers + WHERE project_id = $1`, + [projectId] + // then project_id will then equal what we put in and then using that we can filter + // what we want from the table! + //which we then assign to result back in the route and then convert to json. + ); + + const interestedVolunteers = [] + for await (const volunteerInfo of result.rows) { + // for each volunteer, we add an additional approved field + try{ + const volunteer = await Volunteer.getVolunteerByEmail(volunteerInfo.email); + console.log("retrieved volunteer: ", volunteer) + volunteer["approved"] = volunteerInfo.approved; + interestedVolunteers.push(volunteer) + } catch(error){ + throw error; + } + } + return interestedVolunteers; + } + + static async getOrgById(orgId: number) { + const query = `SELECT * FROM organizations WHERE id=$1`; + const result = await db.query(query, [orgId]); + const org = result.rows[0]; + if (org) { + return org; + } + return null; + } +} diff --git a/volunteerverse-api/src/models/projects.ts b/volunteerverse-api/src/models/projects.ts new file mode 100644 index 00000000..46314493 --- /dev/null +++ b/volunteerverse-api/src/models/projects.ts @@ -0,0 +1,312 @@ +import e from "express"; +import db from "../db"; +import { validateFields } from "../utils/validate"; +import { BadRequestError, NotFoundError } from "../utils/errors"; +import { Organization } from "./organization"; +import { Volunteer, VolunteerProjectProp } from "./volunteer"; +export interface ProjectCardProp { + id: number; + title: string; + orgName: string; + founders: string; + orgUrl?: string; + description: string; + createdAt: string | number; + imageUrl: string; + requestedVolunteers: number; + approvedVolunteers: number; + tags: string[]; +} +export class Projects { + /** + * Inserts a project and the info into the database + * @param projectInfo + */ + static async registerProject(projectInfo: { + orgId: number; + name: string; + desc: string; + imageUrl?: string; + requestedPeople: number; + tags: string[]; + orgName: string; + orgPublicEmail: string; + orgPublicNumber: string; + }) { + const requiredInfo = ["orgId", "name", "desc", "tags", "orgName"]; + console.log(projectInfo); + try { + validateFields({ + required: requiredInfo, + obj: projectInfo, + location: "project registration", + }); + } catch (error) { + throw error; + } + const query = `INSERT into projects + ( + org_id, + project_name, + project_description, + image_url, + requested_people, + org_name, + public_email, + public_number + ) + VALUES($1,$2,$3,$4,$5,$6, $7, $8) + RETURNING *`; + const result = await db.query(query, [ + projectInfo.orgId, + projectInfo.name, + projectInfo.desc, + projectInfo.imageUrl || null, + projectInfo.requestedPeople, + projectInfo.orgName, + projectInfo.orgPublicEmail, + projectInfo.orgPublicNumber, + ]); + console.log("made query in projects"); + const { id } = result.rows[0]; + + projectInfo.tags.forEach((tag) => { + this.insertTag(id, tag); + }); + + return result.rows[0]; + } + + /** + * Insert a project and corresponding tag into the project_tags table + * @param id + * @param tag + */ + static async insertTag(id: number, tag: string) { + const query = `INSERT into project_tags(project_id, tag_name) VALUES ($1,$2) RETURNING *`; + await db.query(query, [id, tag.toLowerCase()]); + } + + /** + * Get's all projects from database with info + * (currently only for volunteers ) + * @returns + */ + static async getAllProjects(): Promise { + const allProjects = []; + const allProjectIds = ( + await db.query(`SELECT project_id FROM project_tags`) + ).rows; + console.log("project ids found", allProjectIds); + + for await (const { project_id } of allProjectIds) { + console.log("fetching project by id: ", project_id); + const project = await this.fetchProjectByProjectId( + project_id, + "volunteer" + ); + console.log("retrieved project: ", project); + allProjects.push(project); + } + + return allProjects; + } + + /** + * Returns project information given the project id + * (using the ProjectCardProp) + * @param id + */ + static async fetchProjectByProjectId( + projectId: number, + userType: string, + email?: string + ): Promise { + const query = `SELECT * FROM projects WHERE id=$1`; + const result = await db.query(query, [projectId]); + console.log("HERE ARE THE PROJECTS FOR VOL", result.rows); + //destructure to extract important info about project + if (result.rows.length > 0) { + const { + id, + org_id, + project_name, + project_description, + created_at, + image_url, + requested_people, + approved_people, + active, + external, + external_link, + public_email, + public_number, + } = result.rows[0]; + + const tags = await this.getProjectTags(project_name); + + if (external == false) { + const { + organization_name, + founders, + website, + organization_description, + logo_url, + } = await Organization.getOrgById(org_id); + let projectCard = { + id: id, + orgName: organization_name, + orgDescription: organization_description, + orgLogoUrl: logo_url, + founders: founders, + orgUrl: website, + title: project_name, + description: project_description, + createdAt: created_at, + imageUrl: image_url, + requestedVolunteers: requested_people, + approvedVolunteers: approved_people, + tags: tags, + active: active, + }; + + if (userType == "volunteer") { + // include fields only relevant to a volunteer + projectCard["interested"] = await Volunteer.expressedInterest( + id, + email + ); + projectCard["approved"] = await Volunteer.fetchProjectApproval( + id, + email + ); + projectCard["orgPublicEmail"] = public_email; + projectCard["orgPublicNumber"] = public_number; + } + return projectCard; + } else if (external) { + let projectCard = { + founders: "", + imageUrl: image_url, + title: project_name, + tags: tags, + id: id, + createdAt: created_at, + orgDescription: null, + description: project_description, + orgName: project_name, // currently does not exist in backend + orgUrl: "", // currently does not exist in backend + requestedVolunteers: null, + approvedVolunteers: null, + external: true, + externalLink: external_link, + orgLogoUrl: "", + active: true, + }; + return projectCard; + + } + } + throw new BadRequestError(`Project ${projectId} does not exist`); + } + + static async getProjectsWithTag(tag: string, email: string) { + const query = `SELECT project_id FROM project_tags WHERE tag_name=$1`; + const result = await db.query(query, [tag]); + console.log("HERE IS THE PROJECTS WITHT HE TAG", result.rows); + + if (result.rows.length === 0) { + // Return an empty array if no projects are found with the given tag + return []; + } else { + const projectIds = result.rows.map((row: any) => row.project_id); + const projects = await Promise.all( + projectIds.map((projectId: number) => + this.fetchProjectByProjectId(projectId, "volunteer", email) + ) + ); + return projects; + } + } + + /** + * Get the tags of a project + * @param projectId + */ + static async getProjectTags(projectName: string) { + const query = `SELECT tag_name FROM project_tags WHERE project_name=$1`; + const result = await db.query(query, [projectName]); + const tags = []; + if (result) { + result.rows.forEach((row: any) => { + tags.push(row.tag_name); + }); + return tags; + } + } + + static async getAllProjectTags() { + const query = `SELECT DISTINCT tag_name FROM project_tags`; + const result = await db.query(query, []); + const tags = []; + result.rows.forEach((row: any) => { + tags.push(row.tag_name); + }); + return tags; + } + + /** + * searches through the projects table - filtering by a search term + * @param term + * @returns array of projects results + */ + static async searchProjects(term: string, email: string) { + const query = `SELECT * FROM projects WHERE project_name ILIKE $1`; + const searchTerm = `%${term}%`; + const result = await db.query(query, [searchTerm]); + console.log(result.rows); + const projectResults = {}; + if (result) { + await Promise.all( + result.rows.map(async (row: any) => { + projectResults[row.id] = await this.fetchProjectByProjectId( + row.id, + "volunteer", + email + ); // updating object with new unqiue project + }) + ); + + + const activeOnlyProjects = Array.from( + Object.values(projectResults) + ).filter((project: VolunteerProjectProp) => project.active === true); + return activeOnlyProjects; + } + else { + throw new BadRequestError() + } + } + + static async searchFilteredProjects(tags:string[], query:string, email:string){ + let projects = []; + const projectPromises = tags.map(async(tag:string)=> {return await this.getProjectsWithTag(tag, email)}); + try { + const projectsArrays = await Promise.all(projectPromises); + const flattenedProjects = projectsArrays.flat(); + + + // Filter projects that contain the query + const filteredProjects = flattenedProjects.filter((project: ProjectCardProp) => + project.title.toLowerCase().includes(query) + ); + + // Add the filtered projects to your 'projects' array + projects.push(...filteredProjects); + return projects; + } catch (error) { + console.error('Error fetching projects:', error); + } + + } +} diff --git a/volunteerverse-api/src/models/volunteer.test.ts b/volunteerverse-api/src/models/volunteer.test.ts new file mode 100644 index 00000000..61d7086f --- /dev/null +++ b/volunteerverse-api/src/models/volunteer.test.ts @@ -0,0 +1,174 @@ +import { Volunteer } from "./volunteer"; +import { BadRequestError, UnprocessableEntityError } from "../utils/errors"; +import db from "../db"; +import { BCRYPT_WORK_FACTOR } from "../config"; +import bcrypt from "bcrypt"; + +/** fetchVolunteerByEmail */ +describe("fetchVolunteerByEmail", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test("returns volunteer when found", async () => { + const mockResult = { + rows: [ + { + volunteer: { + id: 1, + email: "melyssa@gmail.com", + first_name: "Melyssa", + last_name: "Cristino", + bio: "Interested in getting design experience", + image_url: "image.url", + }, + }, + ], + }; + + db.query = jest.fn().mockReturnValue(mockResult); + + const volunteer = await Volunteer.fetchVolunteerByEmail( + "melyssa@gmail.com" + ); + expect(db.query).toHaveBeenCalledTimes(1); // Ensure that the db.query function is called once + expect(volunteer).toEqual(mockResult.rows[0]); + }); + + test("should return null when volunteer is not found", async () => { + const mockResult = { rows: [] }; + db.query = jest.fn().mockReturnValue(mockResult); + const volunteer = await Volunteer.fetchVolunteerByEmail( + "nonexistent@gmail.com" + ); + expect(db.query).toHaveBeenCalledTimes(1); + expect(volunteer).toBeNull(); + }); +}); + +describe("volunteer registration", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test("should return an error if input does not contain all required fields", async () => { + const volunteerInfo = { + email: "example@gmail.com", + password: "", + firstName: "", + lastName: "", + imageUrl: "", + bio: "", + skills: [], + userType: "", + }; + await expect(Volunteer.register(volunteerInfo)).rejects.toThrow( + UnprocessableEntityError + ); + }); + + test("can not register a duplicate email", async () => { + const volunteerInfo = { + email: "melyssa@gmail.com", + password: "123", + firstName: "Melyssa", + lastName: "Cristino", + imageUrl: "image.url", + bio: "Interested in getting design experience", + skills: ["UI/UX design", "HTML", "CSS", "React"], + userType: "volunteer", + }; + + const existingVolunteer = { + volunteer: { + id: 1, + email: "melyssa@gmail.com", + first_name: "Melyssa", + last_name: "Cristino", + bio: "Interested in getting design experience", + image_url: "image.url", + }, + }; + + // Mock the behavior of fetchVolunteerByEmail to simulate an existing volunteer + Volunteer.fetchVolunteerByEmail = jest + .fn() + .mockReturnValue(existingVolunteer); + + await expect(Volunteer.register(volunteerInfo)).rejects.toThrow( + new BadRequestError(`Duplicate email: melyssa@gmail.com`) + ); + }); + + test("registers a new volunteer successfully", async () => { + const volunteerInfo = { + email: "kenneth@gmail.com", + password: "123", + firstName: "Kenneth", + lastName: "Cristino", + bio: "Looking to help out", + skills: ["Machine Learning"], + userType: "volunteer", + }; + + const mockResult = { + rows: [ + { + email: "kenneth@gmail.com", + firstName: "Kenneth", + lastName: "Cristino", + imageUrl: null, + bio: "Looking to help out", + skills: ["Machine Learning"], + userType: "volunteer", + }, + ], + }; + + // Mock the fetchVolunteerByEmail method to return null, indicating no duplicate email exists + Volunteer.fetchVolunteerByEmail = jest.fn().mockResolvedValue(null); + + // Create a mock for bcrypt.hash to spy on its usage + const mockHash = jest.spyOn(bcrypt, "hash"); + + db.query = jest.fn().mockReturnValue(mockResult); + const volunteer = await Volunteer.register(volunteerInfo); + expect(volunteer).toEqual(mockResult.rows[0]); + expect(db.query).toHaveBeenCalledTimes(3); //3 query calls made during the register function if done successfully + + expect(mockHash).toHaveBeenCalledWith( + volunteerInfo.password, + BCRYPT_WORK_FACTOR + ); + }); +}); + +describe('volunteer skills functions', () => { + test('should insert skill for a volunteer in the database', async () => { + // Input data for the skill insertion + const emailInput = 'john@gmail.com'; + const skillInput = 'skill'; + + db.query = jest.fn().mockReturnValue({ rows: [] }); + + // Call the insertSkill function + await Volunteer.insertSkill(emailInput, skillInput); + + // Verify that db.query was called with the correct query and parameters + const expectedQuery = `INSERT into volunteer_skills(email, skill) VALUES ($1, $2) RETURNING *`; + const expectedParameters = [emailInput, skillInput]; + + + expect(db.query).toHaveBeenCalledWith(expectedQuery, expectedParameters); + }) + + test("should fetch all skills for a volunteer from database", async () => { + + }) +}) + + + +afterAll(function () { + db.end(); +}); diff --git a/volunteerverse-api/src/models/volunteer.ts b/volunteerverse-api/src/models/volunteer.ts new file mode 100644 index 00000000..3ecc3168 --- /dev/null +++ b/volunteerverse-api/src/models/volunteer.ts @@ -0,0 +1,394 @@ +import { BCRYPT_WORK_FACTOR } from "../config"; +import db from "../db"; +import { ExpressError, BadRequestError, UnauthorizedError } from "../utils/errors"; +import { validateFields } from "../utils/validate"; +import bcrypt from "bcrypt"; +import { Projects } from "./projects"; + +export interface VolunteerProjectProp{ + id: number, + orgName: string, + orgDescription: string, + orgLogoUrl: string, + founders: string, + orgUrl: string, + title: string, + description: string, + createdAt: Date, + imageUrl?: string, + requestedVolunteers?: number, + approvedVolunteers: number, + tags: string[], + active: boolean, + interested: boolean, + external: boolean, + orgPublicEmail: string, + orgPublicNumber?: string, +} + +export class Volunteer { + + // Static method to make a volunteer object + static async createPublicVolunteer(volunteer: { + id: number; + email: string; + first_name: string; + last_name: string; + bio: string; + image_url: string; + }) { + const skills = await this.fetchAllVolunteerSkills(volunteer.email); + const approvedProjects = await this.getApprovedProjects(volunteer.email); + + return { + id: volunteer.id, + firstName: volunteer.first_name, + lastName: volunteer.last_name, + email: volunteer.email, + bio: volunteer.bio, + imageUrl: volunteer.image_url, + skills: skills, + approvedProjects: approvedProjects, + userType: "volunteer", + }; + } + + + + /** + * Register volunteer with their information in the database + * @param volunteerInfo + */ + static async register(volunteerInfo: { + email: string; + password: string; + firstName: string; + lastName: string; + imageUrl?: string; + bio: string; + skills: string[]; + userType: string; + }) { + const requiredInfo = [ + "email", + "password", + "firstName", + "lastName", + "bio", + "skills", + "userType", + ]; + try { + validateFields({ + required: requiredInfo, + obj: volunteerInfo, + location: "user registration", + }); + } catch (error) { + throw error; + } + + const existingVolunteer = await this.fetchVolunteerByEmail( + volunteerInfo.email + ); + if (existingVolunteer != null) { + throw new BadRequestError(`Duplicate email: ${volunteerInfo.email}`); + } + + const hashedPassword = await bcrypt.hash( + volunteerInfo.password, + BCRYPT_WORK_FACTOR + ); + const normalizedEmail = volunteerInfo.email.toLowerCase(); + + const query = `INSERT INTO volunteers( + email, + first_name, + last_name, + bio, + image_url + ) + VALUES ($1, $2, $3, $4, $5) + RETURNING id, + email, + first_name AS "firstName", + last_name AS "lastName", + bio, + image_url as "imageUrl"`; + + const result = await db.query(query, [ + normalizedEmail, + volunteerInfo.firstName, + volunteerInfo.lastName, + volunteerInfo.bio, + volunteerInfo.imageUrl || null, + ]); + + const { id, email, firstName, lastName, bio, imageUrl } = result.rows[0]; + + const queryPassword = `INSERT into authentication (email, password, user_type) + VALUES($1, $2, $3) RETURNING id, email, password,user_type as "userType"`; + + const passwordResult = await db.query(queryPassword, [ + normalizedEmail, + hashedPassword, + volunteerInfo.userType, + ]); + + const { userType } = passwordResult.rows[0]; + + volunteerInfo.skills.forEach((skill) => { + this.insertSkill(volunteerInfo.email, skill); + }); + console.log({ + id: id, + email: email, + firstName: firstName, + lastName: lastName, + imageUrl: imageUrl, + bio: bio, + skills: volunteerInfo.skills, + userType: userType, + }) + return { + id: id, + email: email, + firstName: firstName, + lastName: lastName, + imageUrl: imageUrl, + bio: bio, + skills: volunteerInfo.skills, + userType: userType, + }; + } + + /** + * Adds a skill corresponding with the volunteer in the volunteer_skills database + */ + + static async insertSkill(emailInput: string, skillInput: string) { + const query = `INSERT into volunteer_skills(email, skill) VALUES ($1, $2) RETURNING *`; + const result = await db.query(query, [emailInput, skillInput]); + } + + /** + * Gets all the skills logged for the volunteer + * @param email + */ + + static async fetchAllVolunteerSkills(email: string) { + const query = `SELECT skill FROM volunteer_skills WHERE email=$1`; + const result = await db.query(query, [email]); + const skills = []; + result.rows.forEach((row) => { + skills.push(row.skill); + }); + return skills; + } + + /** + * Get all the projects the volunteer has applied for or expressed interest in + * @param email + * @returns + */ + + static async getInterestedProjects(email: string) { + // retrieve all project ids for a given user + const query = `SELECT project_id FROM interested_volunteers WHERE email=$1`; + const result = await db.query(query, [email]); + // getting all interested projects + const interestedProjects = []; + + for await (const {project_id} of result.rows) { + // for each project id, retrieve the project object for a volunteer + const project = await Projects.fetchProjectByProjectId(project_id, "volunteer", email); + interestedProjects.push(project); + } + console.log("returning interseted projects: ", interestedProjects); + return interestedProjects; + } + + /** + * Get all the currently approved projects for a specific student + * @param email + * @returns + */ + + static async getApprovedProjects(email: string) { + const query = `SELECT project_id FROM interested_volunteers WHERE email=$1 AND approved=TRUE`; + const result = await db.query(query, [email]); + + if (result) { + return result.rows; + } + return null; + } + + /** + * Fetch a volunteer in the database by email + * @param email + * @returns volunteer if found, null if not + */ + + static async fetchVolunteerByEmail(email: string) { + const query = `SELECT * FROM volunteers WHERE email=$1`; + const result = await db.query(query, [email]); + const volunteer = result.rows[0]; + if (volunteer) { + return volunteer; + } + return null; + } + + // add a check to make sure that the user type IS volunteer (middleware). do the same for organization + + /** + * When a volunteer expresses interest in a project, log it into database + * @param projectId + * @param email + */ + static async expressInterest(projectId: number, email: string) { + const volunteerCheck = await this.expressedInterest(projectId, email); + // checks if interest is already expressed + if (volunteerCheck) { + throw new BadRequestError("Already expressed interest") + } + const volunteerCheck2 = await db.query(`SELECT * FROM volunteers WHERE email=$1`, [email]); + // checks if volunteer does not exists + if (volunteerCheck2.rows.length === 0) { + throw new UnauthorizedError; + } + + const query = ` INSERT into interested_volunteers(email, project_id, approved) + VALUES ($1,$2,$3) + RETURNING + email, + project_id as "projectId", + approved`; + const result = await db.query(query, [email, projectId, null]); + return true ; + } + static async expressUninterest(projectId: number, email: string) { + // first check if user hasn't already expressed interest + const existingInterestedVolunteer = await db.query( + `SELECT * FROM interested_volunteers WHERE email=$1`, [email] + ) + if (existingInterestedVolunteer.rows > 0) { + throw new BadRequestError("User is already not interested") + } + // then remove volunteer from table + const query = ` DELETE FROM interested_volunteers + WHERE project_id=$1 AND email=$2`; + + const result = await db.query(query, [projectId, email]); + return true; + } + + /** + * + * @param email + * @returns ranked projects based on a volunteers skills tags + */ + static async getVolunteersProjectFeed(email: string) { + + // needs error catching to avoid server breaking (long-term: needs code refactoring) + const projects = {}; // projects is an with id : {project} pairs to avoid duplicates + const volunteerSkills = await this.fetchAllVolunteerSkills(email); + console.log("getting skills for each project") + await Promise.all( + volunteerSkills.map(async (tag: string) => { + const tagProjects = await Projects.getProjectsWithTag(tag, email); + console.log(tagProjects) + tagProjects.forEach((project) => { + projects[project.id] = project; // updating object with new unqiue project + }); + }) + ) + + // add remaing projects to the end + const remainingProjects = await Projects.getAllProjects() + console.log("found remaining Projects: ", remainingProjects); + remainingProjects.forEach((remainingProject) => { + if (!(remainingProject.id in projects)){ + projects[remainingProject.id] = remainingProject; + } + }) + + // converts object into array and filters projects by active status ONLY + console.log("projects retrieved: ", Array.from(Object.values(projects))) + const activeOnlyProjects = Array.from(Object.values(projects)).filter((project : VolunteerProjectProp) => project.active === true) + return activeOnlyProjects; + //return activeOnlyProjects; + + } + + + + +/** + * Returns a boolean indicating whether a volunteer has expressed interest in a specific project + * @param projectId + * @param email + * @returns boolean + */ +static async expressedInterest(projectId:number, email:string){ + const query = `SELECT * FROM interested_volunteers WHERE email=$1 AND project_id=$2`; + const result = await db.query(query, [email, projectId]); + if (result.rows[0]){ + return true; + } + return false; +} +static async fetchProjectApproval(projectId : number, email: string){ + const query = `SELECT approved FROM interested_volunteers WHERE email=$1 AND project_id=$2`; + const result = await db.query(query, [email, projectId]); + if (result.rows.length > 0){ + return result.rows[0].approved + } else{ + return false + } +} +/** + * Returns a boolean indicating whether a volunteer was approved for a specific project + * @param projectId + * @param email + * @returns boolean + * @throws BadRequestError + */ + +static async checkStatusProject(projectId:number, email:string){ + const query = `SELECT * FROM interested_volunteers WHERE email=$1 AND project_id=$2`; + const result = await db.query(query, [email, projectId]); + if (result.rows[0]){ + return result.rows[0].approved; + } + throw new BadRequestError(`${email} has not expressed interest in project ${projectId}`); +} + +/** + * returns volunteer info from the volunteers table + * @param email email of the volunteer + * @returns all columns from the volunteer table + */ +static async getVolunteerByEmail(email : string){ + const query = `SELECT + id, + bio, + email, + first_name as "firstName", + last_name as "lastName", + image_url as "imageUrl" + + FROM volunteers + WHERE email=$1`; + const result = await db.query(query, [email]); + + console.log("fetching volunteer by email: ", result.rows) + if (result.rows.length > 0){ + return result.rows[0]; + } + throw new BadRequestError(`no volunteer exists with the following email: ${email}`); + +} + +} \ No newline at end of file diff --git a/volunteerverse-api/src/routes/auth.ts b/volunteerverse-api/src/routes/auth.ts new file mode 100644 index 00000000..8840a20f --- /dev/null +++ b/volunteerverse-api/src/routes/auth.ts @@ -0,0 +1,70 @@ +/** Routes for authentication. */ + +import express from "express" +import { Volunteer } from "../models/volunteer" +import { Organization } from "../models/organization" +import { createUserJwt } from "../utils/token" +import { Auth } from "../models/auth" +import {requireAuthenticatedUser} from "../middleware/security" + + +export const authRoutes = express.Router() + + +authRoutes.post("/register", async function(req, res, next){ + console.log('eday') + try { + const {userType: user_type} = req.body + console.log(user_type) + if (user_type=="volunteer"){ + const volunteer = await Volunteer.register(req.body) + const token = createUserJwt(volunteer) + console.log(token) + console.log('edayy') + return res.status(201).json({user: volunteer, token: token}) + } + else if (user_type=="organization"){ + const organization = await Organization.register(req.body) + const token = createUserJwt(organization) + return res.status(201).json({user: organization, token: token}) + } + } catch (error) { + next(error) + } +}) + +authRoutes.post("/login", async function( req, res, next){ + try{ + const {email, password} = req.body + let user = await Auth.authenticate({email:email, password:password}) + + if(user){ + console.log(user) + const token = createUserJwt(user); + return res.status(201).json({user, token}); + } + + } catch (error){ + next(error) + } + +}) + + +authRoutes.get("/me", requireAuthenticatedUser, async (request, response, next) => { + // request header should contain auth token + try { + const { user } = response.locals; + if (user) { + response.status(200).json({ user: user }); + } else{ + console.log("no user found from repsonse locals: ", response.locals) + next(); + } + } catch (error) { + console.log("unexpected error occured: ", error) + next(error) + } +}); + + diff --git a/volunteerverse-api/src/routes/organization.ts b/volunteerverse-api/src/routes/organization.ts new file mode 100644 index 00000000..efe023c3 --- /dev/null +++ b/volunteerverse-api/src/routes/organization.ts @@ -0,0 +1,116 @@ +/** Routes for authentication. */ +import express from "express"; +import { Organization } from "../models/organization" + +const organizationRoutes = express.Router() + + +//make get? request that returns information from database +organizationRoutes.get("/projects", async function(req,res,next){ + // const org_id = parseInt(req.params.org_id) + const{id} = res.locals.user + const result = await Organization.fetchAllOrganizationProjectsById(id) + if (result) { + res.status(201).json({orgProjects: result}) + } else { + res.status(404).json( { error: 'Project not found' } ) + } + +}) + +/**route that returns project information given the project id */ +// projectRoutes.get("/:projectId", async function (req, res, next){ +// const projectId = parseInt(req.params.projectId) +// const project = await Projects.fetchProjectByProjectId(projectId) +// if (project) { +// res.status(201).json(project) +// } else { +// res.status(404).json( { error: 'Project not found' } ) +// } +// }) + +//make post request that stores organization's projects in database +// organizationRoutes.post("/project/create", async function(req,res,next){ +// const {projectInfo} = req.body +// console.log("project info: ", projectInfo) +// const result = await Organization.createOrganizationProject(projectInfo) +// res.json({projectInfo: result}) +// }) + +// organizationRoutes.post("/project/update", async function(req,res,next){ +// try{ +// const {approved, email, project_id, org_id} = req.body +// const result = await Organization.updateApprovedVolunteers(approved, email, project_id, org_id) +// console.log("updateApproved" ,result) +// res.json({approvedVolunteer: result}) +// }catch (error) { +// next(error); +// } + +// }) + +organizationRoutes.put("/project/status/:projectId", async function(req,res,next){ + try{ + const { id } = res.locals.user + const projectId = parseInt(req.params.projectId) + const result = await Organization.toggleStateOfOrgProject(projectId, id) + res.json({active : result}) + }catch (error) { + next(error); + } +}) +organizationRoutes.put("/project/:projectId", async function(req,res,next){ + console.log('whyy') + try{ + const projectId = parseInt(req.params.projectId) + const { id } = res.locals.user + const { email, initial } = req.body + const result = await Organization.incrementAndDecrementApprovedVolunteers(email, projectId, id, initial) + console.log("updateApproved" ,result) + res.json({approved: result}) + }catch (error) { + next(error); + } + +}) + + + +organizationRoutes.delete("/project/:projectId", async function(req,res,next){ + const { id } = res.locals.user + const projectId = parseInt(req.params.projectId) + console.log("project id: ", projectId) + const result = await Organization.deleteOrganizationProject(projectId, id) + res.json({deleteProject: result}) +}) + + + +organizationRoutes.get("/project/interested/:projectId", async function (req, res, next) { + //req.body is what we put in insomnia when we test which to equate to what we put in the browser + //that then goes into the function below + const projectId = parseInt(req.params.projectId) + console.log("this is the req.body", req.params.projectId); +const result = await Organization.fetchInterestedVolunteersByProjectId(projectId); + if (result) { + res.status(201).json({ interestedVolunteers: result }) + } else { + res.status(404).json( { error: 'Project not found' } ) + } +}); +organizationRoutes.get("/project/interested/count/:projectId", async function (req, res, next) { + //req.body is what we put in insomnia when we test which to equate to what we put in the browser + //that then goes into the function below + const projectId = parseInt(req.params.projectId) + console.log("this is the req.body", req.params.projectId); +const result = await Organization.fetchInterestedVolunteersByProjectId(projectId); + if (result) { + res.status(201).json({ count: result.length }) + } else { + res.status(404).json( { error: 'Project not found' } ) + } +}); + + + +export {organizationRoutes} diff --git a/volunteerverse-api/src/routes/projects.ts b/volunteerverse-api/src/routes/projects.ts new file mode 100644 index 00000000..0061d0e0 --- /dev/null +++ b/volunteerverse-api/src/routes/projects.ts @@ -0,0 +1,117 @@ +/** Routes for the project model */ + +import express from "express"; +import { Projects } from "../models/projects"; +import { requireAuthenticatedUser } from "../middleware/security"; +import qs from "qs"; + + +export const projectRoutes = express.Router(); + + + + +projectRoutes.post("/register", requireAuthenticatedUser, async function (req, res, next){ + try{ + const {id} = res.locals.user + console.log(id) + console.log("req.body", req.body) + console.log("getting here") + const project = await Projects.registerProject({...req.body, orgId: id}) + return res.status(201).json(project) + } catch (error){ + next(error) + } +}) + + + + +/** route that gets all the project tags in database */ +projectRoutes.get("/tags", async function (req, res, next) { + try { + let tags = await Projects.getAllProjectTags(); + tags = tags.length > 0 ? tags : ["HTML", "CSS", "Frontend", "Backend", "Python",] + console.log("sending tags: ", tags) + res.status(201).json({ tags: tags }); + } catch (error) { + next(error); + } +}); + + /**route that filters projects based on query and tags */ + projectRoutes.get("/searchfilter/", requireAuthenticatedUser, + async function (req,res, next){ + const { query, tags } = req.query; + const { email } = res.locals.user; + // Convert 'tags' to an array using split and filter + const tagsArray = typeof tags === 'string' ? tags.split(',').filter(tag => tag.trim() !== '') : []; + // Ensure 'query' is treated as a string + const queryString = typeof query === 'string' ? query : ''; + try { + const projects = await Projects.searchFilteredProjects(tagsArray, queryString, email); + + res.json(projects); + } catch (error) { + res.status(500).json({ error: 'Error fetching projects' }); + } + + }) + +/**route that gets all projects with given tag */ +projectRoutes.get( + "/tag/:tag_name", + requireAuthenticatedUser, + async function (req, res, next) { + const tag = req.params.tag_name; + const { user_type, email } = res.locals.user; + const projects = await Projects.getProjectsWithTag(tag, email); + if (projects) { + res.status(201).json(projects); + } else { + res.status(404).json({ error: "Projects with given tag not found" }); + } + } + ); + + /**route that handles searching by a term */ + projectRoutes.get( + "/search/:searchTerm", + requireAuthenticatedUser, + async function (req, res, next) { + const search = req.params.searchTerm; + const { email } = res.locals.user; + try { + const projects = await Projects.searchProjects(search, email); + res.status(201).json(projects); + } catch (error) { + next(error); + } + } + ); + /**route that returns project information given the project id */ + projectRoutes.get( + "/:projectId", + requireAuthenticatedUser, + async function (req, res, next) { + const projectId = parseInt(req.params.projectId); + const { userType, email } = res.locals.user; + console.log("USERTYPE", userType); + try { + const project = await Projects.fetchProjectByProjectId( + projectId, + userType, + email + ); + res.status(201).json(project); + } catch (error) { + next(error); + } + } + ); + + + + + + \ No newline at end of file diff --git a/volunteerverse-api/src/routes/volunteer.ts b/volunteerverse-api/src/routes/volunteer.ts new file mode 100644 index 00000000..ade25c4c --- /dev/null +++ b/volunteerverse-api/src/routes/volunteer.ts @@ -0,0 +1,67 @@ +/** Routes for authentication. */ +import express from "express"; +import { Volunteer } from "../models/volunteer"; +import { BadRequestError } from "../utils/errors"; + +const volunteerRoutes = express.Router(); + +/** Route that fetches all the skills for the logged in volunteer */ +volunteerRoutes.get("/skills", async function (req, res, next) { + const { email } = res.locals.user; + try { + const result = await Volunteer.fetchAllVolunteerSkills(email); + res.status(200).json({skills: result}); + } catch (error) { + next(error); + } +}); + +/** Route that handles when a volunteer expresses interest in a project - adds it to database */ +volunteerRoutes.put("/interest/:projectId", async function (req, res, next) { + try { + const projectId = parseInt(req.params.projectId); + const {email, userType } = res.locals.user; + const { mode } = req.body; + if (mode === undefined) throw new BadRequestError("No mode found in request body") + console.log("EMAIL VALUE IN VOLUNTEER: ", email); + console.log("request body: ", req.body) + if (mode === "add"){ + console.log("adding interest") + const result = await Volunteer.expressInterest(projectId, email); + res.status(200).json(result); + + }else if (mode === "remove"){ + console.log("removing interest") + const result = await Volunteer.expressUninterest(projectId, email); + res.status(200).json(result); + } + } catch (error) { + next(error); + } +}); + +/** Route that returns the project feed for a volunteer */ +volunteerRoutes.get("/projects", async function (req, res, next) { + const { email } = res.locals.user; + + try{ + const result = await Volunteer.getVolunteersProjectFeed(email); + res.status(200).json(result) + } catch (error){ + console.log("sending error") + next (error) + } +}); +/** Route that returns the project feed for a volunteer */ +volunteerRoutes.get("/projects/interested", async function (req, res, next) { + const { email } = res.locals.user; + try{ + const result = await Volunteer.getInterestedProjects(email); + res.status(200).json(result) + } catch (error){ + console.log("sending error") + next (error) + } +}); + +export { volunteerRoutes }; diff --git a/volunteerverse-api/src/utils/errors.ts b/volunteerverse-api/src/utils/errors.ts new file mode 100644 index 00000000..bc559a7b --- /dev/null +++ b/volunteerverse-api/src/utils/errors.ts @@ -0,0 +1,54 @@ +export class ExpressError extends Error { + public message: string; + public status: number; + + constructor(message: string, status: number) { + super(); + this.message = message; + this.status = status; + } +} + +/** 400 BAD REQUEST error. */ + +export class BadRequestError extends ExpressError { + constructor(message = "Bad Request") { + super(message, 400) + } +} + +/** 401 UNAUTHORIZED error. */ + +export class UnauthorizedError extends ExpressError { + constructor(message = "Unauthorized") { + super(message, 401) + } +} + +/** 403 Forbidden error. */ + +export class ForbiddenError extends ExpressError { + constructor(message = "Forbidden") { + super(message, 403) + } +} + +/** 404 NOT FOUND error. */ + +export class NotFoundError extends ExpressError { + constructor(message = "Not Found") { + super(message, 404) + } +} + +/** 422 Unprocessable Entity error */ + +export class UnprocessableEntityError extends ExpressError { + constructor(message = "Unprocessable Entity") { + super(message, 422) + } + } + + + + diff --git a/volunteerverse-api/src/utils/token.ts b/volunteerverse-api/src/utils/token.ts new file mode 100644 index 00000000..c8afd537 --- /dev/null +++ b/volunteerverse-api/src/utils/token.ts @@ -0,0 +1,44 @@ +import jwt from "jsonwebtoken" +import { SECRET_KEY } from "../config" +import { validateFields } from "./validate" + +export interface VolunteerUserProp{ + id: number, + email: string, + firstName: string, + lastName: string, + imageUrl: string, + bio: string, + skills: string[], + userType: "volunteer", +} +export interface OrgUserProp{ + id: number, + email: string, + orgName: string, + orgDescription: string, + logoUrl: string, + founders: string, + userType: "organization", + orgWebsite: string, +} + +export const generateToken = (data: any) => { + const token = jwt.sign(data, SECRET_KEY); + return token; + } + +export const createUserJwt = (user : VolunteerUserProp | OrgUserProp) => { + validateFields({required:["id", "email", "userType"], obj:user, location:"token generation"}) + console.log(user) + return generateToken(user) +} + +export const validateToken = (token) => { + try{ + const decoded = jwt.verify(token, SECRET_KEY) + return decoded + } catch (error){ + return {} + } +} \ No newline at end of file diff --git a/volunteerverse-api/src/utils/validate.ts b/volunteerverse-api/src/utils/validate.ts new file mode 100644 index 00000000..b2f18be4 --- /dev/null +++ b/volunteerverse-api/src/utils/validate.ts @@ -0,0 +1,25 @@ +import { UnprocessableEntityError } from "./errors"; + +const isNil = (value: any): boolean => + value === null || typeof value === "undefined" || String(value).trim() === ""; + +interface ValidateFieldsOptions { + required: string[]; + obj: Record; + location?: string; +} + +const validateFields = ({ required, obj, location }: ValidateFieldsOptions): void => { + + if (!obj) throw new UnprocessableEntityError(`Missing object for validation.`); + required.forEach((item) => { + console.log("item: ", obj[item]) + if (isNil(obj[item])) { + throw new UnprocessableEntityError( + `Required field - ${item} missing${location ? ` at ${location}` : ""}` + ); + } + }); +}; + +export { validateFields, isNil }; diff --git a/volunteerverse-api/tests/common.ts b/volunteerverse-api/tests/common.ts new file mode 100644 index 00000000..e69de29b diff --git a/volunteerverse-api/tsconfig.build.json b/volunteerverse-api/tsconfig.build.json new file mode 100644 index 00000000..0705a641 --- /dev/null +++ b/volunteerverse-api/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "exclude": ["**/*.test.*", "**/__mocks__/*", "**/__tests__/*"] + } \ No newline at end of file diff --git a/volunteerverse-api/tsconfig.json b/volunteerverse-api/tsconfig.json new file mode 100644 index 00000000..8370ce3d --- /dev/null +++ b/volunteerverse-api/tsconfig.json @@ -0,0 +1,17 @@ + +{ + "compilerOptions": { + "module": "commonjs", + "esModuleInterop": true, + "target": "es2017", + "moduleResolution": "node", + "sourceMap": true, + "outDir": "dist", + "baseUrl": "", + "paths": { + "*": ["node_modules/*"] + } + }, + "lib": ["es2015"] +} + diff --git a/volunteerverse-api/volunteerverse-schema.sql b/volunteerverse-api/volunteerverse-schema.sql new file mode 100644 index 00000000..c961e18d --- /dev/null +++ b/volunteerverse-api/volunteerverse-schema.sql @@ -0,0 +1,67 @@ +CREATE TABLE volunteers( + id SERIAL PRIMARY KEY, + email TEXT NOT NULL UNIQUE CHECK (position('@' IN email) > 1), + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + bio TEXT NOT NULL, + image_url TEXT +); + +CREATE TABLE organizations( + id SERIAL PRIMARY KEY, + organization_name VARCHAR(255), + organization_description TEXT, + organization_email TEXT NOT NULL UNIQUE CHECK (position('@' IN organization_email) > 1), + public_email TEXT NOT NULL UNIQUE CHECK (position('@' IN public_email) > 1), + public_number TEXT DEFAULT NULL, + logo_url TEXT NOT NULL, + founders TEXT NOT NULL, + website TEXT +); + +CREATE TABLE volunteer_skills( + id SERIAL PRIMARY KEY, + email TEXT NOT NULL CHECK (position('@' IN email) > 1), + skill TEXT NOT NULL, + FOREIGN KEY (email) REFERENCES volunteers (email) +); + +CREATE TABLE projects( + id SERIAL PRIMARY KEY, + org_id INTEGER, + org_name TEXT NOT NULL, + project_name TEXT NOT NULL UNIQUE, + project_description TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + image_url TEXT, + requested_people INTEGER, + approved_people INTEGER DEFAULT 0 CHECK (approved_people >= 0), + active BOOLEAN DEFAULT TRUE, + external BOOLEAN DEFAULT FALSE, + public_email TEXT NOT NULL CHECK (position('@' IN public_email) > 1), + external_link TEXT, + public_number TEXT, + website TEXT +); + +CREATE TABLE interested_volunteers( + id SERIAL PRIMARY KEY, + email TEXT NOT NULL CHECK (position('@' IN email) > 1), + project_id INTEGER, + approved BOOLEAN DEFAULT NULL +); + +CREATE TABLE project_tags( + id SERIAL PRIMARY KEY, + project_id INTEGER, + project_name TEXT, + tag_name TEXT NOT NULL + +); + +CREATE TABLE authentication( + id SERIAL PRIMARY KEY, + email TEXT NOT NULL UNIQUE CHECK (position('@' IN email) > 1), + password TEXT NOT NULL, + user_type TEXT NOT NULL +); diff --git a/volunteerverse-api/volunteerverse.sql b/volunteerverse-api/volunteerverse.sql new file mode 100644 index 00000000..95aab5b6 --- /dev/null +++ b/volunteerverse-api/volunteerverse.sql @@ -0,0 +1,14 @@ +\echo 'Delete and recreate VolunteerVerse database?' +\prompt 'Return for yes or control-C to cancel >' + + +SELECT pg_terminate_backend(pg_stat_activity.pid) +FROM pg_stat_activity +WHERE pg_stat_activity.datname = 'volunteerverse'; + + +DROP DATABASE IF EXISTS volunteerverse; +CREATE DATABASE volunteerverse; +\connect volunteerverse + +\i volunteerverse-schema.sql \ No newline at end of file diff --git a/volunteerverse-api/yarn.lock b/volunteerverse-api/yarn.lock new file mode 100644 index 00000000..ac2d4600 --- /dev/null +++ b/volunteerverse-api/yarn.lock @@ -0,0 +1,5376 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.22.9", "@babel/core@^7.4.0-0", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz" + integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.8.4": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.3.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.0": + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz" + integrity sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + slash "^3.0.0" + +"@jest/core@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz" + integrity sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ== + dependencies: + "@jest/console" "^29.6.1" + "@jest/reporters" "^29.6.1" + "@jest/test-result" "^29.6.1" + "@jest/transform" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.6.1" + jest-haste-map "^29.6.1" + jest-message-util "^29.6.1" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.1" + jest-resolve-dependencies "^29.6.1" + jest-runner "^29.6.1" + jest-runtime "^29.6.1" + jest-snapshot "^29.6.1" + jest-util "^29.6.1" + jest-validate "^29.6.1" + jest-watcher "^29.6.1" + micromatch "^4.0.4" + pretty-format "^29.6.1" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz" + integrity sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A== + dependencies: + "@jest/fake-timers" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.1" + +"@jest/expect-utils@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz" + integrity sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz" + integrity sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg== + dependencies: + expect "^29.6.1" + jest-snapshot "^29.6.1" + +"@jest/fake-timers@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz" + integrity sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg== + dependencies: + "@jest/types" "^29.6.1" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.1" + jest-mock "^29.6.1" + jest-util "^29.6.1" + +"@jest/globals@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz" + integrity sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A== + dependencies: + "@jest/environment" "^29.6.1" + "@jest/expect" "^29.6.1" + "@jest/types" "^29.6.1" + jest-mock "^29.6.1" + +"@jest/reporters@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz" + integrity sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.1" + "@jest/test-result" "^29.6.1" + "@jest/transform" "^29.6.1" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + jest-worker "^29.6.1" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.0": + version "29.6.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz" + integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz" + integrity sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw== + dependencies: + "@jest/console" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz" + integrity sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg== + dependencies: + "@jest/test-result" "^29.6.1" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.1" + slash "^3.0.0" + +"@jest/transform@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz" + integrity sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.1" + jest-regex-util "^29.4.3" + jest-util "^29.6.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.0.0", "@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@mapbox/node-pre-gyp@^1.0.10": + version "1.0.10" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@puppeteer/browsers@1.4.6": + version "1.4.6" + resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz" + integrity sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ== + dependencies: + debug "4.3.4" + extract-zip "2.0.1" + progress "2.0.3" + proxy-agent "6.3.0" + tar-fs "3.0.4" + unbzip2-stream "1.4.3" + yargs "17.7.1" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/bcrypt@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz" + integrity sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + +"@types/cors@^2.8.13": + version "2.8.13" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.17": + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.3": + version "29.5.3" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz" + integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.11": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/mime@*", "@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/morgan@^1.9.4": + version "1.9.4" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz" + integrity sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^20.4.2": + version "20.4.2" + resolved "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== + +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.2" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/superagent@*": + version "4.1.18" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz" + integrity sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== + dependencies: + "@types/superagent" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz" + integrity sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A== + dependencies: + "@eslint-community/regexpp" "^4.5.0" + "@typescript-eslint/scope-manager" "6.0.0" + "@typescript-eslint/type-utils" "6.0.0" + "@typescript-eslint/utils" "6.0.0" + "@typescript-eslint/visitor-keys" "6.0.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + natural-compare-lite "^1.4.0" + semver "^7.5.0" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz" + integrity sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg== + dependencies: + "@typescript-eslint/scope-manager" "6.0.0" + "@typescript-eslint/types" "6.0.0" + "@typescript-eslint/typescript-estree" "6.0.0" + "@typescript-eslint/visitor-keys" "6.0.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz" + integrity sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg== + dependencies: + "@typescript-eslint/types" "6.0.0" + "@typescript-eslint/visitor-keys" "6.0.0" + +"@typescript-eslint/type-utils@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz" + integrity sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ== + dependencies: + "@typescript-eslint/typescript-estree" "6.0.0" + "@typescript-eslint/utils" "6.0.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz" + integrity sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg== + +"@typescript-eslint/typescript-estree@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz" + integrity sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ== + dependencies: + "@typescript-eslint/types" "6.0.0" + "@typescript-eslint/visitor-keys" "6.0.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.0" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz" + integrity sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ== + dependencies: + "@eslint-community/eslint-utils" "^4.3.0" + "@types/json-schema" "^7.0.11" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "6.0.0" + "@typescript-eslint/types" "6.0.0" + "@typescript-eslint/typescript-estree" "6.0.0" + eslint-scope "^5.1.1" + semver "^7.5.0" + +"@typescript-eslint/visitor-keys@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz" + integrity sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA== + dependencies: + "@typescript-eslint/types" "6.0.0" + eslint-visitor-keys "^3.4.1" + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.7: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +agent-base@^7.0.1: + version "7.1.0" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +agent-base@^7.0.2: + version "7.1.0" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + +babel-jest@^29.0.0, babel-jest@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz" + integrity sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A== + dependencies: + "@jest/transform" "^29.6.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + +bcrypt@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz" + integrity sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.10" + node-addon-api "^5.0.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.9, "browserslist@>= 4.21.0": + version "4.21.9" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer@^5.2.1: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001503: + version "1.0.30001515" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chokidar@^3.5.1, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-bidi@0.4.16: + version "0.4.16" + resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz" + integrity sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA== + dependencies: + mitt "3.0.0" + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookiejar@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + dependencies: + browserslist "^4.21.9" + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +devtools-protocol@*, devtools-protocol@0.0.1147663: + version "0.0.1147663" + resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz" + integrity sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ== + +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" + integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== + dependencies: + xtend "^4.0.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.431: + version "1.4.460" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.460.tgz" + integrity sha512-kKiHnbrHME7z8E6AYaw0ehyxY5+hdaRmeUbjBO22LZMdqTYCO29EvF0T1cQ3pJ1RN5fyMcHl1Lmcsdt9WWJpJQ== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.44.0: + version "8.44.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz" + integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz" + integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz" + integrity sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g== + dependencies: + "@jest/expect-utils" "^29.6.1" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.1" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz" + integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== + +fast-glob@^3.2.9: + version "3.3.0" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + dependencies: + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" + fs-extra "^8.1.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@~1.7.2, http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz" + integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@2, inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ip@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz" + integrity sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ== + dependencies: + "@jest/environment" "^29.6.1" + "@jest/expect" "^29.6.1" + "@jest/test-result" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.6.1" + jest-matcher-utils "^29.6.1" + jest-message-util "^29.6.1" + jest-runtime "^29.6.1" + jest-snapshot "^29.6.1" + jest-util "^29.6.1" + p-limit "^3.1.0" + pretty-format "^29.6.1" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz" + integrity sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing== + dependencies: + "@jest/core" "^29.6.1" + "@jest/test-result" "^29.6.1" + "@jest/types" "^29.6.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.6.1" + jest-util "^29.6.1" + jest-validate "^29.6.1" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz" + integrity sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.6.1" + "@jest/types" "^29.6.1" + babel-jest "^29.6.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.6.1" + jest-environment-node "^29.6.1" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.1" + jest-runner "^29.6.1" + jest-util "^29.6.1" + jest-validate "^29.6.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz" + integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz" + integrity sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ== + dependencies: + "@jest/types" "^29.6.1" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.6.1" + pretty-format "^29.6.1" + +jest-environment-node@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz" + integrity sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ== + dependencies: + "@jest/environment" "^29.6.1" + "@jest/fake-timers" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.1" + jest-util "^29.6.1" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz" + integrity sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig== + dependencies: + "@jest/types" "^29.6.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.6.1" + jest-worker "^29.6.1" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz" + integrity sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-matcher-utils@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz" + integrity sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.1" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-message-util@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz" + integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz" + integrity sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-util "^29.6.1" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz" + integrity sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.1" + +jest-resolve@*, jest-resolve@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz" + integrity sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.1" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.1" + jest-validate "^29.6.1" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz" + integrity sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ== + dependencies: + "@jest/console" "^29.6.1" + "@jest/environment" "^29.6.1" + "@jest/test-result" "^29.6.1" + "@jest/transform" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.6.1" + jest-haste-map "^29.6.1" + jest-leak-detector "^29.6.1" + jest-message-util "^29.6.1" + jest-resolve "^29.6.1" + jest-runtime "^29.6.1" + jest-util "^29.6.1" + jest-watcher "^29.6.1" + jest-worker "^29.6.1" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz" + integrity sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ== + dependencies: + "@jest/environment" "^29.6.1" + "@jest/fake-timers" "^29.6.1" + "@jest/globals" "^29.6.1" + "@jest/source-map" "^29.6.0" + "@jest/test-result" "^29.6.1" + "@jest/transform" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.1" + jest-message-util "^29.6.1" + jest-mock "^29.6.1" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.1" + jest-snapshot "^29.6.1" + jest-util "^29.6.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz" + integrity sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.6.1" + "@jest/transform" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.1" + graceful-fs "^4.2.9" + jest-diff "^29.6.1" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.1" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + natural-compare "^1.4.0" + pretty-format "^29.6.1" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz" + integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz" + integrity sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA== + dependencies: + "@jest/types" "^29.6.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.6.1" + +jest-watcher@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz" + integrity sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA== + dependencies: + "@jest/test-result" "^29.6.1" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.1" + string-length "^4.0.1" + +jest-worker@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz" + integrity sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA== + dependencies: + "@types/node" "*" + jest-util "^29.6.1" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.0.0, jest@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz" + integrity sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw== + dependencies: + "@jest/core" "^29.6.1" + "@jest/types" "^29.6.1" + import-local "^3.0.2" + jest-cli "^29.6.1" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonwebtoken@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz" + integrity sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +make-dir@^3.0.0, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1, make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mitt@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +nodemon@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz" + integrity sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +object-assign@^4, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz" + integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.1" + +pac-resolver@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz" + integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== + dependencies: + degenerator "^5.0.0" + ip "^1.1.8" + netmask "^2.0.2" + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + +pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.11.1, pg@>=8.0: + version "8.11.1" + resolved "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz" + integrity sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.1" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^29.0.0, pretty-format@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +progress@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz" + integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@20.9.0: + version "20.9.0" + resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz" + integrity sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg== + dependencies: + "@puppeteer/browsers" "1.4.6" + chromium-bidi "0.4.16" + cross-fetch "4.0.0" + debug "4.3.4" + devtools-protocol "0.0.1147663" + ws "8.13.0" + +puppeteer@^20.9.0: + version "20.9.0" + resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz" + integrity sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw== + dependencies: + "@puppeteer/browsers" "1.4.6" + cosmiconfig "8.2.0" + puppeteer-core "20.9.0" + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + +qs@^6.11.0: + version "6.11.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-icons@^4.10.1: + version "4.10.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz" + integrity sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react@*: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.0.0, resolve@^1.14.2, resolve@^1.20.0: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.0.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.3.8, semver@^7.5.0, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz" + integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + dependencies: + agent-base "^7.0.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-support@^0.5.12, source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamx@^2.15.0: + version "2.15.0" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz" + integrity sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superagent@^8.0.5: + version "8.0.9" + resolved "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz" + integrity sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.4" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.1.2" + methods "^1.1.2" + mime "2.6.0" + qs "^6.11.0" + semver "^7.3.8" + +supertest@^6.3.3: + version "6.3.3" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz" + integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== + dependencies: + methods "^1.1.2" + superagent "^8.0.5" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar-fs@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz" + integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== + dependencies: + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^3.1.5" + +tar-stream@^3.1.5: + version "3.1.6" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +tar@^6.1.11: + version "6.1.15" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-api-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz" + integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== + +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +ts-node-dev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz" + integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== + dependencies: + chokidar "^3.5.1" + dynamic-dedupe "^0.3.0" + minimist "^1.2.6" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^10.4.0" + tsconfig "^7.0.0" + +ts-node@^10.4.0, ts-node@>=9.0.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^2.0.1: + version "2.6.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@*, typescript@^5.1.6, "typescript@>= 4.7.4", typescript@>=2.7, typescript@>=4.2.0, "typescript@>=4.3 <6": + version "5.1.6" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@17.7.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/volunteerverse-ui/.eslintrc.cjs b/volunteerverse-ui/.eslintrc.cjs new file mode 100644 index 00000000..1dc7153b --- /dev/null +++ b/volunteerverse-ui/.eslintrc.cjs @@ -0,0 +1,27 @@ +/* eslint-env node */ + +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: true, + tsconfigRootDir: __dirname, + }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + '@typescript-eslint/no-non-null-assertion': 'off', + }, +} diff --git a/volunteerverse-ui/.firebase/hosting.ZGlzdA.cache b/volunteerverse-ui/.firebase/hosting.ZGlzdA.cache new file mode 100644 index 00000000..3b3d1a5d --- /dev/null +++ b/volunteerverse-ui/.firebase/hosting.ZGlzdA.cache @@ -0,0 +1,8 @@ +404.html,1691633333849,05cbc6f94d7a69ce2e29646eab13be2c884e61ba93e3094df5028866876d18b3 +index.html,1691633334270,78ab0995867afca63d717ea3b1289d4cc8264a41756050b635894fdae87458ba +vite.svg,1691633333851,d3bbbc44b3ea71906a72bf2ec1a4716903e2e3d9f85a5007205a65d1f12e2923 +assets/index-b1d2d21a.css,1691633334270,57694fb174465cdb6de6b66951e1704e468fb24c236f33732b797f5bade43971 +assets/floatingStudent-50f13e12.png,1691633334270,0df62bbd32b20c60b832015b5c4f8f35517bfce062e7c82245dcf72632a553ef +assets/team-7718e4ae.png,1691633334270,53f543c96f346293b116c552108429fcd0affecf914cfed6c990c242bd703ac7 +assets/Logo-223cb78a.png,1691633334270,50bdea645b7f65aa6f8627180151785f98db608f569a66cc7154cadc75cf9f28 +assets/index-df23940d.js,1691633334270,ecd306aff50b464900a20b7475830ee17fb206561c6e7ba7ed07135519be8c94 diff --git a/volunteerverse-ui/.firebase/hosting.cHVibGlj.cache b/volunteerverse-ui/.firebase/hosting.cHVibGlj.cache new file mode 100644 index 00000000..b35157f7 --- /dev/null +++ b/volunteerverse-ui/.firebase/hosting.cHVibGlj.cache @@ -0,0 +1,3 @@ +404.html,1691437038431,05cbc6f94d7a69ce2e29646eab13be2c884e61ba93e3094df5028866876d18b3 +vite.svg,1691437038432,d3bbbc44b3ea71906a72bf2ec1a4716903e2e3d9f85a5007205a65d1f12e2923 +index.html,1691437038432,a4d225bcbbb1e69b12418f41c308e386df8ee858faad4a90e6c75b35d8081665 diff --git a/volunteerverse-ui/.firebaserc b/volunteerverse-ui/.firebaserc new file mode 100644 index 00000000..bc2b04ba --- /dev/null +++ b/volunteerverse-ui/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "volunteerverse-3b6b2" + } +} diff --git a/volunteerverse-ui/.gitignore b/volunteerverse-ui/.gitignore new file mode 100644 index 00000000..83e1c004 --- /dev/null +++ b/volunteerverse-ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +.env +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/volunteerverse-ui/404.html b/volunteerverse-ui/404.html new file mode 100644 index 00000000..829eda8f --- /dev/null +++ b/volunteerverse-ui/404.html @@ -0,0 +1,33 @@ + + + + + + Page Not Found + + + + +
+

404

+

Page Not Found

+

The specified file was not found on this website. Please check the URL for mistakes and try again.

+

Why am I seeing this?

+

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

+
+ + diff --git a/volunteerverse-ui/constants.ts b/volunteerverse-ui/constants.ts new file mode 100644 index 00000000..ac012ba1 --- /dev/null +++ b/volunteerverse-ui/constants.ts @@ -0,0 +1,5 @@ +const PRODUCTION_API_BASE_URL = "https://volunteerverse-backend.onrender.com"; +// const PRODUCTION_API_BASE_URL = undefined; +const DEVELOPMENT_API_BASE_URL = "http://localhost:3001"; + +export const API_BASE_URL = PRODUCTION_API_BASE_URL || DEVELOPMENT_API_BASE_URL; diff --git a/volunteerverse-ui/firebase.json b/volunteerverse-ui/firebase.json new file mode 100644 index 00000000..059fe4f8 --- /dev/null +++ b/volunteerverse-ui/firebase.json @@ -0,0 +1,10 @@ +{ + "hosting": { + "public": "dist", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + } +} diff --git a/volunteerverse-ui/index.html b/volunteerverse-ui/index.html new file mode 100644 index 00000000..9dc26f53 --- /dev/null +++ b/volunteerverse-ui/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + VolunteerVerse + + + +
+ + + + \ No newline at end of file diff --git a/volunteerverse-ui/package.json b/volunteerverse-ui/package.json new file mode 100644 index 00000000..049162e9 --- /dev/null +++ b/volunteerverse-ui/package.json @@ -0,0 +1,54 @@ +{ + "name": "volunteerverse-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@mantine/carousel": "^6.0.17", + "@mantine/core": "^6.0.17", + "@mantine/dates": "^6.0.17", + "@mantine/dropzone": "^6.0.17", + "@mantine/form": "^6.0.17", + "@mantine/hooks": "^6.0.17", + "@mantine/modals": "^6.0.17", + "@mantine/notifications": "^6.0.17", + "@mantine/nprogress": "^6.0.17", + "@mantine/prism": "^6.0.17", + "@mantine/spotlight": "^6.0.17", + "@mantine/tiptap": "^6.0.17", + "@tabler/icons-react": "^2.30.0", + "@tiptap/extension-link": "^2.0.4", + "@tiptap/react": "^2.0.4", + "@tiptap/starter-kit": "^2.0.4", + "axios": "^1.4.0", + "dayjs": "^1.11.9", + "dotenv": "^16.3.1", + "embla-carousel-react": "^8.0.0-rc11", + "moment": "^2.29.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.10.1", + "react-router-dom": "^6.14.1" + }, + "devDependencies": { + "@types/node": "^20.4.8", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.6", + "@types/react-router-dom": "^5.3.3", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.61.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.44.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.1", + "typescript": "^5.0.2", + "vite": "^4.4.9" + } +} diff --git a/volunteerverse-ui/public/404.html b/volunteerverse-ui/public/404.html new file mode 100644 index 00000000..829eda8f --- /dev/null +++ b/volunteerverse-ui/public/404.html @@ -0,0 +1,33 @@ + + + + + + Page Not Found + + + + +
+

404

+

Page Not Found

+

The specified file was not found on this website. Please check the URL for mistakes and try again.

+

Why am I seeing this?

+

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

+
+ + diff --git a/volunteerverse-ui/public/index.html b/volunteerverse-ui/public/index.html new file mode 100644 index 00000000..e83bc582 --- /dev/null +++ b/volunteerverse-ui/public/index.html @@ -0,0 +1,89 @@ + + + + + + Welcome to Firebase Hosting + + + + + + + + + + + + + + + + + + + +
+

Welcome

+

Firebase Hosting Setup Complete

+

You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!

+ Open Hosting Documentation +
+

Firebase SDK Loading…

+ + + + diff --git a/volunteerverse-ui/public/vite.svg b/volunteerverse-ui/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/volunteerverse-ui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/volunteerverse-ui/src/App.css b/volunteerverse-ui/src/App.css new file mode 100644 index 00000000..4b5080ca --- /dev/null +++ b/volunteerverse-ui/src/App.css @@ -0,0 +1,43 @@ +#root { + /* max-width: 1280px; */ + margin: 0 auto; + /* padding: 2rem; */ + text-align: center; + max-width: auto; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/volunteerverse-ui/src/App.tsx b/volunteerverse-ui/src/App.tsx new file mode 100644 index 00000000..43e79d8b --- /dev/null +++ b/volunteerverse-ui/src/App.tsx @@ -0,0 +1,93 @@ +import { AppShell, MantineProvider } from '@mantine/core'; +import { Notifications } from '@mantine/notifications'; +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import './App.css'; +import Navbar from './components/Navbar'; +import { AuthenticationContext } from './context/AuthenicationContext'; +import Landing from './pages/Landing/Landing'; +import Login from './pages/Login'; +import NotFound from './pages/NotFound'; +import CreateProject from './pages/Org/CreateProject'; +import OrgHome from './pages/Org/Home/OrgHome'; +import OrgProjectDetailsTabs from './pages/Org/OrgProjectDetails/OrgProjectTabs'; +import SignUp from './pages/SignUp/SignUp'; +import VolunteerHome from './pages/Volunteer/Home/VolunteerHome'; +import MyProjects from './pages/Volunteer/MyProjects'; +import VolunteerProjectDetails from './pages/Volunteer/VolunteerProjectDetails'; +import { useAuthentication } from './services/hooks/useAuthentication'; + +function App() { + /** + * @todo: + * implement loader states as well + * test login + * start building first all functional pages for the volunteer + * then styling each one by one. + * then switch to organization + * then look into stretch features: + * start web scraping data from democracy lab + * email validation, password security, photo image hosting + */ + // Appshell is used to navbar overlay across all pages + const authProps = useAuthentication(); + console.log(authProps) + const { isValidOrg, isAuth } = authProps; + return ( + <> + + ({ + /** incase it's needed */ + })) + }}> + + + ({ + main: { padding: "initial 0"}, + root: { + height: "100%", + backgroundImage: !authProps?.isAuth ? theme.fn.linearGradient(180, theme.colors.violet[5], theme.colors.violet[0], theme.white, theme.colors.violet[2]) + : theme.fn.linearGradient(180, theme.colors.violet[0], theme.colors.violet[0]) + } + })} + header={}> + + : + isValidOrg ? + : + } /> + + {/* POST AUTHENTICATION */} + {/* Displays project by details page for each user role */} + } /> + {/* projects is specific to the volunteers */} + : + isValidOrg ? + : } /> + {/* projects/projectId is used for both volunteers and organizations */} + } /> + {/* projects/create is specfic to organizations looking to create a new project */} + + {/* PRE-AUTHENTICATION */} + } /> + } /> + } /> + {/* Home displays the Dashboard page and the student projects feed */} + } /> + + + + + + + + + + ) +} + +export default App diff --git a/volunteerverse-ui/src/assets/Logo.png b/volunteerverse-ui/src/assets/Logo.png new file mode 100644 index 00000000..ee48a3d6 Binary files /dev/null and b/volunteerverse-ui/src/assets/Logo.png differ diff --git a/volunteerverse-ui/src/assets/TOS.ts b/volunteerverse-ui/src/assets/TOS.ts new file mode 100644 index 00000000..291b4f25 --- /dev/null +++ b/volunteerverse-ui/src/assets/TOS.ts @@ -0,0 +1,58 @@ +export const TOS = + `VolunteerVerse - Terms of Agreement + + Effective Date: [Date] + + Welcome to VolunteerVerse ("Platform"). By accessing or using our Platform, you agree to be bound by these Terms of Agreement ("Terms"). Please read them carefully before using the Platform. + + 1. Acceptance of Terms: + By accessing or using the Platform, you agree to these Terms, including any additional terms and conditions and policies referenced herein. If you do not agree with these Terms, you must refrain from accessing or using the Platform. + + 2. Platform Description: + VolunteerVerse is an online web platform that facilitates the sharing of information about volunteer projects to users. The Platform may also collect and handle sensitive information, such as email addresses and phone numbers, to connect volunteers with project organizers and facilitate communication. + + 3. User Registration and Account: + To access certain features of the Platform, you may be required to register and create an account. You must provide accurate and complete information during the registration process and keep your account credentials secure. You are solely responsible for any activity that occurs under your account. + + 4. Use of the Platform: + a. You agree to use the Platform solely for lawful and non-commercial purposes. You will not use the Platform to post or transmit any content that is defamatory, harmful, offensive, or violates any applicable laws or regulations. + + b. The Platform may allow users to interact and share information. You are solely responsible for the content you post, and any consequences arising from such content. We reserve the right to remove any content that violates these Terms. + + 5. Privacy and Data Protection: + a. The Platform may collect and handle sensitive information, including but not limited to email addresses and phone numbers, to facilitate volunteer project coordination. We take the privacy and security of your data seriously. Please review our Privacy Policy [include a link to your Privacy Policy] to understand how we collect, use, and protect your information. + + b. By using the Platform, you consent to the collection and use of your information in accordance with our Privacy Policy. + + 6. Intellectual Property: + a. The content and materials on the Platform, including but not limited to logos, trademarks, text, images, and software, are the property of VolunteerVerse or its licensors and are protected by intellectual property laws. + + b. You may not reproduce, distribute, modify, or create derivative works based on the Platform's content without our prior written consent. + + 7. Third-Party Links: + The Platform may contain links to third-party websites or services. These links are provided for your convenience, and VolunteerVerse does not endorse or control the content or practices of these third-party sites. Your use of third-party websites is at your own risk, and we recommend reviewing their respective terms of use and privacy policies. + + 8. Limitation of Liability: + a. VolunteerVerse is not liable for any direct, indirect, incidental, special, or consequential damages arising from your use of the Platform or inability to access it. + + b. We do not guarantee the accuracy, completeness, or reliability of any content posted on the Platform. + + c. VolunteerVerse is not responsible for any losses or damages resulting from unauthorized access to your account or data breach. + + 9. Indemnification: + You agree to indemnify and hold harmless VolunteerVerse, its affiliates, officers, directors, employees, and agents from any claims, damages, losses, liabilities, or expenses arising out of your use of the Platform or violation of these Terms. + + 10. Modifications to the Terms: + VolunteerVerse reserves the right to modify or update these Terms at any time. Any changes will be effective upon posting on the Platform. Your continued use of the Platform after such modifications signifies your acceptance of the updated Terms. + + 11. Termination: + VolunteerVerse may terminate your access to the Platform at any time, with or without cause. Upon termination, your rights to use the Platform will cease, and you must discontinue any further use. + + 12. Governing Law: + These Terms shall be governed by and construed in accordance with the laws of [Your Jurisdiction]. Any disputes arising out of or related to these Terms shall be exclusively subject to the jurisdiction of the competent courts of [Your Jurisdiction]. + + By accessing or using VolunteerVerse, you agree to these Terms and acknowledge that you have read and understood them. If you do not agree with these Terms, you must not use the Platform. + + If you have any questions or concerns about these Terms, please contact us at [Your Contact Email]. + + VolunteerVerse` \ No newline at end of file diff --git a/volunteerverse-ui/src/assets/floatingStudent.png b/volunteerverse-ui/src/assets/floatingStudent.png new file mode 100644 index 00000000..4c8a4416 Binary files /dev/null and b/volunteerverse-ui/src/assets/floatingStudent.png differ diff --git a/volunteerverse-ui/src/assets/projectplaceholder.png b/volunteerverse-ui/src/assets/projectplaceholder.png new file mode 100644 index 00000000..bd2053dc Binary files /dev/null and b/volunteerverse-ui/src/assets/projectplaceholder.png differ diff --git a/volunteerverse-ui/src/assets/react.svg b/volunteerverse-ui/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/volunteerverse-ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/volunteerverse-ui/src/assets/team.png b/volunteerverse-ui/src/assets/team.png new file mode 100644 index 00000000..98603693 Binary files /dev/null and b/volunteerverse-ui/src/assets/team.png differ diff --git a/volunteerverse-ui/src/components/GoBackButton.tsx b/volunteerverse-ui/src/components/GoBackButton.tsx new file mode 100644 index 00000000..6c74440f --- /dev/null +++ b/volunteerverse-ui/src/components/GoBackButton.tsx @@ -0,0 +1,22 @@ +import { Button } from "@mantine/core"; +import { IconArrowLeft } from "@tabler/icons-react"; +import { useNavigate } from "react-router-dom"; + +export default function GoBackButton(props : any) { + + let navigate = useNavigate(); + return ( +
+ + +
+ ); +}; \ No newline at end of file diff --git a/volunteerverse-ui/src/components/Navbar.tsx b/volunteerverse-ui/src/components/Navbar.tsx new file mode 100644 index 00000000..a7880077 --- /dev/null +++ b/volunteerverse-ui/src/components/Navbar.tsx @@ -0,0 +1,198 @@ +import { + Box, Burger, + Button, + Divider, + Drawer, + Group, + Header, + Modal, + ScrollArea, + Text, + Title, + createStyles, + rem +} from "@mantine/core"; +import { useDisclosure } from '@mantine/hooks'; +import { useContext, useEffect } from "react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { AuthenticationContext } from "../context/AuthenicationContext"; +import SignUpModal from "../pages/Landing/SignUpModal"; + +const useStyles = createStyles((theme) => ({ + link: { + display: 'flex', + alignItems: 'center', + height: '100%', + paddingLeft: theme.spacing.md, + paddingRight: theme.spacing.md, + textDecoration: 'none', + color: theme.colorScheme === 'dark' ? theme.white : theme.colors.violet[6], + fontWeight: 500, + fontSize: theme.fontSizes.lg, + + [theme.fn.smallerThan('sm')]: { + height: rem(42), + display: 'flex', + alignItems: 'center', + width: '100%', + }, + + ...theme.fn.hover({ + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0], + }), + }, + + subLink: { + width: '100%', + padding: `${theme.spacing.xs} ${theme.spacing.md}`, + borderRadius: theme.radius.md, + + ...theme.fn.hover({ + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0], + }), + + '&:active': theme.activeStyles, + }, + + dropdownFooter: { + backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0], + margin: `calc(${theme.spacing.md} * -1)`, + marginTop: theme.spacing.sm, + padding: `${theme.spacing.md} calc(${theme.spacing.md} * 2)`, + paddingBottom: theme.spacing.xl, + borderTop: `${rem(1)} solid ${theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1] + }`, + }, + + hiddenMobile: { + [theme.fn.smallerThan('sm')]: { + display: 'none', + }, + }, + + hiddenDesktop: { + [theme.fn.largerThan('sm')]: { + display: 'none', + }, + }, +})); + +interface linkProp { + label: string, + path: string, + id?: string, // use this if needed to select specific links +} +export default function Navbar() { + /** + * @todo use navigation route to change navbar conditionallty + */ + const { isAuth, isValidOrg, removeToken} = useContext(AuthenticationContext) + const [drawerOpened, { toggle: toggleDrawer, close: closeDrawer }] = useDisclosure(false); + const [showModal, { open: openModal, close: closeModal }] = useDisclosure(false); + const navigate = useNavigate(); + const urlLocation = useLocation(); + const { classes, theme } = useStyles(); + + // Dynamic Nav bar links + const volunteerLinks = [ + { label: "Explore", path: "/" }, + { label: "My Projects", path: "/projects" }, + ]; + const orgLinks = [ + {label : "Home", path:"/"}, + {label : "Create Project", path:"/projects/create"}, + ]; + const unAuthLinks = [ + { label: "Home", path: "/" }, + { label: "How It Works", path: "/#HowItWorks" }, + { label: "About", path: "/#About" }, + ]; + + const mapLinksToElements = (links: linkProp[], withDivider : boolean = false) => { + return ( + links.map((link) => ( + <> + {link.label} + { withDivider && ()} + + )) + ) + } + useEffect(() => { + // closes drawer anytime users navigate to a new route + closeDrawer(); + + }, [urlLocation]) + return ( + +
+ + VolunteerVerse + + { + !isAuth ? mapLinksToElements(unAuthLinks) : + isValidOrg ? mapLinksToElements(orgLinks) : + mapLinksToElements(volunteerLinks) + + } + + + { + isAuth ? : + <> + + + + } + + + + +
+ + VolunteerVerse} + className={classes.hiddenDesktop} + zIndex={1000000} + > + + { + !isAuth ? + mapLinksToElements(unAuthLinks, true) : + isValidOrg ? mapLinksToElements(volunteerLinks, true) + : mapLinksToElements(orgLinks, true) + } + + { + isAuth ? : + <> + + + + } + + + + + Select Your Role:} + closeButtonProps={{ 'aria-label': 'Close modal' }} + opened={showModal} + onClose={closeModal} + size="auto" + centered + zIndex={1000001}> + + +
+ ); +} \ No newline at end of file diff --git a/volunteerverse-ui/src/components/NoneFound.tsx b/volunteerverse-ui/src/components/NoneFound.tsx new file mode 100644 index 00000000..1fcd0bc7 --- /dev/null +++ b/volunteerverse-ui/src/components/NoneFound.tsx @@ -0,0 +1,20 @@ +import { Title, createStyles, useMantineTheme } from "@mantine/core"; +import { useMediaQuery } from "@mantine/hooks"; + +const useStyles = createStyles(() => ({ + root:{ + height: "100vh", + } +})) +export default function NoneFound({title = "Nothing to see here...", ...props} : {title? : string}) { + const {classes} = useStyles(); + const theme = useMantineTheme(); + const isMobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`); + return ( +
+ + {title} + +
+ ) + } \ No newline at end of file diff --git a/volunteerverse-ui/src/components/QueryBar.tsx b/volunteerverse-ui/src/components/QueryBar.tsx new file mode 100644 index 00000000..e741604d --- /dev/null +++ b/volunteerverse-ui/src/components/QueryBar.tsx @@ -0,0 +1,58 @@ +import { + Group, MultiSelect, + Text, + TextInput +} from '@mantine/core'; +import { UseFormReturnType } from '@mantine/form'; +import { useEffect, useState } from 'react'; +import { useSkills } from '../services/hooks/useSkills'; + +export interface QueryProps { + search: string, + tags: string[], + timeRange: "Day" | "Week" | "Month" | "Year" + } + +export function QueryBar(form: UseFormReturnType) { + // const theme = useMantineTheme(); + const skillsTags = useSkills(); + const [showSearchButton, setShowSearchButton] = useState(false); + + useEffect(() => { + console.log(showSearchButton) + const { search, tags } = form.values; + if (search.trim().length > 0 || tags.length > 0) { + setShowSearchButton(true); + } else { + setShowSearchButton(false); + } + }, [form]) + + + return ( + + search} + radius="xl" + size="md" + placeholder="Search projects by title" + {...form.getInputProps("search")} + /> + psychology} + searchable + clearable + data={skillsTags} + label="Tag Filters" + nothingFound="Nothing found" + placeholder="Search projects by tags" + clearButtonProps={{ 'aria-label': 'Clear selection' }} + {...form.getInputProps("tags")} /> + {/*