diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 613e2ee..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Buildathon Submission Pull Request
-
-Thank you for submitting your project for the Build Beyond Limits 2.0 - powered by Valkey and Breeth AI, hosted by React Hyderabad.
-
-Please fill in the details below before raising your Pull Request.
-
----
-
-## Submission Details
-
-**Project Name:**
-**Attendee Name:**
-**Problem Statement Selected:**
-
-Choose one:
-
-- [ ] HR Cost Intelligence Engine
-- [ ] Intelligent Slack Knowledge Base
-
----
-
-## Checklist
-
-Please confirm the following:
-
-- [ ] I have created my submission file inside the `submissions/` folder.
-- [ ] My submission file follows this naming format: `projectname_attendeeName.md`.
-- [ ] I have used the `SUBMISSION_TEMPLATE.md` format.
-- [ ] I have added my GitHub project repository link.
-- [ ] I have added my LinkedIn profile link.
-- [ ] I have added my GitHub username.
-- [ ] My project repository is public.
-- [ ] I have not added API keys, passwords, tokens, or private credentials.
-- [ ] I understand that my actual project code should be in my own GitHub repository, not in this repository.
-
----
-
-## Project Repository Link
-
-Add your project GitHub repository link here:
-
-```txt
-PASTE_LINK_HERE
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 25412a4..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,84 +0,0 @@
-
----
-
-# `CODE_OF_CONDUCT.md`
-
-```md
-# Code of Conduct
-
-## Our Promise
-
-React Hyderabad is committed to creating a welcoming, respectful, and inclusive environment for everyone participating in this buildathon.
-
-This applies to all participants, mentors, organizers, volunteers, judges, and community members.
-
-We expect everyone to treat each other with kindness, patience, and respect.
-
----
-
-## Expected Behaviour
-
-All participants are expected to:
-
-- Be respectful towards others
-- Collaborate in a healthy and professional way
-- Give constructive feedback
-- Respect different skill levels and backgrounds
-- Help others when possible
-- Follow the event and submission guidelines
-- Keep the community safe and welcoming
-
----
-
-## Unacceptable Behaviour
-
-The following behaviour will not be tolerated:
-
-- Harassment or bullying
-- Discrimination of any kind
-- Offensive comments or personal attacks
-- Inappropriate language or behaviour
-- Sharing someone’s private information without permission
-- Plagiarism or claiming someone else’s work as your own
-- Misuse of GitHub issues, pull requests, or discussions
-- Any behaviour that makes others feel unsafe or unwelcome
-
----
-
-## Project and Submission Ethics
-
-Participants are expected to submit their own work.
-
-You may use AI tools, open-source libraries, APIs, documentation, and online resources, but you should understand what you are building and be able to explain your solution.
-
-If you use existing code, templates, or external resources, please give proper credit wherever required.
-
-Do not submit copied projects as original work.
-
----
-
-## Reporting Issues
-
-If you experience or notice unacceptable behaviour, please reach out to the React Hyderabad organizing team.
-
-The organizing team will review the concern and take appropriate action.
-
----
-
-## Enforcement
-
-Depending on the situation, the organizing team may take actions such as:
-
-- Giving a warning
-- Asking for corrective action
-- Rejecting a submission
-- Removing a participant from the event or repository
-- Taking further action if required
-
----
-
-## Final Note
-
-This buildathon is about learning, building, collaboration, and community.
-
-Please help us keep it respectful, safe, and meaningful for everyone.
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index e69de29..0000000
diff --git a/PROBLEM_STATEMENTS.md b/PROBLEM_STATEMENTS.md
deleted file mode 100644
index fc5a465..0000000
--- a/PROBLEM_STATEMENTS.md
+++ /dev/null
@@ -1,23 +0,0 @@
-Here's the link to access the problem statements -
-
-All the problem statements here - [https://github.com/opensource-for-valkey/valkey-community/tree/main/hackathons/hyd13_2026-06-20](https://github.com/opensource-for-valkey/valkey-community/tree/main/hackathons/hyd13_2026-06-20)
-
-There are three important criterias for building your project -
-
-1. You must use Valkey in your app.
-Valkey Intro - [https://github.com/pnbrown/valkey-intro](https://github.com/pnbrown/valkey-intro)
-2. You should use Breeth AI in your app. Documentation is available - [https://thebreeth.com/](https://thebreeth.com/)
-3. Please use React.js as your frontend library.
-
-
-
-Please make sure you only pick the problem statements as described above!
-
-We will be sharing the credits link of Breeth AI when we go live!
-
-
-
-Please join the discord channel for getting the credits - [https://discord.gg/mPC3AeUC](https://discord.gg/mPC3AeUC)
-
-
-
diff --git a/README.md b/README.md
deleted file mode 100644
index d14c3c6..0000000
--- a/README.md
+++ /dev/null
@@ -1,156 +0,0 @@
-# build-beyond-limits-2.0
-PR submissions for the Build Beyond Limits 2.0 - Powered by Valkey, Hosted by React Hyderabad
-Credit Partner - https://thebreeth.com/
-
-Instructions releasing live on 20th June, at 3 PM
-
-Join here - https://youtube.com/live/kTT2Kovs-y8?feature=share
-
-
-# React Hyderabad x Valkey
-
-Welcome to the official open-source submission repository for the **Build Beyond Limits 2.0 - powered by Valkey and Breeth AI, and hosted by React Hyderabad**.
-
-This buildathon is focused on solving **real-world business problems using AI**. The goal is not just to write code, but to understand a problem, think from a business perspective, use the right tools, build a working solution, and present it clearly.
-
-This repository will act as the central place where all participant submissions are listed.
-
-Your actual project/code should be maintained in your own GitHub repository. This repo is only for submitting your project details.
-
----
-
-## How to Participate
-
-1. Fork this repository.
-
-2. Create your own project repository on GitHub.
-
-3. Pick one of the problem statements from `PROBLEM_STATEMENTS.md`.
-
-4. Build your project in your own GitHub repository.
-
-5. In your fork of this repository, go to the `submissions/` folder.
-
-6. Create a new markdown file using this naming format:
-
-```txt
-projectname_attendeeName.md
-```
-
-OR
-
-```txt
-projectname_teamName.md
-```
-
-Example:
-
-```txt
-ai-sales-copilot_shlok-srivastava.md
-```
-
-7. Use `SUBMISSION_TEMPLATE.md` as the blueprint for your submission.
-
-8. Fill in all the required details:
-
- * Project name
- * Your name
- * Problem statement selected
- * Project description
- * Approach
- * Tools and technologies used
- * GitHub project link
- * LinkedIn profile
- * GitHub username
-
-9. Raise a Pull Request to this repository.
-
-10. Get your Pull Request merged.
-
----
-
-## Important Submission Note
-
-Please make sure your Pull Request is raised by today.
-
-Even if your project is incomplete, you should still submit your project details by creating a Pull Request.
-
-You can continue building and improving your actual project in your own GitHub repository after the submission PR is merged.
-
-The purpose of this repository is to make the hackathon open, transparent, and community-driven.
-
----
-
-## Submission Rules
-
-1. Each participant must submit their own project.
-
-2. Your actual project code should be in your own GitHub repository.
-
-3. Do not push your project code directly into this repository.
-
-4. This repository should only contain participant submission files.
-
-5. Each submission file must be added inside the `submissions/` folder.
-
-6. Use the correct file naming format:
-
-```txt
-projectname_attendeeName.md
-```
-OR
-```txt
-projectname_attendeeName.md
-```
-
-7. Make sure your project repository is public.
-
-8. Do not commit API keys, private tokens, passwords, or secret credentials in your project repository.
-
-9. If your project is still a work in progress, mention that clearly in your submission.
-
-10. Keep your submission clear, honest, and easy to understand.
-
----
-
-## Pull Request Title Format
-
-Please use this format for your Pull Request title:
-
-```txt
-Submission: Project Name - Attendee Name/ Team Name
-```
-
-Example:
-
-```txt
-Submission: AI Sales Copilot - Shlok Srivastava
-```
-
----
-
-## What Makes a Good Submission?
-
-A good submission should clearly explain:
-
-* What problem you selected
-* What your project does
-* Why your solution is useful
-* How you approached the problem
-* What AI tools or technologies you used
-* What is already working
-* What you plan to improve next
-
-The project does not have to be perfect. We care about your thought process, execution, learning, and ability to solve a real-world problem.
-
----
-
-## About the Build Beyond Limits 2.0
-
-This hackathon is hosted by **React Hyderabad** in collaboration with **Valkey** and **Breeth AI**.
-
-The goal is to bring builders together to solve meaningful problems using AI, frontend, backend, cloud, automation, and modern development tools.
-
-Build with intent.
-Solve with clarity.
-Ship with confidence.
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index edd9514..0000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
----
-
-# `SECURITY.md`
-
-```md
-# Security Policy
-
-This repository is used only for collecting hackathon project submissions.
-
-Participants should not add sensitive information to this repository or to their public project repositories.
-
----
-
-## Do Not Commit Secrets
-
-Please do not commit:
-
-- API keys
-- Access tokens
-- Passwords
-- Private credentials
-- `.env` files
-- Database connection strings
-- Cloud service credentials
-- Personal identification documents
-- Any confidential business data
-
----
-
-## If You Accidentally Commit a Secret
-
-If you accidentally commit a secret:
-
-1. Remove it from your repository immediately.
-2. Rotate or revoke the exposed key/token from the provider dashboard.
-3. Update your project with a safe placeholder value.
-4. Inform the organizers if the secret was committed to this repository.
-
----
-
-## Recommended Practice
-
-Use environment variables for local development.
-
-Example:
-
-```txt
-OPENAI_API_KEY=your_api_key_here
-DATABASE_URL=your_database_url_here
\ No newline at end of file
diff --git a/SUBMISSION_TEMPLATE.md b/SUBMISSION_TEMPLATE.md
deleted file mode 100644
index a6e1d6e..0000000
--- a/SUBMISSION_TEMPLATE.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# Project Submission Template
-
-Create a new file inside the `submissions/` folder using this naming format:
-
-```txt
-projectname_attendeeName.md
-```
-
-Example:
-
-```txt
-ai-sales-copilot_shlok-srivastava.md
-```
-
-Copy the template below into your new file and fill in the details.
-
----
-
-# Project Name
-
-Write your project name here.
-
----
-
-## Attendee/Team Details
-
-Add all the names of all the team members if you are participating in teams.
-
-**Name:** Your full name
-**GitHub Username:** Your GitHub username
-**LinkedIn Profile:** Your LinkedIn profile link
-**GitHub Project Repository:** Your project repository link
-
----
-
-## Problem Statement Selected
-
-Mention the title of the problem statement you selected.
-
-Choose one:
-
-```txt
-Problem statement 1
-```
-
-or
-
-```txt
-Problem statement 2
-```
-
----
-
-## Project Description
-
-Briefly explain what your project does.
-
-Try to answer:
-
-* What is the project about?
-* Who is it for?
-* What problem does it solve?
-* How does it help the user?
-
-Write your answer here.
-
----
-
-## Approach
-
-Explain how you approached the problem.
-
-You can include:
-
-* How you understood the problem
-* What user flow you designed
-* What features you decided to build
-* How AI is used in your solution
-* What makes your approach useful or different
-
-Write your answer here.
-
----
-
-## Tech Stack and Tools Used
-
-Mention the tools, technologies, frameworks, and platforms you used.
-
-Example:
-
-**Frontend:** React, Next.js, HTML, CSS, Tailwind, Material UI
-**Backend:** Node.js, Express, FastAPI, Django, Flask
-**Database:** MongoDB, PostgreSQL, Firebase, Supabase
-**AI Tools/API:** OpenAI, Gemini, Claude, LangChain, Hugging Face, local LLMs
-**Cloud/Deployment:** Vercel, Netlify, Render, Railway, AWS, GCP
-**Other Tools:** Cursor, GitHub Copilot, Figma, Postman, Docker
-
-Fill your details below:
-
-**Frontend:**
-**Backend:**
-**Database:**
-**AI Tools/API:**
-**Cloud/Deployment:**
-**Other Tools:**
-
----
-
-## Key Features
-
-List the key features of your project.
-
-Example:
-
-1. Feature one
-2. Feature two
-3. Feature three
-
-Write your features here:
-
-1.
-2.
-3.
-
----
-
-## What is Working?
-
-Mention what is currently working in your project.
-
-This is important even if your project is incomplete.
-
-Write your answer here.
-
----
-
-## What is Still in Progress?
-
-Mention what you are still building or planning to improve.
-
-Write your answer here.
-
----
-
-## Screenshots or Demo
-
-Add screenshots, demo video link, or deployed project link if available.
-
-**Deployed Link:**
-**Demo Video Link:**
-**Screenshots:**
-
----
-
-## Challenges Faced
-
-Mention any challenges you faced while building this project.
-
-Write your answer here.
-
----
-
-## Learnings
-
-Mention what you learned while building this project.
-
-Write your answer here.
-
----
-
-## Future Improvements
-
-Mention what you would improve if you had more time.
-
-Write your answer here.
-
----
-
-## Final Note
-
-Use this space to add anything else you want mentors, judges, or the community to know about your project.
-
-Write your answer here.
diff --git a/submissions/putYourSubmissionsHere.md b/submissions/putYourSubmissionsHere.md
deleted file mode 100644
index e69de29..0000000
diff --git a/submissions/valkey-ecommerce-demo/HACKATHON.md b/submissions/valkey-ecommerce-demo/HACKATHON.md
new file mode 100644
index 0000000..1eb4fd7
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/HACKATHON.md
@@ -0,0 +1,1460 @@
+# Hackathon Challenge Areas
+
+This document provides a detailed technical breakdown of each challenge area for the **Build Beyond Limits** hackathon. Each section describes the subsystem, the Valkey data structures and modules to use, expected API contracts, and implementation guidance.
+
+Use the [valkey-bundle](https://github.com/valkey-io/valkey-bundle) Docker image which includes all modules (Search, JSON, Bloom, etc.):
+
+```bash
+docker run -d --name valkey -p 6379:6379 valkey/valkey-bundle:9-alpine
+```
+
+---
+
+## ID Strategy
+
+All entity IDs use **UUIDv7** (RFC 9562) with a **domain prefix** in the format `domain:uuidv7`. UUIDv7 embeds a Unix timestamp in the most significant bits, which provides:
+
+- **Monotonic ordering**: IDs are naturally sortable by creation time without a separate `createdAt` index.
+- **K-sortable**: Valkey Sorted Sets with UUIDv7 as members are inherently time-ordered.
+- **No coordination**: Generate IDs client-side without a central sequence.
+- **Indexing efficiency**: Lexicographic sorting of UUIDv7 strings matches chronological order, making `ZRANGEBYLEX` and prefix scans efficient.
+- **Self-describing**: The domain prefix makes IDs unambiguous — you always know what entity type an ID refers to without additional context.
+
+### Format
+
+```
+{domain}:{uuidv7}
+```
+
+| Domain | Entity | Example |
+|--------|--------|---------|
+| `user` | User account | `user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e` |
+| `product` | Product | `product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f` |
+| `category` | Category | `category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b` |
+| `vendor` | Vendor/Seller | `vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f` |
+| `order` | Order | `order:0192d4e8-5e6f-7c8d-8a0b-2c3d4e5f6a7b` |
+| `addr` | Address | `addr:0192d4e1-a2c8-7d4b-8f3e-1a9b5c7d2e4f` |
+| `ad` | Advertisement | `ad:0192d4e9-6f7a-7d8e-9b0c-3d4e5f6a7b8c` |
+| `session` | Auth session | `session:0192d4f0-1a2b-7c3d-8e4f-5a6b7c8d9e0f` |
+
+### Example generation (Node.js):
+```js
+import { v7 as uuidv7 } from 'uuid'; // npm install uuid@^9
+
+function createId(domain) {
+ return `${domain}:${uuidv7()}`;
+}
+
+const userId = createId('user'); // "user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e"
+const productId = createId('product'); // "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f"
+const orderId = createId('order'); // "order:0192d4e8-5e6f-7c8d-8a0b-2c3d4e5f6a7b"
+```
+
+### Parsing
+```js
+function parseId(id) {
+ const colonIndex = id.indexOf(':');
+ const domain = id.substring(0, colonIndex);
+ const uuid = id.substring(colonIndex + 1);
+ return { domain, uuid };
+}
+
+const { domain, uuid } = parseId('user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e');
+// domain = "user", uuid = "0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e"
+```
+
+---
+
+## Sample Data Contracts
+
+The following JSON structures define the shared data contracts all teams should follow. This ensures frontend and backend teams can work in parallel with consistent schemas.
+
+All `id` fields follow the `domain:uuidv7` format. The monotonic property of UUIDv7 means you can sort entities by ID to get chronological order — no need for a separate timestamp index in most cases. The domain prefix makes every ID self-describing.
+
+### Users
+
+```json
+{
+ "id": "user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e",
+ "email": "priya.sharma@example.com",
+ "passwordHash": "$2b$12$LJ3m4x...",
+ "firstName": "Priya",
+ "lastName": "Sharma",
+ "phone": "+91-9876543210",
+ "avatar": "/assets/avatars/priya.jpg",
+ "role": "customer",
+ "addresses": [
+ {
+ "id": "addr:0192d4e1-a2c8-7d4b-8f3e-1a9b5c7d2e4f",
+ "label": "Home",
+ "street": "42 MG Road, Banjara Hills",
+ "city": "Hyderabad",
+ "state": "Telangana",
+ "postalCode": "500034",
+ "country": "IN",
+ "lat": 17.4156,
+ "lng": 78.4347,
+ "isDefault": true
+ }
+ ],
+ "preferences": {
+ "currency": "INR",
+ "language": "en",
+ "notifications": true
+ },
+ "createdAt": "2025-01-15T10:30:00Z",
+ "lastLoginAt": "2025-05-20T14:22:00Z"
+}
+```
+
+### Categories
+
+```json
+[
+ {
+ "id": "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b",
+ "name": "Electronics",
+ "slug": "electronics",
+ "icon": "desktop",
+ "parentId": null,
+ "children": ["category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c", "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f", "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a", "category:0192d4e2-6eaf-7c4a-9b3d-5f7e2a0c1d6b"]
+ },
+ {
+ "id": "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c",
+ "name": "Smartphones",
+ "slug": "smartphones",
+ "icon": "device-mobile",
+ "parentId": "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b",
+ "children": []
+ },
+ {
+ "id": "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a",
+ "name": "Fashion",
+ "slug": "fashion",
+ "icon": "t-shirt",
+ "parentId": null,
+ "children": ["category:0192d4e3-8c2d-7e5f-9b3a-0d4c6e7f1a2b", "category:0192d4e3-9d3e-7f6a-8c4b-1e5d7f0a2b3c", "category:0192d4e3-ae4f-7a7b-9d5c-2f6e8a1b3c4d"]
+ },
+ {
+ "id": "category:0192d4e4-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
+ "name": "Home & Kitchen",
+ "slug": "home-kitchen",
+ "icon": "house",
+ "parentId": null,
+ "children": ["category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "category:0192d4e4-3c4d-7e5f-8a6b-7c8d9e0f1a2b", "category:0192d4e4-4d5e-7f6a-9b7c-8d9e0f1a2b3c"]
+ },
+ {
+ "id": "category:0192d4e5-5e6f-7a7b-8c8d-9e0f1a2b3c4d",
+ "name": "Sports & Outdoors",
+ "slug": "sports-outdoors",
+ "icon": "basketball",
+ "parentId": null,
+ "children": ["category:0192d4e5-6f7a-7b8c-9d9e-0f1a2b3c4d5e", "category:0192d4e5-7a8b-7c9d-8e0f-1a2b3c4d5e6f", "category:0192d4e5-8b9c-7d0e-9f1a-2b3c4d5e6f7a"]
+ }
+]
+```
+
+### Products
+
+```json
+{
+ "id": "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f",
+ "sku": "ELEC-PHN-SAM-001",
+ "name": "Galaxy Ultra Pro 256GB",
+ "slug": "galaxy-ultra-pro-256gb",
+ "description": "Flagship smartphone with 200MP camera, 6.8\" AMOLED display, and 5000mAh battery.",
+ "shortDescription": "200MP camera, 6.8\" AMOLED, 5000mAh",
+ "categoryId": "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c",
+ "vendorId": "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ "brand": "Samsung",
+ "price": {
+ "amount": 89999,
+ "currency": "INR",
+ "compareAt": 99999
+ },
+ "images": [
+ {
+ "url": "/assets/products/galaxy-ultra-front.jpg",
+ "alt": "Galaxy Ultra Pro front view",
+ "isPrimary": true
+ },
+ {
+ "url": "/assets/products/galaxy-ultra-back.jpg",
+ "alt": "Galaxy Ultra Pro back view",
+ "isPrimary": false
+ }
+ ],
+ "attributes": {
+ "color": "Phantom Black",
+ "storage": "256GB",
+ "ram": "12GB",
+ "display": "6.8 inch AMOLED",
+ "battery": "5000mAh",
+ "os": "Android 15"
+ },
+ "tags": ["smartphone", "5g", "flagship", "camera", "samsung"],
+ "inventory": {
+ "quantity": 150,
+ "reserved": 12,
+ "warehouse": "HYD-WH-01"
+ },
+ "ratings": {
+ "average": 4.6,
+ "count": 2341
+ },
+ "embedding": [0.023, -0.156, 0.891, 0.445, ...],
+ "status": "active",
+ "createdAt": "2025-03-01T08:00:00Z",
+ "updatedAt": "2025-05-18T12:30:00Z"
+}
+```
+
+### Vendors
+
+```json
+{
+ "id": "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ "name": "TechWorld Electronics",
+ "slug": "techworld-electronics",
+ "email": "support@techworld.in",
+ "phone": "+91-4012345678",
+ "logo": "/assets/vendors/techworld-logo.png",
+ "rating": 4.7,
+ "totalProducts": 342,
+ "totalSales": 15420,
+ "address": {
+ "street": "Plot 15, HITEC City",
+ "city": "Hyderabad",
+ "state": "Telangana",
+ "postalCode": "500081",
+ "country": "IN",
+ "lat": 17.4435,
+ "lng": 78.3772
+ },
+ "verified": true,
+ "joinedAt": "2024-06-15T00:00:00Z"
+}
+```
+
+### Orders
+
+```json
+{
+ "id": "order:0192d4e8-5e6f-7c8d-8a0b-2c3d4e5f6a7b",
+ "userId": "user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e",
+ "status": "confirmed",
+ "items": [
+ {
+ "productId": "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f",
+ "sku": "ELEC-PHN-SAM-001",
+ "name": "Galaxy Ultra Pro 256GB",
+ "quantity": 1,
+ "price": 89999,
+ "vendorId": "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f"
+ }
+ ],
+ "subtotal": 89999,
+ "discount": 5000,
+ "couponCode": "VALKEY10",
+ "tax": 15300,
+ "shipping": 0,
+ "total": 100299,
+ "shippingAddress": {
+ "street": "42 MG Road, Banjara Hills",
+ "city": "Hyderabad",
+ "state": "Telangana",
+ "postalCode": "500034",
+ "country": "IN",
+ "lat": 17.4156,
+ "lng": 78.4347
+ },
+ "payment": {
+ "method": "upi",
+ "transactionId": "txn_abc123",
+ "status": "captured"
+ },
+ "delivery": {
+ "estimatedAt": "2025-05-25T18:00:00Z",
+ "trackingId": "DEL-HYD-98765",
+ "currentLat": 17.4300,
+ "currentLng": 78.4100,
+ "status": "in_transit"
+ },
+ "createdAt": "2025-05-22T09:15:00Z",
+ "updatedAt": "2025-05-22T10:00:00Z"
+}
+```
+
+---
+
+## Challenge 1: User Authentication
+
+### Objective
+Implement user registration, login, and session management using Valkey as the session store.
+
+### Technical Requirements
+
+- **Registration**: Hash passwords with bcrypt (cost factor 12+), store user JSON in Valkey using `JSON.SET`.
+- **Login**: Validate credentials, generate a session token (UUID v4 or JWT), store it in Valkey with a TTL.
+- **Session Management**: Use Valkey strings with expiration for session tokens. Refresh TTL on each authenticated request.
+- **Logout**: Delete the session key from Valkey.
+
+### Valkey Commands & Data Structures
+
+```
+# Store user profile (key = userId, e.g. "user:0192d4e0-...")
+JSON.SET {userId} $ '{...user JSON...}'
+
+# Create session (expires in 24 hours)
+SET session:{token} {userId} EX 86400
+
+# Validate session
+GET session:{token}
+
+# Refresh session TTL
+EXPIRE session:{token} 86400
+
+# Logout
+DEL session:{token}
+
+# Track failed login attempts (rate limiting)
+INCR login_attempts:{email}
+EXPIRE login_attempts:{email} 900
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| POST | `/api/auth/register` | Create new user account |
+| POST | `/api/auth/login` | Authenticate and return session token |
+| POST | `/api/auth/logout` | Invalidate session |
+| GET | `/api/auth/me` | Get current user from session |
+| POST | `/api/auth/refresh` | Refresh session TTL |
+
+### Acceptance Criteria
+- Passwords are never stored in plaintext
+- Sessions expire after 24 hours of inactivity
+- Failed login attempts are rate-limited (max 5 per 15 minutes)
+- Concurrent sessions per user are tracked
+
+---
+
+## Challenge 2: Product Catalog
+
+### Objective
+Build a product catalog service that stores and retrieves products, categories, and vendor information using Valkey JSON.
+
+### Technical Requirements
+
+- **Product Storage**: Store each product as a JSON document using `JSON.SET`. Support partial updates with `JSON.SET` on nested paths.
+- **Category Hierarchy**: Model parent-child category relationships. Support breadcrumb navigation.
+- **Filtering**: Filter products by category, price range, brand, attributes, and vendor.
+- **Pagination**: Implement cursor-based or offset pagination for product listings.
+
+### Valkey Commands & Data Structures
+
+```
+# Store product (key = productId, e.g. "product:0192d4e6-...")
+JSON.SET {productId} $ '{...product JSON...}'
+
+# Get product
+JSON.GET {productId}
+
+# Get specific fields
+JSON.GET {productId} $.name $.price $.ratings
+
+# Update inventory
+JSON.SET {productId} $.inventory.quantity 138
+
+# Store category (key = categoryId, e.g. "category:0192d4e2-...")
+JSON.SET {categoryId} $ '{...category JSON...}'
+
+# Category-to-products index (sorted by creation date)
+ZADD category_products:{categoryId} {timestamp} {productId}
+
+# Get products in category (paginated, newest first)
+ZREVRANGEBYSCORE category_products:{categoryId} +inf -inf LIMIT 0 20
+
+# Brand index
+SADD brand_products:{brand} {productId}
+
+# Price range index (score = price in paise)
+ZADD price_index 8999900 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+ZRANGEBYSCORE price_index 5000000 10000000
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/products` | List products (with filters, pagination) |
+| GET | `/api/products/:id` | Get single product |
+| GET | `/api/categories` | List all categories (tree) |
+| GET | `/api/categories/:id/products` | Products in category |
+| GET | `/api/vendors/:id/products` | Products by vendor |
+| POST | `/api/products` | Create product (vendor/admin) |
+| PATCH | `/api/products/:id` | Update product fields |
+
+### Acceptance Criteria
+- Products are stored as JSON documents with all fields from the contract
+- Category tree supports 2+ levels of nesting
+- Filtering by price range, brand, and category works correctly
+- Pagination returns consistent results
+
+---
+
+## Challenge 3: Shopping Cart with Coupons
+
+### Objective
+Implement a persistent shopping cart with coupon/discount code support using Valkey Hashes and JSON.
+
+### Technical Requirements
+
+- **Cart Storage**: Each user has a cart stored as a Valkey Hash where field = productId and value = quantity, or as a JSON document for richer data.
+- **Cart Operations**: Add item, remove item, update quantity, clear cart.
+- **Coupon System**: Store coupon definitions with rules (percentage off, fixed amount, minimum order, expiry date, usage limits).
+- **Coupon Validation**: Check expiry, minimum order value, usage count, and applicable categories.
+- **Guest Carts**: Support anonymous carts tied to a session ID, merged on login.
+
+### Valkey Commands & Data Structures
+
+```
+# Cart as Hash (simple: productId -> quantity)
+HSET cart:{userId} product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f 2
+HSET cart:{userId} product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a 1
+
+# Get full cart
+HGETALL cart:{userId}
+
+# Update quantity
+HSET cart:{userId} product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f 3
+
+# Remove item
+HDEL cart:{userId} product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Clear cart
+DEL cart:{userId}
+
+# Cart expiry (abandon after 7 days)
+EXPIRE cart:{userId} 604800
+
+# Coupon definition
+JSON.SET coupon:{code} $ '{
+ "code": "VALKEY10",
+ "type": "percentage",
+ "value": 10,
+ "minOrderAmount": 50000,
+ "maxDiscount": 10000,
+ "validFrom": "2025-05-01T00:00:00Z",
+ "validUntil": "2025-06-30T23:59:59Z",
+ "usageLimit": 1000,
+ "usedCount": 342,
+ "applicableCategories": ["category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b", "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a"],
+ "active": true
+}'
+
+# Track coupon usage per user
+SADD coupon_used:{code} {userId}
+SISMEMBER coupon_used:{code} {userId}
+
+# Increment global usage
+JSON.NUMINCRBY coupon:{code} $.usedCount 1
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/cart` | Get current user's cart |
+| POST | `/api/cart/items` | Add item to cart |
+| PATCH | `/api/cart/items/:productId` | Update item quantity |
+| DELETE | `/api/cart/items/:productId` | Remove item from cart |
+| DELETE | `/api/cart` | Clear entire cart |
+| POST | `/api/cart/coupon` | Apply coupon code |
+| DELETE | `/api/cart/coupon` | Remove applied coupon |
+
+### Acceptance Criteria
+- Cart persists across browser sessions for logged-in users
+- Guest carts merge into user cart on login
+- Coupons validate all rules before applying
+- A user cannot use the same coupon twice
+- Cart shows real-time price calculations with discount
+
+---
+
+## Challenge 4: Trending Products
+
+### Objective
+Track product views, purchases, and interactions in real-time to surface trending products using Valkey Sorted Sets.
+
+### Technical Requirements
+
+- **Event Tracking**: Record product views, add-to-cart events, and purchases with timestamps.
+- **Trending Score**: Calculate a weighted score: `views * 1 + addToCart * 3 + purchases * 5`.
+- **Time Decay**: Trending scores should decay over time. Use sliding windows (last 1 hour, 6 hours, 24 hours).
+- **Category Trending**: Track trending per category in addition to global trending.
+
+### Valkey Commands & Data Structures
+
+```
+# Increment product score on view
+ZINCRBY trending:global:1h 1 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+ZINCRBY trending:global:24h 1 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Increment on add-to-cart
+ZINCRBY trending:global:1h 3 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+ZINCRBY trending:global:24h 3 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Increment on purchase
+ZINCRBY trending:global:1h 5 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+ZINCRBY trending:global:24h 5 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Category-specific trending
+ZINCRBY trending:category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b:1h 1 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Get top 10 trending products
+ZREVRANGE trending:global:1h 0 9 WITHSCORES
+
+# Time-series for granular analytics (Sorted Set: score = timestamp, member = productId)
+ZADD product_views:{date} {timestamp} {productId}
+# Count views in last hour
+ZCOUNT product_views:{date} {timestamp - 3600} {timestamp}
+
+# Expire hourly buckets (auto-cleanup)
+EXPIRE trending:global:1h 3600
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/trending` | Get global trending products |
+| GET | `/api/trending/:categoryId` | Trending in category |
+| POST | `/api/events/view` | Record product view |
+| POST | `/api/events/add-to-cart` | Record add-to-cart |
+| POST | `/api/events/purchase` | Record purchase event |
+
+### Acceptance Criteria
+- Trending list updates in real-time as events come in
+- Different time windows return different results
+- Scores reflect weighted interactions (purchase > add-to-cart > view)
+- Stale products naturally fall off trending lists
+
+---
+
+## Challenge 5: Ads
+
+### Objective
+Build an ad placement and targeting system that serves relevant ads based on user context (current category, search query, browsing history) using Valkey.
+
+### Technical Requirements
+
+- **Ad Storage**: Store ad creatives with targeting rules (categories, keywords, user segments).
+- **Ad Selection**: Given a context (page, category, search term), select the most relevant ad with highest bid.
+- **Impression Tracking**: Count impressions and clicks per ad. Enforce daily budget limits.
+- **Frequency Capping**: Limit how many times a user sees the same ad per session/day.
+
+### Valkey Commands & Data Structures
+
+```
+# Store ad creative (key = adId, e.g. "ad:0192d4e9-...")
+JSON.SET {adId} $ '{
+ "id": "ad:0192d4e9-6f7a-7d8e-9b0c-3d4e5f6a7b8c",
+ "vendorId": "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ "title": "Summer Electronics Sale",
+ "imageUrl": "/assets/ads/summer-sale.jpg",
+ "targetUrl": "/shop?sale=summer",
+ "targetCategories": ["category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b", "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c"],
+ "targetKeywords": ["phone", "laptop", "gadget"],
+ "bidAmount": 500,
+ "dailyBudget": 50000,
+ "status": "active"
+}'
+
+# Index ads by category (sorted by bid)
+ZADD ads:category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b 500 ad:0192d4e9-6f7a-7d8e-9b0c-3d4e5f6a7b8c
+
+# Track impressions today
+INCR ad_impressions:{adId}:{date}
+EXPIRE ad_impressions:{adId}:{date} 86400
+
+# Track clicks
+INCR ad_clicks:{adId}:{date}
+
+# Frequency cap per user per day
+INCR ad_freq:{userId}:{adId}:{date}
+EXPIRE ad_freq:{userId}:{adId}:{date} 86400
+
+# Daily spend tracking
+INCRBY ad_spend:{adId}:{date} {bidAmount}
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/ads?context=category&value=category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b` | Get relevant ads |
+| POST | `/api/ads/:adId/impression` | Record impression |
+| POST | `/api/ads/:adId/click` | Record click |
+| POST | `/api/ads` | Create ad (vendor) |
+| GET | `/api/ads/:adId/stats` | Get ad performance |
+
+### Acceptance Criteria
+- Ads are served based on relevance to current page context
+- Higher bids get priority placement
+- Ads stop serving when daily budget is exhausted
+- Users don't see the same ad more than 3 times per session
+- Click-through rate (CTR) is trackable
+
+---
+
+## Challenge 6: Full-Text Search
+
+### Objective
+Implement product search with full-text capabilities using Valkey Search module. Support autocomplete, typo tolerance, and faceted filtering.
+
+### Technical Requirements
+
+- **Index Creation**: Create a search index on product JSON documents covering name, description, brand, tags, category, and price.
+- **Query Support**: Full-text queries with stemming, prefix matching, and fuzzy matching.
+- **Faceted Search**: Return aggregated counts by category, brand, and price range alongside results.
+- **Autocomplete**: Provide search suggestions as the user types (prefix-based).
+- **Sorting**: Support sorting by relevance, price (asc/desc), rating, and newest.
+
+### Valkey Commands & Data Structures
+
+```
+# Create search index on JSON documents
+FT.CREATE idx:products ON JSON PREFIX 1 product:
+ SCHEMA
+ $.name AS name TEXT WEIGHT 5.0
+ $.description AS description TEXT WEIGHT 1.0
+ $.brand AS brand TEXT WEIGHT 3.0 SORTABLE
+ $.tags AS tags TAG SEPARATOR ","
+ $.categoryId AS categoryId TAG
+ $.price.amount AS price NUMERIC SORTABLE
+ $.ratings.average AS rating NUMERIC SORTABLE
+ $.status AS status TAG
+ $.createdAt AS createdAt TEXT SORTABLE
+
+# Full-text search
+FT.SEARCH idx:products "galaxy phone" LIMIT 0 20
+
+# Search with filters
+FT.SEARCH idx:products "@name:galaxy @categoryId:{0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c} @price:[50000 100000]"
+ SORTBY price ASC
+ LIMIT 0 20
+
+# Fuzzy search (typo tolerance)
+FT.SEARCH idx:products "%%galxy%%" LIMIT 0 10
+
+# Faceted aggregation (count by brand)
+FT.AGGREGATE idx:products "phone"
+ GROUPBY 1 @brand
+ REDUCE COUNT 0 AS count
+ SORTBY 2 @count DESC
+
+# Autocomplete suggestions
+FT.SUGADD autocomplete "Galaxy Ultra Pro" 100
+FT.SUGADD autocomplete "Gaming Laptop" 85
+FT.SUGGET autocomplete "gal" FUZZY MAX 5
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/search?q=galaxy&category=category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c&minPrice=50000&maxPrice=100000&sort=price_asc&page=1` | Search products |
+| GET | `/api/search/suggest?q=gal` | Autocomplete suggestions |
+| GET | `/api/search/facets?q=phone` | Get facet counts |
+
+### Response Format
+
+```json
+{
+ "query": "galaxy phone",
+ "total": 47,
+ "page": 1,
+ "pageSize": 20,
+ "results": [
+ { "id": "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f", "name": "Galaxy Ultra Pro 256GB", "score": 0.95, "...": "..." }
+ ],
+ "facets": {
+ "brands": [{ "name": "Samsung", "count": 23 }, { "name": "Apple", "count": 12 }],
+ "priceRanges": [{ "range": "50000-100000", "count": 18 }],
+ "categories": [{ "id": "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c", "name": "Smartphones", "count": 35 }]
+ }
+}
+```
+
+### Acceptance Criteria
+- Search returns relevant results within 50ms
+- Typos in queries still return useful results
+- Facets accurately reflect the filtered result set
+- Autocomplete responds within 20ms
+- Results can be sorted by multiple criteria
+
+---
+
+## Challenge 7: Vector Similarity Search
+
+### Objective
+Implement semantic product search using vector embeddings stored in Valkey. Users can search by meaning rather than exact keywords (e.g., "something to keep my coffee warm" → finds thermoses and insulated mugs).
+
+### Technical Requirements
+
+- **Embedding Generation**: Generate vector embeddings for product descriptions using a pre-trained model (e.g., sentence-transformers, OpenAI embeddings). Store as FLOAT32 vectors.
+- **Vector Index**: Create a vector similarity index using HNSW or FLAT algorithm.
+- **Hybrid Search**: Combine vector similarity with traditional filters (category, price range).
+- **Similar Products**: Given a product, find visually or semantically similar products.
+
+### Valkey Commands & Data Structures
+
+```
+# Create vector index on product embeddings
+FT.CREATE idx:product_vectors ON JSON PREFIX 1 product:
+ SCHEMA
+ $.name AS name TEXT
+ $.categoryId AS categoryId TAG
+ $.price.amount AS price NUMERIC
+ $.embedding AS embedding VECTOR HNSW 6
+ TYPE FLOAT32
+ DIM 384
+ DISTANCE_METRIC COSINE
+
+# KNN search (find 10 most similar products to query vector)
+FT.SEARCH idx:product_vectors
+ "*=>[KNN 10 @embedding $query_vec AS score]"
+ PARAMS 2 query_vec "\x00\x00..."
+ SORTBY score
+ RETURN 4 name score price categoryId
+ DIALECT 2
+
+# Hybrid: vector search + category filter
+FT.SEARCH idx:product_vectors
+ "(@categoryId:{0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b})=>[KNN 10 @embedding $query_vec AS score]"
+ PARAMS 2 query_vec "\x00\x00..."
+ SORTBY score
+ DIALECT 2
+
+# Similar products (use product's own embedding as query)
+# 1. Get the product embedding
+JSON.GET product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f $.embedding
+# 2. Use it as query vector in KNN search
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/search/semantic?q=keep coffee warm` | Semantic search |
+| GET | `/api/products/:id/similar` | Find similar products |
+| POST | `/api/search/by-image` | Search by image embedding |
+
+### Acceptance Criteria
+- Semantic queries return contextually relevant results even without keyword matches
+- Vector search completes within 100ms for 10K+ products
+- Similar products endpoint returns genuinely related items
+- Hybrid search correctly applies filters on top of vector results
+
+---
+
+## Challenge 8: Analytics with Prometheus
+
+### Objective
+Instrument the application with metrics and expose them in Prometheus format. Track business KPIs and system performance using Valkey core data structures for real-time dashboards.
+
+### Technical Requirements
+
+- **Business Metrics**: Track orders per minute, revenue per hour, active users, cart abandonment rate.
+- **System Metrics**: Track API response times, Valkey command latency, error rates.
+- **Metrics Storage**: Use Valkey Sorted Sets (score = timestamp), Hashes, and HyperLogLog for metrics aggregation.
+- **Prometheus Endpoint**: Expose `/metrics` in Prometheus exposition format.
+- **Time Bucketing**: Use time-bucketed keys (per minute, per hour) with TTL for automatic cleanup.
+
+### Valkey Commands & Data Structures
+
+```
+# Orders counter (per-minute bucket, auto-expires)
+INCR metrics:orders:count:{minute_timestamp}
+EXPIRE metrics:orders:count:{minute_timestamp} 86400
+
+# Revenue tracking (per-hour bucket)
+INCRBY metrics:revenue:{hour_timestamp} 100299
+EXPIRE metrics:revenue:{hour_timestamp} 604800
+
+# API latency tracking (Sorted Set: score = latency, member = requestId)
+ZADD metrics:api_latency:{minute_timestamp} 45 {requestId}
+EXPIRE metrics:api_latency:{minute_timestamp} 3600
+
+# Calculate percentiles from sorted set
+ZCARD metrics:api_latency:{minute_timestamp} # total count
+ZRANGEBYSCORE metrics:api_latency:{minute_timestamp} -inf +inf # all values sorted
+# p50 = element at index count/2, p95 = element at index count*0.95
+
+# Active users (HyperLogLog for unique count)
+PFADD active_users:{date}:{hour} {userId}
+PFCOUNT active_users:{date}:{hour}
+
+# Gauge-style metrics (current value in a Hash)
+HSET metrics:gauges cart_abandonment_rate 0.23
+HSET metrics:gauges active_sessions 1542
+HSET metrics:gauges items_in_stock 48230
+
+# Counter-style metrics (atomic increment)
+INCR metrics:counters:http_requests:{status_code}:{minute_timestamp}
+INCR metrics:counters:valkey_commands:{minute_timestamp}
+INCR metrics:counters:errors:{service}:{minute_timestamp}
+
+# Query metrics for a time range (scan matching keys)
+# Application code iterates over minute buckets between from/to timestamps
+# e.g., GET metrics:orders:count:1716372600, GET metrics:orders:count:1716372660, ...
+
+# Histogram buckets for latency distribution
+HINCRBY metrics:latency_histogram:{minute_timestamp} "le_10" 1 # <= 10ms
+HINCRBY metrics:latency_histogram:{minute_timestamp} "le_50" 1 # <= 50ms
+HINCRBY metrics:latency_histogram:{minute_timestamp} "le_100" 1 # <= 100ms
+HINCRBY metrics:latency_histogram:{minute_timestamp} "le_500" 1 # <= 500ms
+HINCRBY metrics:latency_histogram:{minute_timestamp} "le_inf" 1 # <= +Inf
+EXPIRE metrics:latency_histogram:{minute_timestamp} 86400
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/metrics` | Prometheus exposition format |
+| GET | `/api/analytics/dashboard` | Real-time dashboard data |
+| GET | `/api/analytics/revenue?from=&to=&interval=1h` | Revenue over time |
+| GET | `/api/analytics/orders?from=&to=` | Order count over time |
+| GET | `/api/analytics/active-users` | Unique active users |
+
+### Prometheus Exposition Format Example
+
+```
+# HELP http_requests_total Total HTTP requests
+# TYPE http_requests_total counter
+http_requests_total{method="GET",status="200"} 1542
+http_requests_total{method="POST",status="201"} 312
+
+# HELP http_request_duration_seconds HTTP request latency
+# TYPE http_request_duration_seconds histogram
+http_request_duration_seconds_bucket{le="0.01"} 800
+http_request_duration_seconds_bucket{le="0.05"} 1200
+http_request_duration_seconds_bucket{le="0.1"} 1400
+http_request_duration_seconds_bucket{le="0.5"} 1520
+http_request_duration_seconds_bucket{le="+Inf"} 1542
+
+# HELP active_users_total Current unique active users
+# TYPE active_users_total gauge
+active_users_total 1542
+```
+
+### Acceptance Criteria
+- Prometheus can scrape the `/metrics` endpoint successfully
+- Metrics are bucketed by time with automatic TTL-based cleanup
+- Dashboard shows real-time updates (< 5 second delay)
+- At least 5 business metrics and 3 system metrics are tracked
+- Latency percentiles (p50, p95, p99) are calculable from stored data
+
+---
+
+## Challenge 9: Observability with OpenSearch
+
+### Objective
+Implement structured logging, distributed tracing, and error tracking. Forward logs to OpenSearch for centralized search and visualization.
+
+### Technical Requirements
+
+- **Structured Logging**: All logs in JSON format with correlation IDs, timestamps, severity levels, and context.
+- **Request Tracing**: Assign a trace ID to each incoming request. Propagate through all internal calls.
+- **Error Tracking**: Capture and aggregate errors with stack traces, frequency, and affected users.
+- **Log Buffering**: Use Valkey Streams as a buffer before forwarding to OpenSearch (prevents log loss during OpenSearch downtime).
+
+### Valkey Commands & Data Structures
+
+```
+# Buffer logs in a Valkey Stream
+XADD logs:app * level "error" service "cart-service" traceId "trc_abc123"
+ message "Failed to apply coupon" userId "user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e"
+ timestamp "2025-05-22T09:15:00Z" stack "Error: Invalid coupon..."
+
+# Read logs (consumer group for reliable processing)
+XGROUP CREATE logs:app log-forwarder $ MKSTREAM
+XREADGROUP GROUP log-forwarder worker-1 COUNT 100 BLOCK 5000 STREAMS logs:app >
+
+# Acknowledge processed logs
+XACK logs:app log-forwarder {messageId}
+
+# Trim old logs (keep last 100K entries)
+XTRIM logs:app MAXLEN ~ 100000
+
+# Error aggregation
+ZINCRBY errors:24h 1 "cart-service:InvalidCoupon"
+EXPIRE errors:24h 86400
+
+# Request tracing (store span data)
+JSON.SET trace:{traceId} $ '{
+ "traceId": "trc_abc123",
+ "spans": [
+ {"service": "api-gateway", "operation": "POST /cart/coupon", "duration": 45},
+ {"service": "cart-service", "operation": "validateCoupon", "duration": 12},
+ {"service": "valkey", "operation": "JSON.GET coupon:VALKEY10", "duration": 2}
+ ],
+ "totalDuration": 45,
+ "status": "error"
+}'
+EXPIRE trace:{traceId} 3600
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/observability/logs?level=error&service=cart-service&limit=50` | Query recent logs |
+| GET | `/api/observability/traces/:traceId` | Get full trace |
+| GET | `/api/observability/errors` | Top errors (last 24h) |
+| GET | `/api/observability/health` | Service health status |
+
+### Acceptance Criteria
+- All API requests have a unique trace ID in response headers (`X-Trace-Id`)
+- Logs are buffered in Valkey Streams and forwarded to OpenSearch
+- No logs are lost during brief OpenSearch outages
+- Errors are aggregated and ranked by frequency
+- Trace data shows the full request lifecycle across services
+
+---
+
+## Challenge 10: Checkout with Inventory Tracking
+
+### Objective
+Implement a checkout flow with atomic inventory reservation, payment processing, and order creation. Prevent overselling using Valkey transactions.
+
+### Technical Requirements
+
+- **Inventory Reservation**: When a user starts checkout, reserve inventory atomically. Release if checkout is abandoned (TTL-based).
+- **Atomic Decrement**: Use Lua scripts or transactions to ensure inventory never goes negative.
+- **Order Creation**: Create order document on successful payment. Update inventory permanently.
+- **Idempotency**: Prevent duplicate orders from double-clicks or retries using idempotency keys.
+
+### Valkey Commands & Data Structures
+
+```
+# Atomic inventory check-and-reserve (Lua script)
+# KEYS[1] = product inventory key, ARGV[1] = quantity
+EVAL "
+ local current = tonumber(redis.call('JSON.GET', KEYS[1], '$.inventory.quantity'))
+ local reserved = tonumber(redis.call('JSON.GET', KEYS[1], '$.inventory.reserved'))
+ local available = current - reserved
+ if available >= tonumber(ARGV[1]) then
+ redis.call('JSON.NUMINCRBY', KEYS[1], '$.inventory.reserved', ARGV[1])
+ return 1
+ end
+ return 0
+" 1 product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f 2
+
+# Reservation with TTL (auto-release after 10 minutes)
+SET reservation:{orderId}:{productId} {quantity} EX 600
+
+# On successful payment: commit inventory
+JSON.NUMINCRBY {productId} $.inventory.quantity -{quantity}
+JSON.NUMINCRBY {productId} $.inventory.reserved -{quantity}
+DEL reservation:{orderId}:{productId}
+
+# On abandoned checkout: release reservation
+# (handled by TTL expiry + keyspace notification)
+
+# Idempotency key
+SET idempotency:{key} {orderId} NX EX 86400
+
+# Store order
+JSON.SET {orderId} $ '{...order JSON...}'
+
+# Order history index
+ZADD user_orders:{userId} {timestamp} {orderId}
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| POST | `/api/checkout/start` | Reserve inventory, create pending order |
+| POST | `/api/checkout/payment` | Process payment |
+| POST | `/api/checkout/confirm` | Confirm order after payment |
+| POST | `/api/checkout/cancel` | Cancel and release inventory |
+| GET | `/api/orders` | User's order history |
+| GET | `/api/orders/:id` | Order details |
+
+### Acceptance Criteria
+- Inventory never goes negative even under concurrent checkouts
+- Abandoned reservations auto-release after 10 minutes
+- Duplicate payment submissions are safely rejected
+- Order is only created after successful payment confirmation
+- Full order history is queryable per user
+
+---
+
+## Challenge 11: Delivery with Geolocation
+
+### Objective
+Implement delivery tracking with real-time geolocation updates using Valkey Geospatial commands. Support delivery radius queries and ETA calculations.
+
+### Technical Requirements
+
+- **Geospatial Indexing**: Store delivery agent locations and warehouse positions using Valkey GEO commands.
+- **Real-time Updates**: Delivery agents push location updates every 10 seconds.
+- **Proximity Queries**: Find nearest warehouse to customer, nearest delivery agent to warehouse.
+- **ETA Calculation**: Estimate delivery time based on distance and average speed.
+- **Delivery Zones**: Define serviceable areas and validate delivery addresses.
+
+### Valkey Commands & Data Structures
+
+```
+# Store warehouse locations
+GEOADD warehouses 78.4347 17.4156 "HYD-WH-01"
+GEOADD warehouses 78.3772 17.4435 "HYD-WH-02"
+GEOADD warehouses 78.4867 17.3850 "HYD-WH-03"
+
+# Store delivery agent locations (updated every 10s)
+GEOADD delivery_agents 78.4100 17.4300 "agent_raj_001"
+GEOADD delivery_agents 78.4500 17.4200 "agent_kumar_002"
+
+# Find nearest warehouse to customer (within 15km)
+GEOSEARCH warehouses FROMLONLAT 78.4347 17.4156 BYRADIUS 15 km ASC COUNT 3
+
+# Find nearest delivery agent to warehouse
+GEOSEARCH delivery_agents FROMLONLAT 78.4347 17.4156 BYRADIUS 5 km ASC COUNT 1
+
+# Distance between agent and delivery address
+GEODIST delivery_agents "agent_raj_001" "customer_location" km
+
+# Store delivery tracking info (key = trackingId)
+JSON.SET {trackingId} $ '{
+ "trackingId": "DEL-HYD-98765",
+ "orderId": "order:0192d4e8-5e6f-7c8d-8a0b-2c3d4e5f6a7b",
+ "agentId": "agent_raj_001",
+ "status": "in_transit",
+ "pickupLocation": {"lat": 17.4156, "lng": 78.4347},
+ "dropLocation": {"lat": 17.4300, "lng": 78.4100},
+ "currentLocation": {"lat": 17.4200, "lng": 78.4200},
+ "estimatedArrival": "2025-05-22T11:30:00Z",
+ "history": [
+ {"status": "picked_up", "timestamp": "2025-05-22T10:00:00Z", "lat": 17.4156, "lng": 78.4347},
+ {"status": "in_transit", "timestamp": "2025-05-22T10:15:00Z", "lat": 17.4200, "lng": 78.4200}
+ ]
+}'
+
+# Pub/Sub for real-time location updates to frontend
+PUBLISH delivery:location:{trackingId} '{"lat": 17.4250, "lng": 78.4150, "eta": "11:25"}'
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/delivery/:trackingId` | Get delivery status and location |
+| GET | `/api/delivery/:trackingId/track` | SSE stream for real-time updates |
+| POST | `/api/delivery/:trackingId/location` | Agent pushes location update |
+| GET | `/api/delivery/check-serviceability?lat=&lng=` | Check if address is serviceable |
+| GET | `/api/delivery/eta?from=&to=` | Estimate delivery time |
+
+### Acceptance Criteria
+- Delivery location updates in real-time on the frontend map
+- Nearest warehouse selection is correct based on customer location
+- ETA updates as delivery agent moves
+- Non-serviceable areas are correctly rejected
+- Location history is preserved for the full delivery lifecycle
+
+---
+
+## Challenge 12: Rate Limiting
+
+### Objective
+Implement API rate limiting to protect services from abuse. Support multiple strategies: fixed window, sliding window, and token bucket.
+
+### Technical Requirements
+
+- **Per-User Limits**: Authenticated users get higher limits than anonymous users.
+- **Per-Endpoint Limits**: Different endpoints have different rate limits (e.g., search: 30/min, checkout: 5/min).
+- **Sliding Window**: Use a sliding window algorithm for smooth rate limiting without burst edges.
+- **Response Headers**: Return `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.
+- **Graceful Degradation**: Return 429 Too Many Requests with retry-after information.
+
+### Valkey Commands & Data Structures
+
+```
+# Fixed Window (simple counter)
+INCR ratelimit:{userId}:{endpoint}:{window}
+EXPIRE ratelimit:{userId}:{endpoint}:{window} 60
+# Check: if count > limit, reject
+
+# Sliding Window Log (precise but memory-intensive)
+ZADD ratelimit:sliding:{userId}:{endpoint} {timestamp} {requestId}
+ZREMRANGEBYSCORE ratelimit:sliding:{userId}:{endpoint} 0 {timestamp - windowSize}
+ZCARD ratelimit:sliding:{userId}:{endpoint}
+# Check: if count > limit, reject
+
+# Token Bucket (Lua script for atomicity)
+EVAL "
+ local key = KEYS[1]
+ local now = tonumber(ARGV[1])
+ local rate = tonumber(ARGV[2])
+ local capacity = tonumber(ARGV[3])
+ local requested = tonumber(ARGV[4])
+
+ local bucket = redis.call('HMGET', key, 'tokens', 'last_refill')
+ local tokens = tonumber(bucket[1]) or capacity
+ local last_refill = tonumber(bucket[2]) or now
+
+ local elapsed = now - last_refill
+ local refill = math.floor(elapsed * rate)
+ tokens = math.min(capacity, tokens + refill)
+
+ if tokens >= requested then
+ tokens = tokens - requested
+ redis.call('HMSET', key, 'tokens', tokens, 'last_refill', now)
+ redis.call('EXPIRE', key, math.ceil(capacity / rate) + 1)
+ return {1, tokens}
+ end
+ return {0, tokens}
+" 1 ratelimit:bucket:{userId}:{endpoint} {now} {rate} {capacity} 1
+
+# IP-based rate limiting for anonymous users
+INCR ratelimit:ip:{clientIp}:{endpoint}:{minute}
+EXPIRE ratelimit:ip:{clientIp}:{endpoint}:{minute} 60
+```
+
+### Rate Limit Configuration
+
+```json
+{
+ "endpoints": {
+ "/api/search": { "anonymous": 20, "authenticated": 60, "window": 60 },
+ "/api/checkout/start": { "anonymous": 0, "authenticated": 5, "window": 60 },
+ "/api/auth/login": { "anonymous": 5, "authenticated": 5, "window": 900 },
+ "/api/products": { "anonymous": 30, "authenticated": 100, "window": 60 },
+ "/api/cart/*": { "anonymous": 10, "authenticated": 30, "window": 60 }
+ }
+}
+```
+
+### API Response Headers
+
+```
+HTTP/1.1 429 Too Many Requests
+X-RateLimit-Limit: 60
+X-RateLimit-Remaining: 0
+X-RateLimit-Reset: 1716372600
+Retry-After: 45
+Content-Type: application/json
+
+{"error": "rate_limit_exceeded", "message": "Too many requests. Try again in 45 seconds."}
+```
+
+### Acceptance Criteria
+- Rate limits are enforced per user and per endpoint
+- Anonymous users have stricter limits than authenticated users
+- Response headers accurately reflect remaining quota
+- 429 responses include actionable retry information
+- Rate limiting does not add more than 2ms latency to requests
+
+---
+
+## Challenge 13: Real-time Recommendations
+
+### Objective
+Build a recommendation engine that suggests products based on user behavior (collaborative filtering), browsing history, and purchase patterns using Valkey data structures.
+
+### Technical Requirements
+
+- **Browsing History**: Track recently viewed products per user. Use this for "Recently Viewed" and "Continue Shopping" sections.
+- **Collaborative Filtering**: "Users who bought X also bought Y" — use co-purchase matrices stored in Sorted Sets.
+- **Category Affinity**: Track which categories a user browses most. Weight recommendations toward preferred categories.
+- **Real-time Updates**: Recommendations update immediately as new interactions occur.
+- **Diversity**: Avoid recommending the same items repeatedly. Mix familiar categories with discovery.
+
+### Valkey Commands & Data Structures
+
+```
+# Recently viewed (capped list, newest first)
+LPUSH user_history:{userId} product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+LTRIM user_history:{userId} 0 49
+
+# Co-purchase matrix: "bought with" relationships
+# When user buys productA and productB together:
+ZINCRBY copurchase:{productA} 1 {productB}
+ZINCRBY copurchase:{productB} 1 {productA}
+
+# Get top co-purchased products
+ZREVRANGE copurchase:{productId} 0 9 WITHSCORES
+
+# Category affinity (weighted by recency and action type)
+ZINCRBY user_affinity:{userId} 1 category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b # view
+ZINCRBY user_affinity:{userId} 3 category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b # add to cart
+ZINCRBY user_affinity:{userId} 5 category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b # purchase
+
+# Get user's top categories
+ZREVRANGE user_affinity:{userId} 0 4 WITHSCORES
+
+# "Frequently bought together" for product page
+ZREVRANGE copurchase:product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f 0 4
+
+# Personalized feed: combine affinity + trending + history
+# Use ZUNIONSTORE with weights for blended scoring
+ZUNIONSTORE recommendations:{userId} 3
+ user_affinity:{userId}
+ trending:global:24h
+ copurchase:{lastViewedProduct}
+ WEIGHTS 3 1 2
+
+# Exclude already purchased
+SDIFF recommendations:{userId} user_purchased:{userId}
+
+# Session-based recommendations (for anonymous users)
+LPUSH session_history:{sessionId} product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+EXPIRE session_history:{sessionId} 1800
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| GET | `/api/recommendations/personalized` | Personalized product feed |
+| GET | `/api/recommendations/similar/:productId` | "Customers also bought" |
+| GET | `/api/recommendations/recently-viewed` | User's browsing history |
+| GET | `/api/recommendations/trending-for-you` | Trending in user's preferred categories |
+| POST | `/api/recommendations/events` | Record interaction event |
+
+### Acceptance Criteria
+- Recommendations are personalized based on actual user behavior
+- New interactions immediately influence recommendations
+- "Bought together" suggestions are based on real co-purchase data
+- Anonymous users get session-based recommendations
+- Already-purchased items are excluded from suggestions
+
+---
+
+## Challenge 14: Agentic Search
+
+### Objective
+Build an AI-powered search experience that understands natural language queries, maintains conversation context, and can perform multi-step reasoning to find products. Combine full-text search, vector search, and structured filters into an intelligent agent.
+
+### Technical Requirements
+
+- **Natural Language Understanding**: Parse queries like "I need a birthday gift for my 10-year-old nephew who likes science" into structured search parameters.
+- **Multi-step Reasoning**: The agent can refine results by asking clarifying questions or combining multiple searches.
+- **Conversation Memory**: Maintain search context across multiple turns using Valkey (e.g., "show me cheaper options" refers to the previous search).
+- **Tool Use**: The agent has access to tools: `search_products`, `filter_by_price`, `get_reviews`, `check_availability`, `get_similar`.
+- **Result Explanation**: Explain why each product was recommended in the context of the user's query.
+
+### Valkey Commands & Data Structures
+
+```
+# Store conversation context
+JSON.SET conversation:{sessionId} $ '{
+ "sessionId": "sess_abc123",
+ "userId": "user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e",
+ "turns": [
+ {
+ "role": "user",
+ "content": "I need a birthday gift for my 10-year-old nephew who likes science",
+ "timestamp": "2025-05-22T10:00:00Z"
+ },
+ {
+ "role": "agent",
+ "content": "Here are some science-themed gifts...",
+ "searchParams": {
+ "categories": ["category:0192d4e5-9c0d-7e1f-8a2b-3c4d5e6f7a8b", "category:0192d4e5-ad1e-7f2a-9b3c-4d5e6f7a8b9c"],
+ "tags": ["science", "educational", "kids"],
+ "priceRange": [500, 5000],
+ "ageGroup": "8-12"
+ },
+ "results": ["product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f", "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a", "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b"],
+ "timestamp": "2025-05-22T10:00:01Z"
+ }
+ ],
+ "context": {
+ "intent": "gift_search",
+ "recipient": "nephew",
+ "age": 10,
+ "interests": ["science"],
+ "budget": null
+ }
+}'
+EXPIRE conversation:{sessionId} 1800
+
+# Agent tool results cache (avoid re-running expensive searches)
+SET agent_cache:{queryHash} '{...results...}' EX 300
+
+# Search intent classification (pre-computed embeddings for intent matching)
+FT.SEARCH idx:intent_vectors
+ "*=>[KNN 1 @embedding $query_vec AS score]"
+ PARAMS 2 query_vec {encoded_query}
+ DIALECT 2
+
+# User preference learning (long-term)
+JSON.SET user_preferences:{userId} $ '{
+ "pricePreference": "mid-range",
+ "favoriteCategories": ["category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b", "category:0192d4e5-ad1e-7f2a-9b3c-4d5e6f7a8b9c"],
+ "brandPreferences": ["Samsung", "Sony"],
+ "avoidCategories": ["category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a"]
+}'
+```
+
+### Agent Tools Definition
+
+```json
+{
+ "tools": [
+ {
+ "name": "search_products",
+ "description": "Search products by keywords, category, and filters",
+ "parameters": {
+ "query": "string",
+ "categories": "string[]",
+ "tags": "string[]",
+ "minPrice": "number",
+ "maxPrice": "number",
+ "minRating": "number"
+ }
+ },
+ {
+ "name": "semantic_search",
+ "description": "Find products by meaning using vector similarity",
+ "parameters": { "naturalLanguageQuery": "string", "limit": "number" }
+ },
+ {
+ "name": "get_product_details",
+ "description": "Get full details including reviews for a specific product",
+ "parameters": { "productId": "string" }
+ },
+ {
+ "name": "check_availability",
+ "description": "Check if product is in stock and deliverable",
+ "parameters": { "productId": "string", "postalCode": "string" }
+ },
+ {
+ "name": "find_similar",
+ "description": "Find products similar to a given product",
+ "parameters": { "productId": "string", "limit": "number" }
+ },
+ {
+ "name": "ask_clarification",
+ "description": "Ask the user a clarifying question",
+ "parameters": { "question": "string", "options": "string[]" }
+ }
+ ]
+}
+```
+
+### API Endpoints
+
+| Method | Path | Description |
+|--------|------|-------------|
+| POST | `/api/agent/search` | Send natural language query to agent |
+| GET | `/api/agent/conversation/:sessionId` | Get conversation history |
+| POST | `/api/agent/feedback` | User feedback on results (thumbs up/down) |
+
+### Request/Response Example
+
+```json
+// Request
+{
+ "sessionId": "sess_abc123",
+ "message": "I need a birthday gift for my 10-year-old nephew who likes science"
+}
+
+// Response
+{
+ "sessionId": "sess_abc123",
+ "response": "Here are some great science gifts for a 10-year-old! I focused on educational toys and experiment kits:",
+ "results": [
+ {
+ "productId": "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c",
+ "name": "National Geographic Science Kit",
+ "price": 2499,
+ "reason": "Highly rated science experiment kit designed for ages 8-12"
+ },
+ {
+ "productId": "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d",
+ "name": "Kids Starter Telescope",
+ "price": 3999,
+ "reason": "Perfect for a budding astronomer, includes star chart"
+ }
+ ],
+ "followUp": "Would you like me to filter by a specific budget, or show options in a particular science area (chemistry, astronomy, robotics)?",
+ "context": { "intent": "gift_search", "refinements_available": true }
+}
+```
+
+### Acceptance Criteria
+- Agent correctly interprets natural language queries into search parameters
+- Conversation context is maintained across multiple turns
+- "Show me cheaper options" correctly references the previous search
+- Agent uses multiple tools in sequence when needed
+- Results include explanations relevant to the user's stated needs
+- Response time is under 3 seconds for the full agent pipeline
+
+---
+
+## General Guidelines
+
+### Valkey Connection
+
+All services should connect to Valkey at `localhost:6379` by default, configurable via environment variable:
+
+```
+VALKEY_URL=redis://localhost:6379
+```
+
+### Key Naming Convention
+
+Since entity IDs already include the domain prefix (`user:uuid`, `product:uuid`), Valkey keys for primary entities **use the ID directly as the key**. For derived/secondary data structures, append qualifiers:
+
+```
+# Primary entity storage — the key IS the entity ID
+user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e → user JSON document
+product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f → product JSON document
+order:0192d4e8-5e6f-7c8d-8a0b-2c3d4e5f6a7b → order JSON document
+
+# Derived data — use {purpose}:{entityId} or {purpose}:{qualifier}
+cart:user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e → user's cart hash
+session:0192d4f0-1a2b-7c3d-8e4f-5a6b7c8d9e0f → session token
+trending:global:1h → global trending sorted set
+trending:category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b:1h → category trending
+ratelimit:user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e:/api/search:1716372600
+```
+
+This means `JSON.SET` and `JSON.GET` use the entity ID directly as the key:
+```
+JSON.SET product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f $ '{...}'
+JSON.GET user:0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e
+```
+
+Because UUIDv7 is lexicographically sortable by time, you can use `SCAN` with a prefix pattern to find all keys for entities created in a time range, or use `ZRANGEBYLEX` on sorted sets containing prefixed UUIDv7 members.
+
+### Error Handling
+
+All API responses should follow this error format:
+
+```json
+{
+ "error": "error_code",
+ "message": "Human-readable description",
+ "details": {}
+}
+```
+
+### Performance Targets
+
+| Operation | Target Latency |
+|-----------|---------------|
+| Key-value read | < 1ms |
+| JSON document read | < 5ms |
+| Full-text search | < 10ms |
+| Vector search (10K docs) | < 10ms |
+| Geospatial query | < 5ms |
+| Rate limit check | < 2ms |
+
+Good luck building! 🚀
diff --git a/submissions/valkey-ecommerce-demo/LICENSE b/submissions/valkey-ecommerce-demo/LICENSE
new file mode 100644
index 0000000..1921b32
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 opensource-for-valkey
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/submissions/valkey-ecommerce-demo/README.md b/submissions/valkey-ecommerce-demo/README.md
new file mode 100644
index 0000000..4f144b3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/README.md
@@ -0,0 +1,192 @@
+# Valkey E-Commerce Demo
+
+An e-commerce platform built with React + Node.js, showcasing **Valkey** as the core data layer across every major e-commerce subsystem. Built with **Breeth AI** for intelligent shopping assistance and personalized memory.
+
+> Created for the **Build Beyond Limits** hackathon powered by Valkey, hosted by React Hyderabad.
+
+---
+
+## Valkey Features Demonstrated
+
+| Feature | Valkey Data Structure | Command | Use Case |
+|---|---|---|---|
+| **Cart Management** | Hash | `HSET / HGETALL / HDEL` | Persistent cart per user, 7-day TTL |
+| **Session Storage** | String + TTL | `SET session:{token} EX 86400` | JWT-less auth sessions, 24h expiry |
+| **Product Catalog Cache** | JSON | `JSON.SET / JSON.GET` | Product documents + field-level updates |
+| **Real-time Inventory** | JSON + Lua | `JSON.NUMINCRBY + EVAL` | Atomic stock reservation, no overselling |
+| **Full-Text Search** | Search Module | `FT.CREATE / FT.SEARCH` | Product search with fuzzy match + filters |
+| **Trending Products** | Sorted Set | `ZINCRBY / ZREVRANGE` | Time-windowed trending with auto-expire |
+| **AI Conversation Cache** | JSON + TTL | `JSON.SET EX 1800` | 30-min session cache for Breeth AI chats |
+| **User Affinity** | Sorted Set | `ZINCRBY` | Category preference scoring |
+| **Coupon System** | JSON + Set | `JSON.GET / SISMEMBER` | Coupon definitions + per-user usage tracking |
+| **Rate Limiting** | String | `INCR / EXPIRE` | Login attempt rate limiting |
+| **Autocomplete** | Suggestion Index | `FT.SUGADD / FT.SUGGET` | Live product search suggestions |
+
+---
+
+## Breeth AI Integration
+
+[Breeth](https://thebreeth.com) provides intent-aware memory for the AI Shopping Assistant:
+
+- **Long-term user preferences** stored as graph facts (category affinity, browsing patterns)
+- **Cross-session memory** — "you bought earbuds last month" style personalization
+- **Conversation context** — multi-turn shopping conversations with memory
+- **Valkey + Breeth combo**: Valkey caches the short-term conversation (30 min TTL); Breeth stores long-term user graph memory
+
+---
+
+## Tech Stack
+
+**Frontend:**
+- React 18 (Create React App)
+- React Router v6
+- Bootstrap 5 + SCSS
+- Phosphor Icons
+
+**Backend:**
+- Node.js + Express
+- [ioredis](https://github.com/redis/ioredis) — Redis-compatible Valkey client
+- [Breeth AI](https://thebreeth.com) — graph memory API
+
+**Data Layer:**
+- [Valkey Bundle](https://github.com/valkey-io/valkey-bundle) — JSON, Search, Bloom, Geo modules
+
+---
+
+## Quick Start
+
+### Prerequisites
+- Node.js v16+
+- Docker
+
+### 1. Start Valkey
+
+```bash
+docker run -d --name valkey -p 6379:6379 valkey/valkey-bundle:9-alpine
+```
+
+### 2. Start the backend
+
+```bash
+cd backend
+npm install
+npm start
+```
+
+The backend runs on **http://localhost:5000**
+
+### 3. Seed Valkey with sample data
+
+```bash
+cd backend
+node src/seed.js
+```
+
+This seeds:
+- 6 products (phones, laptops, fashion, home, earbuds, sports)
+- 10 categories
+- 3 coupons: `VALKEY10`, `FLAT500`, `BREETH20`
+- 1 demo user: `demo@valkey.io` / `demo1234`
+
+### 4. Start the frontend
+
+```bash
+cd frontend
+npm install
+npm start
+```
+
+The app runs on **http://localhost:3000**
+
+---
+
+## What You'll See
+
+### Valkey Live Monitor (bottom-right button)
+A floating panel showing:
+- Real-time key counts per domain (carts, sessions, products, etc.)
+- Which Valkey commands are being executed live
+- Memory usage
+- Feature activation status
+
+### AI Shopping Assistant (purple robot button)
+Powered by **Breeth AI + Valkey**:
+- Ask about products, deals, or gift ideas
+- Remembers your preferences across sessions (Breeth long-term memory)
+- Conversation cached in Valkey JSON with 30-min TTL
+- Quick prompts: "Show me trending products", "Best budget smartphones"
+
+### Cart Page (`/cart`)
+- Live cart from Valkey Hash — add/remove/update quantities
+- Coupon validation using Valkey JSON + Set
+- Shows exactly which Valkey command was executed
+- Try coupons: `VALKEY10` (10% off), `FLAT500` (flat ₹500), `BREETH20` (20% off)
+
+### Valkey Banner (top of page)
+Scrolling marquee showing all active Valkey features.
+
+---
+
+## API Reference
+
+| Method | Endpoint | Valkey Op | Description |
+|---|---|---|---|
+| GET | `/api/cart?userId=` | `HGETALL` | Fetch user cart |
+| POST | `/api/cart/items` | `HSET + EXPIRE` | Add item to cart |
+| PATCH | `/api/cart/items/:id` | `HSET` | Update quantity |
+| DELETE | `/api/cart/items/:id` | `HDEL` | Remove item |
+| POST | `/api/cart/coupon` | `JSON.GET + SISMEMBER` | Apply coupon |
+| POST | `/api/auth/login` | `SET session EX 86400` | Login + create session |
+| GET | `/api/auth/me` | `GET session + JSON.GET` | Validate session |
+| GET | `/api/products` | `JSON.GET (cache)` | List products |
+| GET | `/api/products/:id` | `JSON.GET` | Get product |
+| GET | `/api/inventory/:id` | `JSON.GET $.inventory` | Real-time stock |
+| POST | `/api/inventory/reserve` | `EVAL Lua (atomic)` | Reserve stock |
+| GET | `/api/search?q=` | `FT.SEARCH` | Full-text search |
+| GET | `/api/search/suggest?q=` | `FT.SUGGET FUZZY` | Autocomplete |
+| POST | `/api/ai/chat` | `JSON.SET EX 1800` | AI assistant (Breeth) |
+| GET | `/api/ai/trending` | `ZREVRANGE` | Trending products |
+| GET | `/api/valkey-stats` | `INFO + KEYS` | Live Valkey stats |
+
+---
+
+## Docker Compose (run everything at once)
+
+```bash
+docker-compose up
+```
+
+This starts Valkey + the backend together. Then start the frontend separately with `cd frontend && npm start`.
+
+---
+
+## Useful Commands
+
+```bash
+# Open Valkey CLI
+docker exec -it valkey valkey-cli
+
+# Check stored products
+valkey-cli JSON.GET product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f
+
+# Inspect a user's cart
+valkey-cli HGETALL cart:user:demo-0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e
+
+# Check active sessions
+valkey-cli KEYS session:*
+
+# View trending products
+valkey-cli ZREVRANGE trending:global:24h 0 9 WITHSCORES
+
+# Check inventory atomically
+valkey-cli JSON.GET product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d $.inventory
+
+# Search products
+valkey-cli FT.SEARCH idx:products "sony"
+```
+
+---
+
+## License
+
+This project is open source and available for educational and hackathon purposes.
diff --git a/submissions/valkey-ecommerce-demo/Valkey-Integrations.md b/submissions/valkey-ecommerce-demo/Valkey-Integrations.md
new file mode 100644
index 0000000..40b0a59
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/Valkey-Integrations.md
@@ -0,0 +1,79 @@
+# Valkey Integrations
+
+Valkey is an open source (BSD) high-performance key/value datastore that supports a variety of workloads such as caching, message queues, and can act as a primary database. The project is backed by the Linux Foundation, ensuring it will remain open source forever.
+
+Valley is looking for attendees to participate in the API challenge choosing one of the following proposed topics, or any other novel use case for an ultra-fast in-memory database.
+
+| \# | Type | Track | Language | Project | Description |
+| :---- | :---- | :---- | :---- | :---- | :---- |
+| 1 | New | Web Development |  | [valkey.io](https://github.com/valkey-io/valkey-io.github.io) | Transform the [valkey.io](http://valkey.io) website from [Zola](https://github.com/getzola/zola) to [Astro](https://github.com/withastro/astro) \+ [React](https://github.com/facebook/react) / [Svelte](https://github.com/sveltejs/svelte). Add interactivity to search anything from anywhere in the site. Include Static pages, Documentation, Blogs, Topics, Commands. |
+| 2 | Integration | Web Framework |  | [Spring.IO](https://github.com/spring-projects/spring-framework) | Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures. A first‑party Valkey integration in the [Spring Framework](https://github.com/spring-projects/spring-framework) delivers native support via Spring Data. It ensures API consistency, shared testing, and unified documentation. Hosting the driver in the Spring repository means it uses the same CI pipelines and security patches as other modules. This cuts external dependency risk and eases version alignment for developers. It also invites deeper community contributions while fitting Spring’s philosophy of seamless ecosystem integration. |
+| 3 | Integration | Web Framework |  | [Symfony](https://github.com/symfony/symfony) | Symfony is a PHP framework for web and console applications and a set of reusable PHP components. |
+| 4 | Integration | Messaging / Queue Library |  | [Celery](https://github.com/celery/celery) | Distributed Task Queue Integrating Valkey natively into Celery offers seamless compatibility with existing Redis-based workflows while leveraging Valkey’s performance, cost efficiency, and open-source flexibility. A first-party driver simplifies configuration using Valkey as a broker or result backend without custom client code. It ensures optimized serialization, reduces external dependency risks, and aligns with Celery’s ecosystem goals. Developers gain a battle-tested, low-latency solution for distributed task queues, encouraging adoption. Official maintenance guarantees security updates and community-driven enhancements, making Valkey a natural choice for scalable Python task management. |
+| 5 | Integration | CMS Framework |  | [WordPress](https://github.com/WordPress/wordpress-develop)  | WordPress is an open-source content management system (CMS) built with PHP and MySQL, designed to create and manage websites through themes and plugins. Adding a first‑party Valkey integration to [WordPress](https://github.com/WordPress/wordpress-develop) gives the CMS native, high‑performance caching for object storage, session data, and transients. A single, maintained client removes the need for third‑party plugins, cuts compatibility bugs, and aligns with WordPress’s focus on speed and scalability. Developers get a secure, auto‑updated driver that mirrors Redis‑style APIs, easing migration. This tight coupling encourages broader adoption of Valkey for millions of sites, reduces external dependency risk, and leverages Valkey’s open‑source flexibility while keeping the core ecosystem clean and consistent. |
+| 6 | Integration | Messaging / Queue Library |  | [BullMQ](https://github.com/taskforcesh/bullmq) | BullMQ \- Message Queue and Batch processing for NodeJS, Python, Elixir and PHP based on Redis A first‑party Valkey integration for **BullMQ** [npmjs.com](http://npmjs.com) [wdk-docs.github.io](https://wdk-docs.github.io/redis-docs/docs/bull/) gives the queue library native, battle‑tested support for Valkey’s high‑performance in‑memory store [oneuptime.com](https://oneuptime.com/blog/post/2026-01-21-bullmq-connection-options/view). Because BullMQ already relies on Redis commands, switching to Valkey requires *no code changes* the same client code works out‑of‑the‑box [dev.to](https://dev.to/aws/getting-started-with-valkey-using-javascript-3fc9). A first‑party driver hosted in the BullMQ repo ensures API consistency, shared CI testing, and timely security patches. It eliminates the need for custom wrappers or third‑party adapters, lowering maintenance overhead and version‑drift risks. Official maintenance also lets the BullMQ community leverage Valkey‑specific optimizations (e.g., faster Lua scripts, better memory handling), making distributed job processing even more reliable and cost‑effective. |
+| 7 | Integration | Web Framework |  | [Flask](https://github.com/pallets/flask) | Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to complex applications. It began as a simple wrapper around Werkzeug and Jinja, and has become one of the most popular Python web application frameworks. |
+| 8 | Integration | Session Library |  | [Flask-Session](http://github.com/pallets-eco/flask-session/) | Flask-Session is an extension for Flask that adds support for server-side sessions to your application. **Valkey as a Native Session Backend in Flask-Session** Adding **Valkey** as a native session backend in **Flask-Session** makes migrations from Redis trivial because Valkey is a drop-in replacement for **Redis 7.2**. |
+| 9 | New | ORM / ODM Library |  | Flask-Valkey né [Flask-Redis](https://github.com/underyx/flask-redis) | A Flask extension for using Redis. Will benefit from first party support for Valkey to use [GLIDE](https://github.com/valkey-io/valkey-glide/) client |
+| 10 | New | Proxy / Library |  | Open Source S3 Proxy Transparent Cache to Valkey | Create a transparent caching layer using the S3 API Protocol to support Amazon S3 as well as open source alternatives [MinIO](https://github.com/minio/minio), [RustFS](https://github.com/rustfs/rustfs), [Ceph](https://github.com/ceph/ceph), [SeaweedFS](https://github.com/seaweedfs/seaweedfs)Blog: [Open-Source S3 Alternatives| Introduction To MinIO](https://python.plainenglish.io/open-source-s3-options-introduction-to-minio-3e55571eeffb) |
+| 11 | Integration | Proxy |  | [envoy proxy](https://github.com/envoyproxy/envoy) support for Valkey | Envoy is a CNCF project. Cloud-native high-performance edge/middle/service proxy. Currently supports [Redis protocol](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_protocols/redis). Adding Valkey as a first party integration using the GLIDE for Go client will enhance its functionality by doing global cluster SCAN, MSET and MGET commands. |
+| 12 | New | JS Runtime |  | [bun](https://github.com/oven-sh/bun) | Bun is Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one. Add support for Valkey besides already existing [Redis](https://bun.com/docs/runtime/redis) using [GLIDE](https://github.com/valkey-io/valkey-glide/). |
+| 13 | Integration | Messaging / Queue Library |  | [SideKiq](https://github.com/sidekiq/sidekiq) | Simple, efficient background processing for Ruby, currently supports Redis; will benefit from first party support for Valkey to use [GLIDE](https://github.com/valkey-io/valkey-glide/) client, multiplexing, global SCAN, MGET, MSET and Cluster support. Sidekiq supports Valkey and Dragonfly as Redis alternatives. Redis 7.2.4 is considered to be the canonical implementation. Incompatibilities with that version are considered bugs. |
+| 14 | Integration | AI/ML LLM engine |  | [vllm](https://github.com/vllm-project/vllm) | A high-throughput and memory-efficient inference and serving engine for LLMs. |
+| 15 | Integration | AI/ML Platform |  | [langchain](https://github.com/langchain-ai/langchain) | LangChain is a framework for building agents and LLM-powered applications. It helps you chain together interoperable components and third-party integrations to simplify AI application development – all while future-proofing decisions as the underlying technology evolves. Currently supports [Redis](https://github.com/langchain-ai/langchain-redis), and AWS [In-MemoryDB](https://github.com/langchain-ai/langchain-aws/tree/main/libs/aws/langchain_aws/vectorstores/inmemorydb). Will benefit of supporting [Valkey Vector Similarity Search](https://github.com/valkey-io/valkey-search) for higher throughput, lower latency, and continuous OSS support from Linux Foundation. |
+| 16 | Integration | Web Framework |  | [fastapi](https://github.com/fastapi/fastapi) | FastAPI framework, high performance, easy to learn, fast to code, ready for production. |
+| 17 | New | Library |  | [fastapi-cache](https://github.com/long2ice/fastapi-cache) | fastapi-cache is a tool to cache fastapi response and function result, with backends support redis and memcached, missing support for Valkey and use [GLIDE](https://github.com/valkey-io/valkey-glide/) for Python. |
+| 18 | Integration | Web Framework |  | [starlette](https://github.com/Kludex/starlette) | Starlette is a lightweight ASGI framework/toolkit, which is ideal for building async web services in Python. Currently support Redis through [starlette-sessions](https://pypi.org/project/starlette-sessions/) |
+| 19 | Integration | PaaS Platform |  | [Coolify](https://github.com/coollabsio/coolify) | An open-source, self-hostable PaaS alternative to Vercel, Heroku & Netlify that lets you easily deploy static sites, databases, full-stack applications and 280+ one-click services on your own servers. Currently support [Redis](https://coolify.io/docs/databases/redis) and [Dragonfly](https://coolify.io/docs/databases/dragonfly), missing support for Valkey. |
+| 20 | Integration | AI/ML Framework |  | [feast](https://github.com/feast-dev/feast) | Feast (Feature Store) is an open source feature store for machine learning. Feast is the fastest path to manage existing infrastructure to productionize analytic data for model training and online inference. Currently supports [Redis](https://docs.feast.dev/reference/online-stores/redis), missing Valkey as Online Datastores. |
+| 21 | Integration | AI/ML Framework |  | [feast](https://github.com/feast-dev/feast) | Missing support for [Iceberg](https://github.com/apache/iceberg) on Offline Datastores |
+| 22 | Integration | Web Framework |  | [laravel](https://github.com/laravel/laravel) | Laravel is a web application framework with expressive, elegant syntax. We’ve already laid the foundation for your next big idea — freeing you to create without sweating the small things.Currently has support for Redis, will benefit from first party integration of Valkey using [GLIDE for PHP](https://github.com/valkey-io/valkey-glide-php). |
+| 23 | New | UI Tool |  | Valkey UI | Currently there's a couple of options to see your Valkey Data. [Valkey Admin](https://github.com/valkey-io/valkey-admin) is a web-based administration tool for Valkey clusters. It provides an intuitive interface to monitor, manage, and interact with your Valkey instances, offering features like real-time metrics and key management. [BetterDB](https://github.com/BetterDB-inc) provides the tooling ecosystem for Valkey, the high-performance Redis fork backed by AWS, Google, and Oracle. With a founding CTO from Redis, we're capturing the massive installed base as cloud providers drive the shift to Valkey's superior performance and permissive licensing. A leaner tool using [Svelte](https://github.com/sveltejs/svelte) will be the best given, Valkey's low memory footprint it aligns better with a compiled project rather than a Virtual DOM like React. |
+| 24 | New | Security |  | [authentik](https://github.com/goauthentik/authentik) | authentik is an open-source Identity Provider (IdP) for modern SSO. It supports SAML, OAuth2/OIDC, LDAP, RADIUS, and more, designed for self-hosting from small labs to large production clusters. Blog: [We removed Redis](https://goauthentik.io/blog/2025-11-13-we-removed-redis/) since didn't align with OSS principles. |
+| 25 | Integration | Ops |  | [airflow](https://github.com/apache/airflow) | Apache Airflow \- A platform to programmatically author, schedule, and monitor workflows. Currently supports [Redis](https://airflow.apache.org/docs/apache-airflow-providers-redis/stable/index.html) |
+| 26 | Integration | Websockets |  | [socket.io](https://github.com/socketio/socket.io/) | Bidirectional and low-latency communication for every platform. Realtime application framework (Node.JS server). Currently support [Redis](https://socket.io/docs/v4/redis-adapter/) |
+| 27 | New | Messaging / Queue Platform |  | Valkey Kafka Connector né [Redis Kafka Connector](https://www.confluent.io/hub/redis/redis-kafka-connect) | [Apache Kafka](https://kafka.apache.org/) is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. Adding Valkey as a sink will benefit real-time use cases. As explained in the Blog: [Low Latency Real-Time Cache Updates with Amazon ElastiCache for Redis and Confluent Cloud Kafka](https://aws.amazon.com/blogs/apn/low-latency-real-time-cache-updates-with-amazon-elasticache-for-redis-and-confluent-cloud-kafka/). |
+| 28 | Integration | Distributed SQL |  | [trino](https://github.com/trinodb/trino) | Trino, the distributed SQL query engine for big data, formerly known as PrestoSQL ([https://trino.io](https://trino.io)) Current support for [Redis](https://trino.io/docs/current/connector/redis.html). |
+| 29 | Integration | e-commerce |  | [OpenCart](https://github.com/opencart/opencart) | A free shopping cart system. OpenCart is an open source PHP-based online e-commerce solution. |
+| 30 | Integration | e-commerce |  | [PrestaShop](https://github.com/PrestaShop/PrestaShop) | PrestaShop is the universal open-source software platform to build your e-commerce solution. |
+| 31 | Integration | e-commerce |  | [Magento2](https://github.com/magento/magento2) | Magento Open Source software delivers basic eCommerce capabilities to build a unique online store from the ground up. |
+| 32 | New | AI/ML Agentic |  | [Strands Agents](https://github.com/strands-agents) | A model-driven, open source SDK for creating AI agents—from simple conversational assistants to complex autonomous workflows. Python and TypeScript. Apache 2.0. |
+| 33 | Integration | AI/ML Agentic |  | [LlamaIndex](https://github.com/run-llama/llama_index) | [LlamaIndex](https://developers.llamaindex.ai/) is the leading framework for building LLM-powered agents over your data. |
+| 34 | Integration | AI/ML Agentic |  | [CrewAI](https://github.com/crewAIInc/crewAI) | Framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, [CrewAI](https://crewai.com/) empowers agents to work together seamlessly, tackling complex tasks. |
+| 35 | New | AI/ML Agentic |  | [OpenClaw](https://github.com/openclaw/openclaw) | [OpenClaw](https://openclaw.ai/) is a personal AI assistant you run on your own devices. It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, Microsoft Teams, WebChat), plus extension channels like BlueBubbles, Matrix, Zalo, and Zalo Personal. It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant. Valkey can help for distributed semantic cache. |
+| 36 | New | AI/ML Agentic |  | [PicoClaw](https://github.com/sipeed/picoclaw) | PicoClaw is an ultra-lightweight personal AI Assistant inspired by nanobot, refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization. Valkey can help for distributed semantic cache. |
+| 37 | New | AI/ML Agentic |  | [OpenViking](https://github.com/volcengine/OpenViking) | [OpenViking](https://openviking.ai/) is an open-source context database designed specifically for AI Agents. OpenViking unifies the management of context (memory, resources, and skills) that Agents need through a file system paradigm, enabling hierarchical context delivery and self-evolving. |
+| 38 | New | AI/ML Deep Research framework |  | [DeerFlow](https://github.com/bytedance/deer-flow) | DeerFlow is a community-driven Deep Research framework, combining language models with tools like web search, crawling, and Python execution, while contributing back to the open-source community. |
+| 39 | New | AI/ML RAG engine |  | [RAGFlow](https://github.com/infiniflow/ragflow) | [RAGFlow](https://ragflow.io/) is a leading open-source Retrieval-Augmented Generation (RAG) engine that fuses cutting-edge RAG with Agent capabilities to create a superior context layer for LLMs |
+| 40 | Integration | AI/ML engine |  | [Ray](https://github.com/ray-project/ray) | [Ray](https://ray.io/) is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads. |
+
+Samples
+
+- [Bedrock Example with Strands](https://github.com/aws-samples/amazon-elasticache-samples/blob/main/navigator/backend/agent.py)
+- [https://github.com/valkey-io/spring-data-valkey](https://github.com/valkey-io/spring-data-valkey)
+- [https://github.com/django-commons/django-valkey](https://github.com/django-commons/django-valkey)
+
+Other Ideas
+
+- RATE LIMITER
+- CONSISTENT HASHING
+- URL SHORTENER
+- NOTIFICATION SYSTEM
+- NEWS FEED SYSTEM
+- CHAT SYSTEM
+- SEARCH AUTOCOMPLETE SYSTEM
+- Proximity Service
+- Nearby Friends
+- Online Maps
+- Distributed Message Queue
+- Metrics Monitoring and Alerting System
+- Ad Click Event Aggregation
+- Hotel Reservation System
+- Distributed Email Service
+- S3-like Object Storage
+- Real-time Gaming Leaderboard
+- Payment System
+- Digital Wallet
+- Stock Exchange
+- Matchmaking system
+- Transparent Caching based on Write Ahead Log using [Debezium](https://github.com/debezium/debezium)
diff --git a/submissions/valkey-ecommerce-demo/backend/.env b/submissions/valkey-ecommerce-demo/backend/.env
new file mode 100644
index 0000000..cd51370
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/.env
@@ -0,0 +1,4 @@
+VALKEY_URL=redis://localhost:6379
+PORT=5000
+BREETH_API_KEY=ck_live_YhQWb-ZjIQxfs6AzDezC3zaPMPw4xJ8yRDkjIz7d16A
+FRONTEND_URL=http://localhost:3000
diff --git a/submissions/valkey-ecommerce-demo/backend/Dockerfile b/submissions/valkey-ecommerce-demo/backend/Dockerfile
new file mode 100644
index 0000000..8686c56
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/Dockerfile
@@ -0,0 +1,7 @@
+FROM node:20-alpine
+WORKDIR /app
+COPY package*.json ./
+RUN npm install
+COPY . .
+EXPOSE 5000
+CMD ["node", "server.js"]
diff --git a/submissions/valkey-ecommerce-demo/backend/package-lock.json b/submissions/valkey-ecommerce-demo/backend/package-lock.json
new file mode 100644
index 0000000..f62862b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/package-lock.json
@@ -0,0 +1,1549 @@
+{
+ "name": "valkey-ecommerce-backend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "valkey-ecommerce-backend",
+ "version": "1.0.0",
+ "dependencies": {
+ "axios": "^1.7.2",
+ "bcryptjs": "^2.4.3",
+ "cors": "^2.8.5",
+ "dotenv": "^16.6.1",
+ "express": "^4.19.2",
+ "ioredis": "^5.3.2",
+ "uuid": "^10.0.0"
+ },
+ "devDependencies": {
+ "nodemon": "^3.1.4"
+ }
+ },
+ "node_modules/@ioredis/commands": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz",
+ "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/agent-base/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/agent-base/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz",
+ "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.16.0",
+ "form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
+ "proxy-from-env": "^2.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.5",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.15.1",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+ "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
+ },
+ "node_modules/cors": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.5",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.15.1",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ioredis": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz",
+ "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@ioredis/commands": "1.10.0",
+ "cluster-key-slot": "1.1.1",
+ "debug": "4.4.3",
+ "denque": "2.1.0",
+ "redis-errors": "1.2.0",
+ "redis-parser": "3.0.0",
+ "standard-as-callback": "2.1.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ioredis"
+ }
+ },
+ "node_modules/ioredis/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ioredis/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nodemon": {
+ "version": "3.1.14",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz",
+ "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^4",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^10.2.1",
+ "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": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
+ "license": "MIT"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/qs": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redis-errors": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
+ "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/redis-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
+ "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
+ "license": "MIT",
+ "dependencies": {
+ "redis-errors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/standard-as-callback": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
+ "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==",
+ "license": "MIT"
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/touch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ }
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/backend/package.json b/submissions/valkey-ecommerce-demo/backend/package.json
new file mode 100644
index 0000000..593bcdf
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "valkey-ecommerce-backend",
+ "version": "1.0.0",
+ "description": "Valkey-powered e-commerce backend with Breeth AI integration",
+ "main": "server.js",
+ "scripts": {
+ "start": "node server.js",
+ "dev": "nodemon server.js",
+ "seed": "node src/seed.js"
+ },
+ "dependencies": {
+ "axios": "^1.7.2",
+ "bcryptjs": "^2.4.3",
+ "cors": "^2.8.5",
+ "dotenv": "^16.6.1",
+ "express": "^4.19.2",
+ "ioredis": "^5.3.2",
+ "uuid": "^10.0.0"
+ },
+ "devDependencies": {
+ "nodemon": "^3.1.4"
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/backend/server.js b/submissions/valkey-ecommerce-demo/backend/server.js
new file mode 100644
index 0000000..6b7101e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/server.js
@@ -0,0 +1,61 @@
+require("dotenv").config();
+const express = require("express");
+const cors = require("cors");
+const { valkey } = require("./src/valkey");
+const { createSearchIndex } = require("./src/routes/search");
+
+const app = express();
+const PORT = process.env.PORT || 5000;
+
+app.use(cors({ origin: process.env.FRONTEND_URL || "http://localhost:3000", credentials: true }));
+app.use(express.json());
+
+// Request logger
+app.use((req, _res, next) => {
+ console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
+ next();
+});
+
+// Routes
+app.use("/api/auth", require("./src/routes/auth"));
+app.use("/api/cart", require("./src/routes/cart"));
+app.use("/api/products", require("./src/routes/products"));
+app.use("/api/inventory", require("./src/routes/inventory"));
+app.use("/api/search", require("./src/routes/search").router);
+app.use("/api/ai", require("./src/routes/ai"));
+app.use("/api/wishlist", require("./src/routes/wishlist"));
+app.use("/api/valkey-stats", require("./src/routes/stats"));
+app.use("/api/comparison", require("./src/routes/comparison"));
+app.use("/api/analytics", require("./src/routes/analytics"));
+app.use("/api/admin", require("./src/routes/admin"));
+app.use("/api/ads", require("./src/routes/ads"));
+
+// Health
+app.get("/health", (_req, res) => res.json({ status: "ok", timestamp: new Date().toISOString() }));
+
+async function start() {
+ await valkey.connect();
+ // Initialize Valkey Search index
+ await createSearchIndex();
+ app.listen(PORT, () => {
+ console.log(`\n[Server] Valkey E-Commerce Backend running on http://localhost:${PORT}`);
+ console.log("[Server] Valkey URL:", process.env.VALKEY_URL || "redis://localhost:6379");
+ console.log("[Server] Breeth AI: connected");
+ console.log("\n[Valkey Features Active]");
+ console.log(" • Cart Management → HSET/HGETALL (Valkey Hash)");
+ console.log(" • Session Storage → SET/GET EX 86400 (Valkey String)");
+ console.log(" • Product Catalog → JSON.SET/GET (Valkey JSON)");
+ console.log(" • Product Cache → GET/SETEX (Valkey String cache)");
+ console.log(" • Real-time Inventory→ JSON.NUMINCRBY + Lua (atomic)");
+ console.log(" • Full-Text Search → FT.SEARCH (Valkey Search Module)");
+ console.log(" • AI Conv. Cache → JSON.SET EX 1800 (Valkey JSON)");
+ console.log(" • Trending Products → ZINCRBY/ZREVRANGE (Valkey Sorted Set)");
+ console.log(" • User Affinity → ZINCRBY (Valkey Sorted Set)");
+ console.log(" • Rate Limiting → INCR/EXPIRE (Valkey String counter)\n");
+ });
+}
+
+start().catch((err) => {
+ console.error("[Server] Fatal error:", err);
+ process.exit(1);
+});
diff --git a/submissions/valkey-ecommerce-demo/backend/src/breeth.js b/submissions/valkey-ecommerce-demo/backend/src/breeth.js
new file mode 100644
index 0000000..dfee082
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/breeth.js
@@ -0,0 +1,64 @@
+const axios = require("axios");
+
+const BREETH_API_KEY = process.env.BREETH_API_KEY || "ck_live_YhQWb-ZjIQxfs6AzDezC3zaPMPw4xJ8yRDkjIz7d16A";
+const BREETH_BASE = "https://api.thebreeth.com/v1";
+
+const breethClient = axios.create({
+ baseURL: BREETH_BASE,
+ headers: {
+ Authorization: `Bearer ${BREETH_API_KEY}`,
+ "Content-Type": "application/json",
+ },
+ timeout: 8000,
+});
+
+async function recordFact(subject, predicate, object, metadata = {}) {
+ try {
+ const res = await breethClient.post("/facts", {
+ subject,
+ predicate,
+ object,
+ metadata,
+ });
+ return res.data;
+ } catch (err) {
+ console.error("[Breeth] recordFact error:", err.message);
+ return null;
+ }
+}
+
+async function searchGraph(query, options = {}) {
+ try {
+ const res = await breethClient.get("/graph/search", {
+ params: { q: query, ...options },
+ });
+ return res.data;
+ } catch (err) {
+ console.error("[Breeth] searchGraph error:", err.message);
+ return { results: [] };
+ }
+}
+
+async function getEntityView(entityId) {
+ try {
+ const res = await breethClient.get(`/graph/entity/${encodeURIComponent(entityId)}`);
+ return res.data;
+ } catch (err) {
+ console.error("[Breeth] getEntityView error:", err.message);
+ return null;
+ }
+}
+
+async function getUserPreferences(userId) {
+ try {
+ const res = await breethClient.get("/graph/search", {
+ params: { q: userId, limit: 20 },
+ });
+ return res.data?.results || [];
+ } catch (err) {
+ console.error("[Breeth] getUserPreferences error:", err.message);
+ return [];
+ }
+}
+
+module.exports = { recordFact, searchGraph, getEntityView, getUserPreferences };
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/admin.js b/submissions/valkey-ecommerce-demo/backend/src/routes/admin.js
new file mode 100644
index 0000000..694c1c1
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/admin.js
@@ -0,0 +1,458 @@
+/**
+ * Admin routes – protected by X-Admin-Token header or admin session
+ *
+ * Middleware: X-Admin-Token: admin-valkey-demo OR session token with role="admin"
+ *
+ * Valkey commands:
+ * KEYS user:* – list all users
+ * JSON.GET {userId} – fetch user profiles
+ * JSON.SET $.inventory – update inventory levels
+ * KEYS cart:* – list all carts (order snapshots)
+ * HGETALL cart:* – fetch cart contents
+ * DEL user:* keys – delete user data
+ * JSON.SET new product – add product
+ * FT.SUGADD – add product to autocomplete
+ * INFO / DBSIZE – system stats
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, getStats } = require("../valkey");
+const { v7: uuidv7 } = require("uuid");
+
+const ADMIN_TOKEN = "admin-valkey-demo";
+
+// Middleware: check X-Admin-Token header or session with role="admin"
+async function requireAdmin(req, res, next) {
+ const headerToken = req.headers["x-admin-token"];
+ if (headerToken === ADMIN_TOKEN) return next();
+
+ // Check session token
+ const bearerToken = req.headers.authorization?.replace("Bearer ", "");
+ if (bearerToken) {
+ try {
+ const userId = await valkey.get(`session:${bearerToken}`);
+ if (userId) {
+ const raw = await valkey.call("JSON.GET", userId);
+ if (raw) {
+ const user = JSON.parse(raw);
+ if (user.role === "admin" || user.role === "manager") {
+ req.adminUser = user;
+ return next();
+ }
+ }
+ }
+ } catch (_) {}
+ }
+
+ res.status(401).json({
+ error: "unauthorized",
+ message: "Admin access required. Provide X-Admin-Token: admin-valkey-demo header or an admin session token.",
+ });
+}
+
+router.use(requireAdmin);
+
+// GET /api/admin/users
+router.get("/users", async (req, res) => {
+ try {
+ const userKeys = await valkey.keys("user:*");
+ const users = [];
+
+ for (const uk of userKeys) {
+ try {
+ const raw = await valkey.call("JSON.GET", uk);
+ if (raw) {
+ const user = JSON.parse(raw);
+ const { passwordHash, ...safeUser } = user;
+ users.push(safeUser);
+ }
+ } catch (_) {}
+ }
+
+ res.json({
+ count: users.length,
+ users,
+ valkeyOp: `KEYS user:* → JSON.GET each (${userKeys.length} users)`,
+ storedIn: "Valkey JSON (user profiles)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_users_error", message: err.message });
+ }
+});
+
+// GET /api/admin/inventory
+router.get("/inventory", async (req, res) => {
+ try {
+ const productKeys = await valkey.keys("product:*");
+ const products = [];
+ const lowStockAlerts = [];
+
+ for (const pk of productKeys) {
+ try {
+ const raw = await valkey.call("JSON.GET", pk);
+ if (raw) {
+ const product = JSON.parse(raw);
+ const inv = product.inventory || {};
+ const available = (inv.quantity || 0) - (inv.reserved || 0);
+
+ const entry = {
+ productId: pk,
+ name: product.name,
+ brand: product.brand,
+ sku: product.sku,
+ categoryId: product.categoryId,
+ price: product.price,
+ inventory: inv,
+ available,
+ status: product.status,
+ };
+ products.push(entry);
+
+ if (available < 10) {
+ lowStockAlerts.push({
+ ...entry,
+ alertLevel: available <= 0 ? "out_of_stock" : available < 5 ? "critical" : "low",
+ });
+ }
+ }
+ } catch (_) {}
+ }
+
+ res.json({
+ totalProducts: products.length,
+ lowStockCount: lowStockAlerts.length,
+ lowStockAlerts,
+ products,
+ valkeyOp: `KEYS product:* → JSON.GET each (${productKeys.length} products)`,
+ storedIn: "Valkey JSON (product documents)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_inventory_error", message: err.message });
+ }
+});
+
+// PATCH /api/admin/inventory/:productId
+router.patch("/inventory/:productId", async (req, res) => {
+ const { productId } = req.params;
+ const { quantity, reserved } = req.body;
+
+ if (quantity === undefined && reserved === undefined) {
+ return res.status(400).json({ error: "quantity or reserved is required" });
+ }
+
+ const key = `product:${productId}`;
+ try {
+ const exists = await valkey.call("JSON.GET", key);
+ if (!exists) return res.status(404).json({ error: "Product not found" });
+
+ const valkeyOps = [];
+
+ if (quantity !== undefined) {
+ await valkey.call("JSON.SET", key, "$.inventory.quantity", JSON.stringify(Number(quantity)));
+ valkeyOps.push(`JSON.SET ${key} $.inventory.quantity ${quantity}`);
+ }
+
+ if (reserved !== undefined) {
+ await valkey.call("JSON.SET", key, "$.inventory.reserved", JSON.stringify(Number(reserved)));
+ valkeyOps.push(`JSON.SET ${key} $.inventory.reserved ${reserved}`);
+ }
+
+ // Update updatedAt
+ await valkey.call("JSON.SET", key, "$.updatedAt", JSON.stringify(new Date().toISOString()));
+ valkeyOps.push(`JSON.SET ${key} $.updatedAt`);
+
+ const updatedRaw = await valkey.call("JSON.GET", key);
+ const updated = JSON.parse(updatedRaw);
+
+ res.json({
+ success: true,
+ productId: key,
+ inventory: updated.inventory,
+ available: updated.inventory.quantity - (updated.inventory.reserved || 0),
+ valkeyOp: valkeyOps.join(" → "),
+ storedIn: "Valkey JSON (product document)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_inventory_update_error", message: err.message });
+ }
+});
+
+// GET /api/admin/orders — treat carts as order snapshots
+router.get("/orders", async (req, res) => {
+ try {
+ const cartKeys = await valkey.keys("cart:*");
+ const orders = [];
+
+ for (const ck of cartKeys) {
+ try {
+ const cartData = await valkey.hgetall(ck);
+ if (cartData && Object.keys(cartData).length > 0) {
+ const items = [];
+ let orderTotal = 0;
+
+ for (const [productId, val] of Object.entries(cartData)) {
+ try {
+ const item = JSON.parse(val);
+ items.push({ productId, ...item });
+ if (item.price && item.quantity) {
+ orderTotal += item.price * item.quantity;
+ }
+ } catch (_) {}
+ }
+
+ orders.push({
+ cartKey: ck,
+ userId: ck.replace("cart:", ""),
+ itemCount: items.length,
+ items,
+ estimatedTotal: orderTotal,
+ currency: "INR",
+ status: "active_cart",
+ });
+ }
+ } catch (_) {}
+ }
+
+ res.json({
+ totalOrders: orders.length,
+ orders,
+ valkeyOp: `KEYS cart:* → HGETALL each (${cartKeys.length} carts)`,
+ storedIn: "Valkey Hash (cart snapshots)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_orders_error", message: err.message });
+ }
+});
+
+// DELETE /api/admin/users/:userId
+router.delete("/users/:userId", async (req, res) => {
+ const { userId } = req.params;
+ const userKey = userId.startsWith("user:") ? userId : `user:${userId}`;
+
+ try {
+ // Get user details first to also delete email index
+ const raw = await valkey.call("JSON.GET", userKey);
+ if (!raw) return res.status(404).json({ error: "User not found" });
+
+ const user = JSON.parse(raw);
+ const deletedKeys = [];
+
+ // Delete user JSON
+ await valkey.del(userKey);
+ deletedKeys.push(userKey);
+
+ // Delete email index
+ if (user.email) {
+ await valkey.del(`email:${user.email}`);
+ deletedKeys.push(`email:${user.email}`);
+ }
+
+ // Delete session keys (scan for sessions belonging to this user)
+ try {
+ const sessionKeys = await valkey.keys("session:*");
+ for (const sk of sessionKeys) {
+ const sessionUserId = await valkey.get(sk);
+ if (sessionUserId === userKey) {
+ await valkey.del(sk);
+ deletedKeys.push(sk);
+ }
+ }
+ } catch (_) {}
+
+ // Delete cart
+ try {
+ await valkey.del(`cart:${userKey}`);
+ deletedKeys.push(`cart:${userKey}`);
+ } catch (_) {}
+
+ // Delete wishlist
+ try {
+ await valkey.del(`wishlist:${userKey}`);
+ deletedKeys.push(`wishlist:${userKey}`);
+ } catch (_) {}
+
+ // Delete comparison set
+ try {
+ await valkey.del(`compare:${userKey}`);
+ deletedKeys.push(`compare:${userKey}`);
+ } catch (_) {}
+
+ res.json({
+ success: true,
+ deletedUserId: userKey,
+ deletedKeys,
+ valkeyOp: `DEL ${deletedKeys.join(", DEL ")}`,
+ storedIn: "Valkey JSON, String, Hash, Set",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_delete_user_error", message: err.message });
+ }
+});
+
+// POST /api/admin/products
+router.post("/products", async (req, res) => {
+ const { name, sku, description, shortDescription, categoryId, vendorId, brand, price, images, attributes, tags, inventory, status } = req.body;
+
+ if (!name || !price || !categoryId) {
+ return res.status(400).json({ error: "name, price, and categoryId are required" });
+ }
+
+ try {
+ const productId = `product:${uuidv7()}`;
+ const slug = name.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
+ const now = new Date().toISOString();
+
+ const product = {
+ id: productId,
+ sku: sku || `PROD-${Date.now()}`,
+ name,
+ slug,
+ description: description || "",
+ shortDescription: shortDescription || "",
+ categoryId,
+ vendorId: vendorId || "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: brand || "",
+ price: typeof price === "object" ? price : { amount: price, currency: "INR" },
+ images: images || [{ url: "/assets/images/thumbs/product-img1.png", alt: name, isPrimary: true }],
+ attributes: attributes || {},
+ tags: tags || [],
+ inventory: inventory || { quantity: 0, reserved: 0, warehouse: "HYD-WH-01" },
+ ratings: { average: 0, count: 0 },
+ status: status || "active",
+ createdAt: now,
+ updatedAt: now,
+ };
+
+ // Store product in Valkey JSON
+ await valkey.call("JSON.SET", productId, "$", JSON.stringify(product));
+
+ // Add to category index
+ if (categoryId) {
+ await valkey.zadd(`category_products:${categoryId}`, Date.now(), productId);
+ }
+
+ // Add to price index
+ if (product.price?.amount) {
+ await valkey.zadd("price_index", product.price.amount, productId);
+ }
+
+ // Add to brand index
+ if (brand) {
+ await valkey.sadd(`brand_products:${brand.toLowerCase()}`, productId);
+ }
+
+ // Add to autocomplete
+ try {
+ await valkey.call("FT.SUGADD", "autocomplete", name, 100);
+ } catch (_) {}
+
+ res.status(201).json({
+ success: true,
+ product,
+ valkeyOp: `JSON.SET ${productId} → ZADD category_products → ZADD price_index → SADD brand_products → FT.SUGADD autocomplete`,
+ storedIn: "Valkey JSON + Sorted Set + Set + Suggestion Index",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_create_product_error", message: err.message });
+ }
+});
+
+// GET /api/admin/stats
+router.get("/stats", async (req, res) => {
+ try {
+ const valkeyOps = [];
+
+ // Key counts
+ const [productKeys, userKeys, categoryKeys, sessionKeys, cartKeys, wishlistKeys, compareKeys, couponKeys] = await Promise.all([
+ valkey.keys("product:*"),
+ valkey.keys("user:*"),
+ valkey.keys("category:*"),
+ valkey.keys("session:*"),
+ valkey.keys("cart:*"),
+ valkey.keys("wishlist:*"),
+ valkey.keys("compare:*"),
+ valkey.keys("coupon:*"),
+ ]);
+ valkeyOps.push("KEYS product:*, user:*, category:*, session:*, cart:*, wishlist:*, compare:*, coupon:*");
+
+ // DB size
+ let dbSize = 0;
+ try {
+ dbSize = await valkey.dbsize();
+ valkeyOps.push("DBSIZE");
+ } catch (_) {}
+
+ // Memory info
+ let memoryInfo = {};
+ try {
+ const info = await valkey.info("memory");
+ valkeyOps.push("INFO memory");
+ const lines = info.split("\r\n");
+ for (const line of lines) {
+ if (line.startsWith("used_memory_human:")) memoryInfo.usedMemory = line.split(":")[1].trim();
+ if (line.startsWith("used_memory_peak_human:")) memoryInfo.peakMemory = line.split(":")[1].trim();
+ if (line.startsWith("mem_fragmentation_ratio:")) memoryInfo.fragmentationRatio = line.split(":")[1].trim();
+ }
+ } catch (e) {
+ valkeyOps.push("INFO memory (error: " + e.message + ")");
+ }
+
+ // Feature usage stats
+ const featureUsage = getStats();
+ valkeyOps.push("getStats() from valkey.js usage counters");
+
+ // Trending set sizes
+ let trendingCount = 0;
+ try {
+ trendingCount = await valkey.zcard("trending:global:24h");
+ valkeyOps.push("ZCARD trending:global:24h");
+ } catch (_) {}
+
+ res.json({
+ timestamp: new Date().toISOString(),
+ keyCounts: {
+ products: productKeys.length,
+ users: userKeys.length,
+ categories: categoryKeys.length,
+ sessions: sessionKeys.length,
+ carts: cartKeys.length,
+ wishlists: wishlistKeys.length,
+ comparisons: compareKeys.length,
+ coupons: couponKeys.length,
+ total: dbSize,
+ },
+ memory: memoryInfo,
+ featureUsage,
+ trending: {
+ productsInTrendingSet: trendingCount,
+ },
+ valkeyOps,
+ storedIn: "Valkey JSON, String, Hash, Set, Sorted Set",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "admin_stats_error", message: err.message });
+ }
+});
+
+// POST /api/admin/reseed
+router.post("/reseed", async (req, res) => {
+ const { fork } = require("child_process");
+ const path = require("path");
+ try {
+ const seedPath = path.join(__dirname, "../seed.js");
+ const child = fork(seedPath);
+
+ child.on("close", (code) => {
+ if (code === 0) {
+ res.json({ status: "success", message: "Database reseeded successfully." });
+ } else {
+ res.status(500).json({ error: "seed_error", message: `Seeding process exited with code ${code}` });
+ }
+ });
+ } catch (err) {
+ res.status(500).json({ error: "reseed_failed", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/ads.js b/submissions/valkey-ecommerce-demo/backend/src/routes/ads.js
new file mode 100644
index 0000000..1de0f95
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/ads.js
@@ -0,0 +1,182 @@
+/**
+ * Targeted Ads – Valkey Sorted Set (user affinity) + Search
+ *
+ * Valkey commands:
+ * ZREVRANGE user_affinity:{userId} 0 2 WITHSCORES – get top 3 interest categories
+ * FT.SEARCH @categoryId:{catId} – find products per category
+ * ZREVRANGE trending:global:24h 0 5 – fallback trending products
+ * JSON.GET {productId} – fetch product details
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey } = require("../valkey");
+
+// GET /api/ads/targeted?userId=
+router.get("/targeted", async (req, res) => {
+ const { userId } = req.query;
+
+ const valkeyOps = [];
+ const ads = [];
+
+ try {
+ let usedAffinity = false;
+
+ if (userId) {
+ // Get top 3 categories from user affinity sorted set
+ const affinityKey = `user_affinity:${userId}`;
+ const affinityRaw = await valkey.zrevrange(affinityKey, 0, 2, "WITHSCORES");
+ valkeyOps.push(`ZREVRANGE ${affinityKey} 0 2 WITHSCORES`);
+
+ const affinities = [];
+ for (let i = 0; i < affinityRaw.length; i += 2) {
+ affinities.push({ categoryId: affinityRaw[i], score: parseFloat(affinityRaw[i + 1]) });
+ }
+
+ if (affinities.length > 0) {
+ usedAffinity = true;
+
+ for (const affinity of affinities) {
+ try {
+ // Escape the categoryId for FT.SEARCH TAG filter
+ const escapedCat = affinity.categoryId.replace(/:/g, "\\:");
+ const searchResult = await valkey.call(
+ "FT.SEARCH", "idx:products",
+ `@categoryId:{${escapedCat}}`,
+ "LIMIT", "0", "3",
+ "RETURN", "5", "name", "price", "brand", "$.images[0].url", "$.images[0].alt"
+ );
+ valkeyOps.push(`FT.SEARCH idx:products @categoryId:{${affinity.categoryId}} LIMIT 0 3`);
+
+ const total = searchResult[0];
+ for (let i = 1; i < searchResult.length; i += 2) {
+ const pid = searchResult[i];
+ const fields = searchResult[i + 1];
+ const obj = { id: pid };
+ for (let j = 0; j < fields.length; j += 2) {
+ let key = fields[j];
+ if (key === "$.images[0].url") key = "image";
+ if (key === "$.images[0].alt") key = "imageAlt";
+ obj[key] = fields[j + 1];
+ }
+ ads.push({
+ productId: pid,
+ name: obj.name || pid,
+ price: obj.price ? Number(obj.price) : null,
+ brand: obj.brand || null,
+ image: obj.image || "/assets/images/thumbs/product-img1.png",
+ adType: "targeted",
+ targetReason: "Based on your browsing",
+ categoryId: affinity.categoryId,
+ affinityScore: affinity.score,
+ });
+ }
+ } catch (e) {
+ valkeyOps.push(`FT.SEARCH for ${affinity.categoryId} (error: ${e.message})`);
+ }
+ }
+ }
+ }
+
+ // Fallback: use trending products if no affinity data or userId not provided
+ if (ads.length === 0) {
+ const trendingRaw = await valkey.zrevrange("trending:global:24h", 0, 5, "WITHSCORES");
+ valkeyOps.push("ZREVRANGE trending:global:24h 0 5 WITHSCORES (fallback — no affinity data)");
+
+ for (let i = 0; i < trendingRaw.length; i += 2) {
+ const pid = trendingRaw[i];
+ const score = parseFloat(trendingRaw[i + 1]);
+ try {
+ const raw = await valkey.call("JSON.GET", pid);
+ valkeyOps.push(`JSON.GET ${pid}`);
+ if (raw) {
+ const product = JSON.parse(raw);
+ ads.push({
+ productId: pid,
+ name: product.name,
+ price: product.price?.amount || null,
+ brand: product.brand || null,
+ image: product.images?.[0]?.url || "/assets/images/thumbs/product-img1.png",
+ adType: "trending",
+ targetReason: "Trending now",
+ trendScore: score,
+ });
+ }
+ } catch (_) {}
+ }
+ }
+
+ // Deduplicate by productId
+ const seen = new Set();
+ const uniqueAds = ads.filter((ad) => {
+ if (seen.has(ad.productId)) return false;
+ seen.add(ad.productId);
+ return true;
+ }).slice(0, 6);
+
+ res.json({
+ userId: userId || "guest",
+ adType: ads.length > 0 && ads[0].adType === "targeted" ? "targeted" : "trending",
+ count: uniqueAds.length,
+ ads: uniqueAds,
+ valkeyOps,
+ storedIn: "Valkey Sorted Set (user_affinity + trending) + Search Index",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "ads_targeted_error", message: err.message });
+ }
+});
+
+// GET /api/ads/banner
+router.get("/banner", async (req, res) => {
+ const banners = [
+ {
+ id: "banner-001",
+ title: "Save 10% with VALKEY10",
+ subtitle: "Use coupon code VALKEY10 on orders above ₹5,000",
+ couponCode: "VALKEY10",
+ discount: "10% OFF",
+ backgroundColor: "#7C3AED",
+ textColor: "#FFFFFF",
+ ctaText: "Shop Now",
+ ctaUrl: "/shop",
+ imageUrl: "/assets/images/banners/valkey-banner.png",
+ validUntil: "2026-12-31",
+ adType: "coupon",
+ priority: 1,
+ },
+ {
+ id: "banner-002",
+ title: "New Arrivals — Apple Collection",
+ subtitle: "iPhone 15 Pro, MacBook Air M3 & Apple Watch Series 9 now in stock",
+ backgroundColor: "#1D1D1F",
+ textColor: "#F5F5F7",
+ ctaText: "Explore New Arrivals",
+ ctaUrl: "/shop?brand=Apple",
+ imageUrl: "/assets/images/banners/new-arrivals.png",
+ adType: "new_arrivals",
+ priority: 2,
+ },
+ {
+ id: "banner-003",
+ title: "Trending Deals This Week",
+ subtitle: "Up to 40% off on Electronics, Fashion & Home Appliances",
+ backgroundColor: "#059669",
+ textColor: "#FFFFFF",
+ ctaText: "See Trending Deals",
+ ctaUrl: "/shop?sort=trending",
+ imageUrl: "/assets/images/banners/trending-deals.png",
+ adType: "trending_deals",
+ priority: 3,
+ },
+ ];
+
+ res.json({
+ count: banners.length,
+ banners,
+ valkeyOp: "Static promotional banners (no Valkey read required)",
+ storedIn: "Hardcoded promotional content",
+ });
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/ai.js b/submissions/valkey-ecommerce-demo/backend/src/routes/ai.js
new file mode 100644
index 0000000..5520f8f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/ai.js
@@ -0,0 +1,368 @@
+/**
+ * AI Shopping Assistant – Breeth AI + Valkey Session Cache
+ *
+ * Breeth stores:
+ * - User shopping preferences as graph facts
+ * - Conversation context between turns
+ * - Category affinity from browsing behavior
+ *
+ * Valkey stores:
+ * - Conversation session cache (JSON, TTL 30 min)
+ * - Agent tool result cache (TTL 5 min)
+ * - User behavior events for real-time recommendations
+ */
+
+const express = require("express");
+const router = express.Router();
+const { v7: uuidv7 } = require("uuid");
+const { valkey, track } = require("../valkey");
+const { recordFact, searchGraph, getUserPreferences } = require("../breeth");
+
+const CONVO_TTL = 1800; // 30 min conversation cache in Valkey
+
+// POST /api/ai/chat – send message to AI shopping assistant
+router.post("/chat", async (req, res) => {
+ const { sessionId, message, userId = "guest:demo" } = req.body;
+ if (!message) return res.status(400).json({ error: "message required" });
+
+ const sid = sessionId || `session:${uuidv7()}`;
+ const convoKey = `conversation:${sid}`;
+
+ try {
+ // Load conversation history from Valkey
+ const raw = await valkey.call("JSON.GET", convoKey);
+ track("aiOps");
+
+ const conversation = raw ? JSON.parse(raw) : { sessionId: sid, userId, turns: [], context: {} };
+
+ // Add user message
+ conversation.turns.push({ role: "user", content: message, timestamp: new Date().toISOString() });
+
+ // Get user preferences from Breeth
+ const preferences = await getUserPreferences(userId);
+
+ // Build AI response (intelligent product-aware responses)
+ const aiResponse = await generateAIResponse(message, conversation, preferences);
+
+ // Add AI response to conversation
+ conversation.turns.push({
+ role: "assistant",
+ content: aiResponse.response,
+ results: aiResponse.products,
+ timestamp: new Date().toISOString(),
+ });
+
+ // Trim to last 10 turns for memory efficiency
+ if (conversation.turns.length > 20) conversation.turns = conversation.turns.slice(-20);
+
+ // Save conversation back to Valkey with TTL
+ await valkey.call("JSON.SET", convoKey, "$", JSON.stringify(conversation));
+ await valkey.expire(convoKey, CONVO_TTL);
+ track("aiOps");
+
+ // Record this interaction in Breeth for long-term memory
+ recordFact(userId, "asked_assistant", message.slice(0, 100), {
+ sessionId: sid,
+ intent: aiResponse.intent,
+ });
+
+ res.json({
+ sessionId: sid,
+ response: aiResponse.response,
+ products: aiResponse.products,
+ followUp: aiResponse.followUp,
+ intent: aiResponse.intent,
+ valkeyOp: "JSON.GET + JSON.SET conversation:{sessionId} EX 1800",
+ storedIn: "Valkey JSON (conversation cache) + Breeth (long-term memory)",
+ breethMemory: preferences.length > 0 ? "personalized" : "first_visit",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "ai_error", message: err.message });
+ }
+});
+
+// GET /api/ai/conversation/:sessionId
+router.get("/conversation/:sessionId", async (req, res) => {
+ const { sessionId } = req.params;
+ const convoKey = `conversation:${sessionId}`;
+
+ try {
+ const raw = await valkey.call("JSON.GET", convoKey);
+ track("aiOps");
+
+ if (!raw) return res.status(404).json({ error: "Conversation not found or expired" });
+
+ res.json({ ...JSON.parse(raw), valkeyOp: "JSON.GET", storedIn: "Valkey JSON (session cache)" });
+ } catch (err) {
+ res.status(500).json({ error: "conversation_error", message: err.message });
+ }
+});
+
+// POST /api/ai/preferences – record user preference in Breeth
+router.post("/preferences", async (req, res) => {
+ const { userId = "guest:demo", category, action, productId } = req.body;
+
+ try {
+ await recordFact(userId, action || "viewed", category || productId, {
+ timestamp: new Date().toISOString(),
+ });
+
+ // Also update Valkey affinity score
+ if (category) {
+ await valkey.zincrby(`user_affinity:${userId}`, action === "purchase" ? 5 : action === "cart" ? 3 : 1, category);
+ }
+
+ track("aiOps");
+ res.json({
+ success: true,
+ valkeyOp: "ZINCRBY user_affinity:{userId}",
+ breethOp: "record_fact",
+ storedIn: "Valkey Sorted Set (affinity) + Breeth (memory graph)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "preferences_error", message: err.message });
+ }
+});
+
+// GET /api/ai/recommendations/:userId
+router.get("/recommendations/:userId", async (req, res) => {
+ const { userId } = req.params;
+
+ try {
+ // Get category affinity from Valkey
+ const affinityRaw = await valkey.zrevrange(`user_affinity:${userId}`, 0, 4, "WITHSCORES");
+ track("aiOps");
+
+ const affinity = [];
+ const affinityCats = [];
+ for (let i = 0; i < affinityRaw.length; i += 2) {
+ affinity.push({ category: affinityRaw[i], score: Number(affinityRaw[i + 1]) });
+ affinityCats.push(affinityRaw[i]);
+ }
+
+ // Get recently viewed from Valkey list
+ const recentlyViewed = await valkey.lrange(`user_history:${userId}`, 0, 9);
+
+ // Get Breeth long-term preferences
+ const breethPrefs = await getUserPreferences(userId);
+
+ // Resolve actual product recommendations
+ const keys = await valkey.keys("product:*");
+ const products = [];
+ for (const k of keys) {
+ const rawProd = await valkey.call("JSON.GET", k);
+ if (rawProd) {
+ products.push({ id: k, ...JSON.parse(rawProd) });
+ }
+ }
+
+ let recommended = [];
+ if (affinityCats.length > 0) {
+ recommended = products.filter(p => affinityCats.includes(p.categoryId));
+ }
+ if (recommended.length < 6) {
+ const remaining = products
+ .filter(p => !recommended.some(r => r.id === p.id))
+ .sort((a, b) => (b.ratings?.average || 0) - (a.ratings?.average || 0));
+ recommended = [...recommended, ...remaining];
+ }
+
+ const recommendations = recommended.slice(0, 8).map(p => ({
+ id: p.id,
+ productId: p.id,
+ name: p.name,
+ price: p.price?.amount || p.price || 0,
+ image: p.images?.[0]?.url || "/assets/images/thumbs/product-img1.png",
+ categoryId: p.categoryId,
+ brand: p.brand,
+ ratings: p.ratings,
+ }));
+
+ res.json({
+ userId,
+ affinity,
+ recentlyViewed,
+ breethMemory: breethPrefs.slice(0, 5),
+ recommendations,
+ valkeyOp: "ZREVRANGE user_affinity + LRANGE user_history + JSON.GET products",
+ storedIn: "Valkey Sorted Set (affinity) + List (history) + JSON (products) + Breeth (graph memory)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "recommendations_error", message: err.message });
+ }
+});
+
+// POST /api/ai/track-view – track product view for recommendations
+router.post("/track-view", async (req, res) => {
+ const { userId = "guest:demo", productId, categoryId } = req.body;
+
+ try {
+ // Push to user history list (capped at 50)
+ if (productId) {
+ await valkey.lpush(`user_history:${userId}`, productId);
+ await valkey.ltrim(`user_history:${userId}`, 0, 49);
+ }
+
+ // Update category affinity
+ if (categoryId) {
+ await valkey.zincrby(`user_affinity:${userId}`, 1, categoryId);
+ }
+
+ // Update trending score
+ if (productId) {
+ await valkey.zincrby("trending:global:1h", 1, productId);
+ await valkey.zincrby("trending:global:24h", 1, productId);
+ await valkey.expire("trending:global:1h", 3600);
+ }
+
+ track("aiOps");
+
+ res.json({
+ success: true,
+ valkeyOp: "LPUSH + LTRIM (history) + ZINCRBY (affinity + trending)",
+ storedIn: "Valkey List + Sorted Sets",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "track_error", message: err.message });
+ }
+});
+
+// GET /api/ai/trending
+router.get("/trending", async (req, res) => {
+ try {
+ const raw = await valkey.zrevrange("trending:global:24h", 0, 9, "WITHSCORES");
+ track("aiOps");
+
+ const trending = [];
+ for (let i = 0; i < raw.length; i += 2) {
+ const productId = raw[i];
+ const score = Number(raw[i + 1]);
+ try {
+ const rawProd = await valkey.call("JSON.GET", productId);
+ if (rawProd) {
+ const prod = JSON.parse(rawProd);
+ trending.push({
+ id: productId,
+ productId,
+ name: prod.name,
+ price: prod.price?.amount || prod.price || 0,
+ image: prod.images?.[0]?.url || "/assets/images/thumbs/product-img1.png",
+ score,
+ });
+ }
+ } catch (_) {}
+ }
+
+ res.json({
+ trending,
+ valkeyOp: "ZREVRANGE trending:global:24h 0 9 WITHSCORES + JSON.GET products",
+ storedIn: "Valkey Sorted Set (trending) + JSON (products)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "trending_error", message: err.message });
+ }
+});
+
+// Smart response generator using product catalog + Breeth preferences
+async function generateAIResponse(message, conversation, preferences) {
+ const msg = message.toLowerCase();
+ let intent = "general";
+ let response = "";
+ let products = [];
+ let followUp = "";
+
+ // Fetch available products from Valkey for context
+ let availableProducts = [];
+ try {
+ const keys = await valkey.keys("product:*");
+ for (const k of keys.slice(0, 30)) {
+ const raw = await valkey.call("JSON.GET", k);
+ if (raw) availableProducts.push({ id: k, ...JSON.parse(raw) });
+ }
+ } catch (_) {}
+
+ // Determine intent from message
+ if (msg.includes("cheap") || msg.includes("budget") || msg.includes("affordable") || msg.includes("under ")) {
+ intent = "budget_search";
+ const affordable = availableProducts
+ .sort((a, b) => (a.price?.amount || 0) - (b.price?.amount || 0))
+ .slice(0, 4);
+ products = affordable.map(formatProduct);
+ response = `Here are some budget-friendly options I found in our catalog:`;
+ followUp = "Would you like me to filter by a specific category or set a price limit?";
+ } else if (msg.includes("phone") || msg.includes("smartphone") || msg.includes("mobile")) {
+ intent = "category_search";
+ const phones = availableProducts.filter(p =>
+ p.name?.toLowerCase().includes("phone") ||
+ p.name?.toLowerCase().includes("galaxy") ||
+ p.categoryId?.includes("smartphone")
+ ).slice(0, 4);
+ products = phones.length ? phones.map(formatProduct) : availableProducts.slice(0, 4).map(formatProduct);
+ response = `Here are our top smartphone picks for you:`;
+ followUp = "Would you like to see phones under a specific budget, or filter by brand?";
+ } else if (msg.includes("laptop") || msg.includes("computer") || msg.includes("pc")) {
+ intent = "category_search";
+ const laptops = availableProducts.filter(p =>
+ p.name?.toLowerCase().includes("laptop") || p.name?.toLowerCase().includes("computer")
+ ).slice(0, 4);
+ products = (laptops.length ? laptops : availableProducts.slice(0, 4)).map(formatProduct);
+ response = `Here are laptop recommendations from our catalog:`;
+ followUp = "Do you need it for gaming, work, or general use?";
+ } else if (msg.includes("recommend") || msg.includes("suggest") || msg.includes("popular") || msg.includes("trending")) {
+ intent = "recommendations";
+ // Use preferences from Breeth if available
+ const topProducts = availableProducts
+ .sort((a, b) => (b.ratings?.average || 0) - (a.ratings?.average || 0))
+ .slice(0, 4);
+ products = topProducts.map(formatProduct);
+ const memNote = preferences.length > 0 ? " Based on your browsing history," : "";
+ response = `${memNote} Here are our top-rated products right now:`;
+ followUp = "Want me to narrow these down by category or price range?";
+ } else if (msg.includes("gift") || msg.includes("present") || msg.includes("birthday")) {
+ intent = "gift_search";
+ const giftItems = availableProducts
+ .sort((a, b) => (b.ratings?.average || 0) - (a.ratings?.average || 0))
+ .slice(0, 4);
+ products = giftItems.map(formatProduct);
+ response = `Great choice for a gift! Here are some well-rated items that make excellent presents:`;
+ followUp = "What's your budget? I can help narrow it down to the perfect gift.";
+ } else if (msg.includes("stock") || msg.includes("available") || msg.includes("in stock")) {
+ intent = "availability_check";
+ const inStock = availableProducts.filter(p => (p.inventory?.quantity || 0) > (p.inventory?.reserved || 0)).slice(0, 4);
+ products = inStock.map(formatProduct);
+ response = `Here are products currently in stock with real-time inventory powered by Valkey:`;
+ followUp = "Would you like to check availability for a specific product?";
+ } else {
+ intent = "general";
+ // Search by message keywords
+ const keywords = msg.split(" ").filter(w => w.length > 3);
+ const matched = availableProducts.filter(p =>
+ keywords.some(kw => p.name?.toLowerCase().includes(kw) || p.description?.toLowerCase().includes(kw))
+ );
+ products = (matched.length ? matched : availableProducts).slice(0, 4).map(formatProduct);
+ response = `I found some products that might match what you're looking for:`;
+ followUp = "Can you tell me more about what you need? I can search by price, brand, or category.";
+ }
+
+ // Personalize with Breeth preferences
+ if (preferences.length > 0) {
+ response += " (personalized based on your Breeth memory profile)";
+ }
+
+ return { response, products, intent, followUp };
+}
+
+function formatProduct(p) {
+ return {
+ productId: p.id,
+ name: p.name,
+ price: p.price?.amount || 0,
+ currency: p.price?.currency || "INR",
+ rating: p.ratings?.average || 0,
+ image: p.images?.[0]?.url || "/assets/images/thumbs/product-img1.png",
+ inStock: (p.inventory?.quantity || 0) > (p.inventory?.reserved || 0),
+ brand: p.brand,
+ };
+}
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/analytics.js b/submissions/valkey-ecommerce-demo/backend/src/routes/analytics.js
new file mode 100644
index 0000000..34f5e07
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/analytics.js
@@ -0,0 +1,330 @@
+/**
+ * Analytics – aggregates data from Valkey for dashboard metrics
+ *
+ * Valkey commands:
+ * ZREVRANGE trending:global:24h 0 9 WITHSCORES – trending products
+ * FT.AGGREGATE idx:products – category distribution
+ * KEYS product:* + JSON.GET $.inventory – inventory alerts
+ * KEYS user:*, session:*, cart:*, wishlist:* – user stats
+ * HGETALL cart:* – revenue estimate + cart abandonment
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, getStats } = require("../valkey");
+
+// GET /api/analytics
+router.get("/", async (req, res) => {
+ try {
+ const valkeyOps = [];
+
+ // 1. Trending products
+ let trendingProducts = [];
+ try {
+ const trendingRaw = await valkey.zrevrange("trending:global:24h", 0, 9, "WITHSCORES");
+ valkeyOps.push("ZREVRANGE trending:global:24h 0 9 WITHSCORES");
+
+ for (let i = 0; i < trendingRaw.length; i += 2) {
+ const pid = trendingRaw[i];
+ const score = parseFloat(trendingRaw[i + 1]);
+ let name = pid;
+ try {
+ const raw = await valkey.call("JSON.GET", pid, "$.name");
+ if (raw) {
+ const parsed = JSON.parse(raw);
+ name = Array.isArray(parsed) ? parsed[0] : parsed;
+ }
+ } catch (_) {}
+ trendingProducts.push({ productId: pid, name, score });
+ }
+ } catch (e) {
+ valkeyOps.push("ZREVRANGE trending:global:24h (error: " + e.message + ")");
+ }
+
+ // 2. Top categories via FT.AGGREGATE
+ let topCategories = [];
+ try {
+ const catAgg = await valkey.call(
+ "FT.AGGREGATE", "idx:products", "*",
+ "GROUPBY", "1", "@categoryId",
+ "REDUCE", "COUNT", "0", "AS", "count",
+ "SORTBY", "2", "@count", "DESC",
+ "LIMIT", "0", "5"
+ );
+ valkeyOps.push("FT.AGGREGATE idx:products GROUPBY @categoryId REDUCE COUNT");
+
+ for (let i = 1; i < catAgg.length; i++) {
+ const row = catAgg[i];
+ const obj = {};
+ for (let j = 0; j < row.length; j += 2) {
+ obj[row[j]] = row[j + 1];
+ }
+ if (obj.categoryId) {
+ // Fetch category name
+ let catName = obj.categoryId;
+ try {
+ const catRaw = await valkey.call("JSON.GET", obj.categoryId, "$.name");
+ if (catRaw) {
+ const parsed = JSON.parse(catRaw);
+ catName = Array.isArray(parsed) ? parsed[0] : parsed;
+ }
+ } catch (_) {}
+ topCategories.push({ categoryId: obj.categoryId, name: catName, productCount: Number(obj.count) });
+ }
+ }
+ } catch (e) {
+ valkeyOps.push("FT.AGGREGATE (error: " + e.message + ")");
+ topCategories = [];
+ }
+
+ // 3. Inventory alerts: products where (quantity - reserved) < 10
+ let inventoryAlerts = [];
+ try {
+ const productKeys = await valkey.keys("product:*");
+ valkeyOps.push(`KEYS product:* → found ${productKeys.length} products`);
+
+ for (const pk of productKeys) {
+ try {
+ const invRaw = await valkey.call("JSON.GET", pk, "$.inventory");
+ if (invRaw) {
+ const invArr = JSON.parse(invRaw);
+ const inv = Array.isArray(invArr) ? invArr[0] : invArr;
+ if (inv && typeof inv.quantity === "number") {
+ const available = inv.quantity - (inv.reserved || 0);
+ if (available < 10) {
+ let pName = pk;
+ try {
+ const nameRaw = await valkey.call("JSON.GET", pk, "$.name");
+ if (nameRaw) {
+ const parsed = JSON.parse(nameRaw);
+ pName = Array.isArray(parsed) ? parsed[0] : parsed;
+ }
+ } catch (_) {}
+ inventoryAlerts.push({
+ productId: pk,
+ name: pName,
+ quantity: inv.quantity,
+ reserved: inv.reserved || 0,
+ available,
+ warehouse: inv.warehouse || "unknown",
+ alertLevel: available <= 0 ? "out_of_stock" : available < 5 ? "critical" : "low",
+ });
+ }
+ }
+ }
+ } catch (_) {}
+ }
+ valkeyOps.push("JSON.GET $.inventory for each product");
+ } catch (e) {
+ valkeyOps.push("Inventory scan (error: " + e.message + ")");
+ }
+
+ // 4. User stats: count keys by type
+ let userStats = {};
+ try {
+ const [userKeys, sessionKeys, cartKeys, wishlistKeys] = await Promise.all([
+ valkey.keys("user:*"),
+ valkey.keys("session:*"),
+ valkey.keys("cart:*"),
+ valkey.keys("wishlist:*"),
+ ]);
+ valkeyOps.push("KEYS user:*, KEYS session:*, KEYS cart:*, KEYS wishlist:*");
+ userStats = {
+ totalUsers: userKeys.length,
+ activeSessions: sessionKeys.length,
+ activeCarts: cartKeys.length,
+ activeWishlists: wishlistKeys.length,
+ };
+ } catch (e) {
+ valkeyOps.push("User stats KEYS (error: " + e.message + ")");
+ userStats = { totalUsers: 0, activeSessions: 0, activeCarts: 0, activeWishlists: 0 };
+ }
+
+ // 5. Revenue estimate + cart abandonment
+ let revenueEstimate = 0;
+ let cartAbandonment = 0;
+ let cartsWithItems = 0;
+ try {
+ const cartKeys = await valkey.keys("cart:*");
+ valkeyOps.push("HGETALL each cart:* for revenue estimate");
+
+ for (const cartKey of cartKeys) {
+ try {
+ const cartData = await valkey.hgetall(cartKey);
+ if (cartData && Object.keys(cartData).length > 0) {
+ cartsWithItems++;
+ for (const val of Object.values(cartData)) {
+ try {
+ const item = JSON.parse(val);
+ if (item.price && item.quantity) {
+ revenueEstimate += item.price * item.quantity;
+ }
+ } catch (_) {}
+ }
+ }
+ } catch (_) {}
+ }
+ cartAbandonment = cartsWithItems; // carts with items = potential abandonment
+ } catch (e) {
+ valkeyOps.push("Cart revenue scan (error: " + e.message + ")");
+ }
+
+ // 6. Search terms (mock/tracked data)
+ let searchTerms = [];
+ try {
+ const searchKeys = await valkey.keys("search:term:*");
+ if (searchKeys.length > 0) {
+ for (const sk of searchKeys.slice(0, 10)) {
+ const count = await valkey.get(sk);
+ const term = sk.replace("search:term:", "");
+ searchTerms.push({ term, count: Number(count) });
+ }
+ searchTerms.sort((a, b) => b.count - a.count);
+ valkeyOps.push("KEYS search:term:* + GET each");
+ } else {
+ // Demo data when no tracking exists
+ searchTerms = [
+ { term: "iphone", count: 142, source: "demo" },
+ { term: "laptop", count: 98, source: "demo" },
+ { term: "headphones", count: 87, source: "demo" },
+ { term: "samsung", count: 76, source: "demo" },
+ { term: "macbook", count: 65, source: "demo" },
+ ];
+ valkeyOps.push("KEYS search:term:* (no data — returning demo search terms)");
+ }
+ } catch (e) {
+ valkeyOps.push("Search terms (error: " + e.message + ")");
+ }
+
+ // 7. Feature usage from valkey.js getStats()
+ const featureUsage = getStats();
+ valkeyOps.push("getStats() from valkey.js usage counters");
+
+ res.json({
+ timestamp: new Date().toISOString(),
+ trendingProducts,
+ topCategories,
+ inventoryAlerts: {
+ count: inventoryAlerts.length,
+ items: inventoryAlerts,
+ },
+ userStats,
+ revenueEstimate: {
+ amount: revenueEstimate,
+ currency: "INR",
+ cartsWithItems,
+ note: "Sum of all active cart item prices * quantities",
+ },
+ cartAbandonment: {
+ cartsWithItems,
+ note: "Carts with items that have not been checked out",
+ },
+ searchTerms,
+ featureUsage,
+ valkeyOps,
+ storedIn: "Valkey Sorted Set, Search Index, JSON, Hash, String, Set",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "analytics_error", message: err.message });
+ }
+});
+
+// GET /api/analytics/conversion — funnel data
+router.get("/conversion", async (req, res) => {
+ try {
+ const valkeyOps = [];
+
+ // Views: total trending score = proxy for total views
+ let totalViews = 0;
+ let uniqueProductViews = 0;
+ try {
+ const trendingMembers = await valkey.zrevrange("trending:global:24h", 0, -1, "WITHSCORES");
+ valkeyOps.push("ZREVRANGE trending:global:24h 0 -1 WITHSCORES");
+ uniqueProductViews = trendingMembers.length / 2;
+ for (let i = 1; i < trendingMembers.length; i += 2) {
+ totalViews += parseFloat(trendingMembers[i]);
+ }
+ } catch (e) {
+ valkeyOps.push("ZREVRANGE (error: " + e.message + ")");
+ }
+
+ // Cart adds: count carts with items
+ let cartsWithItems = 0;
+ let totalCartItems = 0;
+ try {
+ const cartKeys = await valkey.keys("cart:*");
+ valkeyOps.push(`KEYS cart:* → ${cartKeys.length} carts`);
+ for (const ck of cartKeys) {
+ try {
+ const cartData = await valkey.hgetall(ck);
+ if (cartData && Object.keys(cartData).length > 0) {
+ cartsWithItems++;
+ totalCartItems += Object.keys(cartData).length;
+ }
+ } catch (_) {}
+ }
+ valkeyOps.push("HGETALL each cart:* for item counts");
+ } catch (e) {
+ valkeyOps.push("Cart keys (error: " + e.message + ")");
+ }
+
+ // Wishlist adds
+ let wishlistCount = 0;
+ try {
+ const wishlistKeys = await valkey.keys("wishlist:*");
+ valkeyOps.push(`KEYS wishlist:* → ${wishlistKeys.length} wishlists`);
+ for (const wk of wishlistKeys) {
+ try {
+ const wData = await valkey.hgetall(wk);
+ if (wData) wishlistCount += Object.keys(wData).length;
+ } catch (_) {}
+ }
+ } catch (e) {
+ valkeyOps.push("Wishlist keys (error: " + e.message + ")");
+ }
+
+ // Estimate checkout conversions (10% of carts as demo data)
+ const checkoutEstimate = Math.ceil(cartsWithItems * 0.1);
+
+ // Conversion rates
+ const cartConversionRate = totalViews > 0 ? ((cartsWithItems / totalViews) * 100).toFixed(2) : "0.00";
+ const checkoutConversionRate = cartsWithItems > 0 ? ((checkoutEstimate / cartsWithItems) * 100).toFixed(2) : "0.00";
+
+ res.json({
+ timestamp: new Date().toISOString(),
+ funnel: {
+ productViews: {
+ total: Math.round(totalViews),
+ uniqueProducts: uniqueProductViews,
+ valkeySource: "ZREVRANGE trending:global:24h WITHSCORES (cumulative score = views proxy)",
+ },
+ addToCart: {
+ cartSessions: cartsWithItems,
+ totalItemsInCarts: totalCartItems,
+ conversionRate: `${cartConversionRate}%`,
+ valkeySource: "KEYS cart:* + HGETALL",
+ },
+ wishlist: {
+ totalWishlistItems: wishlistCount,
+ valkeySource: "KEYS wishlist:* + HGETALL",
+ },
+ checkout: {
+ estimatedCheckouts: checkoutEstimate,
+ conversionRate: `${checkoutConversionRate}%`,
+ note: "Estimated at 10% of active carts (demo data)",
+ },
+ },
+ summary: {
+ viewToCartRate: `${cartConversionRate}%`,
+ cartToCheckoutRate: `${checkoutConversionRate}%`,
+ overallConversionRate: totalViews > 0 ? ((checkoutEstimate / totalViews) * 100).toFixed(3) + "%" : "0.000%",
+ },
+ valkeyOps,
+ storedIn: "Valkey Sorted Set (trending), Hash (carts, wishlists)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "conversion_analytics_error", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/auth.js b/submissions/valkey-ecommerce-demo/backend/src/routes/auth.js
new file mode 100644
index 0000000..8580901
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/auth.js
@@ -0,0 +1,186 @@
+/**
+ * User Authentication – Valkey String (session tokens)
+ *
+ * Valkey commands used:
+ * JSON.SET {userId} – store user profile as JSON document
+ * SET session:{token} {userId} EX 86400 – session with 24h TTL
+ * GET session:{token} – validate session
+ * EXPIRE session:{token} ... – refresh TTL on activity
+ * DEL session:{token} – logout
+ * INCR login_attempts:{email} – rate limiting
+ * EXPIRE login_attempts:{email} 900 – 15 min window
+ */
+
+const express = require("express");
+const router = express.Router();
+const bcrypt = require("bcryptjs");
+const { v7: uuidv7 } = require("uuid");
+const { valkey, track } = require("../valkey");
+const { recordFact } = require("../breeth");
+
+const SESSION_TTL = 86400; // 24 hours
+const RATE_LIMIT_MAX = 5;
+const RATE_LIMIT_WINDOW = 900; // 15 min
+
+// POST /api/auth/register
+router.post("/register", async (req, res) => {
+ const { email, password, firstName, lastName } = req.body;
+ if (!email || !password) return res.status(400).json({ error: "email and password required" });
+
+ try {
+ // Check if email already registered
+ const existingId = await valkey.get(`email:${email}`);
+ if (existingId) return res.status(409).json({ error: "Email already registered" });
+
+ const userId = `user:${uuidv7()}`;
+ const passwordHash = await bcrypt.hash(password, 12);
+
+ const user = {
+ id: userId,
+ email,
+ passwordHash,
+ firstName: firstName || "",
+ lastName: lastName || "",
+ role: "customer",
+ createdAt: new Date().toISOString(),
+ };
+
+ // Store user JSON in Valkey
+ await valkey.call("JSON.SET", userId, "$", JSON.stringify(user));
+ // Email → userId index
+ await valkey.set(`email:${email}`, userId);
+ track("sessionOps");
+
+ // Record user creation in Breeth for memory
+ recordFact(userId, "registered", "ecommerce_platform", { email, firstName });
+
+ res.status(201).json({
+ success: true,
+ userId,
+ valkeyOp: "JSON.SET + SET (email index)",
+ storedIn: "Valkey JSON",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "register_error", message: err.message });
+ }
+});
+
+// POST /api/auth/login
+router.post("/login", async (req, res) => {
+ const { email, password } = req.body;
+ if (!email || !password) return res.status(400).json({ error: "email and password required" });
+
+ try {
+ // Rate limiting check
+ const attemptsKey = `login_attempts:${email}`;
+ const attempts = await valkey.incr(attemptsKey);
+ await valkey.expire(attemptsKey, RATE_LIMIT_WINDOW);
+ track("sessionOps");
+
+ if (attempts > RATE_LIMIT_MAX) {
+ return res.status(429).json({
+ error: "rate_limit_exceeded",
+ message: "Too many login attempts. Try again in 15 minutes.",
+ valkeyOp: "INCR (rate limiting)",
+ storedIn: "Valkey String counter",
+ });
+ }
+
+ const userId = await valkey.get(`email:${email}`);
+ if (!userId) return res.status(401).json({ error: "Invalid credentials" });
+
+ const raw = await valkey.call("JSON.GET", userId);
+ if (!raw) return res.status(401).json({ error: "User not found" });
+
+ const user = JSON.parse(raw);
+ const valid = await bcrypt.compare(password, user.passwordHash);
+ if (!valid) return res.status(401).json({ error: "Invalid credentials" });
+
+ // Reset rate limit on success
+ await valkey.del(attemptsKey);
+
+ // Create session token
+ const token = uuidv7();
+ await valkey.set(`session:${token}`, userId, "EX", SESSION_TTL);
+ track("sessionOps");
+
+ // Update lastLoginAt
+ await valkey.call("JSON.SET", userId, "$.lastLoginAt", JSON.stringify(new Date().toISOString()));
+
+ recordFact(userId, "logged_in", "ecommerce_platform", { timestamp: new Date().toISOString() });
+
+ res.json({
+ success: true,
+ token,
+ userId,
+ user: { id: userId, email: user.email, firstName: user.firstName, lastName: user.lastName, role: user.role },
+ valkeyOp: "SET session:{token} {userId} EX 86400",
+ storedIn: "Valkey String (session)",
+ sessionTTL: `${SESSION_TTL}s (24 hours)`,
+ });
+ } catch (err) {
+ res.status(500).json({ error: "login_error", message: err.message });
+ }
+});
+
+// GET /api/auth/me
+router.get("/me", async (req, res) => {
+ const token = req.headers.authorization?.replace("Bearer ", "");
+ if (!token) return res.status(401).json({ error: "No token provided" });
+
+ try {
+ const userId = await valkey.get(`session:${token}`);
+ track("sessionOps");
+
+ if (!userId) return res.status(401).json({ error: "Session expired or invalid" });
+
+ // Refresh TTL
+ await valkey.expire(`session:${token}`, SESSION_TTL);
+
+ const raw = await valkey.call("JSON.GET", userId);
+ if (!raw) return res.status(404).json({ error: "User not found" });
+
+ const user = JSON.parse(raw);
+ const { passwordHash, ...safeUser } = user;
+
+ res.json({
+ user: safeUser,
+ valkeyOp: "GET session:{token} → JSON.GET {userId}",
+ storedIn: "Valkey String session + JSON user profile",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "auth_error", message: err.message });
+ }
+});
+
+// POST /api/auth/logout
+router.post("/logout", async (req, res) => {
+ const token = req.headers.authorization?.replace("Bearer ", "");
+ if (!token) return res.status(400).json({ error: "No token" });
+
+ try {
+ await valkey.del(`session:${token}`);
+ track("sessionOps");
+ res.json({ success: true, valkeyOp: "DEL session:{token}", storedIn: "Valkey String session" });
+ } catch (err) {
+ res.status(500).json({ error: "logout_error", message: err.message });
+ }
+});
+
+// POST /api/auth/refresh
+router.post("/refresh", async (req, res) => {
+ const token = req.headers.authorization?.replace("Bearer ", "");
+ if (!token) return res.status(400).json({ error: "No token" });
+
+ try {
+ const exists = await valkey.expire(`session:${token}`, SESSION_TTL);
+ track("sessionOps");
+
+ if (!exists) return res.status(401).json({ error: "Session not found" });
+ res.json({ success: true, ttl: SESSION_TTL, valkeyOp: "EXPIRE session:{token}", storedIn: "Valkey String session" });
+ } catch (err) {
+ res.status(500).json({ error: "refresh_error", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/cart.js b/submissions/valkey-ecommerce-demo/backend/src/routes/cart.js
new file mode 100644
index 0000000..3f9859c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/cart.js
@@ -0,0 +1,188 @@
+/**
+ * Cart Management – Valkey Hash
+ *
+ * Key: cart:{userId}
+ * Field: productId → JSON string with { quantity, name, price, image }
+ * TTL: 7 days (604800s) — abandoned carts auto-expire
+ *
+ * Valkey commands used:
+ * HSET – add / update item
+ * HGETALL – fetch full cart
+ * HDEL – remove item
+ * DEL – clear cart
+ * EXPIRE – reset abandon TTL
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, track } = require("../valkey");
+const { recordFact } = require("../breeth");
+
+const CART_TTL = 604800; // 7 days
+
+function cartKey(userId) {
+ return `cart:${userId}`;
+}
+
+// GET /api/cart?userId=xxx
+router.get("/", async (req, res) => {
+ const userId = req.query.userId || req.headers["x-user-id"] || "guest:demo";
+ try {
+ const raw = await valkey.hgetall(cartKey(userId));
+ track("cartOps");
+
+ const items = raw
+ ? Object.entries(raw).map(([productId, val]) => ({
+ productId,
+ ...JSON.parse(val),
+ }))
+ : [];
+
+ const subtotal = items.reduce((s, i) => s + i.price * i.quantity, 0);
+
+ res.json({
+ userId,
+ items,
+ subtotal,
+ itemCount: items.length,
+ valkeyKey: cartKey(userId),
+ valkeyOp: "HGETALL",
+ storedIn: "Valkey Hash",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "cart_error", message: err.message });
+ }
+});
+
+// POST /api/cart/items
+router.post("/items", async (req, res) => {
+ const { userId = "guest:demo", productId, name, price, image, quantity = 1 } = req.body;
+ if (!productId) return res.status(400).json({ error: "productId required" });
+
+ try {
+ const key = cartKey(userId);
+
+ // Check if item already exists; merge quantity
+ const existing = await valkey.hget(key, productId);
+ const prev = existing ? JSON.parse(existing) : null;
+ const newQty = prev ? prev.quantity + quantity : quantity;
+
+ const item = { name, price, image, quantity: newQty };
+ await valkey.hset(key, productId, JSON.stringify(item));
+ await valkey.expire(key, CART_TTL);
+ track("cartOps");
+
+ // Track in Breeth for personalization
+ recordFact(userId, "added_to_cart", productId, { quantity: newQty, price });
+
+ res.json({
+ success: true,
+ productId,
+ quantity: newQty,
+ valkeyKey: key,
+ valkeyOp: "HSET + EXPIRE",
+ storedIn: "Valkey Hash (cart)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "cart_error", message: err.message });
+ }
+});
+
+// PATCH /api/cart/items/:productId
+router.patch("/items/:productId", async (req, res) => {
+ const { userId = "guest:demo", quantity } = req.body;
+ const { productId } = req.params;
+
+ try {
+ const key = cartKey(userId);
+ const existing = await valkey.hget(key, productId);
+ if (!existing) return res.status(404).json({ error: "Item not in cart" });
+
+ const item = JSON.parse(existing);
+ item.quantity = quantity;
+ await valkey.hset(key, productId, JSON.stringify(item));
+ await valkey.expire(key, CART_TTL);
+ track("cartOps");
+
+ res.json({ success: true, productId, quantity, valkeyOp: "HSET", storedIn: "Valkey Hash" });
+ } catch (err) {
+ res.status(500).json({ error: "cart_error", message: err.message });
+ }
+});
+
+// DELETE /api/cart/items/:productId
+router.delete("/items/:productId", async (req, res) => {
+ const userId = req.query.userId || req.headers["x-user-id"] || "guest:demo";
+ const { productId } = req.params;
+
+ try {
+ await valkey.hdel(cartKey(userId), productId);
+ track("cartOps");
+ res.json({ success: true, valkeyOp: "HDEL", storedIn: "Valkey Hash" });
+ } catch (err) {
+ res.status(500).json({ error: "cart_error", message: err.message });
+ }
+});
+
+// DELETE /api/cart – clear cart
+router.delete("/", async (req, res) => {
+ const userId = req.query.userId || req.headers["x-user-id"] || "guest:demo";
+ try {
+ await valkey.del(cartKey(userId));
+ track("cartOps");
+ res.json({ success: true, valkeyOp: "DEL", storedIn: "Valkey Hash" });
+ } catch (err) {
+ res.status(500).json({ error: "cart_error", message: err.message });
+ }
+});
+
+// POST /api/cart/coupon – validate & apply coupon
+router.post("/coupon", async (req, res) => {
+ const { userId = "guest:demo", couponCode, subtotal } = req.body;
+ if (!couponCode) return res.status(400).json({ error: "couponCode required" });
+
+ try {
+ const raw = await valkey.call("JSON.GET", `coupon:${couponCode.toUpperCase()}`);
+ track("cartOps");
+
+ if (!raw) return res.status(404).json({ error: "Coupon not found" });
+
+ const coupon = JSON.parse(raw);
+ const now = new Date();
+
+ if (!coupon.active) return res.status(400).json({ error: "Coupon inactive" });
+ if (new Date(coupon.validUntil) < now) return res.status(400).json({ error: "Coupon expired" });
+ if (coupon.usedCount >= coupon.usageLimit) return res.status(400).json({ error: "Coupon usage limit reached" });
+ if (subtotal < coupon.minOrderAmount) {
+ return res.status(400).json({
+ error: "Minimum order not met",
+ required: coupon.minOrderAmount,
+ current: subtotal,
+ });
+ }
+
+ let discount = 0;
+ if (coupon.type === "percentage") {
+ discount = Math.min((subtotal * coupon.value) / 100, coupon.maxDiscount);
+ } else {
+ discount = coupon.value;
+ }
+
+ // Check if user already used this coupon
+ const alreadyUsed = await valkey.sismember(`coupon_used:${couponCode.toUpperCase()}`, userId);
+ if (alreadyUsed) return res.status(400).json({ error: "Coupon already used by this user" });
+
+ res.json({
+ success: true,
+ coupon: { code: coupon.code, type: coupon.type, value: coupon.value },
+ discount: Math.round(discount),
+ finalTotal: subtotal - Math.round(discount),
+ valkeyOp: "JSON.GET + SISMEMBER",
+ storedIn: "Valkey JSON + Set",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "coupon_error", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/comparison.js b/submissions/valkey-ecommerce-demo/backend/src/routes/comparison.js
new file mode 100644
index 0000000..894f19c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/comparison.js
@@ -0,0 +1,375 @@
+/**
+ * Product Comparison – Valkey SET per user
+ * key: compare:{userId} (max 4 items)
+ *
+ * Valkey commands:
+ * SMEMBERS compare:{userId} – get all compared product IDs
+ * SCARD compare:{userId} – check count before adding
+ * SADD compare:{userId} {id} – add product to compare set
+ * SREM compare:{userId} {id} – remove product from compare set
+ * DEL compare:{userId} – clear compare list
+ * JSON.GET {productId} – fetch product details
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, track } = require("../valkey");
+
+const MAX_COMPARE = 4;
+
+// GET /api/comparison?userId=
+router.get("/", async (req, res) => {
+ const { userId } = req.query;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `compare:${userId}`;
+ try {
+ const productIds = await valkey.smembers(key);
+
+ const products = [];
+ for (const pid of productIds) {
+ try {
+ const raw = await valkey.call("JSON.GET", pid);
+ if (raw) {
+ const product = JSON.parse(raw);
+ products.push(product);
+ }
+ } catch (e) {
+ products.push({ id: pid, error: "product_not_found" });
+ }
+ }
+
+ res.json({
+ userId,
+ count: products.length,
+ maxAllowed: MAX_COMPARE,
+ products,
+ valkeyOp: `SMEMBERS ${key} → JSON.GET each product`,
+ storedIn: "Valkey Set (compare list) + Valkey JSON (products)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "comparison_fetch_error", message: err.message });
+ }
+});
+
+// POST /api/comparison/add
+router.post("/add", async (req, res) => {
+ const { userId, productId } = req.body;
+ if (!userId || !productId) {
+ return res.status(400).json({ error: "userId and productId required" });
+ }
+
+ const key = `compare:${userId}`;
+ try {
+ // Check current count
+ const currentCount = await valkey.scard(key);
+ if (currentCount >= MAX_COMPARE) {
+ return res.status(400).json({
+ error: "comparison_limit_reached",
+ message: `Maximum ${MAX_COMPARE} products can be compared at once`,
+ currentCount,
+ maxAllowed: MAX_COMPARE,
+ valkeyOp: `SCARD ${key}`,
+ storedIn: "Valkey Set",
+ });
+ }
+
+ const added = await valkey.sadd(key, productId);
+ await valkey.expire(key, 86400); // 24h TTL
+
+ // Fetch product details to confirm
+ let product = null;
+ try {
+ const raw = await valkey.call("JSON.GET", productId);
+ if (raw) product = JSON.parse(raw);
+ } catch (_) {}
+
+ res.json({
+ success: true,
+ added: added === 1,
+ alreadyPresent: added === 0,
+ userId,
+ productId,
+ product: product ? { id: product.id, name: product.name, price: product.price, brand: product.brand } : null,
+ newCount: await valkey.scard(key),
+ maxAllowed: MAX_COMPARE,
+ valkeyOp: `SCARD ${key} → SADD ${key} ${productId}`,
+ storedIn: "Valkey Set (compare:{userId})",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "comparison_add_error", message: err.message });
+ }
+});
+
+// DELETE /api/comparison/remove
+router.delete("/remove", async (req, res) => {
+ const { userId, productId } = req.body;
+ if (!userId || !productId) {
+ return res.status(400).json({ error: "userId and productId required" });
+ }
+
+ const key = `compare:${userId}`;
+ try {
+ const removed = await valkey.srem(key, productId);
+
+ res.json({
+ success: true,
+ removed: removed === 1,
+ userId,
+ productId,
+ remainingCount: await valkey.scard(key),
+ valkeyOp: `SREM ${key} ${productId}`,
+ storedIn: "Valkey Set (compare:{userId})",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "comparison_remove_error", message: err.message });
+ }
+});
+
+// DELETE /api/comparison — clear all
+router.delete("/", async (req, res) => {
+ const { userId } = req.body;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `compare:${userId}`;
+ try {
+ await valkey.del(key);
+
+ res.json({
+ success: true,
+ userId,
+ valkeyOp: `DEL ${key}`,
+ storedIn: "Valkey Set (compare:{userId})",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "comparison_clear_error", message: err.message });
+ }
+});
+
+// POST /api/comparison/ai-compare
+router.post("/ai-compare", async (req, res) => {
+ const { userId } = req.body;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `compare:${userId}`;
+ try {
+ const productIds = await valkey.smembers(key);
+ if (productIds.length < 2) {
+ return res.status(400).json({ error: "At least 2 products are required to compare." });
+ }
+
+ // Fetch all products from Valkey JSON
+ const products = [];
+ for (const pid of productIds) {
+ try {
+ const raw = await valkey.call("JSON.GET", pid);
+ if (raw) products.push(JSON.parse(raw));
+ } catch (_) {}
+ }
+
+ if (products.length < 2) {
+ return res.status(400).json({ error: "Could not load product details from Valkey." });
+ }
+
+ // ── Try Breeth AI ─────────────────────────────────────────────────────────
+ let comparison = null;
+ let poweredBy = "Smart Analysis Engine (Valkey data)";
+ let aiNote = null;
+
+ try {
+ const https = require("https");
+
+ const productDescriptions = products
+ .map(p => [
+ `Name: ${p.name}`,
+ `Brand: ${p.brand || "Unknown"}`,
+ `Price: ₹${(p.price?.amount || p.price || 0).toLocaleString("en-IN")}`,
+ `Rating: ${p.ratings?.average || 4.5} stars (${p.ratings?.count || 0} reviews)`,
+ `Category: ${p.categoryId || "General"}`,
+ `Description: ${p.shortDescription || p.description || "N/A"}`,
+ ].join(", "))
+ .join("\n\n");
+
+ const prompt =
+ `You are an expert shopping assistant. Compare the following products side-by-side. ` +
+ `Highlight key differences in price, features, value, and recommend which to buy under different circumstances. ` +
+ `Give a clear, structured response in 3-4 short paragraphs.\n\nProducts:\n${productDescriptions}`;
+
+ const payload = JSON.stringify({
+ query: prompt,
+ context: { action: "product_comparison", productCount: products.length, userId },
+ });
+
+ const breethResponse = await new Promise((resolve, reject) => {
+ const options = {
+ hostname: "api.thebreeth.com",
+ path: "/v1/search",
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "Authorization": `Bearer ${process.env.BREETH_API_KEY || "ck_live_YhQWb-ZjIQxfs6AzDezC3zaPMPw4xJ8yRDkjIz7d16A"}`,
+ "Content-Length": Buffer.byteLength(payload),
+ },
+ };
+
+ const request = https.request(options, (resp) => {
+ // Reject immediately on HTTP 4xx/5xx
+ if (resp.statusCode >= 400) {
+ request.destroy();
+ return reject(new Error(`Breeth API HTTP ${resp.statusCode}`));
+ }
+ let data = "";
+ resp.on("data", (chunk) => { data += chunk; });
+ resp.on("end", () => {
+ // Reject if the body is an HTML page (e.g. gateway error)
+ if (data.trim().startsWith("<")) {
+ return reject(new Error("Breeth returned HTML (gateway error)"));
+ }
+ try {
+ const parsed = JSON.parse(data);
+ const text = parsed.response || parsed.text || parsed.answer || parsed.message;
+ if (!text) return reject(new Error("Breeth returned empty body"));
+ resolve(text);
+ } catch (_) {
+ reject(new Error("Breeth returned non-JSON body"));
+ }
+ });
+ });
+
+ request.on("error", reject);
+ request.setTimeout(8000, () => {
+ request.destroy();
+ reject(new Error("Breeth AI timeout after 8s"));
+ });
+ request.write(payload);
+ request.end();
+ });
+
+ comparison = breethResponse;
+ poweredBy = "Breeth AI";
+
+ } catch (e) {
+ // ── Rich Smart Fallback — fully derived from Valkey product data ──────
+ aiNote = `Breeth AI unavailable (${e.message}). Showing data-driven comparison from Valkey.`;
+ comparison = buildSmartComparison(products);
+ }
+
+ track("aiOps");
+
+ res.json({
+ success: true,
+ comparison,
+ poweredBy,
+ valkeyOp: `SMEMBERS ${key} + JSON.GET per product`,
+ storedIn: "Valkey Set (compare:{userId}) + Valkey JSON (products)",
+ ...(aiNote ? { aiNote } : {}),
+ });
+
+ } catch (err) {
+ res.status(500).json({ error: "ai_comparison_error", message: err.message });
+ }
+});
+
+/**
+ * Build a rich, structured product comparison from Valkey JSON product data.
+ * Returns a markdown-formatted string.
+ */
+function buildSmartComparison(products) {
+ if (!products || products.length < 2) return "Not enough products to compare.";
+
+ const fmt = (n) => Number(n || 0).toLocaleString("en-IN");
+ const prices = products.map(p => Number(p.price?.amount || p.price || 0));
+ const ratings = products.map(p => Number(p.ratings?.average || 4.0));
+ const reviews = products.map(p => Number(p.ratings?.count || 0));
+ const stocks = products.map(p => {
+ const inv = p.inventory;
+ return inv ? (Number(inv.quantity) || 0) - (Number(inv.reserved) || 0) : null;
+ });
+
+ const cheapestIdx = prices.indexOf(Math.min(...prices));
+ const highestRatedIdx = ratings.indexOf(Math.max(...ratings));
+ const mostReviewedIdx = reviews.indexOf(Math.max(...reviews));
+
+ const lines = [];
+
+ // ── Price Comparison ──────────────────────────────────────────────────────
+ lines.push("## 💰 Price Comparison\n");
+ products.forEach((p, i) => {
+ const diff = prices[i] - prices[cheapestIdx];
+ const tag = i === cheapestIdx
+ ? " 🏷️ **Best Price**"
+ : ` (+₹${fmt(diff)} over cheapest)`;
+ lines.push(`- **${p.name}** (${p.brand || "Unknown"}) — ₹${fmt(prices[i])}${tag}`);
+ });
+ const delta = Math.max(...prices) - Math.min(...prices);
+ lines.push(`\n${products[cheapestIdx].name} is the most affordable, ₹${fmt(delta)} cheaper than the priciest option here.\n`);
+
+ // ── Ratings & Reviews ─────────────────────────────────────────────────────
+ lines.push("## ⭐ Ratings & Customer Trust\n");
+ products.forEach((p, i) => {
+ const filled = Math.round(ratings[i]);
+ const stars = "★".repeat(filled) + "☆".repeat(Math.max(0, 5 - filled));
+ lines.push(`- **${p.name}** — ${stars} ${ratings[i].toFixed(1)}/5 · ${fmt(reviews[i])} reviews`);
+ });
+ const ratingNote = mostReviewedIdx !== highestRatedIdx
+ ? ` ${products[mostReviewedIdx].name} has the most reviews (${fmt(reviews[mostReviewedIdx])}), indicating broader adoption.`
+ : "";
+ lines.push(`\n${products[highestRatedIdx].name} leads in customer satisfaction with ${ratings[highestRatedIdx].toFixed(1)}★.${ratingNote}\n`);
+
+ // ── Stock Availability ────────────────────────────────────────────────────
+ if (stocks.some(s => s !== null)) {
+ lines.push("## 📦 Stock Availability\n");
+ products.forEach((p, i) => {
+ const s = stocks[i];
+ const level = s === null ? "ℹ️ Unknown"
+ : s <= 0 ? "❌ Out of Stock"
+ : s < 5 ? `⚠️ Critical — only ${s} left`
+ : s < 20 ? `🟡 Low Stock (${s} units)`
+ : `✅ In Stock (${s} units)`;
+ lines.push(`- **${p.name}** — ${level}`);
+ });
+ lines.push("");
+ }
+
+ // ── Feature Snapshot ──────────────────────────────────────────────────────
+ lines.push("## 🔍 Feature Snapshot\n");
+ products.forEach((p) => {
+ const desc = p.shortDescription || p.description || "";
+ const snippet = desc.length > 150 ? desc.slice(0, 150) + "…" : desc;
+ lines.push(`**${p.name}:** ${snippet || "No description available."}\n`);
+ });
+
+ // ── Overall Recommendation ────────────────────────────────────────────────
+ lines.push("## 🏆 Our Recommendation\n");
+
+ // Score: best price = 3 pts, highest rating = 2 pts, most reviews = 1 pt
+ const scores = products.map(() => 0);
+ scores[cheapestIdx] += 3;
+ scores[highestRatedIdx] += 2;
+ scores[mostReviewedIdx] += 1;
+ const winnerIdx = scores.indexOf(Math.max(...scores));
+ const winner = products[winnerIdx];
+
+ lines.push(`🥇 **Top Pick: ${winner.name}** (${winner.brand || "Unknown Brand"})`);
+
+ if (winnerIdx === cheapestIdx && winnerIdx === highestRatedIdx) {
+ lines.push(`\nIt offers both the lowest price (₹${fmt(prices[winnerIdx])}) and the highest customer rating (${ratings[winnerIdx].toFixed(1)}★) — a clear best-value choice for most shoppers.`);
+ } else if (winnerIdx === cheapestIdx) {
+ lines.push(`\nWhile ${products[highestRatedIdx].name} edges ahead on ratings, ${winner.name} wins on affordability at ₹${fmt(prices[winnerIdx])}, making it ideal for budget-conscious buyers.`);
+ } else {
+ lines.push(`\nAt ₹${fmt(prices[winnerIdx])} with a ${ratings[winnerIdx].toFixed(1)}★ rating, it strikes the best overall balance of quality and value in this comparison.`);
+ }
+
+ // Alternative mention
+ const alts = products.filter((_, i) => i !== winnerIdx);
+ if (alts.length > 0) {
+ const alt = alts[0];
+ const altIdx = products.indexOf(alt);
+ const reason = altIdx === highestRatedIdx ? "top ratings" : "competitive pricing";
+ lines.push(`\n💡 **Alternative:** For ${reason}, consider **${alt.name}** — ${ratings[altIdx].toFixed(1)}★ at ₹${fmt(prices[altIdx])}.`);
+ }
+
+ return lines.join("\n");
+}
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/inventory.js b/submissions/valkey-ecommerce-demo/backend/src/routes/inventory.js
new file mode 100644
index 0000000..6e565b7
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/inventory.js
@@ -0,0 +1,171 @@
+/**
+ * Real-time Inventory Management – Valkey JSON + Lua atomic scripts
+ *
+ * Valkey commands used:
+ * JSON.GET {productId} $.inventory – read stock
+ * JSON.NUMINCRBY {productId} $.inventory.reserved +N – reserve stock
+ * JSON.NUMINCRBY {productId} $.inventory.quantity -N – commit decrement
+ * EVAL Lua – atomic check-and-reserve to prevent overselling
+ * SET reservation:{orderId}:{productId} {qty} EX 600 – 10-min reservation TTL
+ * ZINCRBY trending:global:1h – update trending on stock changes
+ */
+
+const express = require("express");
+const router = express.Router();
+const { v7: uuidv7 } = require("uuid");
+const { valkey, track } = require("../valkey");
+
+// Lua script: atomic check-and-reserve (prevents overselling under concurrency)
+const RESERVE_SCRIPT = `
+local current = tonumber(redis.call('JSON.GET', KEYS[1], '$.inventory.quantity'))
+local reserved = tonumber(redis.call('JSON.GET', KEYS[1], '$.inventory.reserved'))
+if current == nil then return -1 end
+local available = current - (reserved or 0)
+if available >= tonumber(ARGV[1]) then
+ redis.call('JSON.NUMINCRBY', KEYS[1], '$.inventory.reserved', ARGV[1])
+ return available - tonumber(ARGV[1])
+end
+return -2
+`;
+
+// GET /api/inventory/:productId
+router.get("/:productId", async (req, res) => {
+ const { productId } = req.params;
+ const key = productId.startsWith("product:") ? productId : `product:${productId}`;
+
+ try {
+ const raw = await valkey.call("JSON.GET", key, "$.inventory");
+ track("inventoryOps");
+
+ if (!raw) return res.status(404).json({ error: "Product not found" });
+
+ const inv = JSON.parse(raw)[0];
+ const available = inv.quantity - (inv.reserved || 0);
+
+ res.json({
+ productId: key,
+ ...inv,
+ available,
+ inStock: available > 0,
+ stockLevel: available > 20 ? "high" : available > 5 ? "low" : available > 0 ? "critical" : "out",
+ valkeyOp: "JSON.GET $.inventory",
+ storedIn: "Valkey JSON",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "inventory_error", message: err.message });
+ }
+});
+
+// POST /api/inventory/reserve – atomically reserve stock for checkout
+router.post("/reserve", async (req, res) => {
+ const { productId, quantity = 1, orderId } = req.body;
+ if (!productId) return res.status(400).json({ error: "productId required" });
+
+ const key = productId.startsWith("product:") ? productId : `product:${productId}`;
+ const oid = orderId || `order:${uuidv7()}`;
+
+ try {
+ const result = await valkey.eval(RESERVE_SCRIPT, 1, key, quantity);
+ track("inventoryOps");
+
+ if (result === -1) return res.status(404).json({ error: "Product not found" });
+ if (result === -2) return res.status(409).json({ error: "Insufficient stock", available: 0 });
+
+ // Set reservation TTL (auto-release after 10 min)
+ await valkey.set(`reservation:${oid}:${key}`, quantity, "EX", 600);
+
+ res.json({
+ success: true,
+ orderId: oid,
+ productId: key,
+ quantity,
+ availableAfterReserve: result,
+ reservationExpiresIn: "10 minutes",
+ valkeyOp: "EVAL Lua (atomic reserve) + SET reservation EX 600",
+ storedIn: "Valkey JSON (inventory) + String (reservation TTL)",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "reserve_error", message: err.message });
+ }
+});
+
+// POST /api/inventory/commit – confirm purchase, permanently decrement stock
+router.post("/commit", async (req, res) => {
+ const { productId, quantity, orderId } = req.body;
+ if (!productId || !orderId) return res.status(400).json({ error: "productId and orderId required" });
+
+ const key = productId.startsWith("product:") ? productId : `product:${productId}`;
+
+ try {
+ // Decrement quantity and reserved
+ await valkey.call("JSON.NUMINCRBY", key, "$.inventory.quantity", -quantity);
+ await valkey.call("JSON.NUMINCRBY", key, "$.inventory.reserved", -quantity);
+ await valkey.del(`reservation:${orderId}:${key}`);
+ track("inventoryOps");
+
+ res.json({
+ success: true,
+ productId: key,
+ decremented: quantity,
+ valkeyOp: "JSON.NUMINCRBY (quantity) + JSON.NUMINCRBY (reserved) + DEL reservation",
+ storedIn: "Valkey JSON",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "commit_error", message: err.message });
+ }
+});
+
+// POST /api/inventory/release – release reservation (cancel / timeout)
+router.post("/release", async (req, res) => {
+ const { productId, quantity, orderId } = req.body;
+ if (!productId) return res.status(400).json({ error: "productId required" });
+
+ const key = productId.startsWith("product:") ? productId : `product:${productId}`;
+
+ try {
+ await valkey.call("JSON.NUMINCRBY", key, "$.inventory.reserved", -quantity);
+ if (orderId) await valkey.del(`reservation:${orderId}:${key}`);
+ track("inventoryOps");
+
+ res.json({
+ success: true,
+ released: quantity,
+ valkeyOp: "JSON.NUMINCRBY (reserved) -N",
+ storedIn: "Valkey JSON",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "release_error", message: err.message });
+ }
+});
+
+// GET /api/inventory/all – snapshot of all product stock levels
+router.get("/", async (req, res) => {
+ try {
+ const keys = await valkey.keys("product:*");
+ const items = [];
+
+ for (const key of keys) {
+ try {
+ const nameRaw = await valkey.call("JSON.GET", key, "$.name");
+ const invRaw = await valkey.call("JSON.GET", key, "$.inventory");
+ if (invRaw) {
+ const inv = JSON.parse(invRaw)[0];
+ items.push({
+ productId: key,
+ name: nameRaw ? JSON.parse(nameRaw)[0] : key,
+ quantity: inv.quantity,
+ reserved: inv.reserved || 0,
+ available: inv.quantity - (inv.reserved || 0),
+ });
+ }
+ } catch (_) {}
+ }
+
+ track("inventoryOps");
+ res.json({ inventory: items, count: items.length, valkeyOp: "JSON.GET ($.inventory per product)", storedIn: "Valkey JSON" });
+ } catch (err) {
+ res.status(500).json({ error: "inventory_all_error", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/products.js b/submissions/valkey-ecommerce-demo/backend/src/routes/products.js
new file mode 100644
index 0000000..f539c77
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/products.js
@@ -0,0 +1,230 @@
+/**
+ * Product Catalog – Valkey JSON + Sorted Sets
+ *
+ * Primary storage: JSON.SET {productId} $ → full product document
+ * Category index: ZADD category_products:{categoryId} {score} {productId}
+ * Price index: ZADD price_index {pricePaise} {productId}
+ * Brand index: SADD brand_products:{brand} {productId}
+ *
+ * Cache layer: product list is cached for 60s to reduce repeated JSON.GET scans.
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, track } = require("../valkey");
+
+const PRODUCT_CACHE_TTL = 60; // seconds
+
+// Helper to resolve parent categories recursively to get all child category IDs (including the parent category ID itself)
+async function getCategoryAndChildren(valkeyClient, categoryId) {
+ try {
+ const keys = await valkeyClient.keys("category:*");
+ const categoryMap = {};
+ for (const k of keys) {
+ const raw = await valkeyClient.call("JSON.GET", k);
+ if (raw) {
+ const catObj = JSON.parse(raw);
+ categoryMap[catObj.id] = catObj;
+ }
+ }
+
+ const result = new Set([categoryId]);
+ const queue = [categoryId];
+ while (queue.length > 0) {
+ const current = queue.shift();
+ for (const id in categoryMap) {
+ if (categoryMap[id].parentId === current && !result.has(id)) {
+ result.add(id);
+ queue.push(id);
+ }
+ }
+ }
+ return Array.from(result);
+ } catch (err) {
+ console.error("[Helper] getCategoryAndChildren error:", err);
+ return [categoryId];
+ }
+}
+
+// GET /api/products
+router.get("/", async (req, res) => {
+ const { category, brand, minPrice, maxPrice, page = 1, limit = 12 } = req.query;
+
+ const cacheKey = `cache:products:${JSON.stringify(req.query)}`;
+
+ // Try cache first
+ try {
+ const cached = await valkey.get(cacheKey);
+ if (cached) {
+ track("cacheHits");
+ return res.json({ ...JSON.parse(cached), fromCache: true, valkeyOp: "GET (cache hit)", storedIn: "Valkey String cache" });
+ }
+ track("cacheMisses");
+ } catch (_) {}
+
+ try {
+ // Scan all product keys (in production use FT.SEARCH index)
+ const keys = await valkey.keys("product:*");
+ let products = [];
+
+ for (const key of keys) {
+ try {
+ const raw = await valkey.call("JSON.GET", key);
+ if (raw) products.push(JSON.parse(raw));
+ } catch (_) {}
+ }
+
+ // Apply filters
+ if (category) {
+ const allowedCategories = await getCategoryAndChildren(valkey, category);
+ const allowedSet = new Set(allowedCategories);
+ products = products.filter((p) => allowedSet.has(p.categoryId));
+ }
+ if (brand) products = products.filter((p) => p.brand?.toLowerCase() === brand.toLowerCase());
+ if (minPrice) products = products.filter((p) => p.price?.amount >= Number(minPrice));
+ if (maxPrice) products = products.filter((p) => p.price?.amount <= Number(maxPrice));
+
+ const total = products.length;
+ const offset = (Number(page) - 1) * Number(limit);
+ const paginated = products.slice(offset, offset + Number(limit));
+
+ const result = {
+ total,
+ page: Number(page),
+ pageSize: Number(limit),
+ products: paginated,
+ fromCache: false,
+ valkeyOp: "JSON.GET (per product)",
+ storedIn: "Valkey JSON documents",
+ };
+
+ // Cache the result
+ await valkey.setex(cacheKey, PRODUCT_CACHE_TTL, JSON.stringify(result));
+ track("cacheHits"); // tracked as future cache
+
+ res.json(result);
+ } catch (err) {
+ res.status(500).json({ error: "products_error", message: err.message });
+ }
+});
+
+// GET /api/products/:id
+router.get("/:id", async (req, res) => {
+ const productId = req.params.id.startsWith("product:") ? req.params.id : `product:${req.params.id}`;
+
+ try {
+ const raw = await valkey.call("JSON.GET", productId);
+ track("cacheHits");
+
+ if (!raw) return res.status(404).json({ error: "Product not found" });
+
+ const product = JSON.parse(raw);
+ res.json({ ...product, valkeyOp: "JSON.GET", storedIn: "Valkey JSON" });
+ } catch (err) {
+ res.status(500).json({ error: "product_error", message: err.message });
+ }
+});
+
+// POST /api/products – create / upsert product
+router.post("/", async (req, res) => {
+ const product = req.body;
+ if (!product.id || !product.name) {
+ return res.status(400).json({ error: "id and name required" });
+ }
+
+ try {
+ await valkey.call("JSON.SET", product.id, "$", JSON.stringify(product));
+
+ // Update category index
+ if (product.categoryId) {
+ const score = new Date(product.createdAt || Date.now()).getTime();
+ await valkey.zadd(`category_products:${product.categoryId}`, score, product.id);
+ }
+
+ // Update price index
+ if (product.price?.amount) {
+ await valkey.zadd("price_index", product.price.amount, product.id);
+ }
+
+ // Update brand index
+ if (product.brand) {
+ await valkey.sadd(`brand_products:${product.brand.toLowerCase()}`, product.id);
+ }
+
+ // Add to autocomplete suggestions
+ try {
+ await valkey.call("FT.SUGADD", "autocomplete", product.name, 100);
+ } catch (_) {}
+
+ res.status(201).json({
+ success: true,
+ id: product.id,
+ valkeyOp: "JSON.SET + ZADD + SADD",
+ storedIn: "Valkey JSON + Sorted Set + Set",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "product_create_error", message: err.message });
+ }
+});
+
+// PATCH /api/products/:id – partial update
+router.patch("/:id", async (req, res) => {
+ const productId = req.params.id.startsWith("product:") ? req.params.id : `product:${req.params.id}`;
+ const updates = req.body;
+
+ try {
+ for (const [path, value] of Object.entries(updates)) {
+ await valkey.call("JSON.SET", productId, `$.${path}`, JSON.stringify(value));
+ }
+ track("inventoryOps");
+ res.json({ success: true, valkeyOp: "JSON.SET (partial)", storedIn: "Valkey JSON" });
+ } catch (err) {
+ res.status(500).json({ error: "product_update_error", message: err.message });
+ }
+});
+
+// GET /api/products/:id/inventory – real-time stock
+router.get("/:id/inventory", async (req, res) => {
+ const productId = req.params.id.startsWith("product:") ? req.params.id : `product:${req.params.id}`;
+
+ try {
+ const quantityRaw = await valkey.call("JSON.GET", productId, "$.inventory.quantity");
+ const reservedRaw = await valkey.call("JSON.GET", productId, "$.inventory.reserved");
+ track("inventoryOps");
+
+ const quantity = quantityRaw ? JSON.parse(quantityRaw)[0] : 0;
+ const reserved = reservedRaw ? JSON.parse(reservedRaw)[0] : 0;
+ const available = quantity - reserved;
+
+ res.json({
+ productId,
+ quantity,
+ reserved,
+ available,
+ inStock: available > 0,
+ valkeyOp: "JSON.GET ($.inventory.quantity)",
+ storedIn: "Valkey JSON",
+ });
+ } catch (err) {
+ res.status(500).json({ error: "inventory_error", message: err.message });
+ }
+});
+
+// GET /api/categories
+router.get("/categories/all", async (req, res) => {
+ try {
+ const keys = await valkey.keys("category:*");
+ const categories = [];
+ for (const key of keys) {
+ try {
+ const raw = await valkey.call("JSON.GET", key);
+ if (raw) categories.push(JSON.parse(raw));
+ } catch (_) {}
+ }
+ res.json({ categories, valkeyOp: "JSON.GET (categories)", storedIn: "Valkey JSON" });
+ } catch (err) {
+ res.status(500).json({ error: "categories_error", message: err.message });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/search.js b/submissions/valkey-ecommerce-demo/backend/src/routes/search.js
new file mode 100644
index 0000000..dfb7945
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/search.js
@@ -0,0 +1,368 @@
+/**
+ * Product Search – Valkey Search (FT.SEARCH) + Autocomplete (FT.SUGGET)
+ *
+ * Index: idx:products ON JSON PREFIX 1 product:
+ * Valkey commands:
+ * FT.CREATE – create index (on seed)
+ * FT.SEARCH – full-text search with filters
+ * FT.SUGADD – add autocomplete suggestions
+ * FT.SUGGET – get autocomplete suggestions
+ * FT.AGGREGATE – faceted aggregation
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, track } = require("../valkey");
+
+const INDEX_NAME = "idx:products";
+
+// Initialize search index (called on server start)
+async function createSearchIndex() {
+ try {
+ await valkey.call(
+ "FT.CREATE", INDEX_NAME,
+ "ON", "JSON",
+ "PREFIX", "1", "product:",
+ "SCHEMA",
+ "$.name", "AS", "name", "TEXT", "SORTABLE",
+ "$.description", "AS", "description", "TEXT",
+ "$.brand", "AS", "brand", "TEXT", "SORTABLE",
+ "$.categoryId", "AS", "categoryId", "TAG",
+ "$.price.amount", "AS", "price", "NUMERIC", "SORTABLE",
+ "$.ratings.average", "AS", "rating", "NUMERIC", "SORTABLE",
+ "$.status", "AS", "status", "TAG"
+ );
+ console.log("[Search] FT.CREATE idx:products – index created");
+ } catch (err) {
+ if (err.message && err.message.includes("Index already exists")) {
+ console.log("[Search] idx:products already exists");
+ } else {
+ console.error("[Search] FT.CREATE error:", err.message);
+ }
+ }
+}
+
+// Helper to resolve parent categories recursively to get all child category IDs (including the parent category ID itself)
+async function getCategoryAndChildren(valkeyClient, categoryId) {
+ try {
+ const keys = await valkeyClient.keys("category:*");
+ const categoryMap = {};
+ for (const k of keys) {
+ const raw = await valkeyClient.call("JSON.GET", k);
+ if (raw) {
+ const catObj = JSON.parse(raw);
+ categoryMap[catObj.id] = catObj;
+ }
+ }
+
+ const result = new Set([categoryId]);
+ const queue = [categoryId];
+ while (queue.length > 0) {
+ const current = queue.shift();
+ for (const id in categoryMap) {
+ if (categoryMap[id].parentId === current && !result.has(id)) {
+ result.add(id);
+ queue.push(id);
+ }
+ }
+ }
+ return Array.from(result);
+ } catch (err) {
+ console.error("[Helper] getCategoryAndChildren error:", err);
+ return [categoryId];
+ }
+}
+
+// GET /api/search?q=&category=&minPrice=&maxPrice=&sort=&page=1
+router.get("/", async (req, res) => {
+ const { q = "*", category, minPrice, maxPrice, sort = "relevance", page = 1, limit = 12 } = req.query;
+
+ let query = q === "*" || !q ? "*" : q;
+ const filters = [];
+
+ if (category) {
+ const allowed = await getCategoryAndChildren(valkey, category);
+ const tagExpr = allowed.map((c) => c.replace(/:/g, "\\:")).join(" | ");
+ filters.push(`@categoryId:{${tagExpr}}`);
+ }
+ if (minPrice || maxPrice) {
+ const min = minPrice || "-inf";
+ const max = maxPrice || "+inf";
+ filters.push(`@price:[${min} ${max}]`);
+ }
+
+ if (filters.length) query = `(${query}) ${filters.join(" ")}`;
+
+ const sortArgs = [];
+ if (sort === "price_asc") sortArgs.push("SORTBY", "price", "ASC");
+ else if (sort === "price_desc") sortArgs.push("SORTBY", "price", "DESC");
+ else if (sort === "rating") sortArgs.push("SORTBY", "rating", "DESC");
+
+ const offset = (Number(page) - 1) * Number(limit);
+
+ try {
+ const result = await valkey.call(
+ "FT.SEARCH", INDEX_NAME, query,
+ ...sortArgs,
+ "LIMIT", offset, Number(limit),
+ "RETURN", "6", "name", "price", "brand", "categoryId", "rating", "$.images[0].url"
+ );
+ track("searchOps");
+
+ const total = result[0];
+ const products = [];
+ for (let i = 1; i < result.length; i += 2) {
+ const id = result[i];
+ const fields = result[i + 1];
+ const obj = { id };
+ for (let j = 0; j < fields.length; j += 2) {
+ let key = fields[j];
+ if (key === "$.images[0].url") key = "image";
+ obj[key] = fields[j + 1];
+ }
+ products.push(obj);
+ }
+
+ res.json({
+ query: q,
+ total,
+ page: Number(page),
+ pageSize: Number(limit),
+ results: products,
+ valkeyOp: `FT.SEARCH idx:products "${query}"`,
+ storedIn: "Valkey Search Index (JSON documents)",
+ });
+ } catch (err) {
+ // Fallback: scan all products
+ console.error("[Search] FT.SEARCH failed, falling back to scan:", err.message);
+ try {
+ const keys = await valkey.keys("product:*");
+ const allProducts = [];
+ for (const k of keys) {
+ const raw = await valkey.call("JSON.GET", k);
+ if (raw) {
+ const p = JSON.parse(raw);
+ if (!q || q === "*" || p.name?.toLowerCase().includes(q.toLowerCase())) {
+ allProducts.push({ id: k, name: p.name, price: p.price?.amount, brand: p.brand });
+ }
+ }
+ }
+ res.json({ query: q, total: allProducts.length, results: allProducts, fallback: true });
+ } catch (e2) {
+ res.status(500).json({ error: "search_error", message: err.message });
+ }
+ }
+});
+
+// GET /api/search/suggest?q=
+router.get("/suggest", async (req, res) => {
+ const { q } = req.query;
+ if (!q) return res.json({ suggestions: [] });
+
+ try {
+ const result = await valkey.call("FT.SUGGET", "autocomplete", q, "FUZZY", "MAX", "8");
+ track("searchOps");
+ res.json({
+ query: q,
+ suggestions: result || [],
+ valkeyOp: "FT.SUGGET autocomplete FUZZY",
+ storedIn: "Valkey Suggestion Index",
+ });
+ } catch (err) {
+ res.json({ query: q, suggestions: [], error: err.message });
+ }
+});
+
+// GET /api/search/facets?q=
+router.get("/facets", async (req, res) => {
+ const { q = "*" } = req.query;
+
+ try {
+ const brandFacets = await valkey.call(
+ "FT.AGGREGATE", INDEX_NAME, q,
+ "GROUPBY", "1", "@brand",
+ "REDUCE", "COUNT", "0", "AS", "count",
+ "SORTBY", "2", "@count", "DESC",
+ "LIMIT", "0", "10"
+ );
+ track("searchOps");
+
+ const brands = [];
+ for (let i = 1; i < brandFacets.length; i++) {
+ const row = brandFacets[i];
+ brands.push({ name: row[1], count: Number(row[3]) });
+ }
+
+ res.json({
+ query: q,
+ facets: { brands },
+ valkeyOp: "FT.AGGREGATE GROUPBY @brand",
+ storedIn: "Valkey Search Index",
+ });
+ } catch (err) {
+ res.json({ query: q, facets: { brands: [] }, error: err.message });
+ }
+});
+
+// GET /api/search/agentic?q=&userId=
+router.get("/agentic", async (req, res) => {
+ const { q = "", userId } = req.query;
+ if (!q) return res.status(400).json({ error: "q (search query) is required" });
+
+ const valkeyOps = [];
+
+ try {
+ // Step 1: Run FT.SEARCH for the query
+ let products = [];
+ let searchTotal = 0;
+ try {
+ const searchResult = await valkey.call(
+ "FT.SEARCH", INDEX_NAME, q,
+ "LIMIT", "0", "5",
+ "RETURN", "5", "name", "price", "brand", "categoryId", "$.images[0].url"
+ );
+ track("searchOps");
+ valkeyOps.push(`FT.SEARCH idx:products "${q}" LIMIT 0 5`);
+
+ searchTotal = searchResult[0];
+ for (let i = 1; i < searchResult.length; i += 2) {
+ const pid = searchResult[i];
+ const fields = searchResult[i + 1];
+ const obj = { id: pid };
+ for (let j = 0; j < fields.length; j += 2) {
+ let key = fields[j];
+ if (key === "$.images[0].url") key = "image";
+ obj[key] = fields[j + 1];
+ }
+ products.push(obj);
+ }
+ } catch (e) {
+ valkeyOps.push(`FT.SEARCH (error: ${e.message}) — falling back to scan`);
+ try {
+ const keys = await valkey.keys("product:*");
+ for (const k of keys.slice(0, 5)) {
+ const raw = await valkey.call("JSON.GET", k);
+ if (raw) {
+ const p = JSON.parse(raw);
+ if (p.name?.toLowerCase().includes(q.toLowerCase())) {
+ products.push({ id: k, name: p.name, price: p.price?.amount, brand: p.brand });
+ }
+ }
+ }
+ } catch (_) {}
+ }
+
+ // Step 2: Get user affinities from Valkey
+ let userAffinities = [];
+ if (userId) {
+ try {
+ const affinityKey = `user_affinity:${userId}`;
+ const affinityRaw = await valkey.zrevrange(affinityKey, 0, 4, "WITHSCORES");
+ valkeyOps.push(`ZREVRANGE ${affinityKey} 0 4 WITHSCORES`);
+
+ for (let i = 0; i < affinityRaw.length; i += 2) {
+ const catId = affinityRaw[i];
+ const score = parseFloat(affinityRaw[i + 1]);
+ // Try to get category name
+ let catName = catId;
+ try {
+ const catRaw = await valkey.call("JSON.GET", catId, "$.name");
+ if (catRaw) {
+ const parsed = JSON.parse(catRaw);
+ catName = Array.isArray(parsed) ? parsed[0] : parsed;
+ }
+ } catch (_) {}
+ userAffinities.push({ categoryId: catId, name: catName, score });
+ }
+ } catch (e) {
+ valkeyOps.push(`ZREVRANGE user_affinity (error: ${e.message})`);
+ }
+ }
+
+ // Step 3: Build AI prompt and call Breeth API
+ const productList = products
+ .map((p) => `${p.name} (${p.brand || "Unknown Brand"}) - ₹${p.price || "N/A"}`)
+ .join(", ");
+
+ const categoryInterests = userAffinities.length > 0
+ ? userAffinities.map((a) => a.name).join(", ")
+ : "general shopping";
+
+ const aiPrompt = `User searched for '${q}'. Their top interests are ${categoryInterests}. Products found: ${productList || "No exact matches found"}. Give a helpful shopping recommendation in 2-3 sentences.`;
+
+ let aiResponse = null;
+ let aiError = null;
+ try {
+ const https = require("https");
+ const payload = JSON.stringify({
+ query: aiPrompt,
+ context: {
+ searchQuery: q,
+ userInterests: categoryInterests,
+ productsFound: products.length,
+ },
+ });
+
+ aiResponse = await new Promise((resolve, reject) => {
+ const options = {
+ hostname: "api.thebreeth.com",
+ path: "/v1/search",
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer ck_live_YhQWb-ZjIQxfs6AzDezC3zaPMPw4xJ8yRDkjIz7d16A",
+ "Content-Length": Buffer.byteLength(payload),
+ },
+ };
+
+ const request = https.request(options, (resp) => {
+ let data = "";
+ resp.on("data", (chunk) => { data += chunk; });
+ resp.on("end", () => {
+ try {
+ const parsed = JSON.parse(data);
+ resolve(parsed.response || parsed.text || parsed.answer || parsed.message || JSON.stringify(parsed));
+ } catch (_) {
+ resolve(data);
+ }
+ });
+ });
+
+ request.on("error", reject);
+ request.setTimeout(5000, () => {
+ request.destroy();
+ reject(new Error("Breeth API timeout"));
+ });
+ request.write(payload);
+ request.end();
+ });
+
+ valkeyOps.push("POST https://api.thebreeth.com/v1/search (Breeth AI)");
+ } catch (e) {
+ aiError = e.message;
+ // Generate a helpful fallback response
+ if (products.length > 0) {
+ aiResponse = `Based on your search for "${q}", we found ${products.length} relevant product${products.length > 1 ? "s" : ""}. ${products[0]?.name} looks like a great option${products[0]?.price ? ` at ₹${products[0].price}` : ""}. ${userAffinities.length > 0 ? `Given your interest in ${userAffinities[0]?.name}, you might want to explore more in that category.` : "Browse our full catalog for more options."}`;
+ } else {
+ aiResponse = `We couldn't find exact matches for "${q}", but we have a wide range of products available. Try browsing by category or use filters to narrow your search. Our top categories include Electronics, Fashion, and Home Appliances.`;
+ }
+ valkeyOps.push(`Breeth AI (error: ${aiError}) — using fallback response`);
+ }
+
+ res.json({
+ query: q,
+ userId: userId || "guest",
+ searchTotal,
+ products,
+ aiResponse,
+ userAffinities,
+ valkeyOps,
+ storedIn: "Valkey Search Index (FT.SEARCH) + Valkey Sorted Set (user_affinity)",
+ ...(aiError ? { aiNote: "AI API unavailable, showing generated recommendation" } : {}),
+ });
+ } catch (err) {
+ res.status(500).json({ error: "agentic_search_error", message: err.message });
+ }
+});
+
+module.exports = { router, createSearchIndex };
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/stats.js b/submissions/valkey-ecommerce-demo/backend/src/routes/stats.js
new file mode 100644
index 0000000..57349dc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/stats.js
@@ -0,0 +1,61 @@
+/**
+ * Valkey Stats Endpoint – for the real-time dashboard
+ *
+ * Returns live Valkey memory usage, key counts, and feature usage stats.
+ */
+
+const express = require("express");
+const router = express.Router();
+const { valkey, getStats } = require("../valkey");
+
+router.get("/", async (req, res) => {
+ try {
+ const info = await valkey.info("stats");
+ const memory = await valkey.info("memory");
+ const keyspace = await valkey.info("keyspace");
+
+ // Count keys per domain
+ const [cartKeys, sessionKeys, productKeys, couponKeys, conversationKeys, trendingKeys, wishlistKeys] = await Promise.all([
+ valkey.keys("cart:*").then(k => k.length).catch(() => 0),
+ valkey.keys("session:*").then(k => k.length).catch(() => 0),
+ valkey.keys("product:*").then(k => k.length).catch(() => 0),
+ valkey.keys("coupon:*").then(k => k.length).catch(() => 0),
+ valkey.keys("conversation:*").then(k => k.length).catch(() => 0),
+ valkey.keys("trending:*").then(k => k.length).catch(() => 0),
+ valkey.keys("wishlist:*").then(k => k.length).catch(() => 0),
+ ]);
+
+ // Parse memory used
+ const memMatch = memory.match(/used_memory_human:(\S+)/);
+ const usedMemory = memMatch ? memMatch[1] : "unknown";
+
+ res.json({
+ status: "connected",
+ usedMemory,
+ featureStats: {
+ activeCarts: cartKeys,
+ activeSessions: sessionKeys,
+ cachedProducts: productKeys,
+ coupons: couponKeys,
+ aiConversations: conversationKeys,
+ trendingSets: trendingKeys,
+ wishlists: wishlistKeys,
+ },
+ activeFeatures: [
+ { name: "Cart Management", key: "HSET/HGETALL", description: "Valkey Hash", icon: "ShoppingCart", active: cartKeys > 0 },
+ { name: "Session Storage", key: "SET session EX 86400", description: "Valkey String + TTL (24h)", icon: "Lock", active: true },
+ { name: "Wishlist", key: "HSET/HDEL wishlist", description: "Valkey Hash", icon: "ShoppingCart", active: wishlistKeys > 0 },
+ { name: "Product Catalog", key: "JSON.SET/GET", description: "Valkey JSON", icon: "Database", active: productKeys > 0 },
+ { name: "Real-time Inventory", key: "JSON.NUMINCRBY + Lua", description: "Valkey JSON + Atomic Lua", icon: "Package", active: productKeys > 0 },
+ { name: "AI Conversation Cache", key: "JSON.SET EX 1800", description: "Valkey JSON (30min TTL)", icon: "Robot", active: conversationKeys > 0 },
+ { name: "Product Search", key: "FT.SEARCH idx:products", description: "Valkey Search Module", icon: "MagnifyingGlass", active: true },
+ { name: "Trending Products", key: "ZINCRBY / ZREVRANGE", description: "Valkey Sorted Set + TTL", icon: "TrendUp", active: trendingKeys > 0 },
+ ],
+ usageCounters: getStats(),
+ });
+ } catch (err) {
+ res.status(500).json({ error: "stats_error", message: err.message, status: "disconnected" });
+ }
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/routes/wishlist.js b/submissions/valkey-ecommerce-demo/backend/src/routes/wishlist.js
new file mode 100644
index 0000000..7796a59
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/routes/wishlist.js
@@ -0,0 +1,79 @@
+/**
+ * Wishlist – Valkey Hash (same pattern as cart)
+ * key: wishlist:{userId}
+ * HSET wishlist:{userId} {productId} {json}
+ * HGETALL / HDEL / DEL
+ */
+const express = require("express");
+const router = express.Router();
+const { valkey, track } = require("../valkey");
+
+// GET /api/wishlist?userId=
+router.get("/", async (req, res) => {
+ const { userId } = req.query;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `wishlist:${userId}`;
+ const raw = await valkey.hgetall(key);
+ track("cartOps");
+
+ const items = raw
+ ? Object.values(raw).map(v => { try { return JSON.parse(v); } catch { return null; } }).filter(Boolean)
+ : [];
+
+ res.json({
+ userId,
+ items,
+ itemCount: items.length,
+ valkeyOp: `HGETALL ${key}`,
+ storedIn: "Valkey Hash (wishlist)",
+ });
+});
+
+// POST /api/wishlist/items
+router.post("/items", async (req, res) => {
+ const { userId, productId, name, price, image } = req.body;
+ if (!userId || !productId) return res.status(400).json({ error: "userId and productId required" });
+
+ const key = `wishlist:${userId}`;
+ const item = { productId, name, price, image, addedAt: Date.now() };
+ await valkey.hset(key, productId, JSON.stringify(item));
+ track("cartOps");
+
+ res.json({
+ success: true,
+ item,
+ valkeyOp: `HSET ${key} ${productId}`,
+ storedIn: "Valkey Hash (wishlist)",
+ });
+});
+
+// DELETE /api/wishlist/items/:productId?userId=
+router.delete("/items/:productId", async (req, res) => {
+ const { userId } = req.query;
+ const { productId } = req.params;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `wishlist:${userId}`;
+ await valkey.hdel(key, productId);
+ track("cartOps");
+
+ res.json({
+ success: true,
+ valkeyOp: `HDEL ${key} ${productId}`,
+ storedIn: "Valkey Hash (wishlist)",
+ });
+});
+
+// DELETE /api/wishlist?userId= — clear all
+router.delete("/", async (req, res) => {
+ const { userId } = req.query;
+ if (!userId) return res.status(400).json({ error: "userId required" });
+
+ const key = `wishlist:${userId}`;
+ await valkey.del(key);
+
+ res.json({ success: true, valkeyOp: `DEL ${key}` });
+});
+
+module.exports = router;
diff --git a/submissions/valkey-ecommerce-demo/backend/src/seed.js b/submissions/valkey-ecommerce-demo/backend/src/seed.js
new file mode 100644
index 0000000..fe6843a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/seed.js
@@ -0,0 +1,836 @@
+/**
+ * Seeds Valkey with sample products, categories, vendors, and coupons
+ * following the HACKATHON.md data contracts.
+ *
+ * Run: node src/seed.js
+ */
+
+const { valkey } = require("./valkey");
+
+const PRODUCTS = [
+ {
+ id: "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f",
+ sku: "ELEC-PHN-SAM-001",
+ name: "Galaxy Ultra Pro 256GB",
+ slug: "galaxy-ultra-pro-256gb",
+ description: "Flagship smartphone with 200MP camera, 6.8 inch AMOLED display, and 5000mAh battery.",
+ shortDescription: "200MP camera, 6.8 AMOLED, 5000mAh",
+ categoryId: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Samsung",
+ price: { amount: 89999, currency: "INR", compareAt: 99999 },
+ images: [{ url: "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=400&h=400&fit=crop&auto=format", alt: "Galaxy Ultra Pro", isPrimary: true }],
+ attributes: { color: "Phantom Black", storage: "256GB", ram: "12GB", display: "6.8 inch AMOLED", battery: "5000mAh", os: "Android 15" },
+ tags: ["smartphone", "5g", "flagship", "camera", "samsung"],
+ inventory: { quantity: 150, reserved: 12, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.6, count: 2341 },
+ status: "active",
+ createdAt: "2025-03-01T08:00:00Z",
+ updatedAt: "2025-05-18T12:30:00Z",
+ },
+ {
+ id: "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a",
+ sku: "ELEC-LAP-DEL-001",
+ name: "Dell XPS 15 Laptop",
+ slug: "dell-xps-15",
+ description: "15.6 inch OLED display, Intel Core i9, 32GB RAM, 1TB SSD. Perfect for creators.",
+ shortDescription: "Core i9, 32GB RAM, OLED display",
+ categoryId: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Dell",
+ price: { amount: 149999, currency: "INR", compareAt: 179999 },
+ images: [{ url: "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=400&h=400&fit=crop&auto=format", alt: "Dell XPS 15", isPrimary: true }],
+ attributes: { processor: "Intel Core i9-13900H", ram: "32GB", storage: "1TB SSD", display: "15.6 inch OLED", os: "Windows 11 Pro" },
+ tags: ["laptop", "creator", "gaming", "dell", "oled"],
+ inventory: { quantity: 45, reserved: 5, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.8, count: 892 },
+ status: "active",
+ createdAt: "2025-02-15T08:00:00Z",
+ updatedAt: "2025-05-10T12:30:00Z",
+ },
+ {
+ id: "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b",
+ sku: "FASH-TSH-NIK-001",
+ name: "Nike Air Max Sneakers",
+ slug: "nike-air-max-2025",
+ description: "Premium comfort sneakers with Air Max cushioning. Available in multiple colors.",
+ shortDescription: "Air Max cushioning, premium comfort",
+ categoryId: "category:0192d4e3-8c2d-7e5f-9b3a-0d4c6e7f1a2b",
+ vendorId: "vendor:0192d4e7-5e6f-7c8d-0f1a-2b3c4d5e6f7a",
+ brand: "Nike",
+ price: { amount: 12999, currency: "INR", compareAt: 15999 },
+ images: [{ url: "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=400&h=400&fit=crop&auto=format", alt: "Nike Air Max", isPrimary: true }],
+ attributes: { color: "White/Black", size: "UK 8", material: "Mesh upper, rubber sole" },
+ tags: ["sneakers", "sports", "nike", "running", "fashion"],
+ inventory: { quantity: 200, reserved: 15, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.5, count: 3210 },
+ status: "active",
+ createdAt: "2025-01-10T08:00:00Z",
+ updatedAt: "2025-05-20T10:00:00Z",
+ },
+ {
+ id: "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c",
+ sku: "HOME-KIT-INS-001",
+ name: "Instant Pot Duo 7-in-1",
+ slug: "instant-pot-duo-7in1",
+ description: "7-in-1 multi-cooker. Pressure cooker, slow cooker, rice cooker, steamer, yogurt maker, and warmer.",
+ shortDescription: "7-in-1 electric pressure cooker",
+ categoryId: "category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a",
+ vendorId: "vendor:0192d4e7-6f7a-7d8e-1a2b-3c4d5e6f7a8b",
+ brand: "Instant Pot",
+ price: { amount: 8499, currency: "INR", compareAt: 9999 },
+ images: [{ url: "https://images.unsplash.com/photo-1585515320310-259814833e62?w=400&h=400&fit=crop&auto=format", alt: "Instant Pot", isPrimary: true }],
+ attributes: { capacity: "6 Quart", wattage: "1000W", modes: "7-in-1", color: "Silver" },
+ tags: ["kitchen", "cooking", "home", "appliance", "pressure-cooker"],
+ inventory: { quantity: 80, reserved: 8, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.7, count: 5642 },
+ status: "active",
+ createdAt: "2025-01-20T08:00:00Z",
+ updatedAt: "2025-04-15T12:00:00Z",
+ },
+ {
+ id: "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d",
+ sku: "ELEC-TWS-SNY-001",
+ name: "Sony WF-1000XM5 Earbuds",
+ slug: "sony-wf-1000xm5",
+ description: "Industry-leading noise cancellation, 8hr battery life, Hi-Res Audio. Premium TWS earbuds.",
+ shortDescription: "Best-in-class ANC, 8hr battery",
+ categoryId: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Sony",
+ price: { amount: 24999, currency: "INR", compareAt: 29999 },
+ images: [{ url: "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=400&h=400&fit=crop&auto=format", alt: "Sony WF-1000XM5", isPrimary: true }],
+ attributes: { batteryLife: "8 hours + 16 hours case", noiseCancellation: "Industry-leading ANC", connectivity: "Bluetooth 5.3", color: "Black" },
+ tags: ["earbuds", "tws", "sony", "anc", "audio"],
+ inventory: { quantity: 95, reserved: 20, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.9, count: 1876 },
+ status: "active",
+ createdAt: "2025-02-01T08:00:00Z",
+ updatedAt: "2025-05-12T09:30:00Z",
+ },
+ {
+ id: "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e",
+ sku: "SPRT-YGM-MAD-001",
+ name: "Adidas Yoga Mat Pro",
+ slug: "adidas-yoga-mat-pro",
+ description: "Extra thick 6mm mat with non-slip surface. Ideal for yoga, pilates, and home workouts.",
+ shortDescription: "6mm non-slip yoga mat",
+ categoryId: "category:0192d4e5-6f7a-7b8c-9d9e-0f1a2b3c4d5e",
+ vendorId: "vendor:0192d4e7-5e6f-7c8d-0f1a-2b3c4d5e6f7a",
+ brand: "Adidas",
+ price: { amount: 3299, currency: "INR", compareAt: 3999 },
+ images: [{ url: "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=400&h=400&fit=crop&auto=format", alt: "Adidas Yoga Mat", isPrimary: true }],
+ attributes: { thickness: "6mm", material: "TPE", size: "183cm x 61cm", color: "Blue/Black" },
+ tags: ["yoga", "fitness", "mat", "sports", "adidas"],
+ inventory: { quantity: 300, reserved: 25, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.4, count: 2109 },
+ status: "active",
+ createdAt: "2025-01-05T08:00:00Z",
+ updatedAt: "2025-05-01T11:00:00Z",
+ },
+ // --- 12 NEW PRODUCTS ---
+ {
+ id: "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d",
+ sku: "ELEC-PHN-APL-001",
+ name: "Apple iPhone 15 Pro",
+ slug: "apple-iphone-15-pro",
+ description: "Apple iPhone 15 Pro with A17 Pro chip, 48MP main camera, and titanium design for premium build quality. Features USB-C connectivity and Action Button for customizable shortcuts.",
+ shortDescription: "A17 Pro chip, 48MP camera, titanium design",
+ categoryId: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Apple",
+ price: { amount: 134999, currency: "INR", compareAt: 149999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Apple iPhone 15 Pro", isPrimary: true }],
+ attributes: { processor: "A17 Pro", storage: "256GB", ram: "8GB", display: "6.1 inch Super Retina XDR", camera: "48MP Main + 12MP Ultra Wide", os: "iOS 17", color: "Natural Titanium" },
+ tags: ["iphone", "apple", "5g", "smartphone", "flagship"],
+ inventory: { quantity: 120, reserved: 8, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.8, count: 3421 },
+ status: "active",
+ createdAt: "2025-01-15T08:00:00Z",
+ updatedAt: "2025-05-20T10:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-2222-7b2c-9d2e-2f3a4b5c6d7e",
+ sku: "ELEC-LAP-APL-001",
+ name: "MacBook Air M3 13-inch",
+ slug: "macbook-air-m3-13inch",
+ description: "The MacBook Air with M3 chip delivers incredible performance and up to 18-hour battery life in a thin, fanless design. With a stunning Liquid Retina display and 8GB unified memory, it handles everything effortlessly.",
+ shortDescription: "M3 chip, 18hr battery, fanless design",
+ categoryId: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Apple",
+ price: { amount: 114999, currency: "INR", compareAt: 129999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "MacBook Air M3 13-inch", isPrimary: true }],
+ attributes: { processor: "Apple M3", ram: "8GB Unified", storage: "256GB SSD", display: "13.6 inch Liquid Retina", battery: "18 hours", os: "macOS Sonoma", color: "Midnight" },
+ tags: ["macbook", "apple", "laptop", "m3", "ultrabook"],
+ inventory: { quantity: 60, reserved: 3, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.9, count: 1243 },
+ status: "active",
+ createdAt: "2025-02-10T08:00:00Z",
+ updatedAt: "2025-05-15T12:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-3333-7c3d-0e3f-3a4b5c6d7e8f",
+ sku: "ELEC-PHN-OPL-001",
+ name: "OnePlus 12 5G",
+ slug: "oneplus-12-5g",
+ description: "OnePlus 12 5G is powered by Snapdragon 8 Gen 3 with a 50MP Hasselblad triple camera system. Featuring a 6.82 inch LTPO AMOLED display with 120Hz adaptive refresh rate and 100W SUPERVOOC fast charging.",
+ shortDescription: "Snapdragon 8 Gen 3, Hasselblad cameras, 100W charging",
+ categoryId: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c",
+ vendorId: "vendor:0192d4e7-6f7a-7d8e-1a2b-3c4d5e6f7a8b",
+ brand: "OnePlus",
+ price: { amount: 64999, currency: "INR", compareAt: 69999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "OnePlus 12 5G", isPrimary: true }],
+ attributes: { processor: "Snapdragon 8 Gen 3", storage: "256GB", ram: "12GB", display: "6.82 inch LTPO AMOLED 120Hz", camera: "50MP Hasselblad Triple", battery: "5400mAh", charging: "100W SUPERVOOC", os: "Android 14" },
+ tags: ["oneplus", "5g", "smartphone", "hasselblad", "fast-charging"],
+ inventory: { quantity: 180, reserved: 22, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.7, count: 2891 },
+ status: "active",
+ createdAt: "2025-01-20T08:00:00Z",
+ updatedAt: "2025-05-18T11:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-4444-7d4e-1f4a-4b5c6d7e8f9a",
+ sku: "ELEC-AUD-BOS-001",
+ name: "Bose QuietComfort 45",
+ slug: "bose-quietcomfort-45",
+ description: "The Bose QuietComfort 45 headphones deliver world-class noise cancellation with balanced audio performance. With up to 24 hours of battery life and comfortable over-ear design, they are perfect for travel and work.",
+ shortDescription: "World-class ANC, 24hr battery, over-ear comfort",
+ categoryId: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Bose",
+ price: { amount: 29990, currency: "INR", compareAt: 34990 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Bose QuietComfort 45", isPrimary: true }],
+ attributes: { type: "Over-Ear", noiseCancellation: "World-class ANC", batteryLife: "24 hours", connectivity: "Bluetooth 5.1", color: "White Smoke", foldable: true },
+ tags: ["bose", "headphones", "anc", "audio", "wireless"],
+ inventory: { quantity: 75, reserved: 10, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.7, count: 1567 },
+ status: "active",
+ createdAt: "2025-02-05T08:00:00Z",
+ updatedAt: "2025-05-10T09:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-5555-7e5f-2a5b-5c6d7e8f9a0b",
+ sku: "ELEC-WCH-APL-001",
+ name: "Apple Watch Series 9 GPS",
+ slug: "apple-watch-series-9-gps",
+ description: "Apple Watch Series 9 features the powerful S9 chip with Double Tap gesture and a brighter Always-On Retina display. Track your health with advanced sensors including ECG, blood oxygen, and crash detection.",
+ shortDescription: "S9 chip, Double Tap, health tracking, Always-On display",
+ categoryId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Apple",
+ price: { amount: 41900, currency: "INR", compareAt: 45900 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Apple Watch Series 9 GPS", isPrimary: true }],
+ attributes: { chip: "S9", display: "Always-On Retina LTPO OLED", sensors: "ECG, Blood Oxygen, Temperature", gps: true, waterResistance: "WR50", batteryLife: "18 hours", compatibility: "iPhone" },
+ tags: ["apple", "smartwatch", "health", "fitness", "wearable"],
+ inventory: { quantity: 90, reserved: 15, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.8, count: 2103 },
+ status: "active",
+ createdAt: "2025-01-25T08:00:00Z",
+ updatedAt: "2025-05-12T14:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-6666-7f6a-3b6c-6d7e8f9a0b1c",
+ sku: "HOME-VAC-DYS-001",
+ name: "Dyson V11 Cordless Vacuum",
+ slug: "dyson-v11-cordless-vacuum",
+ description: "The Dyson V11 cordless vacuum features a powerful digital motor with up to 60 minutes of fade-free suction. Intelligent suction automatically adapts to the floor type detected by the machine.",
+ shortDescription: "60min battery, intelligent suction, cordless",
+ categoryId: "category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a",
+ vendorId: "vendor:0192d4e7-6f7a-7d8e-1a2b-3c4d5e6f7a8b",
+ brand: "Dyson",
+ price: { amount: 44900, currency: "INR", compareAt: 52900 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Dyson V11 Cordless Vacuum", isPrimary: true }],
+ attributes: { motor: "Dyson Digital Motor V11", batteryLife: "60 minutes", suction: "185AW", bin: "0.76L", filtration: "Advanced whole-machine filtration", color: "Blue/Nickel" },
+ tags: ["dyson", "vacuum", "cordless", "appliance", "cleaning"],
+ inventory: { quantity: 40, reserved: 5, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.6, count: 876 },
+ status: "active",
+ createdAt: "2025-03-05T08:00:00Z",
+ updatedAt: "2025-05-14T10:30:00Z",
+ },
+ {
+ id: "product:0192d5a1-7777-7a7b-4c7d-7e8f9a0b1c2d",
+ sku: "FASH-JNS-LEV-001",
+ name: "Levi's 501 Original Jeans",
+ slug: "levis-501-original-jeans",
+ description: "The iconic Levi's 501 Original Jeans with straight fit and button fly, a timeless classic since 1873. Made from 100% cotton denim for authentic comfort and durability that only gets better with wear.",
+ shortDescription: "Iconic straight fit, button fly, 100% cotton denim",
+ categoryId: "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a",
+ vendorId: "vendor:0192d4e7-5e6f-7c8d-0f1a-2b3c4d5e6f7a",
+ brand: "Levi's",
+ price: { amount: 3999, currency: "INR", compareAt: 5499 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Levi's 501 Original Jeans", isPrimary: true }],
+ attributes: { fit: "Straight", closure: "Button Fly", material: "100% Cotton Denim", rise: "Mid Rise", wash: "Medium Stonewash", size: "32x32" },
+ tags: ["levis", "jeans", "fashion", "denim", "classic"],
+ inventory: { quantity: 500, reserved: 45, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.5, count: 6789 },
+ status: "active",
+ createdAt: "2025-01-08T08:00:00Z",
+ updatedAt: "2025-05-05T09:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-8888-7b8c-5d8e-8f9a0b1c2d3e",
+ sku: "FASH-SNG-RYB-001",
+ name: "Ray-Ban Aviator Classic Sunglasses",
+ slug: "rayban-aviator-classic",
+ description: "The Ray-Ban Aviator Classic sunglasses with crystal lenses provide 100% UV protection and exceptional optical clarity. Originally designed for US military aviators, these iconic frames have become a timeless fashion staple.",
+ shortDescription: "Crystal lenses, 100% UV protection, iconic aviator style",
+ categoryId: "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a",
+ vendorId: "vendor:0192d4e7-5e6f-7c8d-0f1a-2b3c4d5e6f7a",
+ brand: "Ray-Ban",
+ price: { amount: 12999, currency: "INR", compareAt: 15500 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Ray-Ban Aviator Classic Sunglasses", isPrimary: true }],
+ attributes: { frameShape: "Aviator", lensType: "Crystal G-15", uvProtection: "100% UV400", frameMaterial: "Metal", color: "Gold/Green Classic", size: "58mm" },
+ tags: ["rayban", "sunglasses", "aviator", "fashion", "uv-protection"],
+ inventory: { quantity: 200, reserved: 18, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.6, count: 3201 },
+ status: "active",
+ createdAt: "2025-01-12T08:00:00Z",
+ updatedAt: "2025-05-08T11:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-9999-7c9d-6e9f-9a0b1c2d3e4f",
+ sku: "ELEC-AUD-JBL-001",
+ name: "JBL Charge 5 Bluetooth Speaker",
+ slug: "jbl-charge-5-bluetooth-speaker",
+ description: "The JBL Charge 5 delivers powerful JBL Pro Sound with a bold new design, featuring IP67 waterproof and dustproof rating. With a built-in power bank and 20-hour playtime, it keeps you charged up and partying all day.",
+ shortDescription: "IP67 waterproof, 20hr playtime, built-in power bank",
+ categoryId: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "JBL",
+ price: { amount: 14999, currency: "INR", compareAt: 17999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "JBL Charge 5 Bluetooth Speaker", isPrimary: true }],
+ attributes: { waterproofRating: "IP67", batteryLife: "20 hours", connectivity: "Bluetooth 5.1", powerBank: true, color: "Blue", weight: "960g" },
+ tags: ["jbl", "speaker", "bluetooth", "waterproof", "audio"],
+ inventory: { quantity: 110, reserved: 12, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.7, count: 4532 },
+ status: "active",
+ createdAt: "2025-02-20T08:00:00Z",
+ updatedAt: "2025-05-16T13:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-aaaa-7dae-7fab-ab0c1d2e3f4a",
+ sku: "ELEC-LAP-HPE-001",
+ name: "HP Spectre x360 14-inch",
+ slug: "hp-spectre-x360-14inch",
+ description: "The HP Spectre x360 14-inch is a premium 2-in-1 convertible laptop with OLED touch display and Intel Core Ultra processor. It features an elegant gem-cut design with OLED panel offering stunning colors and deep blacks.",
+ shortDescription: "2-in-1 convertible, OLED touch, Intel Core Ultra",
+ categoryId: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "HP",
+ price: { amount: 159990, currency: "INR", compareAt: 179990 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "HP Spectre x360 14-inch", isPrimary: true }],
+ attributes: { processor: "Intel Core Ultra 7", ram: "16GB LPDDR5", storage: "1TB SSD", display: "14 inch 2.8K OLED Touch 120Hz", convertible: true, os: "Windows 11 Home", color: "Nightfall Black" },
+ tags: ["hp", "spectre", "laptop", "2-in-1", "oled"],
+ inventory: { quantity: 25, reserved: 2, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.7, count: 543 },
+ status: "active",
+ createdAt: "2025-03-10T08:00:00Z",
+ updatedAt: "2025-05-18T15:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-bbbb-7ebf-8fbc-bc1d2e3f4a5b",
+ sku: "ELEC-FIT-FBT-001",
+ name: "Fitbit Charge 6 Fitness Tracker",
+ slug: "fitbit-charge-6-fitness-tracker",
+ description: "Fitbit Charge 6 features built-in GPS, heart rate monitoring, and Google Maps integration for comprehensive fitness tracking. With ECG app, skin temperature sensor, and stress management score, it helps you understand your overall health.",
+ shortDescription: "Built-in GPS, ECG, Google Maps, 7-day battery",
+ categoryId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b",
+ vendorId: "vendor:0192d4e7-6f7a-7d8e-1a2b-3c4d5e6f7a8b",
+ brand: "Fitbit",
+ price: { amount: 14999, currency: "INR", compareAt: 17999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "Fitbit Charge 6 Fitness Tracker", isPrimary: true }],
+ attributes: { gps: "Built-in GPS", heartRate: "Continuous 24/7", battery: "7 days", display: "AMOLED", waterResistance: "Water resistant 50m", googleIntegration: true, color: "Black" },
+ tags: ["fitbit", "fitness", "tracker", "health", "wearable"],
+ inventory: { quantity: 150, reserved: 20, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.5, count: 2876 },
+ status: "active",
+ createdAt: "2025-02-25T08:00:00Z",
+ updatedAt: "2025-05-17T10:00:00Z",
+ },
+ {
+ id: "product:0192d5a1-cccc-7fcf-9acd-cd2e3f4a5b6c",
+ sku: "HOME-ROB-IRB-001",
+ name: "iRobot Roomba i7+ Robot Vacuum",
+ slug: "irobot-roomba-i7-plus",
+ description: "The iRobot Roomba i7+ automatically empties its bin into a Clean Base Automatic Dirt Disposal for hands-free cleaning for weeks. With Smart Mapping technology, it learns your home and you can clean by room with voice or app control.",
+ shortDescription: "Auto empty base, Smart Mapping, voice control compatible",
+ categoryId: "category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a",
+ vendorId: "vendor:0192d4e7-6f7a-7d8e-1a2b-3c4d5e6f7a8b",
+ brand: "iRobot",
+ price: { amount: 59999, currency: "INR", compareAt: 69999 },
+ images: [{ url: "/assets/images/thumbs/product-img1.png", alt: "iRobot Roomba i7+ Robot Vacuum", isPrimary: true }],
+ attributes: { autoEmpty: "Clean Base Automatic Dirt Disposal", mapping: "Smart Mapping with Imprint", suction: "10x Power-Lifting Suction", filters: "High-Efficiency Filter", voiceControl: "Alexa & Google Assistant", runtime: "75 minutes" },
+ tags: ["irobot", "roomba", "robot-vacuum", "smart-home", "appliance"],
+ inventory: { quantity: 30, reserved: 4, warehouse: "HYD-WH-01" },
+ ratings: { average: 4.4, count: 1234 },
+ status: "active",
+ createdAt: "2025-03-15T08:00:00Z",
+ updatedAt: "2025-05-19T09:30:00Z",
+ },
+ {
+ id: "product:potato-5kg",
+ sku: "GROC-VEG-POT-001",
+ name: "Organic Potatoes (5kg)",
+ slug: "organic-potatoes-5kg",
+ description: "Freshly harvested organic potatoes from local farms. Ideal for baking, mashing, or frying.",
+ shortDescription: "Fresh organic potatoes, 5kg pack",
+ categoryId: "category:vegetables-fruit",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Taylor Farms",
+ price: { amount: 150, currency: "INR", compareAt: 200 },
+ images: [{ url: "https://images.unsplash.com/photo-1518977676601-b53f82aba655?w=400&h=400&fit=crop&auto=format", alt: "Potatoes", isPrimary: true }],
+ attributes: { origin: "Local Farm", weight: "5kg", type: "Organic" },
+ tags: ["vegetables", "organic", "potatoes", "fresh"],
+ inventory: { quantity: 500, reserved: 0, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.5, count: 120 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:tomato-1kg",
+ sku: "GROC-VEG-TOM-001",
+ name: "Fresh Red Tomatoes (1kg)",
+ slug: "fresh-red-tomatoes-1kg",
+ description: "Ripe, juicy red tomatoes. Perfect for salads, curries, and sauces.",
+ shortDescription: "Ripe, juicy red tomatoes, 1kg pack",
+ categoryId: "category:vegetables-fruit",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Taylor Farms",
+ price: { amount: 60, currency: "INR", compareAt: 80 },
+ images: [{ url: "https://images.unsplash.com/photo-1595855759920-86582396756a?w=400&h=400&fit=crop&auto=format", alt: "Tomatoes", isPrimary: true }],
+ attributes: { origin: "Local Farm", weight: "1kg", type: "Fresh" },
+ tags: ["vegetables", "tomatoes", "fresh", "juicy"],
+ inventory: { quantity: 400, reserved: 5, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.4, count: 95 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:apple-6pcs",
+ sku: "GROC-FRU-APP-001",
+ name: "Organic Red Apples (6pcs)",
+ slug: "organic-red-apples-6pcs",
+ description: "Crisp and sweet organic red apples. Rich in fiber and antioxidants.",
+ shortDescription: "Sweet, crisp organic red apples",
+ categoryId: "category:vegetables-fruit",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Taylor Farms",
+ price: { amount: 180, currency: "INR", compareAt: 220 },
+ images: [{ url: "https://images.unsplash.com/photo-1560806887-1e4cd0b6cbd6?w=400&h=400&fit=crop&auto=format", alt: "Apples", isPrimary: true }],
+ attributes: { origin: "Shimla", count: "6 pcs", type: "Organic" },
+ tags: ["fruits", "apples", "fresh", "organic"],
+ inventory: { quantity: 200, reserved: 2, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.6, count: 180 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:coke-250ml",
+ sku: "GROC-BEV-COK-001",
+ name: "Coca-Cola Soft Drink (250ml Can)",
+ slug: "coca-cola-250ml",
+ description: "Refreshing Coca-Cola classic soft drink. Best served chilled.",
+ shortDescription: "Refreshing classic cola drink",
+ categoryId: "category:beverages",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Coca-Cola",
+ price: { amount: 40, currency: "INR", compareAt: 40 },
+ images: [{ url: "https://images.unsplash.com/photo-1622483767028-3f66f32aef97?w=400&h=400&fit=crop&auto=format", alt: "Coke", isPrimary: true }],
+ attributes: { volume: "250ml", packaging: "Can" },
+ tags: ["beverages", "cola", "soda", "cold-drink"],
+ inventory: { quantity: 1000, reserved: 0, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.7, count: 1200 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:orangejuice-1l",
+ sku: "GROC-BEV-ORJ-001",
+ name: "100% Pure Orange Juice (1L)",
+ slug: "pure-orange-juice-1l",
+ description: "No added sugar, 100% pure orange juice packed with Vitamin C.",
+ shortDescription: "100% pure orange juice, 1L pack",
+ categoryId: "category:beverages",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Tropicana",
+ price: { amount: 120, currency: "INR", compareAt: 140 },
+ images: [{ url: "https://images.unsplash.com/photo-1613478223719-2ab802602423?w=400&h=400&fit=crop&auto=format", alt: "Orange Juice", isPrimary: true }],
+ attributes: { volume: "1L", type: "100% Juice", packaging: "Tetrapack" },
+ tags: ["beverages", "juice", "orange", "healthy"],
+ inventory: { quantity: 300, reserved: 4, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.5, count: 220 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:chicken-breast-1kg",
+ sku: "GROC-MEA-CHK-001",
+ name: "Fresh Chicken Breast (1kg)",
+ slug: "fresh-chicken-breast-1kg",
+ description: "Premium skinless, boneless chicken breast. Cleaned and ready for cooking.",
+ shortDescription: "Skinless, boneless chicken breast",
+ categoryId: "category:meats-seafood",
+ vendorId: "vendor:0192d4e7-5e6f-7c8d-0f1a-2b3c4d5e6f7a",
+ brand: "FreshMeat",
+ price: { amount: 280, currency: "INR", compareAt: 320 },
+ images: [{ url: "https://images.unsplash.com/photo-1604503468506-a8da13d82791?w=400&h=400&fit=crop&auto=format", alt: "Chicken Breast", isPrimary: true }],
+ attributes: { weight: "1kg", status: "Chilled" },
+ tags: ["meats", "chicken", "fresh", "protein"],
+ inventory: { quantity: 150, reserved: 2, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.6, count: 140 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:milk-1l",
+ sku: "GROC-DAI-MLK-001",
+ name: "Fresh Whole Milk (1L)",
+ slug: "fresh-whole-milk-1l",
+ description: "Pasteurized fresh whole milk with high cream content. Direct from local dairy farms.",
+ shortDescription: "Fresh pasteurized whole milk, 1L",
+ categoryId: "category:breakfast-dairy",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Amul",
+ price: { amount: 66, currency: "INR", compareAt: 70 },
+ images: [{ url: "https://images.unsplash.com/photo-1563636619-e9143da7973b?w=400&h=400&fit=crop&auto=format", alt: "Milk", isPrimary: true }],
+ attributes: { volume: "1L", type: "Whole Milk", fatContent: "4.5%" },
+ tags: ["dairy", "milk", "breakfast", "fresh"],
+ inventory: { quantity: 600, reserved: 10, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.8, count: 540 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:eggs-12pcs",
+ sku: "GROC-DAI-EGG-001",
+ name: "Organic White Eggs (12pcs)",
+ slug: "organic-white-eggs-12pcs",
+ description: "Farm-fresh organic white eggs. Packed with protein and essential nutrients.",
+ shortDescription: "Farm-fresh organic white eggs",
+ categoryId: "category:breakfast-dairy",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Eggo",
+ price: { amount: 90, currency: "INR", compareAt: 110 },
+ images: [{ url: "https://images.unsplash.com/photo-1506976785307-8732e854ad03?w=400&h=400&fit=crop&auto=format", alt: "Eggs", isPrimary: true }],
+ attributes: { count: "12 pcs", type: "Organic" },
+ tags: ["dairy", "eggs", "breakfast", "protein"],
+ inventory: { quantity: 300, reserved: 5, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.7, count: 320 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:frenchfries-1kg",
+ sku: "GROC-FRO-FRY-001",
+ name: "Frozen French Fries (1kg)",
+ slug: "frozen-french-fries-1kg",
+ description: "Crispy frozen French fries. Ready to deep fry or air fry.",
+ shortDescription: "Crispy frozen French fries, 1kg pack",
+ categoryId: "category:frozen-foods",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "McCain",
+ price: { amount: 180, currency: "INR", compareAt: 220 },
+ images: [{ url: "https://images.unsplash.com/photo-1576107232684-1279f390859f?w=400&h=400&fit=crop&auto=format", alt: "French Fries", isPrimary: true }],
+ attributes: { weight: "1kg", storage: "Keep Frozen" },
+ tags: ["frozen", "fries", "potato", "snacks"],
+ inventory: { quantity: 200, reserved: 4, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.5, count: 180 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:cookies-200g",
+ sku: "GROC-SNK-COK-001",
+ name: "Chocolate Chip Cookies (200g)",
+ slug: "chocolate-chip-cookies-200g",
+ description: "Freshly baked cookies loaded with rich chocolate chips. Perfect snack with tea or milk.",
+ shortDescription: "Rich chocolate chip cookies",
+ categoryId: "category:biscuits-snacks",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "GoodDay",
+ price: { amount: 45, currency: "INR", compareAt: 50 },
+ images: [{ url: "https://images.unsplash.com/photo-1499636136210-6f4ee915583e?w=400&h=400&fit=crop&auto=format", alt: "Cookies", isPrimary: true }],
+ attributes: { weight: "200g", flavor: "Chocolate" },
+ tags: ["snacks", "biscuits", "cookies", "chocolate"],
+ inventory: { quantity: 500, reserved: 8, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.6, count: 280 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ },
+ {
+ id: "product:rice-5kg",
+ sku: "GROC-STA-RIC-001",
+ name: "Organic Basmati Rice (5kg)",
+ slug: "organic-basmati-rice-5kg",
+ description: "Premium extra-long grain aromatic organic Basmati rice. Aged to perfection.",
+ shortDescription: "Aromatic extra-long grain Basmati rice",
+ categoryId: "category:grocery-staples",
+ vendorId: "vendor:0192d4e7-4d5e-7b7c-9e9f-1a2b3c4d5e6f",
+ brand: "Daawat",
+ price: { amount: 650, currency: "INR", compareAt: 750 },
+ images: [{ url: "https://images.unsplash.com/photo-1586201375761-83865001e31c?w=400&h=400&fit=crop&auto=format", alt: "Basmati Rice", isPrimary: true }],
+ attributes: { weight: "5kg", type: "Basmati Rice", grain: "Extra Long" },
+ tags: ["staples", "rice", "basmati", "organic"],
+ inventory: { quantity: 150, reserved: 2, warehouse: "HYD-WH-02" },
+ ratings: { average: 4.7, count: 350 },
+ status: "active",
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ }
+];
+
+const CATEGORIES = [
+ { id: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b", name: "Electronics", slug: "electronics", icon: "desktop", parentId: null },
+ { id: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c", name: "Smartphones", slug: "smartphones", icon: "device-mobile", parentId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b" },
+ { id: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f", name: "Laptops", slug: "laptops", icon: "laptop", parentId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b" },
+ { id: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a", name: "Audio", slug: "audio", icon: "headphones", parentId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b" },
+ { id: "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a", name: "Fashion", slug: "fashion", icon: "t-shirt", parentId: null },
+ { id: "category:0192d4e3-8c2d-7e5f-9b3a-0d4c6e7f1a2b", name: "Footwear", slug: "footwear", icon: "sneaker", parentId: "category:0192d4e3-7b1c-7d4e-8a2f-9c3b5d6e0f1a" },
+ { id: "category:0192d4e4-1a2b-7c3d-8e4f-5a6b7c8d9e0f", name: "Home & Kitchen", slug: "home-kitchen", icon: "house", parentId: null },
+ { id: "category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a", name: "Appliances", slug: "appliances", icon: "plug", parentId: "category:0192d4e4-1a2b-7c3d-8e4f-5a6b7c8d9e0f" },
+ { id: "category:0192d4e5-5e6f-7a7b-8c8d-9e0f1a2b3c4d", name: "Sports & Outdoors", slug: "sports-outdoors", icon: "basketball", parentId: null },
+ { id: "category:0192d4e5-6f7a-7b8c-9d9e-0f1a2b3c4d5e", name: "Fitness", slug: "fitness", icon: "barbell", parentId: "category:0192d4e5-5e6f-7a7b-8c8d-9e0f1a2b3c4d" },
+ { id: "category:grocery", name: "Grocery", slug: "grocery", icon: "carrot", parentId: null },
+ { id: "category:vegetables-fruit", name: "Vegetables & Fruit", slug: "vegetables-fruit", icon: "carrot", parentId: "category:grocery" },
+ { id: "category:beverages", name: "Beverages", slug: "beverages", icon: "brandy", parentId: "category:grocery" },
+ { id: "category:meats-seafood", name: "Meats & Seafood", slug: "meats-seafood", icon: "brandy", parentId: "category:grocery" },
+ { id: "category:breakfast-dairy", name: "Breakfast & Dairy", slug: "breakfast-dairy", icon: "brandy", parentId: "category:grocery" },
+ { id: "category:frozen-foods", name: "Frozen Foods", slug: "frozen-foods", icon: "brandy", parentId: "category:grocery" },
+ { id: "category:biscuits-snacks", name: "Biscuits & Snacks", slug: "biscuits-snacks", icon: "brandy", parentId: "category:grocery" },
+ { id: "category:grocery-staples", name: "Grocery & Staples", slug: "grocery-staples", icon: "brandy", parentId: "category:grocery" },
+];
+
+const COUPONS = [
+ {
+ code: "VALKEY10",
+ type: "percentage",
+ value: 10,
+ minOrderAmount: 5000,
+ maxDiscount: 10000,
+ validFrom: "2025-01-01T00:00:00Z",
+ validUntil: "2026-12-31T23:59:59Z",
+ usageLimit: 1000,
+ usedCount: 342,
+ applicableCategories: [],
+ active: true,
+ },
+ {
+ code: "FLAT500",
+ type: "fixed",
+ value: 500,
+ minOrderAmount: 3000,
+ maxDiscount: 500,
+ validFrom: "2025-01-01T00:00:00Z",
+ validUntil: "2026-12-31T23:59:59Z",
+ usageLimit: 500,
+ usedCount: 123,
+ applicableCategories: [],
+ active: true,
+ },
+ {
+ code: "BREETH20",
+ type: "percentage",
+ value: 20,
+ minOrderAmount: 10000,
+ maxDiscount: 5000,
+ validFrom: "2025-01-01T00:00:00Z",
+ validUntil: "2026-12-31T23:59:59Z",
+ usageLimit: 200,
+ usedCount: 45,
+ applicableCategories: [],
+ active: true,
+ },
+];
+
+async function seed() {
+ console.log("[Seed] Connecting to Valkey...");
+ await valkey.connect();
+
+ console.log("[Seed] Seeding categories...");
+ for (const cat of CATEGORIES) {
+ await valkey.call("JSON.SET", cat.id, "$", JSON.stringify(cat));
+ }
+
+ console.log("[Seed] Seeding products...");
+ for (const p of PRODUCTS) {
+ await valkey.call("JSON.SET", p.id, "$", JSON.stringify(p));
+
+ // Category index
+ if (p.categoryId) {
+ await valkey.zadd(`category_products:${p.categoryId}`, Date.now(), p.id);
+ }
+
+ // Price index
+ if (p.price?.amount) {
+ await valkey.zadd("price_index", p.price.amount, p.id);
+ }
+
+ // Brand index
+ if (p.brand) {
+ await valkey.sadd(`brand_products:${p.brand.toLowerCase()}`, p.id);
+ }
+
+ // Autocomplete suggestions
+ try {
+ await valkey.call("FT.SUGADD", "autocomplete", p.name, 100);
+ } catch (_) {}
+
+ // Seed some trending scores
+ await valkey.zincrby("trending:global:24h", Math.floor(Math.random() * 100), p.id);
+ await valkey.zincrby("trending:global:1h", Math.floor(Math.random() * 20), p.id);
+ }
+ await valkey.expire("trending:global:1h", 3600);
+
+ console.log("[Seed] Seeding coupons...");
+ for (const c of COUPONS) {
+ await valkey.call("JSON.SET", `coupon:${c.code}`, "$", JSON.stringify(c));
+ }
+
+ const bcrypt = require("bcryptjs");
+
+ // Demo user (keep existing)
+ const demoUserId = "user:demo-0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e";
+ const demoHash = await bcrypt.hash("demo1234", 12);
+ const demoUser = {
+ id: demoUserId,
+ email: "demo@valkey.io",
+ passwordHash: demoHash,
+ firstName: "Priya",
+ lastName: "Sharma",
+ role: "customer",
+ createdAt: new Date().toISOString(),
+ };
+ await valkey.call("JSON.SET", demoUserId, "$", JSON.stringify(demoUser));
+ await valkey.set("email:demo@valkey.io", demoUserId);
+
+ // Demo cart
+ const cartItem = { name: "Sony WF-1000XM5 Earbuds", price: 24999, image: "/assets/images/thumbs/product-img5.png", quantity: 1 };
+ await valkey.hset(`cart:${demoUserId}`, "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d", JSON.stringify(cartItem));
+ await valkey.expire(`cart:${demoUserId}`, 604800);
+
+ // Admin user
+ const adminUserId = "user:admin-0192d5b0-1111-7a1b-8c1d-admin00000001";
+ const adminHash = await bcrypt.hash("admin1234", 12);
+ const adminUser = {
+ id: adminUserId,
+ email: "admin@valkey.io",
+ passwordHash: adminHash,
+ firstName: "Admin",
+ lastName: "User",
+ role: "admin",
+ createdAt: new Date().toISOString(),
+ };
+ await valkey.call("JSON.SET", adminUserId, "$", JSON.stringify(adminUser));
+ await valkey.set("email:admin@valkey.io", adminUserId);
+
+ // Manager user
+ const managerUserId = "user:manager-0192d5b0-2222-7b2c-9d2e-manager000001";
+ const managerHash = await bcrypt.hash("manager1234", 12);
+ const managerUser = {
+ id: managerUserId,
+ email: "manager@valkey.io",
+ passwordHash: managerHash,
+ firstName: "Manager",
+ lastName: "User",
+ role: "manager",
+ createdAt: new Date().toISOString(),
+ };
+ await valkey.call("JSON.SET", managerUserId, "$", JSON.stringify(managerUser));
+ await valkey.set("email:manager@valkey.io", managerUserId);
+
+ // Regular demo users
+ const user1Id = "user:arjun-0192d5b0-3333-7c3d-0e3f-user000000001";
+ const user1Hash = await bcrypt.hash("user1234", 12);
+ const user1 = {
+ id: user1Id,
+ email: "user1@demo.com",
+ passwordHash: user1Hash,
+ firstName: "Arjun",
+ lastName: "Sharma",
+ role: "customer",
+ createdAt: new Date().toISOString(),
+ };
+ await valkey.call("JSON.SET", user1Id, "$", JSON.stringify(user1));
+ await valkey.set("email:user1@demo.com", user1Id);
+
+ const user2Id = "user:priya-0192d5b0-4444-7d4e-1f4a-user000000002";
+ const user2Hash = await bcrypt.hash("user1234", 12);
+ const user2 = {
+ id: user2Id,
+ email: "user2@demo.com",
+ passwordHash: user2Hash,
+ firstName: "Priya",
+ lastName: "Patel",
+ role: "customer",
+ createdAt: new Date().toISOString(),
+ };
+ await valkey.call("JSON.SET", user2Id, "$", JSON.stringify(user2));
+ await valkey.set("email:user2@demo.com", user2Id);
+
+ // Seed wishlists for demo users
+ console.log("[Seed] Seeding wishlists...");
+
+ // demo@valkey.io wishlist
+ const demoWishlistItems = [
+ { productId: "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d", name: "Apple iPhone 15 Pro", price: 134999, image: "/assets/images/thumbs/product-img1.png" },
+ { productId: "product:0192d5a1-2222-7b2c-9d2e-2f3a4b5c6d7e", name: "MacBook Air M3 13-inch", price: 114999, image: "/assets/images/thumbs/product-img1.png" },
+ { productId: "product:0192d5a1-4444-7d4e-1f4a-4b5c6d7e8f9a", name: "Bose QuietComfort 45", price: 29990, image: "/assets/images/thumbs/product-img1.png" },
+ ];
+ for (const item of demoWishlistItems) {
+ await valkey.hset(`wishlist:${demoUserId}`, item.productId, JSON.stringify({ ...item, addedAt: Date.now() }));
+ }
+
+ // user1@demo.com wishlist
+ const user1WishlistItems = [
+ { productId: "product:0192d5a1-3333-7c3d-0e3f-3a4b5c6d7e8f", name: "OnePlus 12 5G", price: 64999, image: "/assets/images/thumbs/product-img1.png" },
+ { productId: "product:0192d5a1-5555-7e5f-2a5b-5c6d7e8f9a0b", name: "Apple Watch Series 9 GPS", price: 41900, image: "/assets/images/thumbs/product-img1.png" },
+ ];
+ for (const item of user1WishlistItems) {
+ await valkey.hset(`wishlist:${user1Id}`, item.productId, JSON.stringify({ ...item, addedAt: Date.now() }));
+ }
+
+ // user2@demo.com wishlist
+ const user2WishlistItems = [
+ { productId: "product:0192d5a1-7777-7a7b-4c7d-7e8f9a0b1c2d", name: "Levi's 501 Original Jeans", price: 3999, image: "/assets/images/thumbs/product-img1.png" },
+ { productId: "product:0192d5a1-9999-7c9d-6e9f-9a0b1c2d3e4f", name: "JBL Charge 5 Bluetooth Speaker", price: 14999, image: "/assets/images/thumbs/product-img1.png" },
+ { productId: "product:0192d5a1-bbbb-7ebf-8fbc-bc1d2e3f4a5b", name: "Fitbit Charge 6 Fitness Tracker", price: 14999, image: "/assets/images/thumbs/product-img1.png" },
+ ];
+ for (const item of user2WishlistItems) {
+ await valkey.hset(`wishlist:${user2Id}`, item.productId, JSON.stringify({ ...item, addedAt: Date.now() }));
+ }
+
+ // Seed comparison data for guest demo
+ console.log("[Seed] Seeding comparison data...");
+ await valkey.sadd(
+ "compare:guest:demo",
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f",
+ "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d"
+ );
+
+ console.log("\n[Seed] Done!");
+ console.log("[Seed] Products seeded: " + PRODUCTS.length);
+ console.log("[Seed] Demo login: demo@valkey.io / demo1234");
+ console.log("[Seed] Admin login: admin@valkey.io / admin1234");
+ console.log("[Seed] Manager login: manager@valkey.io / manager1234");
+ console.log("[Seed] User1 login: user1@demo.com / user1234");
+ console.log("[Seed] User2 login: user2@demo.com / user1234");
+ console.log("[Seed] Coupons: VALKEY10, FLAT500, BREETH20");
+ process.exit(0);
+}
+
+seed().catch((e) => {
+ console.error("[Seed] Error:", e.message);
+ process.exit(1);
+});
diff --git a/submissions/valkey-ecommerce-demo/backend/src/valkey.js b/submissions/valkey-ecommerce-demo/backend/src/valkey.js
new file mode 100644
index 0000000..b425477
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/backend/src/valkey.js
@@ -0,0 +1,33 @@
+const Redis = require("ioredis");
+
+const VALKEY_URL = process.env.VALKEY_URL || "redis://localhost:6379";
+
+const valkey = new Redis(VALKEY_URL, {
+ lazyConnect: true,
+ retryStrategy: (times) => Math.min(times * 100, 3000),
+ maxRetriesPerRequest: 3,
+});
+
+valkey.on("connect", () => console.log("[Valkey] Connected to Valkey at", VALKEY_URL));
+valkey.on("error", (err) => console.error("[Valkey] Error:", err.message));
+
+// Track which Valkey features are actively being used (for dashboard)
+const usageStats = {
+ cartOps: 0,
+ sessionOps: 0,
+ cacheHits: 0,
+ cacheMisses: 0,
+ inventoryOps: 0,
+ searchOps: 0,
+ aiOps: 0,
+};
+
+function track(feature) {
+ if (usageStats[feature] !== undefined) usageStats[feature]++;
+}
+
+function getStats() {
+ return { ...usageStats };
+}
+
+module.exports = { valkey, track, getStats };
diff --git a/submissions/valkey-ecommerce-demo/docker-compose.yml b/submissions/valkey-ecommerce-demo/docker-compose.yml
new file mode 100644
index 0000000..93c57d3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/docker-compose.yml
@@ -0,0 +1,29 @@
+version: "3.9"
+
+services:
+ valkey:
+ image: valkey/valkey-bundle:9-alpine
+ container_name: valkey
+ ports:
+ - "6379:6379"
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD", "valkey-cli", "ping"]
+ interval: 5s
+ timeout: 3s
+ retries: 5
+
+ backend:
+ build: ./backend
+ container_name: ecommerce-backend
+ ports:
+ - "5000:5000"
+ environment:
+ - VALKEY_URL=redis://valkey:6379
+ - PORT=5000
+ - BREETH_API_KEY=ck_live_YhQWb-ZjIQxfs6AzDezC3zaPMPw4xJ8yRDkjIz7d16A
+ - FRONTEND_URL=http://localhost:3000
+ depends_on:
+ valkey:
+ condition: service_healthy
+ restart: unless-stopped
diff --git a/submissions/valkey-ecommerce-demo/documentation/css/bootstrap.css b/submissions/valkey-ecommerce-demo/documentation/css/bootstrap.css
new file mode 100644
index 0000000..96a6b47
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/css/bootstrap.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+
+ *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+
+
+html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
diff --git a/submissions/valkey-ecommerce-demo/documentation/css/font-awesome.css b/submissions/valkey-ecommerce-demo/documentation/css/font-awesome.css
new file mode 100644
index 0000000..2dcdc22
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/css/font-awesome.css
@@ -0,0 +1,1801 @@
+/*!
+ * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ transform: translate(0, 0);
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+.fa-2x {
+ font-size: 2em;
+}
+.fa-3x {
+ font-size: 3em;
+}
+.fa-4x {
+ font-size: 4em;
+}
+.fa-5x {
+ font-size: 5em;
+}
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center;
+}
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.fa.pull-left {
+ margin-right: .3em;
+}
+.fa.pull-right {
+ margin-left: .3em;
+}
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.fa-rotate-90 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.fa-stack-1x {
+ line-height: inherit;
+}
+.fa-stack-2x {
+ font-size: 2em;
+}
+.fa-inverse {
+ color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+.fa-music:before {
+ content: "\f001";
+}
+.fa-search:before {
+ content: "\f002";
+}
+.fa-envelope-o:before {
+ content: "\f003";
+}
+.fa-heart:before {
+ content: "\f004";
+}
+.fa-star:before {
+ content: "\f005";
+}
+.fa-star-o:before {
+ content: "\f006";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-film:before {
+ content: "\f008";
+}
+.fa-th-large:before {
+ content: "\f009";
+}
+.fa-th:before {
+ content: "\f00a";
+}
+.fa-th-list:before {
+ content: "\f00b";
+}
+.fa-check:before {
+ content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+.fa-search-plus:before {
+ content: "\f00e";
+}
+.fa-search-minus:before {
+ content: "\f010";
+}
+.fa-power-off:before {
+ content: "\f011";
+}
+.fa-signal:before {
+ content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+.fa-trash-o:before {
+ content: "\f014";
+}
+.fa-home:before {
+ content: "\f015";
+}
+.fa-file-o:before {
+ content: "\f016";
+}
+.fa-clock-o:before {
+ content: "\f017";
+}
+.fa-road:before {
+ content: "\f018";
+}
+.fa-download:before {
+ content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+.fa-inbox:before {
+ content: "\f01c";
+}
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+.fa-refresh:before {
+ content: "\f021";
+}
+.fa-list-alt:before {
+ content: "\f022";
+}
+.fa-lock:before {
+ content: "\f023";
+}
+.fa-flag:before {
+ content: "\f024";
+}
+.fa-headphones:before {
+ content: "\f025";
+}
+.fa-volume-off:before {
+ content: "\f026";
+}
+.fa-volume-down:before {
+ content: "\f027";
+}
+.fa-volume-up:before {
+ content: "\f028";
+}
+.fa-qrcode:before {
+ content: "\f029";
+}
+.fa-barcode:before {
+ content: "\f02a";
+}
+.fa-tag:before {
+ content: "\f02b";
+}
+.fa-tags:before {
+ content: "\f02c";
+}
+.fa-book:before {
+ content: "\f02d";
+}
+.fa-bookmark:before {
+ content: "\f02e";
+}
+.fa-print:before {
+ content: "\f02f";
+}
+.fa-camera:before {
+ content: "\f030";
+}
+.fa-font:before {
+ content: "\f031";
+}
+.fa-bold:before {
+ content: "\f032";
+}
+.fa-italic:before {
+ content: "\f033";
+}
+.fa-text-height:before {
+ content: "\f034";
+}
+.fa-text-width:before {
+ content: "\f035";
+}
+.fa-align-left:before {
+ content: "\f036";
+}
+.fa-align-center:before {
+ content: "\f037";
+}
+.fa-align-right:before {
+ content: "\f038";
+}
+.fa-align-justify:before {
+ content: "\f039";
+}
+.fa-list:before {
+ content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+.fa-indent:before {
+ content: "\f03c";
+}
+.fa-video-camera:before {
+ content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
+.fa-map-marker:before {
+ content: "\f041";
+}
+.fa-adjust:before {
+ content: "\f042";
+}
+.fa-tint:before {
+ content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+.fa-share-square-o:before {
+ content: "\f045";
+}
+.fa-check-square-o:before {
+ content: "\f046";
+}
+.fa-arrows:before {
+ content: "\f047";
+}
+.fa-step-backward:before {
+ content: "\f048";
+}
+.fa-fast-backward:before {
+ content: "\f049";
+}
+.fa-backward:before {
+ content: "\f04a";
+}
+.fa-play:before {
+ content: "\f04b";
+}
+.fa-pause:before {
+ content: "\f04c";
+}
+.fa-stop:before {
+ content: "\f04d";
+}
+.fa-forward:before {
+ content: "\f04e";
+}
+.fa-fast-forward:before {
+ content: "\f050";
+}
+.fa-step-forward:before {
+ content: "\f051";
+}
+.fa-eject:before {
+ content: "\f052";
+}
+.fa-chevron-left:before {
+ content: "\f053";
+}
+.fa-chevron-right:before {
+ content: "\f054";
+}
+.fa-plus-circle:before {
+ content: "\f055";
+}
+.fa-minus-circle:before {
+ content: "\f056";
+}
+.fa-times-circle:before {
+ content: "\f057";
+}
+.fa-check-circle:before {
+ content: "\f058";
+}
+.fa-question-circle:before {
+ content: "\f059";
+}
+.fa-info-circle:before {
+ content: "\f05a";
+}
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+.fa-ban:before {
+ content: "\f05e";
+}
+.fa-arrow-left:before {
+ content: "\f060";
+}
+.fa-arrow-right:before {
+ content: "\f061";
+}
+.fa-arrow-up:before {
+ content: "\f062";
+}
+.fa-arrow-down:before {
+ content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+.fa-expand:before {
+ content: "\f065";
+}
+.fa-compress:before {
+ content: "\f066";
+}
+.fa-plus:before {
+ content: "\f067";
+}
+.fa-minus:before {
+ content: "\f068";
+}
+.fa-asterisk:before {
+ content: "\f069";
+}
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+.fa-gift:before {
+ content: "\f06b";
+}
+.fa-leaf:before {
+ content: "\f06c";
+}
+.fa-fire:before {
+ content: "\f06d";
+}
+.fa-eye:before {
+ content: "\f06e";
+}
+.fa-eye-slash:before {
+ content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+.fa-plane:before {
+ content: "\f072";
+}
+.fa-calendar:before {
+ content: "\f073";
+}
+.fa-random:before {
+ content: "\f074";
+}
+.fa-comment:before {
+ content: "\f075";
+}
+.fa-magnet:before {
+ content: "\f076";
+}
+.fa-chevron-up:before {
+ content: "\f077";
+}
+.fa-chevron-down:before {
+ content: "\f078";
+}
+.fa-retweet:before {
+ content: "\f079";
+}
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+.fa-folder:before {
+ content: "\f07b";
+}
+.fa-folder-open:before {
+ content: "\f07c";
+}
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+.fa-twitter-square:before {
+ content: "\f081";
+}
+.fa-facebook-square:before {
+ content: "\f082";
+}
+.fa-camera-retro:before {
+ content: "\f083";
+}
+.fa-key:before {
+ content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+.fa-comments:before {
+ content: "\f086";
+}
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+.fa-star-half:before {
+ content: "\f089";
+}
+.fa-heart-o:before {
+ content: "\f08a";
+}
+.fa-sign-out:before {
+ content: "\f08b";
+}
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+.fa-external-link:before {
+ content: "\f08e";
+}
+.fa-sign-in:before {
+ content: "\f090";
+}
+.fa-trophy:before {
+ content: "\f091";
+}
+.fa-github-square:before {
+ content: "\f092";
+}
+.fa-upload:before {
+ content: "\f093";
+}
+.fa-lemon-o:before {
+ content: "\f094";
+}
+.fa-phone:before {
+ content: "\f095";
+}
+.fa-square-o:before {
+ content: "\f096";
+}
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+.fa-phone-square:before {
+ content: "\f098";
+}
+.fa-twitter:before {
+ content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-rss:before {
+ content: "\f09e";
+}
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+.fa-bell:before {
+ content: "\f0f3";
+}
+.fa-certificate:before {
+ content: "\f0a3";
+}
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+.fa-globe:before {
+ content: "\f0ac";
+}
+.fa-wrench:before {
+ content: "\f0ad";
+}
+.fa-tasks:before {
+ content: "\f0ae";
+}
+.fa-filter:before {
+ content: "\f0b0";
+}
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-cloud:before {
+ content: "\f0c2";
+}
+.fa-flask:before {
+ content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+.fa-square:before {
+ content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+.fa-underline:before {
+ content: "\f0cd";
+}
+.fa-table:before {
+ content: "\f0ce";
+}
+.fa-magic:before {
+ content: "\f0d0";
+}
+.fa-truck:before {
+ content: "\f0d1";
+}
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+.fa-money:before {
+ content: "\f0d6";
+}
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+.fa-caret-right:before {
+ content: "\f0da";
+}
+.fa-columns:before {
+ content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+.fa-envelope:before {
+ content: "\f0e0";
+}
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+.fa-exchange:before {
+ content: "\f0ec";
+}
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+.fa-user-md:before {
+ content: "\f0f0";
+}
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+.fa-bell-o:before {
+ content: "\f0a2";
+}
+.fa-coffee:before {
+ content: "\f0f4";
+}
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+.fa-building-o:before {
+ content: "\f0f7";
+}
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+.fa-medkit:before {
+ content: "\f0fa";
+}
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+.fa-beer:before {
+ content: "\f0fc";
+}
+.fa-h-square:before {
+ content: "\f0fd";
+}
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+.fa-angle-left:before {
+ content: "\f104";
+}
+.fa-angle-right:before {
+ content: "\f105";
+}
+.fa-angle-up:before {
+ content: "\f106";
+}
+.fa-angle-down:before {
+ content: "\f107";
+}
+.fa-desktop:before {
+ content: "\f108";
+}
+.fa-laptop:before {
+ content: "\f109";
+}
+.fa-tablet:before {
+ content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+.fa-circle-o:before {
+ content: "\f10c";
+}
+.fa-quote-left:before {
+ content: "\f10d";
+}
+.fa-quote-right:before {
+ content: "\f10e";
+}
+.fa-spinner:before {
+ content: "\f110";
+}
+.fa-circle:before {
+ content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+.fa-github-alt:before {
+ content: "\f113";
+}
+.fa-folder-o:before {
+ content: "\f114";
+}
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+.fa-smile-o:before {
+ content: "\f118";
+}
+.fa-frown-o:before {
+ content: "\f119";
+}
+.fa-meh-o:before {
+ content: "\f11a";
+}
+.fa-gamepad:before {
+ content: "\f11b";
+}
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+.fa-flag-o:before {
+ content: "\f11d";
+}
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+.fa-terminal:before {
+ content: "\f120";
+}
+.fa-code:before {
+ content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+.fa-location-arrow:before {
+ content: "\f124";
+}
+.fa-crop:before {
+ content: "\f125";
+}
+.fa-code-fork:before {
+ content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+.fa-question:before {
+ content: "\f128";
+}
+.fa-info:before {
+ content: "\f129";
+}
+.fa-exclamation:before {
+ content: "\f12a";
+}
+.fa-superscript:before {
+ content: "\f12b";
+}
+.fa-subscript:before {
+ content: "\f12c";
+}
+.fa-eraser:before {
+ content: "\f12d";
+}
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+.fa-microphone:before {
+ content: "\f130";
+}
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+.fa-shield:before {
+ content: "\f132";
+}
+.fa-calendar-o:before {
+ content: "\f133";
+}
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+.fa-rocket:before {
+ content: "\f135";
+}
+.fa-maxcdn:before {
+ content: "\f136";
+}
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+.fa-html5:before {
+ content: "\f13b";
+}
+.fa-css3:before {
+ content: "\f13c";
+}
+.fa-anchor:before {
+ content: "\f13d";
+}
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+.fa-bullseye:before {
+ content: "\f140";
+}
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+.fa-rss-square:before {
+ content: "\f143";
+}
+.fa-play-circle:before {
+ content: "\f144";
+}
+.fa-ticket:before {
+ content: "\f145";
+}
+.fa-minus-square:before {
+ content: "\f146";
+}
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+.fa-level-up:before {
+ content: "\f148";
+}
+.fa-level-down:before {
+ content: "\f149";
+}
+.fa-check-square:before {
+ content: "\f14a";
+}
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+.fa-share-square:before {
+ content: "\f14d";
+}
+.fa-compass:before {
+ content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+.fa-gbp:before {
+ content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+.fa-file:before {
+ content: "\f15b";
+}
+.fa-file-text:before {
+ content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+.fa-youtube-square:before {
+ content: "\f166";
+}
+.fa-youtube:before {
+ content: "\f167";
+}
+.fa-xing:before {
+ content: "\f168";
+}
+.fa-xing-square:before {
+ content: "\f169";
+}
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+.fa-dropbox:before {
+ content: "\f16b";
+}
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+.fa-instagram:before {
+ content: "\f16d";
+}
+.fa-flickr:before {
+ content: "\f16e";
+}
+.fa-adn:before {
+ content: "\f170";
+}
+.fa-bitbucket:before {
+ content: "\f171";
+}
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+.fa-tumblr:before {
+ content: "\f173";
+}
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+.fa-apple:before {
+ content: "\f179";
+}
+.fa-windows:before {
+ content: "\f17a";
+}
+.fa-android:before {
+ content: "\f17b";
+}
+.fa-linux:before {
+ content: "\f17c";
+}
+.fa-dribbble:before {
+ content: "\f17d";
+}
+.fa-skype:before {
+ content: "\f17e";
+}
+.fa-foursquare:before {
+ content: "\f180";
+}
+.fa-trello:before {
+ content: "\f181";
+}
+.fa-female:before {
+ content: "\f182";
+}
+.fa-male:before {
+ content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184";
+}
+.fa-sun-o:before {
+ content: "\f185";
+}
+.fa-moon-o:before {
+ content: "\f186";
+}
+.fa-archive:before {
+ content: "\f187";
+}
+.fa-bug:before {
+ content: "\f188";
+}
+.fa-vk:before {
+ content: "\f189";
+}
+.fa-weibo:before {
+ content: "\f18a";
+}
+.fa-renren:before {
+ content: "\f18b";
+}
+.fa-pagelines:before {
+ content: "\f18c";
+}
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+.fa-wheelchair:before {
+ content: "\f193";
+}
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+.fa-slack:before {
+ content: "\f198";
+}
+.fa-envelope-square:before {
+ content: "\f199";
+}
+.fa-wordpress:before {
+ content: "\f19a";
+}
+.fa-openid:before {
+ content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+.fa-yahoo:before {
+ content: "\f19e";
+}
+.fa-google:before {
+ content: "\f1a0";
+}
+.fa-reddit:before {
+ content: "\f1a1";
+}
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+.fa-delicious:before {
+ content: "\f1a5";
+}
+.fa-digg:before {
+ content: "\f1a6";
+}
+.fa-pied-piper:before {
+ content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+ content: "\f1a8";
+}
+.fa-drupal:before {
+ content: "\f1a9";
+}
+.fa-joomla:before {
+ content: "\f1aa";
+}
+.fa-language:before {
+ content: "\f1ab";
+}
+.fa-fax:before {
+ content: "\f1ac";
+}
+.fa-building:before {
+ content: "\f1ad";
+}
+.fa-child:before {
+ content: "\f1ae";
+}
+.fa-paw:before {
+ content: "\f1b0";
+}
+.fa-spoon:before {
+ content: "\f1b1";
+}
+.fa-cube:before {
+ content: "\f1b2";
+}
+.fa-cubes:before {
+ content: "\f1b3";
+}
+.fa-behance:before {
+ content: "\f1b4";
+}
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+.fa-steam:before {
+ content: "\f1b6";
+}
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+.fa-recycle:before {
+ content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+.fa-tree:before {
+ content: "\f1bb";
+}
+.fa-spotify:before {
+ content: "\f1bc";
+}
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+.fa-database:before {
+ content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+.fa-vine:before {
+ content: "\f1ca";
+}
+.fa-codepen:before {
+ content: "\f1cb";
+}
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+.fa-git-square:before {
+ content: "\f1d2";
+}
+.fa-git:before {
+ content: "\f1d3";
+}
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+.fa-qq:before {
+ content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+.fa-history:before {
+ content: "\f1da";
+}
+.fa-genderless:before,
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+.fa-header:before {
+ content: "\f1dc";
+}
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+.fa-sliders:before {
+ content: "\f1de";
+}
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+.fa-bomb:before {
+ content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+.fa-tty:before {
+ content: "\f1e4";
+}
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+.fa-plug:before {
+ content: "\f1e6";
+}
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+.fa-twitch:before {
+ content: "\f1e8";
+}
+.fa-yelp:before {
+ content: "\f1e9";
+}
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+.fa-wifi:before {
+ content: "\f1eb";
+}
+.fa-calculator:before {
+ content: "\f1ec";
+}
+.fa-paypal:before {
+ content: "\f1ed";
+}
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+.fa-trash:before {
+ content: "\f1f8";
+}
+.fa-copyright:before {
+ content: "\f1f9";
+}
+.fa-at:before {
+ content: "\f1fa";
+}
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+.fa-pie-chart:before {
+ content: "\f200";
+}
+.fa-line-chart:before {
+ content: "\f201";
+}
+.fa-lastfm:before {
+ content: "\f202";
+}
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+.fa-toggle-off:before {
+ content: "\f204";
+}
+.fa-toggle-on:before {
+ content: "\f205";
+}
+.fa-bicycle:before {
+ content: "\f206";
+}
+.fa-bus:before {
+ content: "\f207";
+}
+.fa-ioxhost:before {
+ content: "\f208";
+}
+.fa-angellist:before {
+ content: "\f209";
+}
+.fa-cc:before {
+ content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+.fa-meanpath:before {
+ content: "\f20c";
+}
+.fa-buysellads:before {
+ content: "\f20d";
+}
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+.fa-dashcube:before {
+ content: "\f210";
+}
+.fa-forumbee:before {
+ content: "\f211";
+}
+.fa-leanpub:before {
+ content: "\f212";
+}
+.fa-sellsy:before {
+ content: "\f213";
+}
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+.fa-skyatlas:before {
+ content: "\f216";
+}
+.fa-cart-plus:before {
+ content: "\f217";
+}
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+.fa-diamond:before {
+ content: "\f219";
+}
+.fa-ship:before {
+ content: "\f21a";
+}
+.fa-user-secret:before {
+ content: "\f21b";
+}
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+.fa-street-view:before {
+ content: "\f21d";
+}
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+.fa-venus:before {
+ content: "\f221";
+}
+.fa-mars:before {
+ content: "\f222";
+}
+.fa-mercury:before {
+ content: "\f223";
+}
+.fa-transgender:before {
+ content: "\f224";
+}
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+.fa-venus-double:before {
+ content: "\f226";
+}
+.fa-mars-double:before {
+ content: "\f227";
+}
+.fa-venus-mars:before {
+ content: "\f228";
+}
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+.fa-neuter:before {
+ content: "\f22c";
+}
+.fa-facebook-official:before {
+ content: "\f230";
+}
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+.fa-whatsapp:before {
+ content: "\f232";
+}
+.fa-server:before {
+ content: "\f233";
+}
+.fa-user-plus:before {
+ content: "\f234";
+}
+.fa-user-times:before {
+ content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+.fa-viacoin:before {
+ content: "\f237";
+}
+.fa-train:before {
+ content: "\f238";
+}
+.fa-subway:before {
+ content: "\f239";
+}
+.fa-medium:before {
+ content: "\f23a";
+}
diff --git a/submissions/valkey-ecommerce-demo/documentation/css/scrollbar.css b/submissions/valkey-ecommerce-demo/documentation/css/scrollbar.css
new file mode 100644
index 0000000..80eb263
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/css/scrollbar.css
@@ -0,0 +1,1274 @@
+/*
+== malihu jquery custom scrollbar plugin ==
+Plugin URI: http://manos.malihu.gr/jquery-custom-content-scroller
+*/
+
+
+
+/*
+CONTENTS:
+ 1. BASIC STYLE - Plugin's basic/essential CSS properties (normally, should not be edited).
+ 2. VERTICAL SCROLLBAR - Positioning and dimensions of vertical scrollbar.
+ 3. HORIZONTAL SCROLLBAR - Positioning and dimensions of horizontal scrollbar.
+ 4. VERTICAL AND HORIZONTAL SCROLLBARS - Positioning and dimensions of 2-axis scrollbars.
+ 5. TRANSITIONS - CSS3 transitions for hover events, auto-expanded and auto-hidden scrollbars.
+ 6. SCROLLBAR COLORS, OPACITY AND BACKGROUNDS
+ 6.1 THEMES - Scrollbar colors, opacity, dimensions, backgrounds etc. via ready-to-use themes.
+*/
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+1. BASIC STYLE
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ .mCustomScrollbar{ -ms-touch-action: none; touch-action: none; /* MSPointer events - direct all pointer events to js */ }
+ .mCustomScrollbar.mCS_no_scrollbar{ -ms-touch-action: auto; touch-action: auto; }
+
+ .mCustomScrollBox{ /* contains plugin's markup */
+ position: relative;
+ overflow: hidden;
+ height: 100%;
+ max-width: 100%;
+ outline: none;
+ direction: ltr;
+ }
+
+ .mCSB_container{ /* contains the original content */
+ overflow: hidden;
+ width: auto;
+ height: auto;
+ }
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+2. VERTICAL SCROLLBAR
+y-axis
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ .mCSB_inside > .mCSB_container{ margin-right: 30px; }
+
+ .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{ margin-right: 0; } /* non-visible scrollbar */
+
+ .mCS-dir-rtl > .mCSB_inside > .mCSB_container{ /* RTL direction/left-side scrollbar */
+ margin-right: 0;
+ margin-left: 30px;
+ }
+
+ .mCS-dir-rtl > .mCSB_inside > .mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{ margin-left: 0; } /* RTL direction/left-side scrollbar */
+
+ .mCSB_scrollTools{ /* contains scrollbar markup (draggable element, dragger rail, buttons etc.) */
+ position: absolute;
+ width: 16px;
+ height: auto;
+ left: auto;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ }
+
+ .mCSB_outside + .mCSB_scrollTools{ right: -26px; } /* scrollbar position: outside */
+
+ .mCS-dir-rtl > .mCSB_inside > .mCSB_scrollTools,
+ .mCS-dir-rtl > .mCSB_outside + .mCSB_scrollTools{ /* RTL direction/left-side scrollbar */
+ right: auto;
+ left: 0;
+ }
+
+ .mCS-dir-rtl > .mCSB_outside + .mCSB_scrollTools{ left: -26px; } /* RTL direction/left-side scrollbar (scrollbar position: outside) */
+
+ .mCSB_scrollTools .mCSB_draggerContainer{ /* contains the draggable element and dragger rail markup */
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ height: auto;
+ }
+
+ .mCSB_scrollTools a + .mCSB_draggerContainer{ margin: 20px 0; }
+
+ .mCSB_scrollTools .mCSB_draggerRail{
+ width: 7px;
+ height: 100%;
+ margin: 0 auto;
+ -webkit-border-radius: 0px; -moz-border-radius: 0px; border-radius: 0px;
+ background:#c1c1c1;
+ }
+
+ .mCSB_scrollTools .mCSB_dragger{ /* the draggable element */
+ cursor: pointer;
+ width: 100%;
+ height: 30px; /* minimum dragger height */
+ z-index: 1;
+ }
+
+ .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ /* the dragger element */
+ position: relative;
+ width: 7px;
+ height: 100%;
+ margin: 0 auto;
+ -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px;
+
+ text-align: center;
+ }
+
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{ width: 12px; /* auto-expanded scrollbar */ }
+
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ width: 8px; /* auto-expanded scrollbar */ }
+
+ .mCSB_scrollTools .mCSB_buttonUp,
+ .mCSB_scrollTools .mCSB_buttonDown{
+ display: block;
+ position: absolute;
+ height: 20px;
+ width: 100%;
+ overflow: hidden;
+ margin: 0 auto;
+ cursor: pointer;
+ }
+
+ .mCSB_scrollTools .mCSB_buttonDown{ bottom: 0; }
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+3. HORIZONTAL SCROLLBAR
+x-axis
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ .mCSB_horizontal.mCSB_inside > .mCSB_container{
+ margin-right: 0;
+ margin-bottom: 30px;
+ }
+
+ .mCSB_horizontal.mCSB_outside > .mCSB_container{ min-height: 100%; }
+
+ .mCSB_horizontal > .mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{ margin-bottom: 0; } /* non-visible scrollbar */
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal{
+ width: auto;
+ height: 16px;
+ top: auto;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ .mCustomScrollBox + .mCSB_scrollTools.mCSB_scrollTools_horizontal,
+ .mCustomScrollBox + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal{ bottom: -26px; } /* scrollbar position: outside */
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal a + .mCSB_draggerContainer{ margin: 0 20px; }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ width: 100%;
+ height: 2px;
+ margin: 7px 0;
+ }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{
+ width: 30px; /* minimum dragger width */
+ height: 100%;
+ left: 0;
+ }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ width: 100%;
+ height: 4px;
+ margin: 6px auto;
+ }
+
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{
+ height: 12px; /* auto-expanded scrollbar */
+ margin: 2px auto;
+ }
+
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{
+ height: 8px; /* auto-expanded scrollbar */
+ margin: 4px 0;
+ }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{
+ display: block;
+ position: absolute;
+ width: 20px;
+ height: 100%;
+ overflow: hidden;
+ margin: 0 auto;
+ cursor: pointer;
+ }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{ left: 0; }
+
+ .mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{ right: 0; }
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+4. VERTICAL AND HORIZONTAL SCROLLBARS
+yx-axis
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ .mCSB_container_wrapper{
+ position: absolute;
+ height: auto;
+ width: auto;
+ overflow: hidden;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin-right: 30px;
+ margin-bottom: 30px;
+ }
+
+ .mCSB_container_wrapper > .mCSB_container{
+ padding-right: 30px;
+ padding-bottom: 30px;
+ }
+
+ .mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_vertical{ bottom: 20px; }
+
+ .mCSB_vertical_horizontal > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ right: 20px; }
+
+ /* non-visible horizontal scrollbar */
+ .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden + .mCSB_scrollTools.mCSB_scrollTools_vertical{ bottom: 0; }
+
+ /* non-visible vertical scrollbar/RTL direction/left-side scrollbar */
+ .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal,
+ .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ right: 0; }
+
+ /* RTL direction/left-side scrollbar */
+ .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_scrollTools.mCSB_scrollTools_horizontal{ left: 20px; }
+
+ /* non-visible scrollbar/RTL direction/left-side scrollbar */
+ .mCS-dir-rtl > .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden + .mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal{ left: 0; }
+
+ .mCS-dir-rtl > .mCSB_inside > .mCSB_container_wrapper{ /* RTL direction/left-side scrollbar */
+ margin-right: 0;
+ margin-left: 30px;
+ }
+
+ .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden > .mCSB_container{
+ padding-right: 0;
+ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
+ }
+
+ .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden > .mCSB_container{
+ padding-bottom: 0;
+ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
+ }
+
+ .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{
+ margin-right: 0; /* non-visible scrollbar */
+ margin-left: 0;
+ }
+
+ /* non-visible horizontal scrollbar */
+ .mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside > .mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{ margin-bottom: 0; }
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+5. TRANSITIONS
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ .mCSB_scrollTools,
+ .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCSB_scrollTools .mCSB_buttonUp,
+ .mCSB_scrollTools .mCSB_buttonDown,
+ .mCSB_scrollTools .mCSB_buttonLeft,
+ .mCSB_scrollTools .mCSB_buttonRight{
+ -webkit-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
+ -moz-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
+ -o-transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
+ transition: opacity .2s ease-in-out, background-color .2s ease-in-out;
+ }
+
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar, /* auto-expanded scrollbar */
+ .mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,
+ .mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail{
+ -webkit-transition: width .2s ease-out .2s, height .2s ease-out .2s,
+ margin-left .2s ease-out .2s, margin-right .2s ease-out .2s,
+ margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s,
+ opacity .2s ease-in-out, background-color .2s ease-in-out;
+ -moz-transition: width .2s ease-out .2s, height .2s ease-out .2s,
+ margin-left .2s ease-out .2s, margin-right .2s ease-out .2s,
+ margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s,
+ opacity .2s ease-in-out, background-color .2s ease-in-out;
+ -o-transition: width .2s ease-out .2s, height .2s ease-out .2s,
+ margin-left .2s ease-out .2s, margin-right .2s ease-out .2s,
+ margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s,
+ opacity .2s ease-in-out, background-color .2s ease-in-out;
+ transition: width .2s ease-out .2s, height .2s ease-out .2s,
+ margin-left .2s ease-out .2s, margin-right .2s ease-out .2s,
+ margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s,
+ opacity .2s ease-in-out, background-color .2s ease-in-out;
+ }
+
+
+
+/*
+------------------------------------------------------------------------------------------------------------------------
+6. SCROLLBAR COLORS, OPACITY AND BACKGROUNDS
+------------------------------------------------------------------------------------------------------------------------
+*/
+
+ /*
+ ----------------------------------------
+ 6.1 THEMES
+ ----------------------------------------
+ */
+
+ /* default theme ("light") */
+
+ .mCSB_scrollTools{ opacity: 0.75; filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)"; }
+
+ .mCS-autoHide > .mCustomScrollBox > .mCSB_scrollTools,
+ .mCS-autoHide > .mCustomScrollBox ~ .mCSB_scrollTools{ opacity: 0; filter: "alpha(opacity=0)"; -ms-filter: "alpha(opacity=0)"; }
+
+ .mCustomScrollbar > .mCustomScrollBox > .mCSB_scrollTools.mCSB_scrollTools_onDrag,
+ .mCustomScrollbar > .mCustomScrollBox ~ .mCSB_scrollTools.mCSB_scrollTools_onDrag,
+ .mCustomScrollBox:hover > .mCSB_scrollTools,
+ .mCustomScrollBox:hover ~ .mCSB_scrollTools,
+ .mCS-autoHide:hover > .mCustomScrollBox > .mCSB_scrollTools,
+ .mCS-autoHide:hover > .mCustomScrollBox ~ .mCSB_scrollTools{ opacity: 1; filter: "alpha(opacity=100)"; -ms-filter: "alpha(opacity=100)"; }
+
+ .mCSB_scrollTools .mCSB_draggerRail{
+ background-color: #000; background-color: rgba(0,0,0,0);
+ filter: "alpha(opacity=0)"; -ms-filter: "alpha(opacity=0)";
+ }
+
+ .mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-color: #fff; background-color: rgba(255,255,255,0.75);
+ filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)";
+ }
+
+ .mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{
+ background-color: #fff; background-color: rgba(255,255,255,0.85);
+ filter: "alpha(opacity=85)"; -ms-filter: "alpha(opacity=85)";
+ }
+ .mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{
+ background-color: #fff; background-color: rgba(255,255,255,0.9);
+ filter: "alpha(opacity=90)"; -ms-filter: "alpha(opacity=90)";
+ }
+
+ .mCSB_scrollTools .mCSB_buttonUp,
+ .mCSB_scrollTools .mCSB_buttonDown,
+ .mCSB_scrollTools .mCSB_buttonLeft,
+ .mCSB_scrollTools .mCSB_buttonRight{
+ background-image: url(mCSB_buttons.png); /* css sprites */
+ background-repeat: no-repeat;
+ opacity: 0.4; filter: "alpha(opacity=40)"; -ms-filter: "alpha(opacity=40)";
+ }
+
+ .mCSB_scrollTools .mCSB_buttonUp{
+ background-position: 0 0;
+ /*
+ sprites locations
+ light: 0 0, -16px 0, -32px 0, -48px 0, 0 -72px, -16px -72px, -32px -72px
+ dark: -80px 0, -96px 0, -112px 0, -128px 0, -80px -72px, -96px -72px, -112px -72px
+ */
+ }
+
+ .mCSB_scrollTools .mCSB_buttonDown{
+ background-position: 0 -20px;
+ /*
+ sprites locations
+ light: 0 -20px, -16px -20px, -32px -20px, -48px -20px, 0 -92px, -16px -92px, -32px -92px
+ dark: -80px -20px, -96px -20px, -112px -20px, -128px -20px, -80px -92px, -96px -92px, -112 -92px
+ */
+ }
+
+ .mCSB_scrollTools .mCSB_buttonLeft{
+ background-position: 0 -40px;
+ /*
+ sprites locations
+ light: 0 -40px, -20px -40px, -40px -40px, -60px -40px, 0 -112px, -20px -112px, -40px -112px
+ dark: -80px -40px, -100px -40px, -120px -40px, -140px -40px, -80px -112px, -100px -112px, -120px -112px
+ */
+ }
+
+ .mCSB_scrollTools .mCSB_buttonRight{
+ background-position: 0 -56px;
+ /*
+ sprites locations
+ light: 0 -56px, -20px -56px, -40px -56px, -60px -56px, 0 -128px, -20px -128px, -40px -128px
+ dark: -80px -56px, -100px -56px, -120px -56px, -140px -56px, -80px -128px, -100px -128px, -120px -128px
+ */
+ }
+
+ .mCSB_scrollTools .mCSB_buttonUp:hover,
+ .mCSB_scrollTools .mCSB_buttonDown:hover,
+ .mCSB_scrollTools .mCSB_buttonLeft:hover,
+ .mCSB_scrollTools .mCSB_buttonRight:hover{ opacity: 0.75; filter: "alpha(opacity=75)"; -ms-filter: "alpha(opacity=75)"; }
+
+ .mCSB_scrollTools .mCSB_buttonUp:active,
+ .mCSB_scrollTools .mCSB_buttonDown:active,
+ .mCSB_scrollTools .mCSB_buttonLeft:active,
+ .mCSB_scrollTools .mCSB_buttonRight:active{ opacity: 0.9; filter: "alpha(opacity=90)"; -ms-filter: "alpha(opacity=90)"; }
+
+
+ /* theme: "dark" */
+
+ .mCS-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: rgba(0,0,0,0.85); }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: rgba(0,0,0,0.9); }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px 0; }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -20px; }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -40px; }
+
+ .mCS-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -56px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme: "light-2", "dark-2" */
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{
+ width: 4px;
+ background-color: #fff; background-color: rgba(255,255,255,0.1);
+ -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px;
+ }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ width: 4px;
+ background-color: #fff; background-color: rgba(255,255,255,0.75);
+ -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px;
+ }
+
+ .mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ width: 100%;
+ height: 4px;
+ margin: 6px auto;
+ }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px 0; }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -20px; }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -40px; }
+
+ .mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -56px; }
+
+
+ /* theme: "dark-2" */
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{
+ background-color: #000; background-color: rgba(0,0,0,0.1);
+ -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px;
+ }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-color: #000; background-color: rgba(0,0,0,0.75);
+ -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px;
+ }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px 0; }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -20px; }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -40px; }
+
+ .mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -56px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme: "light-thick", "dark-thick" */
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{
+ width: 4px;
+ background-color: #fff; background-color: rgba(255,255,255,0.1);
+ -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;
+ }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ width: 6px;
+ background-color: #fff; background-color: rgba(255,255,255,0.75);
+ -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;
+ }
+
+ .mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ width: 100%;
+ height: 4px;
+ margin: 6px 0;
+ }
+
+ .mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ width: 100%;
+ height: 6px;
+ margin: 5px auto;
+ }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -16px 0; }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -16px -20px; }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -20px -40px; }
+
+ .mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -20px -56px; }
+
+
+ /* theme: "dark-thick" */
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{
+ background-color: #000; background-color: rgba(0,0,0,0.1);
+ -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;
+ }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-color: #000; background-color: rgba(0,0,0,0.75);
+ -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;
+ }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -96px 0; }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -96px -20px; }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -100px -40px; }
+
+ .mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -100px -56px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme: "light-thin", "dark-thin" */
+
+ .mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.1); }
+
+ .mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 2px; }
+
+ .mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{ width: 100%; }
+
+ .mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ width: 100%;
+ height: 2px;
+ margin: 7px auto;
+ }
+
+
+ /* theme "dark-thin" */
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px 0; }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -20px; }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -40px; }
+
+ .mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -56px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme "rounded", "rounded-dark", "rounded-dots", "rounded-dots-dark" */
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.15); }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_dragger,
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger{ height: 14px; }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ width: 14px;
+ margin: 0 1px;
+ }
+
+ .mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,
+ .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,
+ .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 14px; }
+
+ .mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ height: 14px;
+ margin: 1px 0;
+ }
+
+ .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{
+ width: 16px; /* auto-expanded scrollbar */
+ height: 16px;
+ margin: -1px 0;
+ }
+
+ .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,
+ .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{ width: 4px; /* auto-expanded scrollbar */ }
+
+ .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{
+ height: 16px; /* auto-expanded scrollbar */
+ width: 16px;
+ margin: 0 -1px;
+ }
+
+ .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{
+ height: 4px; /* auto-expanded scrollbar */
+ margin: 6px 0;
+ }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{ background-position: 0 -72px; }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{ background-position: 0 -92px; }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{ background-position: 0 -112px; }
+
+ .mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{ background-position: 0 -128px; }
+
+
+ /* theme "rounded-dark", "rounded-dots-dark" */
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.15); }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -80px -72px; }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -80px -92px; }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -80px -112px; }
+
+ .mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -80px -128px; }
+
+
+ /* theme "rounded-dots", "rounded-dots-dark" */
+
+ .mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail,
+ .mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail{ width: 4px; }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ background-color: transparent;
+ background-position: center;
+ }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==");
+ background-repeat: repeat-y;
+ opacity: 0.3;
+ filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)";
+ }
+
+ .mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ height: 4px;
+ margin: 6px 0;
+ background-repeat: repeat-x;
+ }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{ background-position: -16px -72px; }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{ background-position: -16px -92px; }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -20px -112px; }
+
+ .mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{ background-position: -20px -128px; }
+
+
+ /* theme "rounded-dots-dark" */
+
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=");
+ }
+
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -96px -72px; }
+
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -96px -92px; }
+
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -100px -112px; }
+
+ .mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -100px -128px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme "3d", "3d-dark", "3d-thick", "3d-thick-dark" */
+
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-repeat: repeat-y;
+ background-image: -moz-linear-gradient(left, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%);
+ background-image: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0.5)), color-stop(100%,rgba(255,255,255,0)));
+ background-image: -webkit-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: -o-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: -ms-linear-gradient(left, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: linear-gradient(to right, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ }
+
+ .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 100%);
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.5)), color-stop(100%,rgba(255,255,255,0)));
+ background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: -o-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: -ms-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ background-image: linear-gradient(to bottom, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0) 100%);
+ }
+
+
+ /* theme "3d", "3d-dark" */
+
+ .mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger,
+ .mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger{ height: 70px; }
+
+ .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger,
+ .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 70px; }
+
+ .mCS-3d.mCSB_scrollTools,
+ .mCS-3d-dark.mCSB_scrollTools{
+ opacity: 1;
+ filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)";
+ }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ -webkit-border-radius: 16px; -moz-border-radius: 16px; border-radius: 16px; }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{
+ width: 8px;
+ background-color: #000; background-color: rgba(0,0,0,0.2);
+ box-shadow: inset 1px 0 1px rgba(0,0,0,0.5), inset -1px 0 1px rgba(255,255,255,0.2);
+ }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #555; }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 8px; }
+
+ .mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ width: 100%;
+ height: 8px;
+ margin: 4px 0;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,0.5), inset 0 -1px 1px rgba(255,255,255,0.2);
+ }
+
+ .mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ width: 100%;
+ height: 8px;
+ margin: 4px auto;
+ }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; }
+
+ .mCS-3d.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; }
+
+
+ /* theme "3d-dark" */
+
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{
+ background-color: #000; background-color: rgba(0,0,0,0.1);
+ box-shadow: inset 1px 0 1px rgba(0,0,0,0.1);
+ }
+
+ .mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{ box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); }
+
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; }
+
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; }
+
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; }
+
+ .mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme: "3d-thick", "3d-thick-dark" */
+
+ .mCS-3d-thick.mCSB_scrollTools,
+ .mCS-3d-thick-dark.mCSB_scrollTools{
+ opacity: 1;
+ filter: "alpha(opacity=30)"; -ms-filter: "alpha(opacity=30)";
+ }
+
+ .mCS-3d-thick.mCSB_scrollTools,
+ .mCS-3d-thick-dark.mCSB_scrollTools,
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{ -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px; }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
+
+ .mCSB_inside + .mCS-3d-thick.mCSB_scrollTools_vertical,
+ .mCSB_inside + .mCS-3d-thick-dark.mCSB_scrollTools_vertical{ right: 1px; }
+
+ .mCS-3d-thick.mCSB_scrollTools_vertical,
+ .mCS-3d-thick-dark.mCSB_scrollTools_vertical{ box-shadow: inset 1px 0 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.5); }
+
+ .mCS-3d-thick.mCSB_scrollTools_horizontal,
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal{
+ bottom: 1px;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.5);
+ }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ box-shadow: inset 1px 0 0 rgba(255,255,255,0.4);
+ width: 12px;
+ margin: 2px;
+ position: absolute;
+ height: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ }
+
+ .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 0 1px 0 rgba(255,255,255,0.4); }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #555; }
+
+ .mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ height: 12px;
+ width: auto;
+ }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{
+ background-color: #000; background-color: rgba(0,0,0,0.05);
+ box-shadow: inset 1px 1px 16px rgba(0,0,0,0.1);
+ }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; }
+
+ .mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; }
+
+
+ /* theme: "3d-thick-dark" */
+
+ .mCS-3d-thick-dark.mCSB_scrollTools{ box-shadow: inset 0 0 14px rgba(0,0,0,0.2); }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal{ box-shadow: inset 0 1px 1px rgba(0,0,0,0.1), inset 0 0 14px rgba(0,0,0,0.2); }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 1px 0 0 rgba(255,255,255,0.4), inset -1px 0 0 rgba(0,0,0,0.2); }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{ box-shadow: inset 0 1px 0 rgba(255,255,255,0.4), inset 0 -1px 0 rgba(0,0,0,0.2); }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #777; }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{
+ background-color: #fff; background-color: rgba(0,0,0,0.05);
+ box-shadow: inset 1px 1px 16px rgba(0,0,0,0.1);
+ }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; }
+
+ .mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme: "minimal", "minimal-dark" */
+
+ .mCSB_outside + .mCS-minimal.mCSB_scrollTools_vertical,
+ .mCSB_outside + .mCS-minimal-dark.mCSB_scrollTools_vertical{
+ right: 0;
+ margin: 12px 0;
+ }
+
+ .mCustomScrollBox.mCS-minimal + .mCSB_scrollTools.mCSB_scrollTools_horizontal,
+ .mCustomScrollBox.mCS-minimal + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal,
+ .mCustomScrollBox.mCS-minimal-dark + .mCSB_scrollTools.mCSB_scrollTools_horizontal,
+ .mCustomScrollBox.mCS-minimal-dark + .mCSB_scrollTools + .mCSB_scrollTools.mCSB_scrollTools_horizontal{
+ bottom: 0;
+ margin: 0 12px;
+ }
+
+ /* RTL direction/left-side scrollbar */
+ .mCS-dir-rtl > .mCSB_outside + .mCS-minimal.mCSB_scrollTools_vertical,
+ .mCS-dir-rtl > .mCSB_outside + .mCS-minimal-dark.mCSB_scrollTools_vertical{
+ left: 0;
+ right: auto;
+ }
+
+ .mCS-minimal.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: transparent; }
+
+ .mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger,
+ .mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger{ height: 50px; }
+
+ .mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger,
+ .mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger{ width: 50px; }
+
+ .mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-color: #fff; background-color: rgba(255,255,255,0.2);
+ filter: "alpha(opacity=20)"; -ms-filter: "alpha(opacity=20)";
+ }
+
+ .mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{
+ background-color: #fff; background-color: rgba(255,255,255,0.5);
+ filter: "alpha(opacity=50)"; -ms-filter: "alpha(opacity=50)";
+ }
+
+
+ /* theme: "minimal-dark" */
+
+ .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ background-color: #000; background-color: rgba(0,0,0,0.2);
+ filter: "alpha(opacity=20)"; -ms-filter: "alpha(opacity=20)";
+ }
+
+ .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{
+ background-color: #000; background-color: rgba(0,0,0,0.5);
+ filter: "alpha(opacity=50)"; -ms-filter: "alpha(opacity=50)";
+ }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme "light-3", "dark-3" */
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{
+ width: 6px;
+ background-color: #000; background-color: rgba(0,0,0,0.2);
+ }
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ width: 6px; }
+
+ .mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ width: 100%;
+ height: 6px;
+ margin: 5px 0;
+ }
+
+ .mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{
+ width: 12px;
+ }
+
+ .mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded + .mCSB_draggerRail,
+ .mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{
+ height: 12px;
+ margin: 2px 0;
+ }
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; }
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; }
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; }
+
+ .mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; }
+
+
+ /* theme "dark-3" */
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.1); }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; }
+
+ .mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; }
+
+ /* ---------------------------------------- */
+
+
+
+ /* theme "inset", "inset-dark", "inset-2", "inset-2-dark", "inset-3", "inset-3-dark" */
+
+ .mCS-inset.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{
+ width: 12px;
+ background-color: #000; background-color: rgba(0,0,0,0.2);
+ }
+
+ .mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{
+ width: 6px;
+ margin: 3px 5px;
+ position: absolute;
+ height: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ }
+
+ .mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{
+ height: 6px;
+ margin: 5px 3px;
+ position: absolute;
+ width: auto;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ }
+
+ .mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,
+ .mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{
+ width: 100%;
+ height: 12px;
+ margin: 2px 0;
+ }
+
+ .mCS-inset.mCSB_scrollTools .mCSB_buttonUp,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp{ background-position: -32px -72px; }
+
+ .mCS-inset.mCSB_scrollTools .mCSB_buttonDown,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown{ background-position: -32px -92px; }
+
+ .mCS-inset.mCSB_scrollTools .mCSB_buttonLeft,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -40px -112px; }
+
+ .mCS-inset.mCSB_scrollTools .mCSB_buttonRight,
+ .mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight{ background-position: -40px -128px; }
+
+
+ /* theme "inset-dark", "inset-2-dark", "inset-3-dark" */
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.1); }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp{ background-position: -112px -72px; }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown{ background-position: -112px -92px; }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft{ background-position: -120px -112px; }
+
+ .mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight{ background-position: -120px -128px; }
+
+
+ /* theme "inset-2", "inset-2-dark" */
+
+ .mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{
+ background-color: transparent;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #fff;
+ border-color: rgba(255,255,255,0.2);
+ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
+ }
+
+ .mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{ border-color: #000; border-color: rgba(0,0,0,0.2); }
+
+
+ /* theme "inset-3", "inset-3-dark" */
+
+ .mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{ background-color: #fff; background-color: rgba(255,255,255,0.6); }
+
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{ background-color: #000; background-color: rgba(0,0,0,0.6); }
+
+ .mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.75); }
+
+ .mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.85); }
+
+ .mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #000; background-color: rgba(0,0,0,0.9); }
+
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.75); }
+
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.85); }
+
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,
+ .mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{ background-color: #fff; background-color: rgba(255,255,255,0.9); }
+
+ /* ---------------------------------------- */
diff --git a/submissions/valkey-ecommerce-demo/documentation/css/style.css b/submissions/valkey-ecommerce-demo/documentation/css/style.css
new file mode 100644
index 0000000..aa5709d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/css/style.css
@@ -0,0 +1,384 @@
+/* Documentation For Quray HTML5 Agency Template */
+
+/***
+
+====================================================================
+ Fonts
+====================================================================
+
+***/
+
+@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700);
+@import url(http://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700);
+
+@import url("font-awesome.css");
+
+/***
+
+====================================================================
+ Reset
+====================================================================
+
+***/
+
+/***
+
+====================================================================
+ Global Settings
+====================================================================
+
+ ***/
+
+body {
+ font-family: "Open Sans", sans-serif;
+ font-size: 14px;
+ color: #353535;
+ line-height: 1.6em;
+ font-weight: 500;
+ background: #ffffff;
+ -webkit-font-smoothing: antialiased;
+}
+
+a {
+ text-decoration: none;
+ cursor: pointer;
+ color: #246BFD;
+}
+ul,
+ol {
+ list-style-type: none;
+ padding: 0;
+}
+a:hover,
+a:focus,
+a:visited {
+ text-decoration: none;
+ outline: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ position: relative;
+ margin: 0px;
+ background: none;
+}
+
+h1 {
+ font-size: 24px;
+}
+
+h2 {
+ font-size: 20px;
+}
+
+h3 {
+ font-size: 18px;
+}
+
+p {
+ font-size: 14px;
+ line-height: 1.6em;
+}
+
+/***
+
+====================================================================
+ Sidebar
+====================================================================
+
+****/
+#sidebar {
+ position: fixed;
+ left: 0px;
+ top: 0px;
+ width: 250px;
+ height: 100%;
+ padding: 0px 20px;
+ border-right: 2px solid #246BFD;
+ z-index: 10;
+}
+
+#sidebar .mCSB_inside > .mCSB_container {
+ margin-right: 12px !important;
+}
+
+#sidebar .mCS_no_scrollbar .mCSB_container {
+ margin-right: 0px !important;
+}
+
+#sidebar .menu-box {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ padding: 0px 0px 30px;
+ background: rgba(0, 0, 0, 0.8);
+ transition: all 1000ms ease;
+ -moz-transition: all 1000ms ease;
+ -webkit-transition: all 1000ms ease;
+ -ms-transition: all 1000ms ease;
+ -o-transition: all 1000ms ease;
+}
+
+#sidebar .menu-box .logo {
+ position: relative;
+ margin-bottom: 35px;
+ padding: 30px 32px 10px;
+}
+
+#sidebar .menu-box .logo img {
+ position: relative;
+ display: inline-block;
+ max-width: 100%;
+}
+
+#sidebar .menu-box .sticky-menu {
+ position: relative;
+}
+
+#sidebar .menu-box .sticky-menu > ul {
+ position: relative;
+ display: block;
+ margin: 0px;
+ padding: 0px;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+#sidebar .menu-box .sticky-menu > ul > li {
+ position: relative;
+ display: block;
+ padding: 3px 30px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+ font-size: 20px;
+ color: #ffffff;
+ text-align: left;
+}
+
+#sidebar .menu-box .sticky-menu > ul > li > a {
+ position: relative;
+ display: block;
+ padding: 7px 30px 7px 0px;
+ color: #ffffff;
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 20px;
+ text-transform: uppercase;
+ transition: all 300ms ease;
+ -moz-transition: all 300ms ease;
+ -webkit-transition: all 300ms ease;
+ -ms-transition: all 300ms ease;
+ -o-transition: all 300ms ease;
+}
+
+#sidebar .menu-box .sticky-menu > ul > li a .fa {
+ position: absolute;
+ right: -10px;
+ top: 0px;
+ width: 24px;
+ text-align: left;
+ color: #ffffff;
+ opacity: 0;
+ font-size: 12px;
+ display: block;
+ line-height: 34px;
+ transition: all 500ms ease;
+ -moz-transition: all 500ms ease;
+ -webkit-transition: all 500ms ease;
+ -ms-transition: all 500ms ease;
+ -o-transition: all 500ms ease;
+}
+
+#sidebar .menu-box .sticky-menu > ul > li.current a .fa,
+#sidebar .menu-box .sticky-menu > ul > li:hover a .fa {
+ /* left:15px; */
+ opacity: 1;
+}
+
+#sidebar .menu-box .sticky-menu > ul > li > a:hover,
+#sidebar .menu-box .sticky-menu > ul > li.current > a,
+#sidebar .menu-box .sticky-menu > ul > li.current-menu-item > a {
+ text-shadow: 0px 0px 0px rgba(255, 255, 255, 0.7),
+ 0px 8px 13px rgba(255, 255, 255, 0.1),
+ 0px 18px 23px rgba(255, 255, 255, 0.1);
+}
+
+#sidebar .copyright {
+ position: fixed;
+ left: 0px;
+ bottom: 5px;
+ width: 250px;
+ height: 30px;
+ font-size: 13px;
+ color: #ffffff;
+ line-height: 30px;
+ text-align: center;
+}
+
+/***
+
+====================================================================
+ Content Section
+====================================================================
+
+****/
+
+#content-section {
+ position: relative;
+ padding: 0px 0px 30px 250px;
+ width: 100%;
+ z-index: 5;
+}
+
+#content-section .section {
+ position: relative;
+ min-height: 200px;
+ margin-bottom: 50px;
+}
+
+#content-section .sec-title {
+ position: relative;
+ padding: 10px 20px 10px 50px;
+ background: rgba(0, 0, 0, 0.7);
+ color: #ffffff;
+}
+
+#content-section .sec-title h2 {
+ position: relative;
+ font-size: 24px;
+ text-transform: capitalize;
+ font-weight: 600;
+}
+
+#content-section .sec-title h3 {
+ position: relative;
+ font-size: 22px;
+ text-transform: uppercase;
+ font-weight: 600;
+}
+
+#content-section .sec-title .icon {
+ position: absolute;
+ left: 20px;
+ top: 10px;
+ width: 30px;
+ height: 40px;
+ line-height: 30px;
+ font-size: 18px;
+}
+
+#content-section .separator {
+ position: relative;
+ margin: 20px 0px;
+ height: 1px;
+}
+
+#content-section .separator:before {
+ content: "";
+ position: relative;
+ display: block;
+ width: 100%;
+ height: 1px;
+ background: linear-gradient(left, #d0d0d0, #f1f1f1, #ffffff);
+ background: -moz-linear-gradient(left, #d0d0d0, #f1f1f1, #ffffff);
+ background: -webkit-linear-gradient(left, #d0d0d0, #f1f1f1, #ffffff);
+ background: -ms-linear-gradient(left, #d0d0d0, #f1f1f1, #ffffff);
+ background: -o-linear-gradient(left, #d0d0d0, #f1f1f1, #ffffff);
+}
+
+#content-section .sec-content {
+ position: relative;
+ padding: 10px 20px;
+}
+
+.introduction .sec-content h2 {
+ font-size: 32px;
+ text-transform: uppercase;
+ margin-bottom: 10px;
+ font-weight: 600;
+ font-family: "Open Sans Condensed", sans-serif;
+ color: #246BFD;
+}
+
+.introduction .sec-content h3 {
+ font-size: 22px;
+ text-transform: capitalize;
+ margin-bottom: 10px;
+ font-family: "Open Sans Condensed", sans-serif;
+}
+
+.html-structure .sec-content h3,
+.css-structure .sec-content h3,
+.javascript .sec-content h3,
+.sources-credits .sec-content h3,
+.contact-form .sec-content h3,
+.support .sec-content h3,
+.map-settings .sec-content h3,
+.count-timer .sec-content h3 {
+ font-size: 15px;
+ font-weight: 600;
+ margin-bottom: 30px;
+ line-height: 1.4em;
+}
+
+.html-structure code {
+ font-size: 14px;
+ font-family: "Open Sans", sans-serif;
+ color: #353535;
+ padding: 30px 20px;
+ background: #f1f1f1;
+ height: auto;
+ display: block;
+}
+
+.javascript ul li {
+ list-style: none;
+}
+
+.sources-credits p {
+ margin-bottom: 2px;
+}
+
+#content-section img {
+ display: inline-block;
+ max-width: 100%;
+ height: auto;
+}
+
+#content-section .image-box {
+ position: relative;
+ padding: 0px;
+ margin: 30px 0px;
+}
+
+.logo a {
+ font-size: 30px;
+ color: #ffffff;
+}
+
+#Feature-card ul li {
+ list-style: disc;
+ margin-left: 22px;
+}
+
+.setup {
+ display: block;
+ margin: 5px 0;
+ border: 1px solid #ddd;
+ padding: 20px;
+ border-radius: 10px;
+}
+.init {
+ padding-left: 20px;
+}
+.init li {
+ list-style: circle;
+}
+.setup li {
+ list-style: circle;
+}
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/FontAwesome.otf b/submissions/valkey-ecommerce-demo/documentation/fonts/FontAwesome.otf
new file mode 100644
index 0000000..f7936cc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/FontAwesome.otf differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.eot b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..33b2bb8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.eot differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.svg b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..1ee89d4
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.svg
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.ttf b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..ed9372f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..8b280b9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff2 b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..3311d58
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/fontawesome-webfont.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.eot b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.eot differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.svg b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.ttf b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff2 b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/about.png b/submissions/valkey-ecommerce-demo/documentation/images/about.png
new file mode 100644
index 0000000..ad037bc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/about.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/blog.png b/submissions/valkey-ecommerce-demo/documentation/images/blog.png
new file mode 100644
index 0000000..d2868b2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/blog.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/contact.png b/submissions/valkey-ecommerce-demo/documentation/images/contact.png
new file mode 100644
index 0000000..6095752
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/contact.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/contact_img.png b/submissions/valkey-ecommerce-demo/documentation/images/contact_img.png
new file mode 100644
index 0000000..6daf069
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/contact_img.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/copyright.png b/submissions/valkey-ecommerce-demo/documentation/images/copyright.png
new file mode 100644
index 0000000..e3f41ad
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/copyright.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/css.png b/submissions/valkey-ecommerce-demo/documentation/images/css.png
new file mode 100644
index 0000000..75f955e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/css.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/faq.png b/submissions/valkey-ecommerce-demo/documentation/images/faq.png
new file mode 100644
index 0000000..04845eb
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/faq.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/favicon.png b/submissions/valkey-ecommerce-demo/documentation/images/favicon.png
new file mode 100644
index 0000000..131a68a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/favicon.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/footer.png b/submissions/valkey-ecommerce-demo/documentation/images/footer.png
new file mode 100644
index 0000000..70c721b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/footer.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/html-sample.png b/submissions/valkey-ecommerce-demo/documentation/images/html-sample.png
new file mode 100644
index 0000000..d257dff
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/html-sample.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/logo.png b/submissions/valkey-ecommerce-demo/documentation/images/logo.png
new file mode 100644
index 0000000..e351c69
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/logo.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/logo_img.png b/submissions/valkey-ecommerce-demo/documentation/images/logo_img.png
new file mode 100644
index 0000000..ae813b1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/logo_img.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/metatag.png b/submissions/valkey-ecommerce-demo/documentation/images/metatag.png
new file mode 100644
index 0000000..18d6191
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/metatag.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/output.png b/submissions/valkey-ecommerce-demo/documentation/images/output.png
new file mode 100644
index 0000000..9053efe
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/output.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/output3.png b/submissions/valkey-ecommerce-demo/documentation/images/output3.png
new file mode 100644
index 0000000..a9c74f2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/output3.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/output4.png b/submissions/valkey-ecommerce-demo/documentation/images/output4.png
new file mode 100644
index 0000000..bf18452
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/output4.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/service.png b/submissions/valkey-ecommerce-demo/documentation/images/service.png
new file mode 100644
index 0000000..a28cffe
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/service.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/team.png b/submissions/valkey-ecommerce-demo/documentation/images/team.png
new file mode 100644
index 0000000..737ea27
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/team.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/images/testimonial.png b/submissions/valkey-ecommerce-demo/documentation/images/testimonial.png
new file mode 100644
index 0000000..7b31a80
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/documentation/images/testimonial.png differ
diff --git a/submissions/valkey-ecommerce-demo/documentation/index.html b/submissions/valkey-ecommerce-demo/documentation/index.html
new file mode 100644
index 0000000..bceaf4b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/index.html
@@ -0,0 +1,465 @@
+
+
+
+
+
+ Valkey - E-commerce React JS Template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Introduction
+
+
+
+
+
Valkey
+
Valkey - E-commerce React JS Template
+
+
+
+
Created : May 19, 2026
+
Last Update : May 24, 2026
+
By : Roberto Luna-Rojas
+
+
+
+ Thank you for purchasing Valkey - E-commerce React JS Template
+ If you have any questions that are beyond the scope of
+ this help file, please feel free to email, via my user page contact form
+ or put a ticket at Support Center . Thank you so much!
+
+
+
All Pages
+
+ 01) Home One
+ 02) Home Two
+ 03) Shop
+ 04) Product Details
+ 05) Product Details 2
+ 06) Cart
+ 07) Checkout
+ 08) Account
+ 09) Blog
+ 10) Blog Details
+ 11) Contact
+ 12) Wishlist
+ 13) Become a seller
+ 14) Vendor
+ 15) Vendor-details
+ 16) Vendor-two
+ 17) Vendor-two-details
+ 18) Vendor-two-details
+
+
+
+
+
+
Setup Development Environment
+
+
+ Install recommended version of NodeJS
+ Use this command line on the terminal to navigate to the project root directory.
+ Run those flowing commands.
+
+ npm install
+ npm start
+
+
+
+
+ You will now see the website live.
+ Build the project using this command.
+ Run those flowing commands.
+
+
+
+
+
+
+
+
+
+
+
React JsX Structure
+
+
+
+
+
+ The React js template uses Latest Bootstrap 5 with valid
+ HTML5 JSX tags. This theme is a responsive layout with 4 column Support
+ column. All of the information in content area is nested within a class
+ and comes with predefined classes.
+
+
+
+
+
+
+
+
+
Output
+
+
+
+
+
+
+
+
+
+
SASS Files and Structure
+
+
+
+
+
+ Mainly three main SCSS files are used in this theme.
+
+
+ If you would like to edit a specific section of the site, simply find
+ the appropriate label in the SCSS file, and then scroll down until you
+ find the appropriate style that needs to be edited.
+
+
+
+
+
+
+
+
+
+
+
+
Customization
+
+
+
+
+
Change Meta Tag :
+
+
+
+
+
+
+
+
+
+
Change favicon :
+
+
+
+
+
+
+
+
+
+
Contact Form Structure :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Logo Structure
+
+
+
+
+
+
+
+
+
+
+
Output
+
+
+
+
+
+
+
+
+
+
+
+
+
App Structure
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Component Area Structure
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Preloader Area Structure
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
blog Area Structure
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Features
+
+
+
+
+
+ SASS File Included
+ 100% pixel perfect design
+ Clean and Simple Style
+ Cross Browser Optimization.
+ Google font.
+ Compatible Browsers – IE9+, Chrome, Safari, Opera, Firefox
+ Documentation – Yes
+ License – GPL
+ Version – 1.0.0
+ Columns – 4
+ Files Included -html, JSX, scss
+ User Friendly Code
+ Easy to customize
+ W3C Validation
+ Clean & Modern Design
+ CSS3 animations
+ Full Responsive
+ SEO friendly code
+
+
+
+
+
+
+
+
+
+
+
Sources and Credits
+
+
+
+
+
+ Fonts Used int the template are google fonts, you can find theme on
+ Google Fonts API
+
+
+
Font Used:
+
+
+
+
+
+
+ Every Code is properly commented for Editing Ease.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/bootstrap.min.js b/submissions/valkey-ecommerce-demo/documentation/js/bootstrap.min.js
new file mode 100644
index 0000000..c6d3692
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.2",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.2",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.2",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.2",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.2",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('
').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j ').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.2",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.2",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.2",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.2",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()
+}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.2",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/jquery.js b/submissions/valkey-ecommerce-demo/documentation/js/jquery.js
new file mode 100644
index 0000000..e6a051d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/jquery.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" a ",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=" ",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h ]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:k.htmlSerialize?[0,"",""]:[1,"X","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" a ",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)
+}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();ca ",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/jquery.nav.js b/submissions/valkey-ecommerce-demo/documentation/js/jquery.nav.js
new file mode 100644
index 0000000..e40e3ee
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/jquery.nav.js
@@ -0,0 +1,225 @@
+/*
+ * jQuery One Page Nav Plugin
+ * http://github.com/davist11/jQuery-One-Page-Nav
+ *
+ * Copyright (c) 2010 Trevor Davis (http://trevordavis.net)
+ * Dual licensed under the MIT and GPL licenses.
+ * Uses the same license as jQuery, see:
+ * http://jquery.org/license
+ *
+ * @version 3.0.0
+ *
+ * Example usage:
+ * $('#nav').onePageNav({
+ * currentClass: 'current',
+ * changeHash: false,
+ * scrollSpeed: 750
+ * });
+ */
+
+(function($, window, document, undefined){
+
+ // our plugin constructor
+ var OnePageNav = function(elem, options){
+ this.elem = elem;
+ this.$elem = $(elem);
+ this.options = options;
+ this.metadata = this.$elem.data('plugin-options');
+ this.$win = $(window);
+ this.sections = {};
+ this.didScroll = false;
+ this.$doc = $(document);
+ this.docHeight = this.$doc.height();
+ };
+
+ // the plugin prototype
+ OnePageNav.prototype = {
+ defaults: {
+ navItems: 'a',
+ currentClass: 'current',
+ changeHash: false,
+ easing: 'swing',
+ filter: '',
+ scrollSpeed: 1000,
+ scrollThreshold: 0.5,
+ begin: false,
+ end: false,
+ scrollChange: false
+ },
+
+ init: function() {
+ // Introduce defaults that can be extended either
+ // globally or using an object literal.
+ this.config = $.extend({}, this.defaults, this.options, this.metadata);
+
+ this.$nav = this.$elem.find(this.config.navItems);
+
+ //Filter any links out of the nav
+ if(this.config.filter !== '') {
+ this.$nav = this.$nav.filter(this.config.filter);
+ }
+
+ //Handle clicks on the nav
+ this.$nav.on('click.onePageNav', $.proxy(this.handleClick, this));
+
+ //Get the section positions
+ this.getPositions();
+
+ //Handle scroll changes
+ this.bindInterval();
+
+ //Update the positions on resize too
+ this.$win.on('resize.onePageNav', $.proxy(this.getPositions, this));
+
+ return this;
+ },
+
+ adjustNav: function(self, $parent) {
+ self.$elem.find('.' + self.config.currentClass).removeClass(self.config.currentClass);
+ $parent.addClass(self.config.currentClass);
+ },
+
+ bindInterval: function() {
+ var self = this;
+ var docHeight;
+
+ self.$win.on('scroll.onePageNav', function() {
+ self.didScroll = true;
+ });
+
+ self.t = setInterval(function() {
+ docHeight = self.$doc.height();
+
+ //If it was scrolled
+ if(self.didScroll) {
+ self.didScroll = false;
+ self.scrollChange();
+ }
+
+ //If the document height changes
+ if(docHeight !== self.docHeight) {
+ self.docHeight = docHeight;
+ self.getPositions();
+ }
+ }, 250);
+ },
+
+ getHash: function($link) {
+ return $link.attr('href').split('#')[1];
+ },
+
+ getPositions: function() {
+ var self = this;
+ var linkHref;
+ var topPos;
+ var $target;
+
+ self.$nav.each(function() {
+ linkHref = self.getHash($(this));
+ $target = $('#' + linkHref);
+
+ if($target.length) {
+ topPos = $target.offset().top;
+ self.sections[linkHref] = Math.round(topPos);
+ }
+ });
+ },
+
+ getSection: function(windowPos) {
+ var returnValue = null;
+ var windowHeight = Math.round(this.$win.height() * this.config.scrollThreshold);
+
+ for(var section in this.sections) {
+ if((this.sections[section] - windowHeight) < windowPos) {
+ returnValue = section;
+ }
+ }
+
+ return returnValue;
+ },
+
+ handleClick: function(e) {
+ var self = this;
+ var $link = $(e.currentTarget);
+ var $parent = $link.parent();
+ var newLoc = '#' + self.getHash($link);
+
+ if(!$parent.hasClass(self.config.currentClass)) {
+ //Start callback
+ if(self.config.begin) {
+ self.config.begin();
+ }
+
+ //Change the highlighted nav item
+ self.adjustNav(self, $parent);
+
+ //Removing the auto-adjust on scroll
+ self.unbindInterval();
+
+ //Scroll to the correct position
+ self.scrollTo(newLoc, function() {
+ //Do we need to change the hash?
+ if(self.config.changeHash) {
+ window.location.hash = newLoc;
+ }
+
+ //Add the auto-adjust on scroll back in
+ self.bindInterval();
+
+ //End callback
+ if(self.config.end) {
+ self.config.end();
+ }
+ });
+ }
+
+ e.preventDefault();
+ },
+
+ scrollChange: function() {
+ var windowTop = this.$win.scrollTop();
+ var position = this.getSection(windowTop);
+ var $parent;
+
+ //If the position is set
+ if(position !== null) {
+ $parent = this.$elem.find('a[href$="#' + position + '"]').parent();
+
+ //If it's not already the current section
+ if(!$parent.hasClass(this.config.currentClass)) {
+ //Change the highlighted nav item
+ this.adjustNav(this, $parent);
+
+ //If there is a scrollChange callback
+ if(this.config.scrollChange) {
+ this.config.scrollChange($parent);
+ }
+ }
+ }
+ },
+
+ scrollTo: function(target, callback) {
+
+
+ var offset = $(target).offset().top;
+
+ $('html, body').animate({
+ scrollTop: offset
+ }, this.config.scrollSpeed, this.config.easing, callback);
+ },
+
+ unbindInterval: function() {
+ clearInterval(this.t);
+ this.$win.unbind('scroll.onePageNav');
+ }
+ };
+
+ OnePageNav.defaults = OnePageNav.prototype.defaults;
+
+ $.fn.onePageNav = function(options) {
+ return this.each(function() {
+ new OnePageNav(this, options).init();
+ });
+ };
+
+})( jQuery, window , document );
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/jquery.scrollTo.js b/submissions/valkey-ecommerce-demo/documentation/js/jquery.scrollTo.js
new file mode 100644
index 0000000..d9f9b15
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/jquery.scrollTo.js
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) 2007-2014 Ariel Flesler - aflesler
gmailcom | http://flesler.blogspot.com
+ * Licensed under MIT
+ * @author Ariel Flesler
+ * @version 1.4.14
+ */
+;(function(k){'use strict';k(['jquery'],function($){var j=$.scrollTo=function(a,b,c){return $(window).scrollTo(a,b,c)};j.defaults={axis:'xy',duration:0,limit:!0};j.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(f,g,h){if(typeof g=='object'){h=g;g=0}if(typeof h=='function')h={onAfter:h};if(f=='max')f=9e9;h=$.extend({},j.defaults,h);g=g||h.duration;h.queue=h.queue&&h.axis.length>1;if(h.queue)g/=2;h.offset=both(h.offset);h.over=both(h.over);return this._scrollable().each(function(){if(f==null)return;var d=this,$elem=$(d),targ=f,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=win?$(targ):$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}var e=$.isFunction(h.offset)&&h.offset(d,targ)||h.offset;$.each(h.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=j.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(h.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=e[pos]||0;if(h.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*h.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(h.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&h.queue){if(old!=attr[key])animate(h.onAfterFirst);delete attr[key]}});animate(h.onAfter);function animate(a){$elem.animate(attr,g,h.easing,a&&function(){a.call(this,targ,h)})}}).end()};j.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}return j})}(typeof define==='function'&&define.amd?define:function(a,b){if(typeof module!=='undefined'&&module.exports){module.exports=b(require('jquery'))}else{b(jQuery)}}));
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/respond.js b/submissions/valkey-ecommerce-demo/documentation/js/respond.js
new file mode 100644
index 0000000..58883e4
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/respond.js
@@ -0,0 +1,353 @@
+/* Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */
+(function( w ){
+
+ "use strict";
+
+ //exposed namespace
+ var respond = {};
+ w.respond = respond;
+
+ //define update even in native-mq-supporting browsers, to avoid errors
+ respond.update = function(){};
+
+ //define ajax obj
+ var requestQueue = [],
+ xmlHttp = (function() {
+ var xmlhttpmethod = false;
+ try {
+ xmlhttpmethod = new w.XMLHttpRequest();
+ }
+ catch( e ){
+ xmlhttpmethod = new w.ActiveXObject( "Microsoft.XMLHTTP" );
+ }
+ return function(){
+ return xmlhttpmethod;
+ };
+ })(),
+
+ //tweaked Ajax functions from Quirksmode
+ ajax = function( url, callback ) {
+ var req = xmlHttp();
+ if (!req){
+ return;
+ }
+ req.open( "GET", url, true );
+ req.onreadystatechange = function () {
+ if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
+ return;
+ }
+ callback( req.responseText );
+ };
+ if ( req.readyState === 4 ){
+ return;
+ }
+ req.send( null );
+ },
+ isUnsupportedMediaQuery = function( query ) {
+ return query.replace( respond.regex.minmaxwh, '' ).match( respond.regex.other );
+ };
+
+ //expose for testing
+ respond.ajax = ajax;
+ respond.queue = requestQueue;
+ respond.unsupportedmq = isUnsupportedMediaQuery;
+ respond.regex = {
+ media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
+ keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
+ comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
+ urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
+ findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
+ only: /(only\s+)?([a-zA-Z]+)\s?/,
+ minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
+ maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
+ minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
+ other: /\([^\)]*\)/g
+ };
+
+ //expose media query support flag for external use
+ respond.mediaQueriesSupported = w.matchMedia && w.matchMedia( "only all" ) !== null && w.matchMedia( "only all" ).matches;
+
+ //if media queries are supported, exit here
+ if( respond.mediaQueriesSupported ){
+ return;
+ }
+
+ //define vars
+ var doc = w.document,
+ docElem = doc.documentElement,
+ mediastyles = [],
+ rules = [],
+ appendedEls = [],
+ parsedSheets = {},
+ resizeThrottle = 30,
+ head = doc.getElementsByTagName( "head" )[0] || docElem,
+ base = doc.getElementsByTagName( "base" )[0],
+ links = head.getElementsByTagName( "link" ),
+
+ lastCall,
+ resizeDefer,
+
+ //cached container for 1em value, populated the first time it's needed
+ eminpx,
+
+ // returns the value of 1em in pixels
+ getEmValue = function() {
+ var ret,
+ div = doc.createElement('div'),
+ body = doc.body,
+ originalHTMLFontSize = docElem.style.fontSize,
+ originalBodyFontSize = body && body.style.fontSize,
+ fakeUsed = false;
+
+ div.style.cssText = "position:absolute;font-size:1em;width:1em";
+
+ if( !body ){
+ body = fakeUsed = doc.createElement( "body" );
+ body.style.background = "none";
+ }
+
+ // 1em in a media query is the value of the default font size of the browser
+ // reset docElem and body to ensure the correct value is returned
+ docElem.style.fontSize = "100%";
+ body.style.fontSize = "100%";
+
+ body.appendChild( div );
+
+ if( fakeUsed ){
+ docElem.insertBefore( body, docElem.firstChild );
+ }
+
+ ret = div.offsetWidth;
+
+ if( fakeUsed ){
+ docElem.removeChild( body );
+ }
+ else {
+ body.removeChild( div );
+ }
+
+ // restore the original values
+ docElem.style.fontSize = originalHTMLFontSize;
+ if( originalBodyFontSize ) {
+ body.style.fontSize = originalBodyFontSize;
+ }
+
+
+ //also update eminpx before returning
+ ret = eminpx = parseFloat(ret);
+
+ return ret;
+ },
+
+ //enable/disable styles
+ applyMedia = function( fromResize ){
+ var name = "clientWidth",
+ docElemProp = docElem[ name ],
+ currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
+ styleBlocks = {},
+ lastLink = links[ links.length-1 ],
+ now = (new Date()).getTime();
+
+ //throttle resize calls
+ if( fromResize && lastCall && now - lastCall < resizeThrottle ){
+ w.clearTimeout( resizeDefer );
+ resizeDefer = w.setTimeout( applyMedia, resizeThrottle );
+ return;
+ }
+ else {
+ lastCall = now;
+ }
+
+ for( var i in mediastyles ){
+ if( mediastyles.hasOwnProperty( i ) ){
+ var thisstyle = mediastyles[ i ],
+ min = thisstyle.minw,
+ max = thisstyle.maxw,
+ minnull = min === null,
+ maxnull = max === null,
+ em = "em";
+
+ if( !!min ){
+ min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
+ }
+ if( !!max ){
+ max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
+ }
+
+ // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
+ if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
+ if( !styleBlocks[ thisstyle.media ] ){
+ styleBlocks[ thisstyle.media ] = [];
+ }
+ styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
+ }
+ }
+ }
+
+ //remove any existing respond style element(s)
+ for( var j in appendedEls ){
+ if( appendedEls.hasOwnProperty( j ) ){
+ if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
+ head.removeChild( appendedEls[ j ] );
+ }
+ }
+ }
+ appendedEls.length = 0;
+
+ //inject active styles, grouped by media type
+ for( var k in styleBlocks ){
+ if( styleBlocks.hasOwnProperty( k ) ){
+ var ss = doc.createElement( "style" ),
+ css = styleBlocks[ k ].join( "\n" );
+
+ ss.type = "text/css";
+ ss.media = k;
+
+ //originally, ss was appended to a documentFragment and sheets were appended in bulk.
+ //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
+ head.insertBefore( ss, lastLink.nextSibling );
+
+ if ( ss.styleSheet ){
+ ss.styleSheet.cssText = css;
+ }
+ else {
+ ss.appendChild( doc.createTextNode( css ) );
+ }
+
+ //push to appendedEls to track for later removal
+ appendedEls.push( ss );
+ }
+ }
+ },
+ //find media blocks in css text, convert to style blocks
+ translate = function( styles, href, media ){
+ var qs = styles.replace( respond.regex.comments, '' )
+ .replace( respond.regex.keyframes, '' )
+ .match( respond.regex.media ),
+ ql = qs && qs.length || 0;
+
+ //try to get CSS path
+ href = href.substring( 0, href.lastIndexOf( "/" ) );
+
+ var repUrls = function( css ){
+ return css.replace( respond.regex.urls, "$1" + href + "$2$3" );
+ },
+ useMedia = !ql && media;
+
+ //if path exists, tack on trailing slash
+ if( href.length ){ href += "/"; }
+
+ //if no internal queries exist, but media attr does, use that
+ //note: this currently lacks support for situations where a media attr is specified on a link AND
+ //its associated stylesheet has internal CSS media queries.
+ //In those cases, the media attribute will currently be ignored.
+ if( useMedia ){
+ ql = 1;
+ }
+
+ for( var i = 0; i < ql; i++ ){
+ var fullq, thisq, eachq, eql;
+
+ //media attr
+ if( useMedia ){
+ fullq = media;
+ rules.push( repUrls( styles ) );
+ }
+ //parse for styles
+ else{
+ fullq = qs[ i ].match( respond.regex.findStyles ) && RegExp.$1;
+ rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
+ }
+
+ eachq = fullq.split( "," );
+ eql = eachq.length;
+
+ for( var j = 0; j < eql; j++ ){
+ thisq = eachq[ j ];
+
+ if( isUnsupportedMediaQuery( thisq ) ) {
+ continue;
+ }
+
+ mediastyles.push( {
+ media : thisq.split( "(" )[ 0 ].match( respond.regex.only ) && RegExp.$2 || "all",
+ rules : rules.length - 1,
+ hasquery : thisq.indexOf("(") > -1,
+ minw : thisq.match( respond.regex.minw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
+ maxw : thisq.match( respond.regex.maxw ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
+ } );
+ }
+ }
+
+ applyMedia();
+ },
+
+ //recurse through request queue, get css text
+ makeRequests = function(){
+ if( requestQueue.length ){
+ var thisRequest = requestQueue.shift();
+
+ ajax( thisRequest.href, function( styles ){
+ translate( styles, thisRequest.href, thisRequest.media );
+ parsedSheets[ thisRequest.href ] = true;
+
+ // by wrapping recursive function call in setTimeout
+ // we prevent "Stack overflow" error in IE7
+ w.setTimeout(function(){ makeRequests(); },0);
+ } );
+ }
+ },
+
+ //loop stylesheets, send text content to translate
+ ripCSS = function(){
+
+ for( var i = 0; i < links.length; i++ ){
+ var sheet = links[ i ],
+ href = sheet.href,
+ media = sheet.media,
+ isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
+
+ //only links plz and prevent re-parsing
+ if( !!href && isCSS && !parsedSheets[ href ] ){
+ // selectivizr exposes css through the rawCssText expando
+ if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
+ translate( sheet.styleSheet.rawCssText, href, media );
+ parsedSheets[ href ] = true;
+ } else {
+ if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
+ href.replace( RegExp.$1, "" ).split( "/" )[0] === w.location.host ){
+ // IE7 doesn't handle urls that start with '//' for ajax request
+ // manually add in the protocol
+ if ( href.substring(0,2) === "//" ) { href = w.location.protocol + href; }
+ requestQueue.push( {
+ href: href,
+ media: media
+ } );
+ }
+ }
+ }
+ }
+ makeRequests();
+ };
+
+ //translate CSS
+ ripCSS();
+
+ //expose update for re-running respond later on
+ respond.update = ripCSS;
+
+ //expose getEmValue
+ respond.getEmValue = getEmValue;
+
+ //adjust on resize
+ function callMedia(){
+ applyMedia( true );
+ }
+
+ if( w.addEventListener ){
+ w.addEventListener( "resize", callMedia, false );
+ }
+ else if( w.attachEvent ){
+ w.attachEvent( "onresize", callMedia );
+ }
+})(this);
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/script.js b/submissions/valkey-ecommerce-demo/documentation/js/script.js
new file mode 100644
index 0000000..49203e5
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/script.js
@@ -0,0 +1,36 @@
+(function($) {
+
+ "use strict";
+
+
+ //Add OnepageNav / Sidebar
+ function sideNav() {
+ if($('.menu-box .sticky-menu').length){
+ $('.menu-box .sticky-menu ul').onePageNav();
+ }
+ }
+
+ //Add Scroll Bar To Sidebar
+ if($('#sidebar .menu-box').length){
+ $("#sidebar .menu-box").mCustomScrollbar({
+ axis:"y",
+ autoExpandScrollbar:false
+ });
+ }
+
+ //animate to top on Page Refresh
+ $('html, body').animate({
+ scrollTop: $('html, body').offset().top
+ }, 1000);
+
+
+/* ==========================================================================
+ When document is ready, do
+ ========================================================================== */
+
+ $(document).on('ready', function() {
+ sideNav();
+ });
+
+
+})(window.jQuery);
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/documentation/js/scrollbar.js b/submissions/valkey-ecommerce-demo/documentation/js/scrollbar.js
new file mode 100644
index 0000000..3f06584
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/documentation/js/scrollbar.js
@@ -0,0 +1,2169 @@
+/*
+== malihu jquery custom scrollbar plugin ==
+Version: 3.0.4
+Plugin URI: http://manos.malihu.gr/jquery-custom-content-scroller
+Author: malihu
+Author URI: http://manos.malihu.gr
+License: MIT License (MIT)
+*/
+
+/*
+Copyright 2010 Manos Malihutsakis (email: manos@malihu.gr)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+/*
+The code below is fairly long, fully commented and should be normally used in development.
+For production, use either the minified jquery.mCustomScrollbar.min.js script or
+the production-ready jquery.mCustomScrollbar.concat.min.js which contains the plugin
+and dependencies (minified).
+*/
+
+;(function(window,document,undefined){
+
+/* plugin dependencies */
+(function(init){
+ /* support for RequireJS */
+ if(typeof define==="function" && define.amd){
+ define(["jquery", "jquery-mousewheel"], init);
+ }else{
+ var _dlp=("https:"==document.location.protocol) ? "https:" : "http:"; /* dependency location protocol */
+ /* load jquery-mousewheel plugin (via CDN) if it's not present (works when mCustomScrollbar fn is called on window load) */
+ $.event.special.mousewheel || $("head").append(decodeURI("%3Cscript src="+_dlp+"//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.11/jquery.mousewheel.min.js%3E%3C/script%3E"));
+ init(jQuery);
+ }
+}
+
+(function($){
+
+ /*
+ ----------------------------------------
+ PLUGIN NAMESPACE, PREFIX, DEFAULT SELECTOR(S)
+ ----------------------------------------
+ */
+
+ var pluginNS="mCustomScrollbar",
+ pluginPfx="mCS",
+ defaultSelector=".mCustomScrollbar",
+
+
+
+
+
+ /*
+ ----------------------------------------
+ DEFAULT OPTIONS
+ ----------------------------------------
+ */
+
+ defaults={
+ /*
+ set element/content width programmatically
+ values: boolean, pixels, percentage
+ */
+ setWidth:false,
+ /*
+ set element/content height programmatically
+ values: boolean, pixels, percentage
+ */
+ setHeight:false,
+ /*
+ set the initial css top property of content
+ values: string (e.g. "-100px", "10%" etc.)
+ */
+ setTop:0,
+ /*
+ set the initial css left property of content
+ values: string (e.g. "-100px", "10%" etc.)
+ */
+ setLeft:0,
+ /*
+ scrollbar axis (vertical and/or horizontal scrollbars)
+ values (string): "y", "x", "yx"
+ */
+ axis:"y",
+ /*
+ position of scrollbar relative to content
+ values (string): "inside", "outside" ("outside" requires elements with position:relative)
+ */
+ scrollbarPosition:"inside",
+ /*
+ scrolling inertia
+ values: integer (milliseconds)
+ */
+ scrollInertia:950,
+ /*
+ auto-adjust scrollbar dragger length
+ values: boolean
+ */
+ autoDraggerLength:true,
+ /*
+ auto-hide scrollbar when idle
+ values: boolean
+ */
+ autoHideScrollbar:false,
+ /*
+ auto-expands scrollbar on mouse-over and dragging
+ */
+ autoExpandScrollbar:false,
+ /*
+ always show scrollbar, even when there's nothing to scroll
+ values: integer (0=disable, 1=always show dragger rail, 2=always show dragger rail, dragger and buttons), boolean
+ */
+ alwaysShowScrollbar:0,
+ /*
+ scrolling always snaps to a multiple of this number in pixels
+ values: integer
+ */
+ snapAmount:null,
+ /*
+ when snapping, snap with this number in pixels as an offset
+ values: integer
+ */
+ snapOffset:0,
+ /*
+ mouse-wheel scrolling
+ */
+ mouseWheel:{
+ /*
+ enable mouse-wheel scrolling
+ values: boolean
+ */
+ enable:true,
+ /*
+ scrolling amount in pixels
+ values: "auto", integer
+ */
+ scrollAmount:"auto",
+ /*
+ mouse-wheel scrolling axis
+ the default scrolling direction when both vertical and horizontal scrollbars are present
+ values (string): "y", "x"
+ */
+ axis:"y",
+ /*
+ prevent the default behaviour which automatically scrolls the parent element(s)
+ when end of scrolling is reached
+ values: boolean
+ */
+ preventDefault:false,
+ /*
+ the reported mouse-wheel delta value. The number of lines (translated to pixels) one wheel notch scrolls.
+ values: "auto", integer
+ "auto" uses the default OS/browser value
+ */
+ deltaFactor:"auto",
+ /*
+ normalize mouse-wheel delta to -1 or 1 (disables mouse-wheel acceleration)
+ values: boolean
+ */
+ normalizeDelta:false,
+ /*
+ invert mouse-wheel scrolling direction
+ values: boolean
+ */
+ invert:false,
+ /*
+ the tags that disable mouse-wheel when cursor is over them
+ */
+ disableOver:["select","option","keygen","datalist","textarea"]
+ },
+ /*
+ scrollbar buttons
+ */
+ scrollButtons:{
+ /*
+ enable scrollbar buttons
+ values: boolean
+ */
+ enable:false,
+ /*
+ scrollbar buttons scrolling type
+ values (string): "stepless", "stepped"
+ */
+ scrollType:"stepless",
+ /*
+ scrolling amount in pixels
+ values: "auto", integer
+ */
+ scrollAmount:"auto"
+ },
+ /*
+ keyboard scrolling
+ */
+ keyboard:{
+ /*
+ enable scrolling via keyboard
+ values: boolean
+ */
+ enable:true,
+ /*
+ keyboard scrolling type
+ values (string): "stepless", "stepped"
+ */
+ scrollType:"stepless",
+ /*
+ scrolling amount in pixels
+ values: "auto", integer
+ */
+ scrollAmount:"auto"
+ },
+ /*
+ enable content touch-swipe scrolling
+ values: boolean, integer, string (number)
+ integer values define the axis-specific minimum amount required for scrolling momentum
+ */
+ contentTouchScroll:25,
+ /*
+ advanced option parameters
+ */
+ advanced:{
+ /*
+ auto-expand content horizontally (for "x" or "yx" axis)
+ values: boolean
+ */
+ autoExpandHorizontalScroll:false,
+ /*
+ auto-scroll to elements with focus
+ */
+ autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",
+ /*
+ auto-update scrollbars on content, element or viewport resize
+ should be true for fluid layouts/elements, adding/removing content dynamically, hiding/showing elements, content with images etc.
+ values: boolean
+ */
+ updateOnContentResize:true,
+ /*
+ auto-update scrollbars each time each image inside the element is fully loaded
+ values: boolean
+ */
+ updateOnImageLoad:true,
+ /*
+ auto-update scrollbars based on the amount and size changes of specific selectors
+ useful when you need to update the scrollbar(s) automatically, each time a type of element is added, removed or changes its size
+ values: boolean, string (e.g. "ul li" will auto-update scrollbars each time list-items inside the element are changed)
+ a value of true (boolean) will auto-update scrollbars each time any element is changed
+ */
+ updateOnSelectorChange:false
+ },
+ /*
+ scrollbar theme
+ values: string
+ ready-to-use themes: "light", "dark", "light-2", "dark-2", "light-3", "dark-3", "light-thick", "dark-thick", "light-thin", "dark-thin",
+ "rounded", "rounded-dark", "rounded-dots", "rounded-dots-dark", "3d", "3d-dark", "3d-thick", "3d-thick-dark", "minimal", "minimal-dark",
+ "inset", "inset-dark", "inset-2", "inset-2-dark", "inset-3", "inset-3-dark"
+ */
+ theme:"light",
+ /*
+ user defined callback functions
+ */
+ callbacks:{
+ /*
+ function to call when a scroll event starts
+ values (function): function(){}
+ */
+ onScrollStart:false,
+ /*
+ function to call when a scroll event is complete
+ values (function): function(){}
+ */
+ onScroll:false,
+ /*
+ function to call when a scroll event is complete and content is scrolled all the way to the end (bottom/right)
+ values (function): function(){}
+ */
+ onTotalScroll:false,
+ /*
+ function to call when a scroll event is complete and content is scrolled back to the beginning (top/left)
+ values (function): function(){}
+ */
+ onTotalScrollBack:false,
+ /*
+ function to call when a scroll event is running
+ values (function): function(){}
+ */
+ whileScrolling:false,
+ /*
+ onTotalScroll offset value
+ values: integer (pixels)
+ */
+ onTotalScrollOffset:0,
+ /*
+ onTotalScrollBack offset value
+ values: integer (pixels)
+ */
+ onTotalScrollBackOffset:0,
+ /*
+ callback offsets will trigger even if content is already scrolled to the end or beginning
+ values: boolean
+ */
+ alwaysTriggerOffsets:true,
+ /*
+ function to call when content becomes long enough and vertical scrollbar is added
+ values (function): function(){}
+ */
+ onOverflowY:false,
+ /*
+ function to call when content becomes wide enough and horizontal scrollbar is added
+ values (function): function(){}
+ */
+ onOverflowX:false,
+ /*
+ function to call when content becomes short enough and vertical scrollbar is removed
+ values (function): function(){}
+ */
+ onOverflowYNone:false,
+ /*
+ function to call when content becomes narrow enough and horizontal scrollbar is removed
+ values (function): function(){}
+ */
+ onOverflowXNone:false
+ },
+ /*
+ add scrollbar(s) on all elements matching the current selector, now and in the future
+ values: boolean, string
+ string values: "on" (enable), "once" (disable after first invocation), "off" (disable)
+ */
+ live:false,
+ /*
+ the matching set of elements (instead of the current selector) to add scrollbar(s), now and in the future
+ values: string (selector)
+ */
+ liveSelector:null
+ },
+
+
+
+
+
+ /*
+ ----------------------------------------
+ VARS, CONSTANTS
+ ----------------------------------------
+ */
+
+ totalInstances=0, /* plugin instances amount */
+ liveTimers={}, /* live option timers */
+ /* live option timers removal */
+ removeLiveTimers=function(selector){
+ if(liveTimers[selector]){
+ clearTimeout(liveTimers[selector]);
+ functions._delete.call(null,liveTimers[selector]);
+ }
+ },
+ oldIE=(window.attachEvent && !window.addEventListener) ? 1 : 0, /* detect IE < 9 */
+ touchActive=false, /* global touch state (for touch and pointer events) */
+
+
+
+
+
+ /*
+ ----------------------------------------
+ METHODS
+ ----------------------------------------
+ */
+
+ methods={
+
+ /*
+ plugin initialization method
+ creates the scrollbar(s), plugin data object and options
+ ----------------------------------------
+ */
+
+ init:function(options){
+
+ var options=$.extend(true,{},defaults,options),
+ selector=functions._selector.call(this); /* validate selector */
+
+ /*
+ if live option is enabled, monitor for elements matching the current selector and
+ apply scrollbar(s) when found (now and in the future)
+ */
+ if(options.live){
+ var liveSelector=options.liveSelector || this.selector || defaultSelector, /* live selector(s) */
+ $liveSelector=$(liveSelector); /* live selector(s) as jquery object */
+ if(options.live==="off"){
+ /*
+ disable live if requested
+ usage: $(selector).mCustomScrollbar({live:"off"});
+ */
+ removeLiveTimers(liveSelector);
+ return;
+ }
+ liveTimers[liveSelector]=setTimeout(function(){
+ /* call mCustomScrollbar fn on live selector(s) every half-second */
+ $liveSelector.mCustomScrollbar(options);
+ if(options.live==="once" && $liveSelector.length){
+ /* disable live after first invocation */
+ removeLiveTimers(liveSelector);
+ }
+ },500);
+ }else{
+ removeLiveTimers(liveSelector);
+ }
+
+ /* options backward compatibility (for versions < 3.0.0) and normalization */
+ options.setWidth=(options.set_width) ? options.set_width : options.setWidth;
+ options.setHeight=(options.set_height) ? options.set_height : options.setHeight;
+ options.axis=(options.horizontalScroll) ? "x" : functions._findAxis.call(null,options.axis);
+ options.scrollInertia=options.scrollInertia>0 && options.scrollInertia<17 ? 17 : options.scrollInertia;
+ if(typeof options.mouseWheel!=="object" && options.mouseWheel==true){ /* old school mouseWheel option (non-object) */
+ options.mouseWheel={enable:true,scrollAmount:"auto",axis:"y",preventDefault:false,deltaFactor:"auto",normalizeDelta:false,invert:false}
+ }
+ options.mouseWheel.scrollAmount=!options.mouseWheelPixels ? options.mouseWheel.scrollAmount : options.mouseWheelPixels;
+ options.mouseWheel.normalizeDelta=!options.advanced.normalizeMouseWheelDelta ? options.mouseWheel.normalizeDelta : options.advanced.normalizeMouseWheelDelta;
+ options.scrollButtons.scrollType=functions._findScrollButtonsType.call(null,options.scrollButtons.scrollType);
+
+ functions._theme.call(null,options); /* theme-specific options */
+
+ /* plugin constructor */
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if(!$this.data(pluginPfx)){ /* prevent multiple instantiations */
+
+ /* store options and create objects in jquery data */
+ $this.data(pluginPfx,{
+ idx:++totalInstances, /* instance index */
+ opt:options, /* options */
+ scrollRatio:{y:null,x:null}, /* scrollbar to content ratio */
+ overflowed:null, /* overflowed axis */
+ contentReset:{y:null,x:null}, /* object to check when content resets */
+ bindEvents:false, /* object to check if events are bound */
+ tweenRunning:false, /* object to check if tween is running */
+ sequential:{}, /* sequential scrolling object */
+ langDir:$this.css("direction"), /* detect/store direction (ltr or rtl) */
+ cbOffsets:null, /* object to check whether callback offsets always trigger */
+ /*
+ object to check how scrolling events where last triggered
+ "internal" (default - triggered by this script), "external" (triggered by other scripts, e.g. via scrollTo method)
+ usage: object.data("mCS").trigger
+ */
+ trigger:null
+ });
+
+ /* HTML data attributes */
+ var o=$this.data(pluginPfx).opt,
+ htmlDataAxis=$this.data("mcs-axis"),htmlDataSbPos=$this.data("mcs-scrollbar-position"),htmlDataTheme=$this.data("mcs-theme");
+ if(htmlDataAxis){o.axis=htmlDataAxis;} /* usage example: data-mcs-axis="y" */
+ if(htmlDataSbPos){o.scrollbarPosition=htmlDataSbPos;} /* usage example: data-mcs-scrollbar-position="outside" */
+ if(htmlDataTheme){ /* usage example: data-mcs-theme="minimal" */
+ o.theme=htmlDataTheme;
+ functions._theme.call(null,o); /* theme-specific options */
+ }
+
+ functions._pluginMarkup.call(this); /* add plugin markup */
+
+ methods.update.call(null,$this); /* call the update method */
+
+ }
+
+ });
+
+ },
+ /* ---------------------------------------- */
+
+
+
+ /*
+ plugin update method
+ updates content and scrollbar(s) values, events and status
+ ----------------------------------------
+ usage: $(selector).mCustomScrollbar("update");
+ */
+
+ update:function(el){
+
+ var selector=el || functions._selector.call(this); /* validate selector */
+
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if($this.data(pluginPfx)){ /* check if plugin has initialized */
+
+ var d=$this.data(pluginPfx),o=d.opt,
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")];
+
+ if(!mCSB_container.length){return;}
+
+ if(d.tweenRunning){functions._stop.call(null,$this);} /* stop any running tweens while updating */
+
+ /* if element was disabled or destroyed, remove class(es) */
+ if($this.hasClass("mCS_disabled")){$this.removeClass("mCS_disabled");}
+ if($this.hasClass("mCS_destroyed")){$this.removeClass("mCS_destroyed");}
+
+ functions._maxHeight.call(this); /* detect/set css max-height value */
+
+ functions._expandContentHorizontally.call(this); /* expand content horizontally */
+
+ if(o.axis!=="y" && !o.advanced.autoExpandHorizontalScroll){
+ mCSB_container.css("width",functions._contentWidth(mCSB_container.children()));
+ }
+
+ d.overflowed=functions._overflowed.call(this); /* determine if scrolling is required */
+
+ functions._scrollbarVisibility.call(this); /* show/hide scrollbar(s) */
+
+ /* auto-adjust scrollbar dragger length analogous to content */
+ if(o.autoDraggerLength){functions._setDraggerLength.call(this);}
+
+ functions._scrollRatio.call(this); /* calculate and store scrollbar to content ratio */
+
+ functions._bindEvents.call(this); /* bind scrollbar events */
+
+ /* reset scrolling position and/or events */
+ var to=[Math.abs(mCSB_container[0].offsetTop),Math.abs(mCSB_container[0].offsetLeft)];
+ if(o.axis!=="x"){ /* y/yx axis */
+ if(!d.overflowed[0]){ /* y scrolling is not required */
+ functions._resetContentPosition.call(this); /* reset content position */
+ if(o.axis==="y"){
+ functions._unbindEvents.call(this);
+ }else if(o.axis==="yx" && d.overflowed[1]){
+ functions._scrollTo.call(this,$this,to[1].toString(),{dir:"x",dur:0,overwrite:"none"});
+ }
+ }else if(mCSB_dragger[0].height()>mCSB_dragger[0].parent().height()){
+ functions._resetContentPosition.call(this); /* reset content position */
+ }else{ /* y scrolling is required */
+ functions._scrollTo.call(this,$this,to[0].toString(),{dir:"y",dur:0,overwrite:"none"});
+ d.contentReset.y=null;
+ }
+ }
+ if(o.axis!=="y"){ /* x/yx axis */
+ if(!d.overflowed[1]){ /* x scrolling is not required */
+ functions._resetContentPosition.call(this); /* reset content position */
+ if(o.axis==="x"){
+ functions._unbindEvents.call(this);
+ }else if(o.axis==="yx" && d.overflowed[0]){
+ functions._scrollTo.call(this,$this,to[0].toString(),{dir:"y",dur:0,overwrite:"none"});
+ }
+ }else if(mCSB_dragger[1].width()>mCSB_dragger[1].parent().width()){
+ functions._resetContentPosition.call(this); /* reset content position */
+ }else{ /* x scrolling is required */
+ functions._scrollTo.call(this,$this,to[1].toString(),{dir:"x",dur:0,overwrite:"none"});
+ d.contentReset.x=null;
+ }
+ }
+
+ functions._autoUpdate.call(this); /* initialize automatic updating (for dynamic content, fluid layouts etc.) */
+
+ }
+
+ });
+
+ },
+ /* ---------------------------------------- */
+
+
+
+ /*
+ plugin scrollTo method
+ triggers a scrolling event to a specific value
+ ----------------------------------------
+ usage: $(selector).mCustomScrollbar("scrollTo",value,options);
+ */
+
+ scrollTo:function(val,options){
+
+ /* prevent silly things like $(selector).mCustomScrollbar("scrollTo",undefined); */
+ if(typeof val=="undefined" || val==null){return;}
+
+ var selector=functions._selector.call(this); /* validate selector */
+
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if($this.data(pluginPfx)){ /* check if plugin has initialized */
+
+ var d=$this.data(pluginPfx),o=d.opt,
+ /* method default options */
+ methodDefaults={
+ trigger:"external", /* method is by default triggered externally (e.g. from other scripts) */
+ scrollInertia:o.scrollInertia, /* scrolling inertia (animation duration) */
+ scrollEasing:"mcsEaseInOut", /* animation easing */
+ moveDragger:false, /* move dragger instead of content */
+ timeout:60, /* scroll-to delay */
+ callbacks:true, /* enable/disable callbacks */
+ onStart:true,
+ onUpdate:true,
+ onComplete:true
+ },
+ methodOptions=$.extend(true,{},methodDefaults,options),
+ to=functions._arr.call(this,val),dur=methodOptions.scrollInertia>0 && methodOptions.scrollInertia<17 ? 17 : methodOptions.scrollInertia;
+
+ /* translate yx values to actual scroll-to positions */
+ to[0]=functions._to.call(this,to[0],"y");
+ to[1]=functions._to.call(this,to[1],"x");
+
+ /*
+ check if scroll-to value moves the dragger instead of content.
+ Only pixel values apply on dragger (e.g. 100, "100px", "-=100" etc.)
+ */
+ if(methodOptions.moveDragger){
+ to[0]*=d.scrollRatio.y;
+ to[1]*=d.scrollRatio.x;
+ }
+
+ methodOptions.dur=dur;
+
+ setTimeout(function(){
+ /* do the scrolling */
+ if(to[0]!==null && typeof to[0]!=="undefined" && o.axis!=="x" && d.overflowed[0]){ /* scroll y */
+ methodOptions.dir="y";
+ methodOptions.overwrite="all";
+ functions._scrollTo.call(this,$this,to[0].toString(),methodOptions);
+ }
+ if(to[1]!==null && typeof to[1]!=="undefined" && o.axis!=="y" && d.overflowed[1]){ /* scroll x */
+ methodOptions.dir="x";
+ methodOptions.overwrite="none";
+ functions._scrollTo.call(this,$this,to[1].toString(),methodOptions);
+ }
+ },methodOptions.timeout);
+
+ }
+
+ });
+
+ },
+ /* ---------------------------------------- */
+
+
+
+ /*
+ plugin stop method
+ stops scrolling animation
+ ----------------------------------------
+ usage: $(selector).mCustomScrollbar("stop");
+ */
+ stop:function(){
+
+ var selector=functions._selector.call(this); /* validate selector */
+
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if($this.data(pluginPfx)){ /* check if plugin has initialized */
+
+ functions._stop.call(null,$this);
+
+ }
+
+ });
+
+ },
+ /* ---------------------------------------- */
+
+
+
+ /*
+ plugin disable method
+ temporarily disables the scrollbar(s)
+ ----------------------------------------
+ usage: $(selector).mCustomScrollbar("disable",reset);
+ reset (boolean): resets content position to 0
+ */
+ disable:function(r){
+
+ var selector=functions._selector.call(this); /* validate selector */
+
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if($this.data(pluginPfx)){ /* check if plugin has initialized */
+
+ var d=$this.data(pluginPfx),o=d.opt;
+
+ functions._autoUpdate.call(this,"remove"); /* remove automatic updating */
+
+ functions._unbindEvents.call(this); /* unbind events */
+
+ if(r){functions._resetContentPosition.call(this);} /* reset content position */
+
+ functions._scrollbarVisibility.call(this,true); /* show/hide scrollbar(s) */
+
+ $this.addClass("mCS_disabled"); /* add disable class */
+
+ }
+
+ });
+
+ },
+ /* ---------------------------------------- */
+
+
+
+ /*
+ plugin destroy method
+ completely removes the scrollbar(s) and returns the element to its original state
+ ----------------------------------------
+ usage: $(selector).mCustomScrollbar("destroy");
+ */
+ destroy:function(){
+
+ var selector=functions._selector.call(this); /* validate selector */
+
+ return $(selector).each(function(){
+
+ var $this=$(this);
+
+ if($this.data(pluginPfx)){ /* check if plugin has initialized */
+
+ var d=$this.data(pluginPfx),o=d.opt,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ scrollbar=$(".mCSB_"+d.idx+"_scrollbar");
+
+ if(o.live){removeLiveTimers(selector);} /* remove live timer */
+
+ functions._autoUpdate.call(this,"remove"); /* remove automatic updating */
+
+ functions._unbindEvents.call(this); /* unbind events */
+
+ functions._resetContentPosition.call(this); /* reset content position */
+
+ $this.removeData(pluginPfx); /* remove plugin data object */
+
+ functions._delete.call(null,this.mcs); /* delete callbacks object */
+
+ /* remove plugin markup */
+ scrollbar.remove(); /* remove scrollbar(s) first (those can be either inside or outside plugin's inner wrapper) */
+ mCustomScrollBox.replaceWith(mCSB_container.contents()); /* replace plugin's inner wrapper with the original content */
+ /* remove plugin classes from the element and add destroy class */
+ $this.removeClass(pluginNS+" _"+pluginPfx+"_"+d.idx+" mCS-autoHide mCS-dir-rtl mCS_no_scrollbar mCS_disabled").addClass("mCS_destroyed");
+
+ }
+
+ });
+
+ }
+ /* ---------------------------------------- */
+
+ },
+
+
+
+
+
+ /*
+ ----------------------------------------
+ FUNCTIONS
+ ----------------------------------------
+ */
+
+ functions={
+
+ /* validates selector (if selector is invalid or undefined uses the default one) */
+ _selector:function(){
+ return (typeof $(this)!=="object" || $(this).length<1) ? defaultSelector : this;
+ },
+ /* -------------------- */
+
+ /* changes options according to theme */
+ _theme:function(obj){
+ var fixedSizeScrollbarThemes=["rounded","rounded-dark","rounded-dots","rounded-dots-dark"],
+ nonExpandedScrollbarThemes=["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"],
+ disabledScrollButtonsThemes=["minimal","minimal-dark"],
+ enabledAutoHideScrollbarThemes=["minimal","minimal-dark"],
+ scrollbarPositionOutsideThemes=["minimal","minimal-dark"];
+ obj.autoDraggerLength=$.inArray(obj.theme,fixedSizeScrollbarThemes) > -1 ? false : obj.autoDraggerLength;
+ obj.autoExpandScrollbar=$.inArray(obj.theme,nonExpandedScrollbarThemes) > -1 ? false : obj.autoExpandScrollbar;
+ obj.scrollButtons.enable=$.inArray(obj.theme,disabledScrollButtonsThemes) > -1 ? false : obj.scrollButtons.enable;
+ obj.autoHideScrollbar=$.inArray(obj.theme,enabledAutoHideScrollbarThemes) > -1 ? true : obj.autoHideScrollbar;
+ obj.scrollbarPosition=$.inArray(obj.theme,scrollbarPositionOutsideThemes) > -1 ? "outside" : obj.scrollbarPosition;
+ },
+ /* -------------------- */
+
+
+ /* normalizes axis option to valid values: "y", "x", "yx" */
+ _findAxis:function(val){
+ return (val==="yx" || val==="xy" || val==="auto") ? "yx" : (val==="x" || val==="horizontal") ? "x" : "y";
+ },
+ /* -------------------- */
+
+
+ /* normalizes scrollButtons.scrollType option to valid values: "stepless", "stepped" */
+ _findScrollButtonsType:function(val){
+ return (val==="stepped" || val==="pixels" || val==="step" || val==="click") ? "stepped" : "stepless";
+ },
+ /* -------------------- */
+
+
+ /* generates plugin markup */
+ _pluginMarkup:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ expandClass=o.autoExpandScrollbar ? " mCSB_scrollTools_onDrag_expand" : "",
+ scrollbar=["",""],
+ wrapperClass=o.axis==="yx" ? "mCSB_vertical_horizontal" : o.axis==="x" ? "mCSB_horizontal" : "mCSB_vertical",
+ scrollbars=o.axis==="yx" ? scrollbar[0]+scrollbar[1] : o.axis==="x" ? scrollbar[1] : scrollbar[0],
+ contentWrapper=o.axis==="yx" ? "
" : "",
+ autoHideClass=o.autoHideScrollbar ? " mCS-autoHide" : "",
+ scrollbarDirClass=(o.axis!=="x" && d.langDir==="rtl") ? " mCS-dir-rtl" : "";
+ if(o.setWidth){$this.css("width",o.setWidth);} /* set element width */
+ if(o.setHeight){$this.css("height",o.setHeight);} /* set element height */
+ o.setLeft=(o.axis!=="y" && d.langDir==="rtl") ? "989999px" : o.setLeft; /* adjust left position for rtl direction */
+ $this.addClass(pluginNS+" _"+pluginPfx+"_"+d.idx+autoHideClass+scrollbarDirClass).wrapInner("");
+ var mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container");
+ if(o.axis!=="y" && !o.advanced.autoExpandHorizontalScroll){
+ mCSB_container.css("width",functions._contentWidth(mCSB_container.children()));
+ }
+ if(o.scrollbarPosition==="outside"){
+ if($this.css("position")==="static"){ /* requires elements with non-static position */
+ $this.css("position","relative");
+ }
+ $this.css("overflow","visible");
+ mCustomScrollBox.addClass("mCSB_outside").after(scrollbars);
+ }else{
+ mCustomScrollBox.addClass("mCSB_inside").append(scrollbars);
+ mCSB_container.wrap(contentWrapper);
+ }
+ functions._scrollButtons.call(this); /* add scrollbar buttons */
+ /* minimum dragger length */
+ var mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")];
+ mCSB_dragger[0].css("min-height",mCSB_dragger[0].height());
+ mCSB_dragger[1].css("min-width",mCSB_dragger[1].width());
+ },
+ /* -------------------- */
+
+
+ /* calculates content width */
+ _contentWidth:function(el){
+ return Math.max.apply(Math,el.map(function(){return $(this).outerWidth(true);}).get());
+ },
+ /* -------------------- */
+
+
+ /* expands content horizontally */
+ _expandContentHorizontally:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCSB_container=$("#mCSB_"+d.idx+"_container");
+ if(o.advanced.autoExpandHorizontalScroll && o.axis!=="y"){
+ /*
+ wrap content with an infinite width div and set its position to absolute and width to auto.
+ Setting width to auto before calculating the actual width is important!
+ We must let the browser set the width as browser zoom values are impossible to calculate.
+ */
+ mCSB_container.css({"position":"absolute","width":"auto"})
+ .wrap("
")
+ .css({ /* set actual width, original position and un-wrap */
+ /*
+ get the exact width (with decimals) and then round-up.
+ Using jquery outerWidth() will round the width value which will mess up with inner elements that have non-integer width
+ */
+ "width":(Math.ceil(mCSB_container[0].getBoundingClientRect().right+0.4)-Math.floor(mCSB_container[0].getBoundingClientRect().left)),
+ "position":"relative"
+ }).unwrap();
+ }
+ },
+ /* -------------------- */
+
+
+ /* adds scrollbar buttons */
+ _scrollButtons:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCSB_scrollTools=$(".mCSB_"+d.idx+"_scrollbar:first"),
+ btnHTML=[
+ " "," ",
+ " "," "
+ ],
+ btn=[(o.axis==="x" ? btnHTML[2] : btnHTML[0]),(o.axis==="x" ? btnHTML[3] : btnHTML[1]),btnHTML[2],btnHTML[3]];
+ if(o.scrollButtons.enable){
+ mCSB_scrollTools.prepend(btn[0]).append(btn[1]).next(".mCSB_scrollTools").prepend(btn[2]).append(btn[3]);
+ }
+ },
+ /* -------------------- */
+
+
+ /* detects/sets css max-height value */
+ _maxHeight:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mh=$this.css("max-height"),pct=mh.indexOf("%")!==-1,
+ bs=$this.css("box-sizing");
+ if(mh!=="none"){
+ var val=pct ? $this.parent().height()*parseInt(mh)/100 : parseInt(mh);
+ /* if element's css box-sizing is "border-box", subtract any paddings and/or borders from max-height value */
+ if(bs==="border-box"){val-=(($this.innerHeight()-$this.height())+($this.outerHeight()-$this.innerHeight()));}
+ mCustomScrollBox.css("max-height",Math.round(val));
+ }
+ },
+ /* -------------------- */
+
+
+ /* auto-adjusts scrollbar dragger length */
+ _setDraggerLength:function(){
+ var $this=$(this),d=$this.data(pluginPfx),
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")],
+ ratio=[mCustomScrollBox.height()/mCSB_container.outerHeight(false),mCustomScrollBox.width()/mCSB_container.outerWidth(false)],
+ l=[
+ parseInt(mCSB_dragger[0].css("min-height")),Math.round(ratio[0]*mCSB_dragger[0].parent().height()),
+ parseInt(mCSB_dragger[1].css("min-width")),Math.round(ratio[1]*mCSB_dragger[1].parent().width())
+ ],
+ h=oldIE && (l[1]mCustomScrollBox.height(),contentWidth>mCustomScrollBox.width()];
+ },
+ /* -------------------- */
+
+
+ /* resets content position to 0 */
+ _resetContentPosition:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")];
+ functions._stop($this); /* stop any current scrolling before resetting */
+ if((o.axis!=="x" && !d.overflowed[0]) || (o.axis==="y" && d.overflowed[0])){ /* reset y */
+ mCSB_dragger[0].add(mCSB_container).css("top",0);
+ functions._scrollTo($this,"_resetY");
+ }
+ if((o.axis!=="y" && !d.overflowed[1]) || (o.axis==="x" && d.overflowed[1])){ /* reset x */
+ var cx=dx=0;
+ if(d.langDir==="rtl"){ /* adjust left position for rtl direction */
+ cx=mCustomScrollBox.width()-mCSB_container.outerWidth(false);
+ dx=Math.abs(cx/d.scrollRatio.x);
+ }
+ mCSB_container.css("left",cx);
+ mCSB_dragger[1].css("left",dx);
+ functions._scrollTo($this,"_resetX");
+ }
+ },
+ /* -------------------- */
+
+
+ /* binds scrollbar events */
+ _bindEvents:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt;
+ if(!d.bindEvents){ /* check if events are already bound */
+ functions._draggable.call(this);
+ if(o.contentTouchScroll){functions._contentDraggable.call(this);}
+ if(o.mouseWheel.enable){ /* bind mousewheel fn when plugin is available */
+ function _mwt(){
+ mousewheelTimeout=setTimeout(function(){
+ if(!$.event.special.mousewheel){
+ _mwt();
+ }else{
+ clearTimeout(mousewheelTimeout);
+ functions._mousewheel.call($this[0]);
+ }
+ },1000);
+ }
+ var mousewheelTimeout;
+ _mwt();
+ }
+ functions._draggerRail.call(this);
+ functions._wrapperScroll.call(this);
+ if(o.advanced.autoScrollOnFocus){functions._focus.call(this);}
+ if(o.scrollButtons.enable){functions._buttons.call(this);}
+ if(o.keyboard.enable){functions._keyboard.call(this);}
+ d.bindEvents=true;
+ }
+ },
+ /* -------------------- */
+
+
+ /* unbinds scrollbar events */
+ _unbindEvents:function(){
+ var $this=$(this),d=$this.data(pluginPfx),
+ namespace=pluginPfx+"_"+d.idx,
+ sb=".mCSB_"+d.idx+"_scrollbar",
+ sel=$("#mCSB_"+d.idx+",#mCSB_"+d.idx+"_container,#mCSB_"+d.idx+"_container_wrapper,"+sb+" .mCSB_draggerContainer,#mCSB_"+d.idx+"_dragger_vertical,#mCSB_"+d.idx+"_dragger_horizontal,"+sb+">a"),
+ mCSB_container=$("#mCSB_"+d.idx+"_container");
+ if(d.bindEvents){ /* check if events are bound */
+ /* unbind namespaced events from document/selectors */
+ $(document).unbind("."+namespace);
+ sel.each(function(){
+ $(this).unbind("."+namespace);
+ });
+ /* clear and delete timeouts/objects */
+ clearTimeout($this[0]._focusTimeout); functions._delete.call(null,$this[0]._focusTimeout);
+ clearTimeout(d.sequential.step); functions._delete.call(null,d.sequential.step);
+ clearTimeout(mCSB_container[0].onCompleteTimeout); functions._delete.call(null,mCSB_container[0].onCompleteTimeout);
+ d.bindEvents=false;
+ }
+ },
+ /* -------------------- */
+
+
+ /* toggles scrollbar visibility */
+ _scrollbarVisibility:function(disabled){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ contentWrapper=$("#mCSB_"+d.idx+"_container_wrapper"),
+ content=contentWrapper.length ? contentWrapper : $("#mCSB_"+d.idx+"_container"),
+ scrollbar=[$("#mCSB_"+d.idx+"_scrollbar_vertical"),$("#mCSB_"+d.idx+"_scrollbar_horizontal")],
+ mCSB_dragger=[scrollbar[0].find(".mCSB_dragger"),scrollbar[1].find(".mCSB_dragger")];
+ if(o.axis!=="x"){
+ if(d.overflowed[0] && !disabled){
+ scrollbar[0].add(mCSB_dragger[0]).add(scrollbar[0].children("a")).css("display","block");
+ content.removeClass("mCS_no_scrollbar_y mCS_y_hidden");
+ }else{
+ if(o.alwaysShowScrollbar){
+ if(o.alwaysShowScrollbar!==2){mCSB_dragger[0].add(scrollbar[0].children("a")).css("display","none");}
+ content.removeClass("mCS_y_hidden");
+ }else{
+ scrollbar[0].css("display","none");
+ content.addClass("mCS_y_hidden");
+ }
+ content.addClass("mCS_no_scrollbar_y");
+ }
+ }
+ if(o.axis!=="y"){
+ if(d.overflowed[1] && !disabled){
+ scrollbar[1].add(mCSB_dragger[1]).add(scrollbar[1].children("a")).css("display","block");
+ content.removeClass("mCS_no_scrollbar_x mCS_x_hidden");
+ }else{
+ if(o.alwaysShowScrollbar){
+ if(o.alwaysShowScrollbar!==2){mCSB_dragger[1].add(scrollbar[1].children("a")).css("display","none");}
+ content.removeClass("mCS_x_hidden");
+ }else{
+ scrollbar[1].css("display","none");
+ content.addClass("mCS_x_hidden");
+ }
+ content.addClass("mCS_no_scrollbar_x");
+ }
+ }
+ if(!d.overflowed[0] && !d.overflowed[1]){
+ $this.addClass("mCS_no_scrollbar");
+ }else{
+ $this.removeClass("mCS_no_scrollbar");
+ }
+ },
+ /* -------------------- */
+
+
+ /* returns input coordinates of pointer, touch and mouse events (relative to document) */
+ _coordinates:function(e){
+ var t=e.type;
+ switch(t){
+ case "pointerdown": case "MSPointerDown": case "pointermove": case "MSPointerMove": case "pointerup": case "MSPointerUp":
+ return [e.originalEvent.pageY,e.originalEvent.pageX];
+ break;
+ case "touchstart": case "touchmove": case "touchend":
+ var touch=e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
+ return [touch.pageY,touch.pageX];
+ break;
+ default:
+ return [e.pageY,e.pageX];
+ }
+ },
+ /* -------------------- */
+
+
+ /*
+ SCROLLBAR DRAG EVENTS
+ scrolls content via scrollbar dragging
+ */
+ _draggable:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ namespace=pluginPfx+"_"+d.idx,
+ draggerId=["mCSB_"+d.idx+"_dragger_vertical","mCSB_"+d.idx+"_dragger_horizontal"],
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ mCSB_dragger=$("#"+draggerId[0]+",#"+draggerId[1]),
+ draggable,dragY,dragX;
+ mCSB_dragger.bind("mousedown."+namespace+" touchstart."+namespace+" pointerdown."+namespace+" MSPointerDown."+namespace,function(e){
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ if(!functions._mouseBtnLeft(e)){return;} /* left mouse button only */
+ touchActive=true;
+ if(oldIE){document.onselectstart=function(){return false;}} /* disable text selection for IE < 9 */
+ _iframe(false); /* enable scrollbar dragging over iframes by disabling their events */
+ functions._stop($this);
+ draggable=$(this);
+ var offset=draggable.offset(),y=functions._coordinates(e)[0]-offset.top,x=functions._coordinates(e)[1]-offset.left,
+ h=draggable.height()+offset.top,w=draggable.width()+offset.left;
+ if(y0 && x0){
+ dragY=y;
+ dragX=x;
+ }
+ functions._onDragClasses(draggable,"active",o.autoExpandScrollbar);
+ }).bind("touchmove."+namespace,function(e){
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ var offset=draggable.offset(),y=functions._coordinates(e)[0]-offset.top,x=functions._coordinates(e)[1]-offset.left;
+ _drag(dragY,dragX,y,x);
+ });
+ $(document).bind("mousemove."+namespace+" pointermove."+namespace+" MSPointerMove."+namespace,function(e){
+ if(draggable){
+ var offset=draggable.offset(),y=functions._coordinates(e)[0]-offset.top,x=functions._coordinates(e)[1]-offset.left;
+ if(dragY===y){return;} /* has it really moved? */
+ _drag(dragY,dragX,y,x);
+ }
+ }).add(mCSB_dragger).bind("mouseup."+namespace+" touchend."+namespace+" pointerup."+namespace+" MSPointerUp."+namespace,function(e){
+ if(draggable){
+ functions._onDragClasses(draggable,"active",o.autoExpandScrollbar);
+ draggable=null;
+ }
+ touchActive=false;
+ if(oldIE){document.onselectstart=null;} /* enable text selection for IE < 9 */
+ _iframe(true); /* enable iframes events */
+ });
+ function _iframe(evt){
+ var el=mCSB_container.find("iframe");
+ if(!el.length){return;} /* check if content contains iframes */
+ var val=!evt ? "none" : "auto";
+ el.css("pointer-events",val); /* for IE11, iframe's display property should not be "block" */
+ }
+ function _drag(dragY,dragX,y,x){
+ mCSB_container[0].idleTimer=o.scrollInertia<233 ? 250 : 0;
+ if(draggable.attr("id")===draggerId[1]){
+ var dir="x",to=((draggable[0].offsetLeft-dragX)+x)*d.scrollRatio.x;
+ }else{
+ var dir="y",to=((draggable[0].offsetTop-dragY)+y)*d.scrollRatio.y;
+ }
+ functions._scrollTo($this,to.toString(),{dir:dir,drag:true});
+ }
+ },
+ /* -------------------- */
+
+
+ /*
+ TOUCH SWIPE EVENTS
+ scrolls content via touch swipe
+ Emulates the native touch-swipe scrolling with momentum found in iOS, Android and WP devices
+ */
+ _contentDraggable:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ namespace=pluginPfx+"_"+d.idx,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")],
+ dragY,dragX,touchStartY,touchStartX,touchMoveY=[],touchMoveX=[],startTime,runningTime,endTime,distance,speed,amount,
+ durA=0,durB,overwrite=o.axis==="yx" ? "none" : "all";
+ mCSB_container.bind("touchstart."+namespace+" pointerdown."+namespace+" MSPointerDown."+namespace,function(e){
+ if(!functions._pointerTouch(e) || touchActive){return;}
+ var offset=mCSB_container.offset();
+ dragY=functions._coordinates(e)[0]-offset.top;
+ dragX=functions._coordinates(e)[1]-offset.left;
+ }).bind("touchmove."+namespace+" pointermove."+namespace+" MSPointerMove."+namespace,function(e){
+ if(!functions._pointerTouch(e) || touchActive){return;}
+ e.stopImmediatePropagation();
+ runningTime=functions._getTime();
+ var offset=mCustomScrollBox.offset(),y=functions._coordinates(e)[0]-offset.top,x=functions._coordinates(e)[1]-offset.left,
+ easing="mcsLinearOut";
+ touchMoveY.push(y);
+ touchMoveX.push(x);
+ if(d.overflowed[0]){
+ var limit=mCSB_dragger[0].parent().height()-mCSB_dragger[0].height(),
+ prevent=((dragY-y)>0 && (y-dragY)>-(limit*d.scrollRatio.y));
+ }
+ if(d.overflowed[1]){
+ var limitX=mCSB_dragger[1].parent().width()-mCSB_dragger[1].width(),
+ preventX=((dragX-x)>0 && (x-dragX)>-(limitX*d.scrollRatio.x));
+ }
+ if(prevent || preventX){e.preventDefault();} /* prevent native document scrolling */
+ amount=o.axis==="yx" ? [(dragY-y),(dragX-x)] : o.axis==="x" ? [null,(dragX-x)] : [(dragY-y),null];
+ mCSB_container[0].idleTimer=250;
+ if(d.overflowed[0]){_drag(amount[0],durA,easing,"y","all",true);}
+ if(d.overflowed[1]){_drag(amount[1],durA,easing,"x",overwrite,true);}
+ });
+ mCustomScrollBox.bind("touchstart."+namespace+" pointerdown."+namespace+" MSPointerDown."+namespace,function(e){
+ if(!functions._pointerTouch(e) || touchActive){return;}
+ e.stopImmediatePropagation();
+ functions._stop($this);
+ startTime=functions._getTime();
+ var offset=mCustomScrollBox.offset();
+ touchStartY=functions._coordinates(e)[0]-offset.top;
+ touchStartX=functions._coordinates(e)[1]-offset.left;
+ touchMoveY=[]; touchMoveX=[];
+ }).bind("touchend."+namespace+" pointerup."+namespace+" MSPointerUp."+namespace,function(e){
+ if(!functions._pointerTouch(e) || touchActive){return;}
+ e.stopImmediatePropagation();
+ endTime=functions._getTime();
+ var offset=mCustomScrollBox.offset(),y=functions._coordinates(e)[0]-offset.top,x=functions._coordinates(e)[1]-offset.left;
+ if((endTime-runningTime)>30){return;}
+ speed=1000/(endTime-startTime);
+ var easing="mcsEaseOut",slow=speed<2.5,
+ diff=slow ? [touchMoveY[touchMoveY.length-2],touchMoveX[touchMoveX.length-2]] : [0,0];
+ distance=slow ? [(y-diff[0]),(x-diff[1])] : [y-touchStartY,x-touchStartX];
+ var absDistance=[Math.abs(distance[0]),Math.abs(distance[1])];
+ speed=slow ? [Math.abs(distance[0]/4),Math.abs(distance[1]/4)] : [speed,speed];
+ var a=[
+ Math.abs(mCSB_container[0].offsetTop)-(distance[0]*_m((absDistance[0]/speed[0]),speed[0])),
+ Math.abs(mCSB_container[0].offsetLeft)-(distance[1]*_m((absDistance[1]/speed[1]),speed[1]))
+ ];
+ amount=o.axis==="yx" ? [a[0],a[1]] : o.axis==="x" ? [null,a[1]] : [a[0],null];
+ durB=[(absDistance[0]*4)+o.scrollInertia,(absDistance[1]*4)+o.scrollInertia];
+ var md=parseInt(o.contentTouchScroll) || 0; /* absolute minimum distance required */
+ amount[0]=absDistance[0]>md ? amount[0] : 0;
+ amount[1]=absDistance[1]>md ? amount[1] : 0;
+ if(d.overflowed[0]){_drag(amount[0],durB[0],easing,"y",overwrite,false);}
+ if(d.overflowed[1]){_drag(amount[1],durB[1],easing,"x",overwrite,false);}
+ });
+ function _m(ds,s){
+ var r=[s*1.5,s*2,s/1.5,s/2];
+ if(ds>90){
+ return s>4 ? r[0] : r[3];
+ }else if(ds>60){
+ return s>3 ? r[3] : r[2];
+ }else if(ds>30){
+ return s>8 ? r[1] : s>6 ? r[0] : s>4 ? s : r[2];
+ }else{
+ return s>8 ? s : r[3];
+ }
+ }
+ function _drag(amount,dur,easing,dir,overwrite,drag){
+ if(!amount){return;}
+ functions._scrollTo($this,amount.toString(),{dur:dur,scrollEasing:easing,dir:dir,overwrite:overwrite,drag:drag});
+ }
+ },
+ /* -------------------- */
+
+
+ /*
+ MOUSE WHEEL EVENT
+ scrolls content via mouse-wheel
+ via mouse-wheel plugin (https://github.com/brandonaaron/jquery-mousewheel)
+ */
+ _mousewheel:function(){
+ var $this=$(this),d=$this.data(pluginPfx);
+ if(d){ /* Check if the scrollbar is ready to use mousewheel events (issue: #185) */
+ var o=d.opt,
+ namespace=pluginPfx+"_"+d.idx,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_dragger=[$("#mCSB_"+d.idx+"_dragger_vertical"),$("#mCSB_"+d.idx+"_dragger_horizontal")],
+ iframe=$("#mCSB_"+d.idx+"_container").find("iframe"),
+ el=mCustomScrollBox /* mousewheel element selector */;
+ /* check for cross domain iframes and bind mousewheel event on them in addition to default mousewheel element selector */
+ if(iframe.length){
+ iframe.each(function(){
+ var iFobj=this;
+ if(_canAccessIFrame(iFobj)){ /* check if iframe can be accessed */
+ el=el.add($(iFobj).contents().find("body"));
+ }
+ });
+ }
+ el.bind("mousewheel."+namespace,function(e,delta){
+ functions._stop($this);
+ if(functions._disableMousewheel($this,e.target)){return;} /* disables mouse-wheel when hovering specific elements */
+ var deltaFactor=o.mouseWheel.deltaFactor!=="auto" ? parseInt(o.mouseWheel.deltaFactor) : (oldIE && e.deltaFactor<100) ? 100 : e.deltaFactor || 100;
+ if(o.axis==="x" || o.mouseWheel.axis==="x"){
+ var dir="x",
+ px=[Math.round(deltaFactor*d.scrollRatio.x),parseInt(o.mouseWheel.scrollAmount)],
+ amount=o.mouseWheel.scrollAmount!=="auto" ? px[1] : px[0]>=mCustomScrollBox.width() ? mCustomScrollBox.width()*0.9 : px[0],
+ contentPos=Math.abs($("#mCSB_"+d.idx+"_container")[0].offsetLeft),
+ draggerPos=mCSB_dragger[1][0].offsetLeft,
+ limit=mCSB_dragger[1].parent().width()-mCSB_dragger[1].width(),
+ dlt=e.deltaX || e.deltaY || delta;
+ }else{
+ var dir="y",
+ px=[Math.round(deltaFactor*d.scrollRatio.y),parseInt(o.mouseWheel.scrollAmount)],
+ amount=o.mouseWheel.scrollAmount!=="auto" ? px[1] : px[0]>=mCustomScrollBox.height() ? mCustomScrollBox.height()*0.9 : px[0],
+ contentPos=Math.abs($("#mCSB_"+d.idx+"_container")[0].offsetTop),
+ draggerPos=mCSB_dragger[0][0].offsetTop,
+ limit=mCSB_dragger[0].parent().height()-mCSB_dragger[0].height(),
+ dlt=e.deltaY || delta;
+ }
+ if((dir==="y" && !d.overflowed[0]) || (dir==="x" && !d.overflowed[1])){return;}
+ if(o.mouseWheel.invert){dlt=-dlt;}
+ if(o.mouseWheel.normalizeDelta){dlt=dlt<0 ? -1 : 1;}
+ if((dlt>0 && draggerPos!==0) || (dlt<0 && draggerPos!==limit) || o.mouseWheel.preventDefault){
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ }
+ functions._scrollTo($this,(contentPos-(dlt*amount)).toString(),{dir:dir});
+ });
+ }
+ /* check if iframe can be accessed */
+ function _canAccessIFrame(iframe){
+ var html=null;
+ try{
+ var doc=iframe.contentDocument || iframe.contentWindow.document;
+ html=doc.body.innerHTML;
+ }catch(err){/* do nothing */}
+ return(html!==null);
+ }
+ },
+ /* -------------------- */
+
+
+ /* disables mouse-wheel when hovering specific elements like select, datalist etc. */
+ _disableMousewheel:function(el,target){
+ var tag=target.nodeName.toLowerCase(),
+ tags=el.data(pluginPfx).opt.mouseWheel.disableOver,
+ /* elements that require focus */
+ focusTags=["select","textarea"];
+ return $.inArray(tag,tags) > -1 && !($.inArray(tag,focusTags) > -1 && !$(target).is(":focus"));
+ },
+ /* -------------------- */
+
+
+ /*
+ DRAGGER RAIL CLICK EVENT
+ scrolls content via dragger rail
+ */
+ _draggerRail:function(){
+ var $this=$(this),d=$this.data(pluginPfx),
+ namespace=pluginPfx+"_"+d.idx,
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ wrapper=mCSB_container.parent(),
+ mCSB_draggerContainer=$(".mCSB_"+d.idx+"_scrollbar .mCSB_draggerContainer");
+ mCSB_draggerContainer.bind("touchstart."+namespace+" pointerdown."+namespace+" MSPointerDown."+namespace,function(e){
+ touchActive=true;
+ }).bind("touchend."+namespace+" pointerup."+namespace+" MSPointerUp."+namespace,function(e){
+ touchActive=false;
+ }).bind("click."+namespace,function(e){
+ if($(e.target).hasClass("mCSB_draggerContainer") || $(e.target).hasClass("mCSB_draggerRail")){
+ functions._stop($this);
+ var el=$(this),mCSB_dragger=el.find(".mCSB_dragger");
+ if(el.parent(".mCSB_scrollTools_horizontal").length>0){
+ if(!d.overflowed[1]){return;}
+ var dir="x",
+ clickDir=e.pageX>mCSB_dragger.offset().left ? -1 : 1,
+ to=Math.abs(mCSB_container[0].offsetLeft)-(clickDir*(wrapper.width()*0.9));
+ }else{
+ if(!d.overflowed[0]){return;}
+ var dir="y",
+ clickDir=e.pageY>mCSB_dragger.offset().top ? -1 : 1,
+ to=Math.abs(mCSB_container[0].offsetTop)-(clickDir*(wrapper.height()*0.9));
+ }
+ functions._scrollTo($this,to.toString(),{dir:dir,scrollEasing:"mcsEaseInOut"});
+ }
+ });
+ },
+ /* -------------------- */
+
+
+ /*
+ FOCUS EVENT
+ scrolls content via element focus (e.g. clicking an input, pressing TAB key etc.)
+ */
+ _focus:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ namespace=pluginPfx+"_"+d.idx,
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ wrapper=mCSB_container.parent();
+ mCSB_container.bind("focusin."+namespace,function(e){
+ var el=$(document.activeElement),
+ nested=mCSB_container.find(".mCustomScrollBox").length,
+ dur=0;
+ if(!el.is(o.advanced.autoScrollOnFocus)){return;}
+ functions._stop($this);
+ clearTimeout($this[0]._focusTimeout);
+ $this[0]._focusTimer=nested ? (dur+17)*nested : 0;
+ $this[0]._focusTimeout=setTimeout(function(){
+ var to=[el.offset().top-mCSB_container.offset().top,el.offset().left-mCSB_container.offset().left],
+ contentPos=[mCSB_container[0].offsetTop,mCSB_container[0].offsetLeft],
+ isVisible=[
+ (contentPos[0]+to[0]>=0 && contentPos[0]+to[0]=0 && contentPos[0]+to[1]a");
+ btn.bind("mousedown."+namespace+" touchstart."+namespace+" pointerdown."+namespace+" MSPointerDown."+namespace+" mouseup."+namespace+" touchend."+namespace+" pointerup."+namespace+" MSPointerUp."+namespace+" mouseout."+namespace+" pointerout."+namespace+" MSPointerOut."+namespace+" click."+namespace,function(e){
+ e.preventDefault();
+ if(!functions._mouseBtnLeft(e)){return;} /* left mouse button only */
+ var btnClass=$(this).attr("class");
+ seq.type=o.scrollButtons.scrollType;
+ switch(e.type){
+ case "mousedown": case "touchstart": case "pointerdown": case "MSPointerDown":
+ if(seq.type==="stepped"){return;}
+ touchActive=true;
+ d.tweenRunning=false;
+ _seq("on",btnClass);
+ break;
+ case "mouseup": case "touchend": case "pointerup": case "MSPointerUp":
+ case "mouseout": case "pointerout": case "MSPointerOut":
+ if(seq.type==="stepped"){return;}
+ touchActive=false;
+ if(seq.dir){_seq("off",btnClass);}
+ break;
+ case "click":
+ if(seq.type!=="stepped" || d.tweenRunning){return;}
+ _seq("on",btnClass);
+ break;
+ }
+ function _seq(a,c){
+ seq.scrollAmount=o.snapAmount || o.scrollButtons.scrollAmount;
+ functions._sequentialScroll.call(this,$this,a,c);
+ }
+ });
+ },
+ /* -------------------- */
+
+
+ /*
+ KEYBOARD EVENTS
+ scrolls content via keyboard
+ Keys: up arrow, down arrow, left arrow, right arrow, PgUp, PgDn, Home, End
+ */
+ _keyboard:function(){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,seq=d.sequential,
+ namespace=pluginPfx+"_"+d.idx,
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ wrapper=mCSB_container.parent(),
+ editables="input,textarea,select,datalist,keygen,[contenteditable='true']";
+ mCustomScrollBox.attr("tabindex","0").bind("blur."+namespace+" keydown."+namespace+" keyup."+namespace,function(e){
+ switch(e.type){
+ case "blur":
+ if(d.tweenRunning && seq.dir){_seq("off",null);}
+ break;
+ case "keydown": case "keyup":
+ var code=e.keyCode ? e.keyCode : e.which,action="on";
+ if((o.axis!=="x" && (code===38 || code===40)) || (o.axis!=="y" && (code===37 || code===39))){
+ /* up (38), down (40), left (37), right (39) arrows */
+ if(((code===38 || code===40) && !d.overflowed[0]) || ((code===37 || code===39) && !d.overflowed[1])){return;}
+ if(e.type==="keyup"){action="off";}
+ if(!$(document.activeElement).is(editables)){
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ _seq(action,code);
+ }
+ }else if(code===33 || code===34){
+ /* PgUp (33), PgDn (34) */
+ if(d.overflowed[0] || d.overflowed[1]){
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ }
+ if(e.type==="keyup"){
+ functions._stop($this);
+ var keyboardDir=code===34 ? -1 : 1;
+ if(o.axis==="x" || (o.axis==="yx" && d.overflowed[1] && !d.overflowed[0])){
+ var dir="x",to=Math.abs(mCSB_container[0].offsetLeft)-(keyboardDir*(wrapper.width()*0.9));
+ }else{
+ var dir="y",to=Math.abs(mCSB_container[0].offsetTop)-(keyboardDir*(wrapper.height()*0.9));
+ }
+ functions._scrollTo($this,to.toString(),{dir:dir,scrollEasing:"mcsEaseInOut"});
+ }
+ }else if(code===35 || code===36){
+ /* End (35), Home (36) */
+ if(!$(document.activeElement).is(editables)){
+ if(d.overflowed[0] || d.overflowed[1]){
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ }
+ if(e.type==="keyup"){
+ if(o.axis==="x" || (o.axis==="yx" && d.overflowed[1] && !d.overflowed[0])){
+ var dir="x",to=code===35 ? Math.abs(wrapper.width()-mCSB_container.outerWidth(false)) : 0;
+ }else{
+ var dir="y",to=code===35 ? Math.abs(wrapper.height()-mCSB_container.outerHeight(false)) : 0;
+ }
+ functions._scrollTo($this,to.toString(),{dir:dir,scrollEasing:"mcsEaseInOut"});
+ }
+ }
+ }
+ break;
+ }
+ function _seq(a,c){
+ seq.type=o.keyboard.scrollType;
+ seq.scrollAmount=o.snapAmount || o.keyboard.scrollAmount;
+ if(seq.type==="stepped" && d.tweenRunning){return;}
+ functions._sequentialScroll.call(this,$this,a,c);
+ }
+ });
+ },
+ /* -------------------- */
+
+
+ /* scrolls content sequentially (used when scrolling via buttons, keyboard arrows etc.) */
+ _sequentialScroll:function(el,action,trigger){
+ var d=el.data(pluginPfx),o=d.opt,seq=d.sequential,
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ once=seq.type==="stepped" ? true : false;
+ switch(action){
+ case "on":
+ seq.dir=[
+ (trigger==="mCSB_buttonRight" || trigger==="mCSB_buttonLeft" || trigger===39 || trigger===37 ? "x" : "y"),
+ (trigger==="mCSB_buttonUp" || trigger==="mCSB_buttonLeft" || trigger===38 || trigger===37 ? -1 : 1)
+ ];
+ functions._stop(el);
+ if(functions._isNumeric(trigger) && seq.type==="stepped"){return;}
+ _start(once);
+ break;
+ case "off":
+ _stop();
+ if(once || (d.tweenRunning && seq.dir)){
+ _start(true);
+ }
+ break;
+ }
+ /* starts sequence */
+ function _start(once){
+ var c=seq.type!=="stepped", /* continuous scrolling */
+ t=!once ? 1000/60 : c ? o.scrollInertia/1.5 : o.scrollInertia, /* timer */
+ m=!once ? 2.5 : c ? 7.5 : 40, /* multiplier */
+ contentPos=[Math.abs(mCSB_container[0].offsetTop),Math.abs(mCSB_container[0].offsetLeft)],
+ ratio=[d.scrollRatio.y>10 ? 10 : d.scrollRatio.y,d.scrollRatio.x>10 ? 10 : d.scrollRatio.x],
+ amount=seq.dir[0]==="x" ? contentPos[1]+(seq.dir[1]*(ratio[1]*m)) : contentPos[0]+(seq.dir[1]*(ratio[0]*m)),
+ px=seq.dir[0]==="x" ? contentPos[1]+(seq.dir[1]*parseInt(seq.scrollAmount)) : contentPos[0]+(seq.dir[1]*parseInt(seq.scrollAmount)),
+ to=seq.scrollAmount!=="auto" ? px : amount,
+ easing=!once ? "mcsLinear" : c ? "mcsLinearOut" : "mcsEaseInOut",
+ onComplete=!once ? false : true;
+ if(once && t<17){
+ to=seq.dir[0]==="x" ? contentPos[1] : contentPos[0];
+ }
+ functions._scrollTo(el,to.toString(),{dir:seq.dir[0],scrollEasing:easing,dur:t,onComplete:onComplete});
+ if(once){
+ seq.dir=false;
+ return;
+ }
+ clearTimeout(seq.step);
+ seq.step=setTimeout(function(){
+ _start();
+ },t);
+ }
+ /* stops sequence */
+ function _stop(){
+ clearTimeout(seq.step);
+ functions._stop(el);
+ }
+ },
+ /* -------------------- */
+
+
+ /* returns a yx array from value */
+ _arr:function(val){
+ var o=$(this).data(pluginPfx).opt,vals=[];
+ if(typeof val==="function"){val=val();} /* check if the value is a single anonymous function */
+ /* check if value is object or array, its length and create an array with yx values */
+ if(!(val instanceof Array)){ /* object value (e.g. {y:"100",x:"100"}, 100 etc.) */
+ vals[0]=val.y ? val.y : val.x || o.axis==="x" ? null : val;
+ vals[1]=val.x ? val.x : val.y || o.axis==="y" ? null : val;
+ }else{ /* array value (e.g. [100,100]) */
+ vals=val.length>1 ? [val[0],val[1]] : o.axis==="x" ? [null,val[0]] : [val[0],null];
+ }
+ /* check if array values are anonymous functions */
+ if(typeof vals[0]==="function"){vals[0]=vals[0]();}
+ if(typeof vals[1]==="function"){vals[1]=vals[1]();}
+ return vals;
+ },
+ /* -------------------- */
+
+
+ /* translates values (e.g. "top", 100, "100px", "#id") to actual scroll-to positions */
+ _to:function(val,dir){
+ if(val==null || typeof val=="undefined"){return;}
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ wrapper=mCSB_container.parent(),
+ t=typeof val;
+ if(!dir){dir=o.axis==="x" ? "x" : "y";}
+ var contentLength=dir==="x" ? mCSB_container.outerWidth(false) : mCSB_container.outerHeight(false),
+ contentOffset=dir==="x" ? mCSB_container.offset().left : mCSB_container.offset().top,
+ contentPos=dir==="x" ? mCSB_container[0].offsetLeft : mCSB_container[0].offsetTop,
+ cssProp=dir==="x" ? "left" : "top";
+ switch(t){
+ case "function": /* this currently is not used. Consider removing it */
+ return val();
+ break;
+ case "object":
+ if(val.nodeType){ /* DOM */
+ var objOffset=dir==="x" ? $(val).offset().left : $(val).offset().top;
+ }else if(val.jquery){ /* jquery object */
+ if(!val.length){return;}
+ var objOffset=dir==="x" ? val.offset().left : val.offset().top;
+ }
+ return objOffset-contentOffset;
+ break;
+ case "string": case "number":
+ if(functions._isNumeric.call(null,val)){ /* numeric value */
+ return Math.abs(val);
+ }else if(val.indexOf("%")!==-1){ /* percentage value */
+ return Math.abs(contentLength*parseInt(val)/100);
+ }else if(val.indexOf("-=")!==-1){ /* decrease value */
+ return Math.abs(contentPos-parseInt(val.split("-=")[1]));
+ }else if(val.indexOf("+=")!==-1){ /* inrease value */
+ var p=(contentPos+parseInt(val.split("+=")[1]));
+ return p>=0 ? 0 : Math.abs(p);
+ }else if(val.indexOf("px")!==-1 && functions._isNumeric.call(null,val.split("px")[0])){ /* pixels string value (e.g. "100px") */
+ return Math.abs(val.split("px")[0]);
+ }else{
+ if(val==="top" || val==="left"){ /* special strings */
+ return 0;
+ }else if(val==="bottom"){
+ return Math.abs(wrapper.height()-mCSB_container.outerHeight(false));
+ }else if(val==="right"){
+ return Math.abs(wrapper.width()-mCSB_container.outerWidth(false));
+ }else if(val==="first" || val==="last"){
+ var obj=mCSB_container.find(":"+val),
+ objOffset=dir==="x" ? $(obj).offset().left : $(obj).offset().top;
+ return objOffset-contentOffset;
+ }else{
+ if($(val).length){ /* jquery selector */
+ var objOffset=dir==="x" ? $(val).offset().left : $(val).offset().top;
+ return objOffset-contentOffset;
+ }else{ /* other values (e.g. "100em") */
+ mCSB_container.css(cssProp,val);
+ methods.update.call(null,$this[0]);
+ return;
+ }
+ }
+ }
+ break;
+ }
+ },
+ /* -------------------- */
+
+
+ /* calls the update method automatically */
+ _autoUpdate:function(rem){
+ var $this=$(this),d=$this.data(pluginPfx),o=d.opt,
+ mCSB_container=$("#mCSB_"+d.idx+"_container");
+ if(rem){
+ /*
+ removes autoUpdate timer
+ usage: functions._autoUpdate.call(this,"remove");
+ */
+ clearTimeout(mCSB_container[0].autoUpdate);
+ functions._delete.call(null,mCSB_container[0].autoUpdate);
+ return;
+ }
+ var wrapper=mCSB_container.parent(),
+ scrollbar=[$("#mCSB_"+d.idx+"_scrollbar_vertical"),$("#mCSB_"+d.idx+"_scrollbar_horizontal")],
+ scrollbarSize=function(){return [
+ scrollbar[0].is(":visible") ? scrollbar[0].outerHeight(true) : 0, /* returns y-scrollbar height */
+ scrollbar[1].is(":visible") ? scrollbar[1].outerWidth(true) : 0 /* returns x-scrollbar width */
+ ]},
+ oldSelSize=sizesSum(),newSelSize,
+ os=[mCSB_container.outerHeight(false),mCSB_container.outerWidth(false),wrapper.height(),wrapper.width(),scrollbarSize()[0],scrollbarSize()[1]],ns,
+ oldImgsLen=imgSum(),newImgsLen;
+ upd();
+ function upd(){
+ clearTimeout(mCSB_container[0].autoUpdate);
+ mCSB_container[0].autoUpdate=setTimeout(function(){
+ /* update on specific selector(s) length and size change */
+ if(o.advanced.updateOnSelectorChange){
+ newSelSize=sizesSum();
+ if(newSelSize!==oldSelSize){
+ doUpd();
+ oldSelSize=newSelSize;
+ return;
+ }
+ }
+ /* update on main element and scrollbar size changes */
+ if(o.advanced.updateOnContentResize){
+ ns=[mCSB_container.outerHeight(false),mCSB_container.outerWidth(false),wrapper.height(),wrapper.width(),scrollbarSize()[0],scrollbarSize()[1]];
+ if(ns[0]!==os[0] || ns[1]!==os[1] || ns[2]!==os[2] || ns[3]!==os[3] || ns[4]!==os[4] || ns[5]!==os[5]){
+ doUpd();
+ os=ns;
+ }
+ }
+ /* update on image load */
+ if(o.advanced.updateOnImageLoad){
+ newImgsLen=imgSum();
+ if(newImgsLen!==oldImgsLen){
+ mCSB_container.find("img").each(function(){
+ imgLoader(this.src);
+ });
+ oldImgsLen=newImgsLen;
+ }
+ }
+ if(o.advanced.updateOnSelectorChange || o.advanced.updateOnContentResize || o.advanced.updateOnImageLoad){upd();}
+ },60);
+ }
+ /* returns images amount */
+ function imgSum(){
+ var total=0
+ if(o.advanced.updateOnImageLoad){total=mCSB_container.find("img").length;}
+ return total;
+ }
+ /* a tiny image loader */
+ function imgLoader(src){
+ var img=new Image();
+ function createDelegate(contextObject,delegateMethod){
+ return function(){return delegateMethod.apply(contextObject,arguments);}
+ }
+ function imgOnLoad(){
+ this.onload=null;
+ doUpd();
+ }
+ img.onload=createDelegate(img,imgOnLoad);
+ img.src=src;
+ }
+ /* returns the total height and width sum of all elements matching the selector */
+ function sizesSum(){
+ if(o.advanced.updateOnSelectorChange===true){o.advanced.updateOnSelectorChange="*";}
+ var total=0,sel=mCSB_container.find(o.advanced.updateOnSelectorChange);
+ if(o.advanced.updateOnSelectorChange && sel.length>0){sel.each(function(){total+=$(this).height()+$(this).width();});}
+ return total;
+ }
+ /* calls the update method */
+ function doUpd(){
+ clearTimeout(mCSB_container[0].autoUpdate);
+ methods.update.call(null,$this[0]);
+ }
+ },
+ /* -------------------- */
+
+
+ /* snaps scrolling to a multiple of a pixels number */
+ _snapAmount:function(to,amount,offset){
+ return (Math.round(to/amount)*amount-offset);
+ },
+ /* -------------------- */
+
+
+ /* stops content and scrollbar animations */
+ _stop:function(el){
+ var d=el.data(pluginPfx),
+ sel=$("#mCSB_"+d.idx+"_container,#mCSB_"+d.idx+"_container_wrapper,#mCSB_"+d.idx+"_dragger_vertical,#mCSB_"+d.idx+"_dragger_horizontal");
+ sel.each(function(){
+ functions._stopTween.call(this);
+ });
+ },
+ /* -------------------- */
+
+
+ /*
+ ANIMATES CONTENT
+ This is where the actual scrolling happens
+ */
+ _scrollTo:function(el,to,options){
+ var d=el.data(pluginPfx),o=d.opt,
+ defaults={
+ trigger:"internal",
+ dir:"y",
+ scrollEasing:"mcsEaseOut",
+ drag:false,
+ dur:o.scrollInertia,
+ overwrite:"all",
+ callbacks:true,
+ onStart:true,
+ onUpdate:true,
+ onComplete:true
+ },
+ options=$.extend(defaults,options),
+ dur=[options.dur,(options.drag ? 0 : options.dur)],
+ mCustomScrollBox=$("#mCSB_"+d.idx),
+ mCSB_container=$("#mCSB_"+d.idx+"_container"),
+ totalScrollOffsets=o.callbacks.onTotalScrollOffset ? functions._arr.call(el,o.callbacks.onTotalScrollOffset) : [0,0],
+ totalScrollBackOffsets=o.callbacks.onTotalScrollBackOffset ? functions._arr.call(el,o.callbacks.onTotalScrollBackOffset) : [0,0];
+ d.trigger=options.trigger;
+ if(to==="_resetY" && !d.contentReset.y){
+ /* callbacks: onOverflowYNone */
+ if(_cb("onOverflowYNone")){o.callbacks.onOverflowYNone.call(el[0]);}
+ d.contentReset.y=1;
+ }
+ if(to==="_resetX" && !d.contentReset.x){
+ /* callbacks: onOverflowXNone */
+ if(_cb("onOverflowXNone")){o.callbacks.onOverflowXNone.call(el[0]);}
+ d.contentReset.x=1;
+ }
+ if(to==="_resetY" || to==="_resetX"){return;}
+ if((d.contentReset.y || !el[0].mcs) && d.overflowed[0]){
+ /* callbacks: onOverflowY */
+ if(_cb("onOverflowY")){o.callbacks.onOverflowY.call(el[0]);}
+ d.contentReset.x=null;
+ }
+ if((d.contentReset.x || !el[0].mcs) && d.overflowed[1]){
+ /* callbacks: onOverflowX */
+ if(_cb("onOverflowX")){o.callbacks.onOverflowX.call(el[0]);}
+ d.contentReset.x=null;
+ }
+ if(o.snapAmount){to=functions._snapAmount(to,o.snapAmount,o.snapOffset);} /* scrolling snapping */
+ switch(options.dir){
+ case "x":
+ var mCSB_dragger=$("#mCSB_"+d.idx+"_dragger_horizontal"),
+ property="left",
+ contentPos=mCSB_container[0].offsetLeft,
+ limit=[
+ mCustomScrollBox.width()-mCSB_container.outerWidth(false),
+ mCSB_dragger.parent().width()-mCSB_dragger.width()
+ ],
+ scrollTo=[to,to===0 ? 0 : (to/d.scrollRatio.x)],
+ tso=totalScrollOffsets[1],
+ tsbo=totalScrollBackOffsets[1],
+ totalScrollOffset=tso>0 ? tso/d.scrollRatio.x : 0,
+ totalScrollBackOffset=tsbo>0 ? tsbo/d.scrollRatio.x : 0;
+ break;
+ case "y":
+ var mCSB_dragger=$("#mCSB_"+d.idx+"_dragger_vertical"),
+ property="top",
+ contentPos=mCSB_container[0].offsetTop,
+ limit=[
+ mCustomScrollBox.height()-mCSB_container.outerHeight(false),
+ mCSB_dragger.parent().height()-mCSB_dragger.height()
+ ],
+ scrollTo=[to,to===0 ? 0 : (to/d.scrollRatio.y)],
+ tso=totalScrollOffsets[0],
+ tsbo=totalScrollBackOffsets[0],
+ totalScrollOffset=tso>0 ? tso/d.scrollRatio.y : 0,
+ totalScrollBackOffset=tsbo>0 ? tsbo/d.scrollRatio.y : 0;
+ break;
+ }
+ if(scrollTo[1]<0 || (scrollTo[0]===0 && scrollTo[1]===0)){
+ scrollTo=[0,0];
+ }else if(scrollTo[1]>=limit[1]){
+ scrollTo=[limit[0],limit[1]];
+ }else{
+ scrollTo[0]=-scrollTo[0];
+ }
+ if(!el[0].mcs){_mcs();} /* init mcs object (once) to make it available before callbacks */
+ clearTimeout(mCSB_container[0].onCompleteTimeout);
+ if(!d.tweenRunning && ((contentPos===0 && scrollTo[0]>=0) || (contentPos===limit[0] && scrollTo[0]<=limit[0]))){return;}
+ functions._tweenTo.call(null,mCSB_dragger[0],property,Math.round(scrollTo[1]),dur[1],options.scrollEasing);
+ functions._tweenTo.call(null,mCSB_container[0],property,Math.round(scrollTo[0]),dur[0],options.scrollEasing,options.overwrite,{
+ onStart:function(){
+ if(options.callbacks && options.onStart && !d.tweenRunning){
+ /* callbacks: onScrollStart */
+ if(_cb("onScrollStart")){_mcs(); o.callbacks.onScrollStart.call(el[0]);}
+ d.tweenRunning=true;
+ functions._onDragClasses(mCSB_dragger);
+ d.cbOffsets=_cbOffsets();
+ }
+ },onUpdate:function(){
+ if(options.callbacks && options.onUpdate){
+ /* callbacks: whileScrolling */
+ if(_cb("whileScrolling")){_mcs(); o.callbacks.whileScrolling.call(el[0]);}
+ }
+ },onComplete:function(){
+ if(options.callbacks && options.onComplete){
+ if(o.axis==="yx"){clearTimeout(mCSB_container[0].onCompleteTimeout);}
+ var t=mCSB_container[0].idleTimer || 0;
+ mCSB_container[0].onCompleteTimeout=setTimeout(function(){
+ /* callbacks: onScroll, onTotalScroll, onTotalScrollBack */
+ if(_cb("onScroll")){_mcs(); o.callbacks.onScroll.call(el[0]);}
+ if(_cb("onTotalScroll") && scrollTo[1]>=limit[1]-totalScrollOffset && d.cbOffsets[0]){_mcs(); o.callbacks.onTotalScroll.call(el[0]);}
+ if(_cb("onTotalScrollBack") && scrollTo[1]<=totalScrollBackOffset && d.cbOffsets[1]){_mcs(); o.callbacks.onTotalScrollBack.call(el[0]);}
+ d.tweenRunning=false;
+ mCSB_container[0].idleTimer=0;
+ functions._onDragClasses(mCSB_dragger,"hide");
+ },t);
+ }
+ }
+ });
+ /* checks if callback function exists */
+ function _cb(cb){
+ return d && o.callbacks[cb] && typeof o.callbacks[cb]==="function";
+ }
+ /* checks whether callback offsets always trigger */
+ function _cbOffsets(){
+ return [o.callbacks.alwaysTriggerOffsets || contentPos>=limit[0]+tso,o.callbacks.alwaysTriggerOffsets || contentPos<=-tsbo];
+ }
+ /*
+ populates object with useful values for the user
+ values:
+ content: this.mcs.content
+ content top position: this.mcs.top
+ content left position: this.mcs.left
+ dragger top position: this.mcs.draggerTop
+ dragger left position: this.mcs.draggerLeft
+ scrolling y percentage: this.mcs.topPct
+ scrolling x percentage: this.mcs.leftPct
+ scrolling direction: this.mcs.direction
+ */
+ function _mcs(){
+ var cp=[mCSB_container[0].offsetTop,mCSB_container[0].offsetLeft], /* content position */
+ dp=[mCSB_dragger[0].offsetTop,mCSB_dragger[0].offsetLeft], /* dragger position */
+ cl=[mCSB_container.outerHeight(false),mCSB_container.outerWidth(false)], /* content length */
+ pl=[mCustomScrollBox.height(),mCustomScrollBox.width()]; /* content parent length */
+ el[0].mcs={
+ content:mCSB_container, /* original content wrapper as jquery object */
+ top:cp[0],left:cp[1],draggerTop:dp[0],draggerLeft:dp[1],
+ topPct:Math.round((100*Math.abs(cp[0]))/(Math.abs(cl[0])-pl[0])),leftPct:Math.round((100*Math.abs(cp[1]))/(Math.abs(cl[1])-pl[1])),
+ direction:options.dir
+ };
+ /*
+ this refers to the original element containing the scrollbar(s)
+ usage: this.mcs.top, this.mcs.leftPct etc.
+ */
+ }
+ },
+ /* -------------------- */
+
+
+ /*
+ CUSTOM JAVASCRIPT ANIMATION TWEEN
+ Lighter and faster than jquery animate() and css transitions
+ Animates top/left properties and includes easings
+ */
+ _tweenTo:function(el,prop,to,duration,easing,overwrite,callbacks){
+ var callbacks=callbacks || {},
+ onStart=callbacks.onStart || function(){},onUpdate=callbacks.onUpdate || function(){},onComplete=callbacks.onComplete || function(){},
+ startTime=functions._getTime(),_delay,progress=0,from=el.offsetTop,elStyle=el.style,_request;
+ if(prop==="left"){from=el.offsetLeft;}
+ var diff=to-from;
+ el._mcsstop=0;
+ if(overwrite!=="none"){_cancelTween();}
+ _startTween();
+ function _step(){
+ if(el._mcsstop){return;}
+ if(!progress){onStart.call();}
+ progress=functions._getTime()-startTime;
+ _tween();
+ if(progress>=el._mcstime){
+ el._mcstime=(progress>el._mcstime) ? progress+_delay-(progress- el._mcstime) : progress+_delay-1;
+ if(el._mcstime0){
+ el._mcscurrVal=_ease(el._mcstime,from,diff,duration,easing);
+ elStyle[prop]=Math.round(el._mcscurrVal)+"px";
+ }else{
+ elStyle[prop]=to+"px";
+ }
+ onUpdate.call();
+ }
+ function _startTween(){
+ _delay=1000/60;
+ el._mcstime=progress+_delay;
+ _request=(!window.requestAnimationFrame) ? function(f){_tween(); return setTimeout(f,0.01);} : window.requestAnimationFrame;
+ el._mcsid=_request(_step);
+ }
+ function _cancelTween(){
+ if(el._mcsid==null){return;}
+ if(!window.requestAnimationFrame){clearTimeout(el._mcsid);
+ }else{window.cancelAnimationFrame(el._mcsid);}
+ el._mcsid=null;
+ }
+ function _ease(t,b,c,d,type){
+ switch(type){
+ case "linear": case "mcsLinear":
+ return c*t/d + b;
+ break;
+ case "mcsLinearOut":
+ t/=d; t--; return c * Math.sqrt(1 - t*t) + b;
+ break;
+ case "easeInOutSmooth":
+ t/=d/2;
+ if(t<1) return c/2*t*t + b;
+ t--;
+ return -c/2 * (t*(t-2) - 1) + b;
+ break;
+ case "easeInOutStrong":
+ t/=d/2;
+ if(t<1) return c/2 * Math.pow( 2, 10 * (t - 1) ) + b;
+ t--;
+ return c/2 * ( -Math.pow( 2, -10 * t) + 2 ) + b;
+ break;
+ case "easeInOut": case "mcsEaseInOut":
+ t/=d/2;
+ if(t<1) return c/2*t*t*t + b;
+ t-=2;
+ return c/2*(t*t*t + 2) + b;
+ break;
+ case "easeOutSmooth":
+ t/=d; t--;
+ return -c * (t*t*t*t - 1) + b;
+ break;
+ case "easeOutStrong":
+ return c * ( -Math.pow( 2, -10 * t/d ) + 1 ) + b;
+ break;
+ case "easeOut": case "mcsEaseOut": default:
+ var ts=(t/=d)*t,tc=ts*t;
+ return b+c*(0.499999999999997*tc*ts + -2.5*ts*ts + 5.5*tc + -6.5*ts + 4*t);
+ }
+ }
+ },
+ /* -------------------- */
+
+
+ /* returns current time */
+ _getTime:function(){
+ if(window.performance && window.performance.now){
+ return window.performance.now();
+ }else{
+ if(window.performance && window.performance.webkitNow){
+ return window.performance.webkitNow();
+ }else{
+ if(Date.now){return Date.now();}else{return new Date().getTime();}
+ }
+ }
+ },
+ /* -------------------- */
+
+
+ /* stops a tween */
+ _stopTween:function(){
+ var el=this;
+ if(el._mcsid==null){return;}
+ if(!window.requestAnimationFrame){clearTimeout(el._mcsid);
+ }else{window.cancelAnimationFrame(el._mcsid);}
+ el._mcsid=null;
+ el._mcsstop=1;
+ },
+ /* -------------------- */
+
+
+ /* deletes a property (avoiding the exception thrown by IE) */
+ _delete:function(p){
+ try{delete p;}catch(e){p=null;}
+ },
+ /* -------------------- */
+
+
+ /* detects left mouse button */
+ _mouseBtnLeft:function(e){
+ return !(e.which && e.which!==1);
+ },
+ /* -------------------- */
+
+
+ /* detects if pointer type event is touch */
+ _pointerTouch:function(e){
+ var t=e.originalEvent.pointerType;
+ return !(t && t!=="touch" && t!==2);
+ },
+ /* -------------------- */
+
+
+ /* checks if value is numeric */
+ _isNumeric:function(val){
+ return !isNaN(parseFloat(val)) && isFinite(val);
+ }
+ /* -------------------- */
+
+ };
+
+
+
+
+
+ /*
+ ----------------------------------------
+ PLUGIN SETUP
+ ----------------------------------------
+ */
+
+ /* plugin constructor functions */
+ $.fn[pluginNS]=function(method){ /* usage: $(selector).mCustomScrollbar(); */
+ if(methods[method]){
+ return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
+ }else if(typeof method==="object" || !method){
+ return methods.init.apply(this,arguments);
+ }else{
+ $.error("Method "+method+" does not exist");
+ }
+ };
+ $[pluginNS]=function(method){ /* usage: $.mCustomScrollbar(); */
+ if(methods[method]){
+ return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
+ }else if(typeof method==="object" || !method){
+ return methods.init.apply(this,arguments);
+ }else{
+ $.error("Method "+method+" does not exist");
+ }
+ };
+
+ /*
+ allow setting plugin default options.
+ usage: $.mCustomScrollbar.defaults.scrollInertia=500;
+ to apply any changed default options on default selectors (below), use inside document ready fn
+ e.g.: $(document).ready(function(){ $.mCustomScrollbar.defaults.scrollInertia=500; });
+ */
+ $[pluginNS].defaults=defaults;
+
+ /*
+ add window object (window.mCustomScrollbar)
+ usage: if(window.mCustomScrollbar){console.log("custom scrollbar plugin loaded");}
+ */
+ window[pluginNS]=true;
+
+ $(window).load(function(){
+ $(defaultSelector)[pluginNS](); /* add scrollbars automatically on default selector */
+ });
+
+}))}(window,document));
diff --git a/submissions/valkey-ecommerce-demo/ecommerce-demo-using-valkey_TeamVitalOPS.md b/submissions/valkey-ecommerce-demo/ecommerce-demo-using-valkey_TeamVitalOPS.md
new file mode 100644
index 0000000..89823d5
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/ecommerce-demo-using-valkey_TeamVitalOPS.md
@@ -0,0 +1,253 @@
+# Project Submission Template
+
+Create a new file inside the `submissions/` folder using this naming format:
+
+```txt
+projectname_attendeeName.md
+```
+
+Example:
+
+```txt
+ai-sales-copilot_shlok-srivastava.md
+```
+
+Copy the template below into your new file and fill in the details.
+
+---
+
+# Valkey E-Commerce Demo with Breeth AI
+
+---
+
+## Attendee/Team Details
+
+Add all the names of all the team members if you are participating in teams.
+
+**Name:** Syed Dilawar Hashir
+**Name:** Syed Roshan Munazzir
+**GitHub Username:** SyedHashirGit
+**GitHub Username:** SyedRoshan1526
+**LinkedIn Profile:** https://www.linkedin.com/in/syed-dilawar-hashir-9684a7394/
+**LinkedIn Profile:** https://www.linkedin.com/in/syed-roshan-1188b136b/
+**GitHub Project Repository:** https://github.com/SyedHashirGit/build-beyond-limits-2.0/tree/Valkey-E-Commerce-Demo_Syed-Dilawar-Hashir
+
+---
+
+## Problem Statement Selected
+
+Valkey E-Commerce Demo
+
+```txt
+Problem statement 1
+```
+
+---
+
+## Project Description
+
+**Valkey E-Commerce Demo** is a full-stack e-commerce platform that uses **Valkey as the primary data layer** across every major subsystem — cart management, session storage, product catalog caching, real-time inventory, and full-text search. It is enhanced with **Breeth AI** for an intelligent, memory-aware shopping assistant.
+
+* **What is it about?** A production-realistic e-commerce store (React frontend + Node.js backend) where Valkey powers every critical operation rather than a traditional relational database.
+
+* **Who is it for?** Developers, architects, and hackathon judges who want to see concrete, real-world applications of Valkey's data structures — not toy examples. Also serves as a reference implementation for teams building high-performance commerce backends.
+
+* **What problem does it solve?** E-commerce platforms routinely suffer from slow cart operations, session bottlenecks, stale product data, and inventory race conditions (overselling). This project demonstrates how Valkey's native data structures — Hashes, JSON, Sorted Sets, atomic Lua scripts, and the Search module — eliminate each of these problems with sub-millisecond latency.
+
+* **How does it help the user?** Every action a shopper takes (adding to cart, searching, checking stock, applying coupons) is handled by Valkey natively. A live floating dashboard shows exactly which Valkey command executed, which data structure was used, and the current key count per domain — making it instantly educational for anyone evaluating Valkey for production use.
+
+---
+
+## Approach
+
+**Understanding the problem:** The HACKATHON.md spec described 14 challenge areas. Rather than picking one, I chose to implement the four that together tell the most compelling Valkey story in an e-commerce context: Cart (Hash), Sessions (String + TTL), Product Catalog (JSON), and Real-time Inventory (JSON + Lua atomic). Full-text search (FT.SEARCH) and trending products (Sorted Sets) were added to round out the data-structure showcase.
+
+**User flow designed:**
+1. Shopper lands on the site → session is created in Valkey (`SET session:{token} EX 86400`)
+2. Browses products → catalog served from Valkey JSON documents, results cached as Valkey Strings for 60 seconds
+3. Searches → `FT.SEARCH idx:products` on a live search index built over the JSON documents
+4. Adds to cart → `HSET cart:{userId} {productId} {json}` with a 7-day TTL for abandon-cart auto-expiry
+5. Applies coupon → `JSON.GET coupon:{code}` validates rules; `SISMEMBER` checks per-user usage
+6. Proceeds to checkout → Lua atomic script does check-and-reserve inventory, preventing overselling under concurrency
+7. Chats with AI assistant → conversation cached in Valkey JSON (30-min TTL); long-term user preferences stored in Breeth AI's graph memory
+
+**How AI is used:**
+- **Breeth AI** provides a graph-structured memory layer. Every product view, cart addition, and purchase is recorded as a fact in Breeth's knowledge graph. When the user opens the AI assistant, Breeth retrieves their preference profile to personalize responses.
+- The AI assistant itself reasons over the live Valkey product catalog — it fetches products directly from Valkey JSON at query time, so recommendations are always up-to-date with actual inventory and pricing.
+- Conversation history is stored in Valkey JSON with a 30-minute TTL, so the assistant remembers context within a session without any persistent database.
+
+**What makes it different:**
+- Every Valkey operation is **visible to the user** in real time — the floating Valkey Monitor panel shows live key counts, the last command executed, memory usage, and which data structure powered each action. This makes it immediately clear *why* Valkey is being used, not just *that* it's being used.
+- The inventory reservation uses a **Lua atomic script** running inside Valkey, ensuring zero overselling even under concurrent checkout attempts — a genuinely production-critical pattern.
+- Two complementary memory layers: Valkey for fast, ephemeral, TTL-managed state; Breeth for durable, semantic, cross-session user memory.
+
+---
+
+## Tech Stack and Tools Used
+
+Mention the tools, technologies, frameworks, and platforms you used.
+
+Example:
+
+**Frontend:** React, Next.js, HTML, CSS, Tailwind, Material UI
+**Backend:** Node.js, Express, FastAPI, Django, Flask
+**Database:** MongoDB, PostgreSQL, Firebase, Supabase
+**AI Tools/API:** OpenAI, Gemini, Claude, LangChain, Hugging Face, local LLMs
+**Cloud/Deployment:** Vercel, Netlify, Render, Railway, AWS, GCP
+**Other Tools:** Cursor, GitHub Copilot, Figma, Postman, Docker
+
+Fill your details below:
+
+**Frontend:** React 18, React Router v6, Bootstrap 5, SCSS, Phosphor Icons
+**Backend:** Node.js, Express.js, ioredis (Valkey-compatible Redis client)
+**Database:** Valkey Bundle 9 (JSON module, Search module, Bloom module) — used as the sole data layer
+**AI Tools/API:** Breeth AI (graph memory API for user preferences and conversation context), Claude Sonnet 4.6 (development assistance)
+**Cloud/Deployment:** Docker (Valkey container via `valkey/valkey-bundle:9-alpine`)
+**Other Tools:** Docker Desktop, Postman (API testing), Claude Code (development)
+
+---
+
+## Key Features
+
+List the key features of your project.
+
+Example:
+
+1. Feature one
+2. Feature two
+3. Feature three
+
+1. **Live Cart Management (Valkey Hash)** — `HSET / HGETALL / HDEL / EXPIRE` — persistent cart per user with 7-day abandon-TTL; coupon validation via `JSON.GET` + `SISMEMBER`; guest and authenticated carts supported.
+
+2. **Session Storage (Valkey String + TTL)** — JWT-less auth using `SET session:{token} {userId} EX 86400`; session refresh on every request; rate-limited login attempts via `INCR / EXPIRE` (max 5 per 15 min).
+
+3. **Product Catalog Caching (Valkey JSON)** — All 6 products stored as full JSON documents using `JSON.SET`; field-level updates with `JSON.SET $.path`; category/brand/price indexes using Sorted Sets and Sets; 60-second list cache using Valkey Strings.
+
+4. **Real-time Inventory (Valkey JSON + Lua atomic script)** — Stock levels live in `$.inventory.quantity / $.inventory.reserved`; atomic check-and-reserve via `EVAL` Lua script prevents overselling under concurrency; 10-minute reservation TTL auto-releases abandoned checkouts.
+
+5. **Full-Text Search (Valkey Search Module)** — `FT.CREATE idx:products ON JSON` indexes all product documents; `FT.SEARCH` with category/price filters and sort; `FT.SUGGET FUZZY` for autocomplete; `FT.AGGREGATE GROUPBY` for faceted counts.
+
+6. **Trending Products (Valkey Sorted Set)** — `ZINCRBY trending:global:1h` and `trending:global:24h` scored by weighted events (view=1, cart=3, purchase=5); hourly key auto-expires; `ZREVRANGE` returns top 10 in real time.
+
+7. **Breeth AI Shopping Assistant** — Conversational product search with memory; Valkey JSON caches the 30-min conversation session; Breeth graph memory stores long-term user preferences across sessions; quick-prompt buttons for common shopping intents.
+
+8. **Valkey Live Monitor (floating dashboard)** — Real-time panel showing: active key counts per domain, last Valkey command executed, memory usage (`INFO memory`), and activation status of each feature — makes Valkey usage transparent and educational.
+
+9. **User Affinity Tracking (Valkey Sorted Set)** — `ZINCRBY user_affinity:{userId} {score} {categoryId}` records browsing patterns; used by AI assistant for personalised recommendations; `LRANGE user_history:{userId}` tracks recently viewed products.
+
+10. **Coupons (Valkey JSON + Set)** — Coupon definitions stored as JSON; `SISMEMBER coupon_used:{code} {userId}` prevents double-use; demo codes: `VALKEY10` (10%), `FLAT500` (flat ₹500), `BREETH20` (20%).
+
+---
+
+## What is Working?
+
+All core features are fully functional and tested:
+
+- **Backend API** running on `localhost:5000` with 8 route groups (auth, cart, products, inventory, search, AI, stats)
+- **Valkey connection** established to the live `venturemind-valkey` container (which includes JSON, Search, Bloom modules)
+- **Product seeding** — 6 products, 10 categories, 3 coupons, and 1 demo user (`demo@valkey.io / demo1234`) seeded into Valkey
+- **FT.CREATE idx:products** — search index built over all product JSON documents
+- **Cart CRUD** — add, remove, update quantity, clear cart, all backed by Valkey Hash
+- **Coupon validation** — `VALKEY10`, `FLAT500`, `BREETH20` all validated via Valkey JSON + Set
+- **Session auth** — register, login (with rate limiting), get-me, logout, refresh all working
+- **Inventory API** — real-time stock levels, atomic Lua reservation, commit and release endpoints
+- **Search API** — `FT.SEARCH` returns results for queries like "sony", "laptop", "galaxy"; autocomplete via `FT.SUGGET`
+- **AI chat API** — `/api/ai/chat` returns product recommendations using live Valkey catalog; conversation cached in Valkey JSON
+- **Valkey stats endpoint** — `/api/valkey-stats` returns memory, key counts, and feature activation status
+- **React frontend** — ValkeyContext wired to backend; ValkeyMonitor floating panel; AI assistant; Valkey banner; live cart on `/cart` page
+- **Verified endpoints** (tested live):
+ - `GET /api/products` → 6 products from Valkey JSON
+ - `GET /api/cart?userId=...` → live cart from Valkey Hash
+ - `GET /api/search?q=sony` → 1 result via `FT.SEARCH`
+ - `GET /api/inventory/product:...` → stock level `75, high` from Valkey JSON
+
+---
+
+## What is Still in Progress?
+
+- **Checkout flow** — inventory reservation is implemented at the API level but the frontend `/checkout` page still uses the original static UI; wiring the Valkey atomic reserve/commit to the checkout form UI is pending
+- **Vector similarity search** — the HACKATHON.md Challenge 7 (semantic product search via `FT.CREATE` with `VECTOR HNSW`) requires embedding generation; embedding model integration is not yet implemented
+- **Delivery geolocation** — `GEOADD / GEOSEARCH` commands for real-time delivery tracking (Challenge 11) are not yet built
+- **Prometheus metrics** — `/metrics` endpoint with Valkey-backed counters and HyperLogLog (Challenge 8) is not yet wired up
+- **Breeth AI deeper personalization** — currently Breeth facts are written on user actions but the retrieval-and-inject path for truly personalised recommendations needs more tuning once the Breeth graph populates with real interaction data
+- **Product image assets** — products reference placeholder image paths; real product images would enhance the visual showcase
+- **OpenSearch log forwarding** — Valkey Streams as a log buffer (Challenge 9) is architected but the forwarder consumer is not running
+
+---
+
+## Screenshots or Demo
+
+**Deployed Link:** Local — run `cd backend && npm start` then `cd frontend && npm start`
+**Demo Video Link:** *(to be recorded)*
+**GitHub Repository:** https://github.com/SyedHashirGit/build-beyond-limits-2.0/tree/Valkey-E-Commerce-Demo_Syed-Dilawar-Hashir
+
+**Key screens to demo:**
+- `/` homepage with Valkey feature banner scrolling across the top
+- Click **"Valkey Live"** button (bottom-right, teal) → real-time panel showing 8 active Valkey features, key counts, memory usage, last command executed
+- Click **purple robot button** → Breeth AI assistant; type "show me trending products" or "recommend earbuds"
+- `/cart` → live Valkey Hash cart; add items, change quantities, apply coupon `VALKEY10`
+- `/api/valkey-stats` in browser → raw JSON of all live Valkey metrics
+- `docker exec -it venturemind-valkey valkey-cli HGETALL cart:user:demo-0192d4e0-7b3a-7f5c-9e1a-4b8c2d6f0a1e` → see raw cart data in Valkey
+
+---
+
+## Challenges Faced
+
+1. **Valkey Search WEIGHT clause** — The `valkey-bundle:9-alpine` image's Search module does not support `WEIGHT` values other than 1.0 in `FT.CREATE` schema definitions, unlike Redis 7 documentation implies. Discovered at runtime (`Invalid field type for field $.name: The WEIGHT clause with a value other than 1.0 is not supported`). Fixed by removing all `WEIGHT` annotations from the schema.
+
+2. **Lua script compatibility** — The atomic inventory reservation Lua script uses `redis.call` (the Valkey Lua environment uses the same alias for backwards compatibility). Needed to verify that `JSON.GET` and `JSON.NUMINCRBY` are callable from within Lua — they are, since the JSON module registers its commands in the standard command table.
+
+3. **Port conflict** — An existing `venturemind-valkey` container was already occupying port 6379, so the `docker run` for `valkey-ecom` failed with `port is already allocated`. Resolved by verifying the existing container had the required modules (JSON, Search, Bloom — confirmed via `MODULE LIST`) and using it directly instead of starting a new one.
+
+4. **Breeth API edge format** — The Breeth `record_fact` tool with snake_case predicates does not always extract clean graph edges (warns "Graphiti extracted entities but no edges"). Used more natural-language predicates ("uses", "stores", "built with") to get proper edge extraction confirmed by the `edges: 2` response.
+
+5. **ioredis `.call()` for module commands** — ioredis does not have typed wrappers for `JSON.SET`, `FT.SEARCH`, etc. All Valkey module commands are sent through the generic `valkey.call("JSON.SET", key, "$", value)` API. Required careful argument ordering — particularly for `FT.SEARCH` which returns interleaved `[total, key, [field, val, ...], key, [field, val, ...]]` arrays that need manual unpacking.
+
+---
+
+## Learnings
+
+- **Valkey JSON module is genuinely powerful** — storing an entire product document as a single JSON value and being able to update a nested field (`JSON.SET product:xyz $.inventory.reserved 5`) without reading the full document first is a pattern that eliminates a whole class of read-modify-write race conditions.
+
+- **Sorted Sets are the right structure for trending** — using `ZINCRBY` with time-windowed keys (`trending:global:1h`, `trending:global:24h`) and TTL-based cleanup is elegant. The score naturally accumulates weighted events (view=1, cart=3, purchase=5) with no aggregation job needed.
+
+- **Lua scripts inside Valkey are atomic by design** — the check-and-reserve inventory pattern (`if available >= requested then increment reserved`) is only safe inside a Lua script because Valkey's single-threaded executor runs it without interleaving. A naive GET-then-SET in application code would have a race window.
+
+- **Breeth + Valkey are complementary, not competing** — Valkey is the right layer for fast, expiring, operational state (30-min conversation cache, 7-day cart TTL, 24h session). Breeth is the right layer for durable, semantic, relationship-structured user memory (category affinity graph, long-term preference facts). The two layers serve different temporal and structural needs.
+
+- **UUIDv7 domain-prefixed IDs are excellent for Valkey** — using `product:0192d4e6-...` directly as the Valkey key means `JSON.GET` and `FT.CREATE PREFIX 1 product:` work naturally together. The lexicographic sort order of UUIDv7 means `ZRANGEBYLEX` gives chronological ordering for free.
+
+---
+
+## Future Improvements
+
+1. **Vector similarity search** — Add `FT.CREATE` with `VECTOR HNSW` and integrate a sentence-transformer model (e.g. `all-MiniLM-L6-v2`) to generate product embeddings. This would enable semantic queries like "something to keep my coffee warm" returning thermos results.
+
+2. **Checkout flow UI** — Wire the frontend `/checkout` page to the atomic inventory reservation API (`POST /api/inventory/reserve`) so the full purchase journey is visible end-to-end with Valkey operations shown at each step.
+
+3. **Prometheus metrics endpoint** — Implement `/metrics` using Valkey Sorted Sets for latency histograms, `PFADD / PFCOUNT` HyperLogLog for unique active users, and `INCR` counters for orders-per-minute. This would showcase Valkey's analytics primitives.
+
+4. **Real-time delivery tracking** — Implement `GEOADD / GEOSEARCH` for delivery agent location and `PUBLISH / SUBSCRIBE` for real-time location push to the frontend via Server-Sent Events.
+
+5. **Valkey Streams for observability** — Buffer all API request logs via `XADD logs:app` and implement a consumer group forwarder to OpenSearch, demonstrating the log buffering pattern from Challenge 9.
+
+6. **Deeper Breeth personalization** — As the Breeth graph populates with real interaction facts, build a retrieval pipeline that extracts the user's top 3 category affinities from the Breeth graph and injects them into every AI assistant system prompt, making recommendations truly adaptive.
+
+---
+
+## Final Note
+
+The goal of this project was not just to *use* Valkey, but to make it *visible*. Every Valkey operation is surfaced to the user in real time — the floating monitor panel shows the exact command (`HGETALL cart:{userId}`), the data structure used (Valkey Hash), and live metrics. This makes the project both a working e-commerce demo and an interactive teaching tool for Valkey's capabilities.
+
+The combination of **10 distinct Valkey data structures and commands** — Hashes, JSON, Strings, Sorted Sets, Sets, Lua scripts, the Search module, Suggestion index, TTL expiry, and HyperLogLog counters — across a single coherent application is the core contribution. Each structure was chosen because it is the *right* tool for that problem, not because it was convenient.
+
+**Breeth AI** adds a production-realistic AI memory layer that complements Valkey rather than duplicating it: Valkey handles fast ephemeral state; Breeth handles durable semantic user memory. Together they demonstrate how modern AI-native applications can be built with Valkey as the operational backbone.
+
+The project is open source, runnable locally with Docker in under 5 minutes, and serves as a reference implementation for any team evaluating Valkey for a production commerce backend.
+
+```bash
+# Get started in 3 commands
+docker run -d --name valkey -p 6379:6379 valkey/valkey-bundle:9-alpine
+cd backend && npm install && node src/seed.js && npm start
+cd ../frontend && npm install && npm start
+```
diff --git a/submissions/valkey-ecommerce-demo/frontend/.env b/submissions/valkey-ecommerce-demo/frontend/.env
new file mode 100644
index 0000000..1c630e6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/.env
@@ -0,0 +1 @@
+REACT_APP_API_URL=http://localhost:5000
diff --git a/submissions/valkey-ecommerce-demo/frontend/.gitignore b/submissions/valkey-ecommerce-demo/frontend/.gitignore
new file mode 100644
index 0000000..4d29575
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/.gitignore
@@ -0,0 +1,23 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/submissions/valkey-ecommerce-demo/frontend/README.md b/submissions/valkey-ecommerce-demo/frontend/README.md
new file mode 100644
index 0000000..58beeac
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/README.md
@@ -0,0 +1,70 @@
+# Getting Started with Create React App
+
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `npm start`
+
+Runs the app in the development mode.\
+Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
+
+The page will reload when you make changes.\
+You may also see any lint errors in the console.
+
+### `npm test`
+
+Launches the test runner in the interactive watch mode.\
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `npm run build`
+
+Builds the app for production to the `build` folder.\
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.\
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `npm run eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can't go back!**
+
+If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
+
+You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
+
+### Code Splitting
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
+
+### Analyzing the Bundle Size
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
+
+### Making a Progressive Web App
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
+
+### Advanced Configuration
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
+
+### Deployment
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
+
+### `npm run build` fails to minify
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
diff --git a/submissions/valkey-ecommerce-demo/frontend/package-lock.json b/submissions/valkey-ecommerce-demo/frontend/package-lock.json
new file mode 100644
index 0000000..a2ad337
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/package-lock.json
@@ -0,0 +1,19662 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "my-app",
+ "version": "0.1.0",
+ "dependencies": {
+ "@phosphor-icons/react": "^2.1.7",
+ "@ramonak/react-progress-bar": "^5.2.0",
+ "@testing-library/jest-dom": "^5.17.0",
+ "@testing-library/react": "^13.4.0",
+ "@testing-library/user-event": "^13.5.0",
+ "animate.css": "^4.1.1",
+ "bootstrap": "^5.3.3",
+ "isotope-layout": "^3.0.6",
+ "jquery": "^3.7.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-fast-marquee": "^1.6.5",
+ "react-router-dom": "^6.22.1",
+ "react-scripts": "5.0.1",
+ "react-scroll-to-top": "^3.0.0",
+ "react-slick": "^0.30.2",
+ "react-slider": "^2.0.6",
+ "select2": "^4.1.0-rc.0",
+ "slick-carousel": "^1.8.1",
+ "web-vitals": "^2.1.4",
+ "wowjs": "^1.1.3"
+ },
+ "devDependencies": {
+ "sass": "^1.71.1",
+ "webpack": "^5.90.3"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz",
+ "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==",
+ "license": "MIT"
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz",
+ "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz",
+ "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz",
+ "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz",
+ "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.0",
+ "@babel/types": "^7.26.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
+ "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.1.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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
+ "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.1",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz",
+ "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+ "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-decorators": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@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-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+ "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz",
+ "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
+ "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
+ "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz",
+ "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-flow": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
+ "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-simple-access": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
+ "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz",
+ "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz",
+ "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
+ "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
+ "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
+ "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.25.9",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.25.9",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.25.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz",
+ "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@csstools/normalize.css": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz",
+ "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
+ "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
+ "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
+ "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
+ "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
+ "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
+ "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
+ "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
+ "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
+ "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+ "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
+ "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
+ "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
+ "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
+ "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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==",
+ "license": "ISC",
+ "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/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/console/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/console/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/core/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/core/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/environment/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "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-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@jest/transform/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==",
+ "license": "MIT"
+ },
+ "node_modules/@jest/transform/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "license": "MIT"
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+ "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.4.1",
+ "@parcel/watcher-darwin-arm64": "2.4.1",
+ "@parcel/watcher-darwin-x64": "2.4.1",
+ "@parcel/watcher-freebsd-x64": "2.4.1",
+ "@parcel/watcher-linux-arm-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-musl": "2.4.1",
+ "@parcel/watcher-linux-x64-glibc": "2.4.1",
+ "@parcel/watcher-linux-x64-musl": "2.4.1",
+ "@parcel/watcher-win32-arm64": "2.4.1",
+ "@parcel/watcher-win32-ia32": "2.4.1",
+ "@parcel/watcher-win32-x64": "2.4.1"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+ "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+ "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+ "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+ "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+ "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+ "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+ "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+ "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+ "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+ "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+ "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+ "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@phosphor-icons/react": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz",
+ "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8",
+ "react-dom": ">= 16.8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
+ "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-html": "^0.0.9",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^4.2.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@ramonak/react-progress-bar": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@ramonak/react-progress-bar/-/react-progress-bar-5.3.0.tgz",
+ "integrity": "sha512-PjpOcSBAVSQNyx2cvYyBCI14Tg2eFM0psC9m2ic33PYBIdOzO9/DieWndq9BUQTSjIIarhSpa/lqJ33W/mFJMw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17 || ^18",
+ "react-dom": "^16.0.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz",
+ "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "license": "MIT"
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz",
+ "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.12.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
+ "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@adobe/css-tools": "^4.0.1",
+ "@babel/runtime": "^7.9.2",
+ "@types/testing-library__jest-dom": "^5.9.1",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.5.6",
+ "lodash": "^4.17.15",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz",
+ "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@testing-library/dom": "^8.5.0",
+ "@types/react-dom": "^18.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/@testing-library/dom": {
+ "version": "8.20.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz",
+ "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.1.3",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/@testing-library/user-event": {
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
+ "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.12",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
+ "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "license": "MIT",
+ "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": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz",
+ "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "29.5.14",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
+ "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.8.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz",
+ "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.13",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
+ "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/q": {
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
+ "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.16",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz",
+ "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.12",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
+ "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/testing-library__jest-dom": {
+ "version": "5.14.9",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz",
+ "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/jest": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.12",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz",
+ "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/experimental-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz",
+ "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^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==",
+ "license": "BSD-2-Clause",
+ "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==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
+ "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
+ "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
+ "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
+ "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-opt": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1",
+ "@webassemblyjs/wast-printer": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
+ "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
+ "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
+ "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
+ "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "license": "BSD-3-Clause"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-attributes": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+ "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/animate.css": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
+ "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+ "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz",
+ "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "license": "MIT"
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-jest/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
+ "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.4",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "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==",
+ "license": "BSD-3-Clause",
+ "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": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-named-asset-import": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
+ "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@babel/core": "^7.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+ "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+ "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==",
+ "license": "MIT"
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@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"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "license": "MIT"
+ },
+ "node_modules/bfj": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
+ "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "check-types": "^11.2.3",
+ "hoopy": "^0.1.4",
+ "jsonpath": "^1.1.1",
+ "tryer": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/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==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
+ "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/bootstrap": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
+ "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.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==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001673",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz",
+ "integrity": "sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/check-types": {
+ "version": "11.2.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
+ "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
+ "license": "MIT"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "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"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
+ "license": "MIT"
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT"
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/compression/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==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "license": "MIT"
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
+ "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
+ "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz",
+ "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+ "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-blank-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+ "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+ "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-has-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+ "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+ "license": "CC0-1.0",
+ "bin": {
+ "css-prefers-color-scheme": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "license": "MIT"
+ },
+ "node_modules/css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "license": "MIT"
+ },
+ "node_modules/cssdb": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz",
+ "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ],
+ "license": "CC0-1.0"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "license": "MIT",
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csso/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "license": "MIT"
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "license": "MIT",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "license": "MIT"
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "license": "MIT"
+ },
+ "node_modules/deep-equal": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
+ "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.5",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.2",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deep-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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/desandro-matches-selector": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/desandro-matches-selector/-/desandro-matches-selector-2.0.2.tgz",
+ "integrity": "sha512-+1q0nXhdzg1IpIJdMKalUwvvskeKnYyEe3shPRwedNcWtnhEKT3ZxvFjzywHDeGcKViIxTCAoOYQWP1qD7VNyg==",
+ "license": "MIT"
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "license": "MIT"
+ },
+ "node_modules/detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "bin": {
+ "detect": "bin/detect-port",
+ "detect-port": "bin/detect-port"
+ },
+ "engines": {
+ "node": ">= 4.2.1"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "license": "MIT"
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "license": "MIT"
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "license": "MIT",
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.47",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz",
+ "integrity": "sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.17.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+ "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==",
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz",
+ "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.4",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.3",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "BSD-2-Clause",
+ "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/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
+ "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@babel/plugin-syntax-flow": "^7.14.5",
+ "@babel/plugin-transform-react-jsx": "^7.14.9",
+ "eslint": "^8.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
+ "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.1.0",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz",
+ "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.58.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "Python-2.0"
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ev-emitter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ev-emitter/-/ev-emitter-1.1.1.tgz",
+ "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==",
+ "license": "MIT"
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "license": "MIT",
+ "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==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
+ "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.10",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.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==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fizzy-ui-utils": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz",
+ "integrity": "sha512-CZXDVXQ1If3/r8s0T+v+qVeMshhfcuq0rqIFgJnrtd+Bu8GmDmqMjntjUePypVtjHXKJ6V4sw9zeyox34n9aCg==",
+ "license": "MIT",
+ "dependencies": {
+ "desandro-matches-selector": "^2.0.0"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
+ "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 6",
+ "typescript": ">= 2.7",
+ "vue-template-compiler": "*",
+ "webpack": ">= 4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz",
+ "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "license": "Unlicense"
+ },
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-size": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/get-size/-/get-size-2.0.3.tgz",
+ "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "license": "MIT"
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "license": "MIT"
+ },
+ "node_modules/harmony-reflect": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
+ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
+ "license": "(Apache-2.0 OR MPL-1.1)"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/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==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+ "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
+ "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+ "license": "ISC"
+ },
+ "node_modules/identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
+ "license": "MIT",
+ "dependencies": {
+ "harmony-reflect": "^1.4.6"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "license": "MIT"
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isotope-layout": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/isotope-layout/-/isotope-layout-3.0.6.tgz",
+ "integrity": "sha512-z2ZKablhocXhoNyWwzJPFd7u7FWbYbVJA51Nvsqsod8jH2ExGc1SwDsSWKE54e3PhXzqf2yZPhFSq/c2MR1arw==",
+ "license": "GPL-3.0",
+ "dependencies": {
+ "desandro-matches-selector": "^2.0.0",
+ "fizzy-ui-utils": "^2.0.4",
+ "get-size": "^2.0.0",
+ "masonry-layout": "^4.1.0",
+ "outlayer": "^2.1.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "license": "BSD-3-Clause",
+ "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==",
+ "license": "BSD-3-Clause",
+ "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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "license": "BSD-3-Clause",
+ "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/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
+ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
+ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.5.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-circus/node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-cli/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-cli/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-config/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-config/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-each/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-environment-jsdom/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-environment-node/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-haste-map/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-jasmine2/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-runner/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-validate/node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
+ "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^28.0.0",
+ "jest-watcher": "^28.0.0",
+ "slash": "^4.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "jest": "^27.0.0 || ^28.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+ "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^28.1.3",
+ "jest-util": "^28.1.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+ "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.24.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+ "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": {
+ "version": "0.24.51",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/emittery": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+ "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+ "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^28.1.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^28.1.3",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
+ "version": "28.0.2",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+ "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+ "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.10.2",
+ "jest-util": "^28.1.3",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+ "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
+ "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "license": "MIT"
+ },
+ "node_modules/json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "string-convert": "^0.2.0"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpath": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "license": "MIT",
+ "dependencies": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ }
+ },
+ "node_modules/jsonpath/node_modules/esprima": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
+ "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "license": "MIT",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/masonry-layout": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/masonry-layout/-/masonry-layout-4.2.2.tgz",
+ "integrity": "sha512-iGtAlrpHNyxaR19CvKC3npnEcAwszXoyJiI8ARV2ePi7fmYhIud25MHK8Zx4P0LCC4d3TNO9+rFa1KoK1OEOaA==",
+ "license": "MIT",
+ "dependencies": {
+ "get-size": "^2.0.2",
+ "outlayer": "^2.1.0"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "license": "CC0-1.0"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz",
+ "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.13",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz",
+ "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==",
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz",
+ "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.reduce": "^1.0.6",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "gopd": "^1.0.1",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/outlayer": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/outlayer/-/outlayer-2.1.1.tgz",
+ "integrity": "sha512-+GplXsCQ3VrbGujAeHEzP9SXsBmJxzn/YdDSQZL0xqBmAWBmortu2Y9Gwdp9J0bgDQ8/YNIPMoBM13nTwZfAhw==",
+ "license": "MIT",
+ "dependencies": {
+ "ev-emitter": "^1.0.0",
+ "fizzy-ui-utils": "^2.0.0",
+ "get-size": "^2.0.2"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "license": "MIT"
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
+ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+ "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-browser-comments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
+ "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": ">=8"
+ },
+ "peerDependencies": {
+ "browserslist": ">=4",
+ "postcss": ">=8"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+ "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+ "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+ "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+ "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "12.1.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+ "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+ "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+ "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+ "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-env-function": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+ "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-flexbugs-fixes": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
+ "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+ "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+ "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+ "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+ "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-initial": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+ "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+ "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
+ "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+ "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-media-minmax": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+ "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz",
+ "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz",
+ "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+ "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-normalize": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
+ "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/normalize.css": "*",
+ "postcss-browser-comments": "^4",
+ "sanitize.css": "*"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4",
+ "postcss": ">= 8"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "license": "MIT",
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
+ "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+ "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+ "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
+ "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-cascade-layers": "^1.1.1",
+ "@csstools/postcss-color-function": "^1.1.1",
+ "@csstools/postcss-font-format-keywords": "^1.0.1",
+ "@csstools/postcss-hwb-function": "^1.0.2",
+ "@csstools/postcss-ic-unit": "^1.0.1",
+ "@csstools/postcss-is-pseudo-class": "^2.0.7",
+ "@csstools/postcss-nested-calc": "^1.0.0",
+ "@csstools/postcss-normalize-display-values": "^1.0.1",
+ "@csstools/postcss-oklab-function": "^1.1.1",
+ "@csstools/postcss-progressive-custom-properties": "^1.3.0",
+ "@csstools/postcss-stepped-value-functions": "^1.0.1",
+ "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
+ "@csstools/postcss-trigonometric-functions": "^1.0.2",
+ "@csstools/postcss-unset-value": "^1.0.2",
+ "autoprefixer": "^10.4.13",
+ "browserslist": "^4.21.4",
+ "css-blank-pseudo": "^3.0.3",
+ "css-has-pseudo": "^3.0.4",
+ "css-prefers-color-scheme": "^6.0.3",
+ "cssdb": "^7.1.0",
+ "postcss-attribute-case-insensitive": "^5.0.2",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^4.2.4",
+ "postcss-color-hex-alpha": "^8.0.4",
+ "postcss-color-rebeccapurple": "^7.1.1",
+ "postcss-custom-media": "^8.0.2",
+ "postcss-custom-properties": "^12.1.10",
+ "postcss-custom-selectors": "^6.0.3",
+ "postcss-dir-pseudo-class": "^6.0.5",
+ "postcss-double-position-gradients": "^3.1.2",
+ "postcss-env-function": "^4.0.6",
+ "postcss-focus-visible": "^6.0.4",
+ "postcss-focus-within": "^5.0.4",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^3.0.5",
+ "postcss-image-set-function": "^4.0.7",
+ "postcss-initial": "^4.0.1",
+ "postcss-lab-function": "^4.2.1",
+ "postcss-logical": "^5.0.4",
+ "postcss-media-minmax": "^5.0.0",
+ "postcss-nesting": "^10.2.0",
+ "postcss-opacity-percentage": "^1.1.2",
+ "postcss-overflow-shorthand": "^3.0.4",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^7.0.5",
+ "postcss-pseudo-class-any-link": "^7.1.6",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+ "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
+ "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/postcss-svgo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "license": "MIT"
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/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==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-app-polyfill/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==",
+ "license": "MIT"
+ },
+ "node_modules/react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
+ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==",
+ "license": "MIT"
+ },
+ "node_modules/react-fast-marquee": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.5.tgz",
+ "integrity": "sha512-swDnPqrT2XISAih0o74zQVE2wQJFMvkx+9VZXYYNSLb/CUcAzU9pNj637Ar2+hyRw6b4tP6xh4GQZip2ZCpQpg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">= 16.8.0 || ^18.0.0",
+ "react-dom": ">= 16.8.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
+ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz",
+ "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.20.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz",
+ "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.20.0",
+ "react-router": "6.27.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-scripts": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
+ "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
+ "@svgr/webpack": "^5.5.0",
+ "babel-jest": "^27.4.2",
+ "babel-loader": "^8.2.3",
+ "babel-plugin-named-asset-import": "^0.3.8",
+ "babel-preset-react-app": "^10.0.1",
+ "bfj": "^7.0.2",
+ "browserslist": "^4.18.1",
+ "camelcase": "^6.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "css-loader": "^6.5.1",
+ "css-minimizer-webpack-plugin": "^3.2.0",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "eslint": "^8.3.0",
+ "eslint-config-react-app": "^7.0.1",
+ "eslint-webpack-plugin": "^3.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^10.0.0",
+ "html-webpack-plugin": "^5.5.0",
+ "identity-obj-proxy": "^3.0.0",
+ "jest": "^27.4.3",
+ "jest-resolve": "^27.4.2",
+ "jest-watch-typeahead": "^1.0.0",
+ "mini-css-extract-plugin": "^2.4.5",
+ "postcss": "^8.4.4",
+ "postcss-flexbugs-fixes": "^5.0.2",
+ "postcss-loader": "^6.2.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^7.0.1",
+ "prompts": "^2.4.2",
+ "react-app-polyfill": "^3.0.0",
+ "react-dev-utils": "^12.0.1",
+ "react-refresh": "^0.11.0",
+ "resolve": "^1.20.0",
+ "resolve-url-loader": "^4.0.0",
+ "sass-loader": "^12.3.0",
+ "semver": "^7.3.5",
+ "source-map-loader": "^3.0.0",
+ "style-loader": "^3.3.1",
+ "tailwindcss": "^3.0.2",
+ "terser-webpack-plugin": "^5.2.5",
+ "webpack": "^5.64.4",
+ "webpack-dev-server": "^4.6.0",
+ "webpack-manifest-plugin": "^4.0.2",
+ "workbox-webpack-plugin": "^6.4.1"
+ },
+ "bin": {
+ "react-scripts": "bin/react-scripts.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ },
+ "peerDependencies": {
+ "react": ">= 16",
+ "typescript": "^3.2.1 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-scripts/node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "license": "MIT",
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-scroll-to-top": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-scroll-to-top/-/react-scroll-to-top-3.0.0.tgz",
+ "integrity": "sha512-I/k45Ujai097du59tHBbzGxN7Lyc6K8Uc3IChq6HMXaBfB8N/rrfm055T5Yv0DWfVpf6pOFaBmhD3LOfH5unGw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || 17.x || ^18"
+ }
+ },
+ "node_modules/react-slick": {
+ "version": "0.30.2",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz",
+ "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==",
+ "license": "MIT",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-slider": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/react-slider/-/react-slider-2.0.6.tgz",
+ "integrity": "sha512-gJxG1HwmuMTJ+oWIRCmVWvgwotNCbByTwRkFZC6U4MBsHqJBmxwbYRJUmxy4Tke1ef8r9jfXjgkmY/uHOCEvbA==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.8.1"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regex-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
+ "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
+ "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.11.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
+ "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-url-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
+ "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+ "license": "MIT",
+ "dependencies": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.35",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">=8.9"
+ },
+ "peerDependencies": {
+ "rework": "1.0.1",
+ "rework-visit": "1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rework": {
+ "optional": true
+ },
+ "rework-visit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/resolve-url-loader/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==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-url-loader/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "license": "ISC"
+ },
+ "node_modules/resolve-url-loader/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "license": "MIT",
+ "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==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "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==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/sass": {
+ "version": "1.80.4",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.4.tgz",
+ "integrity": "sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@parcel/watcher": "^2.4.1",
+ "chokidar": "^4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass/node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sass/node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "license": "ISC"
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/schema-utils/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "license": "MIT"
+ },
+ "node_modules/select2": {
+ "version": "4.1.0-rc.0",
+ "resolved": "https://registry.npmjs.org/select2/-/select2-4.1.0-rc.0.tgz",
+ "integrity": "sha512-Hr9TdhyHCZUtwznEH2CBf7967mEM0idtJ5nMtjvk3Up5tPukOLXbHUNmh10oRfeNIhj+3GD3niu+g6sVK+gK0A==",
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+ "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "jquery": ">=1.8.0"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "license": "MIT"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "license": "MIT"
+ },
+ "node_modules/static-eval": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
+ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "license": "MIT",
+ "dependencies": {
+ "escodegen": "^1.8.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "internal-slot": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "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==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/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==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/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==",
+ "license": "MIT"
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "regexp.prototype.flags": "^1.5.2",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
+ "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT"
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "node_modules/svgo/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
+ "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.0",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.36.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
+ "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.10",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
+ "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.20",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.26.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "ISC",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+ "license": "MIT"
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "license": "MIT"
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "license": "BSD-3-Clause"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+ "license": "MIT"
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "license": "0BSD"
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "license": "MIT"
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "license": "ISC",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/v8-to-istanbul/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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "license": "MIT",
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-vitals": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
+ "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.95.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz",
+ "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.5",
+ "@webassemblyjs/ast": "^1.12.1",
+ "@webassemblyjs/wasm-edit": "^1.12.1",
+ "@webassemblyjs/wasm-parser": "^1.12.1",
+ "acorn": "^8.7.1",
+ "acorn-import-attributes": "^1.9.5",
+ "browserslist": "^4.21.10",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-manifest-plugin": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
+ "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
+ "license": "MIT",
+ "dependencies": {
+ "tapable": "^2.0.0",
+ "webpack-sources": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.44.2 || ^5.47.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-encoding/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==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
+ "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
+ "license": "MIT",
+ "dependencies": {
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz",
+ "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz",
+ "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz",
+ "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.6.0",
+ "workbox-broadcast-update": "6.6.0",
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-google-analytics": "6.6.0",
+ "workbox-navigation-preload": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-range-requests": "6.6.0",
+ "workbox-recipes": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0",
+ "workbox-streams": "6.6.0",
+ "workbox-sw": "6.6.0",
+ "workbox-window": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "license": "MIT",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/workbox-build/node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz",
+ "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==",
+ "deprecated": "workbox-background-sync@6.6.0",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz",
+ "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-expiration": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz",
+ "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz",
+ "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==",
+ "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-background-sync": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz",
+ "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz",
+ "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz",
+ "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz",
+ "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz",
+ "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz",
+ "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz",
+ "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz",
+ "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-webpack-plugin": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz",
+ "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.9.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/workbox-window": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz",
+ "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/wowjs": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wowjs/-/wowjs-1.1.3.tgz",
+ "integrity": "sha512-HQp1gi56wYmjOYYOMZ08TnDGpT+AO21RJVa0t1NJ3jU8l3dMyP+sY7TO/lilzVp4JFjW88bBY87RnpxdpSKofA==",
+ "dependencies": {
+ "animate.css": "latest"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "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==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "license": "MIT"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/package.json b/submissions/valkey-ecommerce-demo/frontend/package.json
new file mode 100644
index 0000000..ae8b3c5
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@phosphor-icons/react": "^2.1.7",
+ "@ramonak/react-progress-bar": "^5.2.0",
+ "@testing-library/jest-dom": "^5.17.0",
+ "@testing-library/react": "^13.4.0",
+ "@testing-library/user-event": "^13.5.0",
+ "animate.css": "^4.1.1",
+ "bootstrap": "^5.3.3",
+ "isotope-layout": "^3.0.6",
+ "jquery": "^3.7.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-fast-marquee": "^1.6.5",
+ "react-router-dom": "^6.22.1",
+ "react-scripts": "5.0.1",
+ "react-scroll-to-top": "^3.0.0",
+ "react-slick": "^0.30.2",
+ "react-slider": "^2.0.6",
+ "select2": "^4.1.0-rc.0",
+ "slick-carousel": "^1.8.1",
+ "web-vitals": "^2.1.4",
+ "wowjs": "^1.1.3"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "devDependencies": {
+ "sass": "^1.71.1",
+ "webpack": "^5.90.3"
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/.htaccess b/submissions/valkey-ecommerce-demo/frontend/public/.htaccess
new file mode 100644
index 0000000..537e0f1
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/.htaccess
@@ -0,0 +1,11 @@
+
+
+ RewriteEngine On
+ RewriteBase /
+ RewriteRule ^index\.html$ - [L]
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-l
+ RewriteRule . /index.html [L]
+
+
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/_redirects b/submissions/valkey-ecommerce-demo/frontend/public/_redirects
new file mode 100644
index 0000000..26199d6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/_redirects
@@ -0,0 +1,2 @@
+
+/* /index.html 200
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/animate.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/animate.css
new file mode 100644
index 0000000..d71da17
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/animate.css
@@ -0,0 +1,2744 @@
+@charset "UTF-8";
+
+
+/*!
+Animate.css - http://daneden.me/animate
+Licensed under the MIT license
+
+Copyright (c) 2013 Daniel Eden
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.animated.hinge {
+ -webkit-animation-duration: 2s;
+ animation-duration: 2s;
+}
+
+@-webkit-keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 40% {
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px);
+ }
+
+ 60% {
+ -webkit-transform: translateY(-15px);
+ transform: translateY(-15px);
+ }
+}
+
+@keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 40% {
+ -webkit-transform: translateY(-30px);
+ -ms-transform: translateY(-30px);
+ transform: translateY(-30px);
+ }
+
+ 60% {
+ -webkit-transform: translateY(-15px);
+ -ms-transform: translateY(-15px);
+ transform: translateY(-15px);
+ }
+}
+
+.bounce {
+ -webkit-animation-name: bounce;
+ animation-name: bounce;
+}
+
+@-webkit-keyframes flash {
+ 0%, 50%, 100% {
+ opacity: 1;
+ }
+
+ 25%, 75% {
+ opacity: 0;
+ }
+}
+
+@keyframes flash {
+ 0%, 50%, 100% {
+ opacity: 1;
+ }
+
+ 25%, 75% {
+ opacity: 0;
+ }
+}
+
+.flash {
+ -webkit-animation-name: flash;
+ animation-name: flash;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 50% {
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+@keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ -ms-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 50% {
+ -webkit-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ -ms-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+.pulse {
+ -webkit-animation-name: pulse;
+ animation-name: pulse;
+}
+
+@-webkit-keyframes shake {
+ 0%, 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 10%, 30%, 50%, 70%, 90% {
+ -webkit-transform: translateX(-10px);
+ transform: translateX(-10px);
+ }
+
+ 20%, 40%, 60%, 80% {
+ -webkit-transform: translateX(10px);
+ transform: translateX(10px);
+ }
+}
+
+@keyframes shake {
+ 0%, 100% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 10%, 30%, 50%, 70%, 90% {
+ -webkit-transform: translateX(-10px);
+ -ms-transform: translateX(-10px);
+ transform: translateX(-10px);
+ }
+
+ 20%, 40%, 60%, 80% {
+ -webkit-transform: translateX(10px);
+ -ms-transform: translateX(10px);
+ transform: translateX(10px);
+ }
+}
+
+.shake {
+ -webkit-animation-name: shake;
+ animation-name: shake;
+}
+
+@-webkit-keyframes swing {
+ 20% {
+ -webkit-transform: rotate(15deg);
+ transform: rotate(15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate(-10deg);
+ transform: rotate(-10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate(5deg);
+ transform: rotate(5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate(-5deg);
+ transform: rotate(-5deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+}
+
+@keyframes swing {
+ 20% {
+ -webkit-transform: rotate(15deg);
+ -ms-transform: rotate(15deg);
+ transform: rotate(15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate(-10deg);
+ -ms-transform: rotate(-10deg);
+ transform: rotate(-10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate(5deg);
+ -ms-transform: rotate(5deg);
+ transform: rotate(5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate(-5deg);
+ -ms-transform: rotate(-5deg);
+ transform: rotate(-5deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(0deg);
+ -ms-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+}
+
+.swing {
+ -webkit-transform-origin: top center;
+ -ms-transform-origin: top center;
+ transform-origin: top center;
+ -webkit-animation-name: swing;
+ animation-name: swing;
+}
+
+@-webkit-keyframes tada {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 10%, 20% {
+ -webkit-transform: scale(0.9) rotate(-3deg);
+ transform: scale(0.9) rotate(-3deg);
+ }
+
+ 30%, 50%, 70%, 90% {
+ -webkit-transform: scale(1.1) rotate(3deg);
+ transform: scale(1.1) rotate(3deg);
+ }
+
+ 40%, 60%, 80% {
+ -webkit-transform: scale(1.1) rotate(-3deg);
+ transform: scale(1.1) rotate(-3deg);
+ }
+
+ 100% {
+ -webkit-transform: scale(1) rotate(0);
+ transform: scale(1) rotate(0);
+ }
+}
+
+@keyframes tada {
+ 0% {
+ -webkit-transform: scale(1);
+ -ms-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 10%, 20% {
+ -webkit-transform: scale(0.9) rotate(-3deg);
+ -ms-transform: scale(0.9) rotate(-3deg);
+ transform: scale(0.9) rotate(-3deg);
+ }
+
+ 30%, 50%, 70%, 90% {
+ -webkit-transform: scale(1.1) rotate(3deg);
+ -ms-transform: scale(1.1) rotate(3deg);
+ transform: scale(1.1) rotate(3deg);
+ }
+
+ 40%, 60%, 80% {
+ -webkit-transform: scale(1.1) rotate(-3deg);
+ -ms-transform: scale(1.1) rotate(-3deg);
+ transform: scale(1.1) rotate(-3deg);
+ }
+
+ 100% {
+ -webkit-transform: scale(1) rotate(0);
+ -ms-transform: scale(1) rotate(0);
+ transform: scale(1) rotate(0);
+ }
+}
+
+.tada {
+ -webkit-animation-name: tada;
+ animation-name: tada;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes wobble {
+ 0% {
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+
+ 15% {
+ -webkit-transform: translateX(-25%) rotate(-5deg);
+ transform: translateX(-25%) rotate(-5deg);
+ }
+
+ 30% {
+ -webkit-transform: translateX(20%) rotate(3deg);
+ transform: translateX(20%) rotate(3deg);
+ }
+
+ 45% {
+ -webkit-transform: translateX(-15%) rotate(-3deg);
+ transform: translateX(-15%) rotate(-3deg);
+ }
+
+ 60% {
+ -webkit-transform: translateX(10%) rotate(2deg);
+ transform: translateX(10%) rotate(2deg);
+ }
+
+ 75% {
+ -webkit-transform: translateX(-5%) rotate(-1deg);
+ transform: translateX(-5%) rotate(-1deg);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+
+@keyframes wobble {
+ 0% {
+ -webkit-transform: translateX(0%);
+ -ms-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+
+ 15% {
+ -webkit-transform: translateX(-25%) rotate(-5deg);
+ -ms-transform: translateX(-25%) rotate(-5deg);
+ transform: translateX(-25%) rotate(-5deg);
+ }
+
+ 30% {
+ -webkit-transform: translateX(20%) rotate(3deg);
+ -ms-transform: translateX(20%) rotate(3deg);
+ transform: translateX(20%) rotate(3deg);
+ }
+
+ 45% {
+ -webkit-transform: translateX(-15%) rotate(-3deg);
+ -ms-transform: translateX(-15%) rotate(-3deg);
+ transform: translateX(-15%) rotate(-3deg);
+ }
+
+ 60% {
+ -webkit-transform: translateX(10%) rotate(2deg);
+ -ms-transform: translateX(10%) rotate(2deg);
+ transform: translateX(10%) rotate(2deg);
+ }
+
+ 75% {
+ -webkit-transform: translateX(-5%) rotate(-1deg);
+ -ms-transform: translateX(-5%) rotate(-1deg);
+ transform: translateX(-5%) rotate(-1deg);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0%);
+ -ms-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+
+.wobble {
+ -webkit-animation-name: wobble;
+ animation-name: wobble;
+}
+
+@-webkit-keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.05);
+ transform: scale(1.05);
+ }
+
+ 70% {
+ -webkit-transform: scale(.9);
+ transform: scale(.9);
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+@keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ -ms-transform: scale(.3);
+ transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.05);
+ -ms-transform: scale(1.05);
+ transform: scale(1.05);
+ }
+
+ 70% {
+ -webkit-transform: scale(.9);
+ -ms-transform: scale(.9);
+ transform: scale(.9);
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ -ms-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+.bounceIn {
+ -webkit-animation-name: bounceIn;
+ animation-name: bounceIn;
+}
+
+@-webkit-keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(30px);
+ transform: translateY(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(-10px);
+ transform: translateY(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(30px);
+ -ms-transform: translateY(30px);
+ transform: translateY(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(-10px);
+ -ms-transform: translateY(-10px);
+ transform: translateY(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.bounceInDown {
+ -webkit-animation-name: bounceInDown;
+ animation-name: bounceInDown;
+}
+
+@-webkit-keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(30px);
+ transform: translateX(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(-10px);
+ transform: translateX(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(30px);
+ -ms-transform: translateX(30px);
+ transform: translateX(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(-10px);
+ -ms-transform: translateX(-10px);
+ transform: translateX(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.bounceInLeft {
+ -webkit-animation-name: bounceInLeft;
+ animation-name: bounceInLeft;
+}
+
+@-webkit-keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(-30px);
+ transform: translateX(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(10px);
+ transform: translateX(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(-30px);
+ -ms-transform: translateX(-30px);
+ transform: translateX(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(10px);
+ -ms-transform: translateX(10px);
+ transform: translateX(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.bounceInRight {
+ -webkit-animation-name: bounceInRight;
+ animation-name: bounceInRight;
+}
+
+@-webkit-keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(10px);
+ transform: translateY(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ -ms-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(-30px);
+ -ms-transform: translateY(-30px);
+ transform: translateY(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(10px);
+ -ms-transform: translateY(10px);
+ transform: translateY(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.bounceInUp {
+ -webkit-animation-name: bounceInUp;
+ animation-name: bounceInUp;
+}
+
+@-webkit-keyframes bounceOut {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 25% {
+ -webkit-transform: scale(.95);
+ transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ transform: scale(.3);
+ }
+}
+
+@keyframes bounceOut {
+ 0% {
+ -webkit-transform: scale(1);
+ -ms-transform: scale(1);
+ transform: scale(1);
+ }
+
+ 25% {
+ -webkit-transform: scale(.95);
+ -ms-transform: scale(.95);
+ transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ -ms-transform: scale(.3);
+ transform: scale(.3);
+ }
+}
+
+.bounceOut {
+ -webkit-animation-name: bounceOut;
+ animation-name: bounceOut;
+}
+
+@-webkit-keyframes bounceOutDown {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+}
+
+@keyframes bounceOutDown {
+ 0% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(-20px);
+ -ms-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ -ms-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+}
+
+.bounceOutDown {
+ -webkit-animation-name: bounceOutDown;
+ animation-name: bounceOutDown;
+}
+
+@-webkit-keyframes bounceOutLeft {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+@keyframes bounceOutLeft {
+ 0% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(20px);
+ -ms-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+.bounceOutLeft {
+ -webkit-animation-name: bounceOutLeft;
+ animation-name: bounceOutLeft;
+}
+
+@-webkit-keyframes bounceOutRight {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+@keyframes bounceOutRight {
+ 0% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(-20px);
+ -ms-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+.bounceOutRight {
+ -webkit-animation-name: bounceOutRight;
+ animation-name: bounceOutRight;
+}
+
+@-webkit-keyframes bounceOutUp {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+@keyframes bounceOutUp {
+ 0% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(20px);
+ -ms-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+.bounceOutUp {
+ -webkit-animation-name: bounceOutUp;
+ animation-name: bounceOutUp;
+}
+
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
+
+@-webkit-keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ -ms-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown;
+}
+
+@-webkit-keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.fadeInDownBig {
+ -webkit-animation-name: fadeInDownBig;
+ animation-name: fadeInDownBig;
+}
+
+@-webkit-keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ -ms-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.fadeInLeft {
+ -webkit-animation-name: fadeInLeft;
+ animation-name: fadeInLeft;
+}
+
+@-webkit-keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.fadeInLeftBig {
+ -webkit-animation-name: fadeInLeftBig;
+ animation-name: fadeInLeftBig;
+}
+
+@-webkit-keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ -ms-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.fadeInRight {
+ -webkit-animation-name: fadeInRight;
+ animation-name: fadeInRight;
+}
+
+@-webkit-keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.fadeInRightBig {
+ -webkit-animation-name: fadeInRightBig;
+ animation-name: fadeInRightBig;
+}
+
+@-webkit-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ -ms-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+
+@-webkit-keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ -ms-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.fadeInUpBig {
+ -webkit-animation-name: fadeInUpBig;
+ animation-name: fadeInUpBig;
+}
+
+@-webkit-keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+
+.fadeOut {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+
+@-webkit-keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+}
+
+@keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ -ms-transform: translateY(20px);
+ transform: translateY(20px);
+ }
+}
+
+.fadeOutDown {
+ -webkit-animation-name: fadeOutDown;
+ animation-name: fadeOutDown;
+}
+
+@-webkit-keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+}
+
+@keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ -ms-transform: translateY(2000px);
+ transform: translateY(2000px);
+ }
+}
+
+.fadeOutDownBig {
+ -webkit-animation-name: fadeOutDownBig;
+ animation-name: fadeOutDownBig;
+}
+
+@-webkit-keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+}
+
+@keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ -ms-transform: translateX(-20px);
+ transform: translateX(-20px);
+ }
+}
+
+.fadeOutLeft {
+ -webkit-animation-name: fadeOutLeft;
+ animation-name: fadeOutLeft;
+}
+
+@-webkit-keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+@keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+.fadeOutLeftBig {
+ -webkit-animation-name: fadeOutLeftBig;
+ animation-name: fadeOutLeftBig;
+}
+
+@-webkit-keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+}
+
+@keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ -ms-transform: translateX(20px);
+ transform: translateX(20px);
+ }
+}
+
+.fadeOutRight {
+ -webkit-animation-name: fadeOutRight;
+ animation-name: fadeOutRight;
+}
+
+@-webkit-keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+@keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+.fadeOutRightBig {
+ -webkit-animation-name: fadeOutRightBig;
+ animation-name: fadeOutRightBig;
+}
+
+@-webkit-keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+}
+
+@keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ -ms-transform: translateY(-20px);
+ transform: translateY(-20px);
+ }
+}
+
+.fadeOutUp {
+ -webkit-animation-name: fadeOutUp;
+ animation-name: fadeOutUp;
+}
+
+@-webkit-keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+@keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+.fadeOutUpBig {
+ -webkit-animation-name: fadeOutUpBig;
+ animation-name: fadeOutUpBig;
+}
+
+@-webkit-keyframes flip {
+ 0% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
+ transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
+ transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+@keyframes flip {
+ 0% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
+ -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
+ transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
+ -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
+ transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
+ -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
+ -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+.animated.flip {
+ -webkit-backface-visibility: visible;
+ -ms-backface-visibility: visible;
+ backface-visibility: visible;
+ -webkit-animation-name: flip;
+ animation-name: flip;
+}
+
+@-webkit-keyframes flipInX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateX(-10deg);
+ transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateX(10deg);
+ transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+
+@keyframes flipInX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ -ms-transform: perspective(400px) rotateX(90deg);
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateX(-10deg);
+ -ms-transform: perspective(400px) rotateX(-10deg);
+ transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateX(10deg);
+ -ms-transform: perspective(400px) rotateX(10deg);
+ transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ -ms-transform: perspective(400px) rotateX(0deg);
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+
+.flipInX {
+ -webkit-backface-visibility: visible !important;
+ -ms-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInX;
+ animation-name: flipInX;
+}
+
+@-webkit-keyframes flipInY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateY(-10deg);
+ transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateY(10deg);
+ transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+
+@keyframes flipInY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ -ms-transform: perspective(400px) rotateY(90deg);
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateY(-10deg);
+ -ms-transform: perspective(400px) rotateY(-10deg);
+ transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateY(10deg);
+ -ms-transform: perspective(400px) rotateY(10deg);
+ transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ -ms-transform: perspective(400px) rotateY(0deg);
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+
+.flipInY {
+ -webkit-backface-visibility: visible !important;
+ -ms-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInY;
+ animation-name: flipInY;
+}
+
+@-webkit-keyframes flipOutX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ -ms-transform: perspective(400px) rotateX(0deg);
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ -ms-transform: perspective(400px) rotateX(90deg);
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutX {
+ -webkit-animation-name: flipOutX;
+ animation-name: flipOutX;
+ -webkit-backface-visibility: visible !important;
+ -ms-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+}
+
+@-webkit-keyframes flipOutY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ -ms-transform: perspective(400px) rotateY(0deg);
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ -ms-transform: perspective(400px) rotateY(90deg);
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutY {
+ -webkit-backface-visibility: visible !important;
+ -ms-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipOutY;
+ animation-name: flipOutY;
+}
+
+@-webkit-keyframes lightSpeedIn {
+ 0% {
+ -webkit-transform: translateX(100%) skewX(-30deg);
+ transform: translateX(100%) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: translateX(-20%) skewX(30deg);
+ transform: translateX(-20%) skewX(30deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: translateX(0%) skewX(-15deg);
+ transform: translateX(0%) skewX(-15deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: translateX(0%) skewX(0deg);
+ transform: translateX(0%) skewX(0deg);
+ opacity: 1;
+ }
+}
+
+@keyframes lightSpeedIn {
+ 0% {
+ -webkit-transform: translateX(100%) skewX(-30deg);
+ -ms-transform: translateX(100%) skewX(-30deg);
+ transform: translateX(100%) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: translateX(-20%) skewX(30deg);
+ -ms-transform: translateX(-20%) skewX(30deg);
+ transform: translateX(-20%) skewX(30deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: translateX(0%) skewX(-15deg);
+ -ms-transform: translateX(0%) skewX(-15deg);
+ transform: translateX(0%) skewX(-15deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: translateX(0%) skewX(0deg);
+ -ms-transform: translateX(0%) skewX(0deg);
+ transform: translateX(0%) skewX(0deg);
+ opacity: 1;
+ }
+}
+
+.lightSpeedIn {
+ -webkit-animation-name: lightSpeedIn;
+ animation-name: lightSpeedIn;
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+}
+
+@-webkit-keyframes lightSpeedOut {
+ 0% {
+ -webkit-transform: translateX(0%) skewX(0deg);
+ transform: translateX(0%) skewX(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: translateX(100%) skewX(-30deg);
+ transform: translateX(100%) skewX(-30deg);
+ opacity: 0;
+ }
+}
+
+@keyframes lightSpeedOut {
+ 0% {
+ -webkit-transform: translateX(0%) skewX(0deg);
+ -ms-transform: translateX(0%) skewX(0deg);
+ transform: translateX(0%) skewX(0deg);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform: translateX(100%) skewX(-30deg);
+ -ms-transform: translateX(100%) skewX(-30deg);
+ transform: translateX(100%) skewX(-30deg);
+ opacity: 0;
+ }
+}
+
+.lightSpeedOut {
+ -webkit-animation-name: lightSpeedOut;
+ animation-name: lightSpeedOut;
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+}
+
+@-webkit-keyframes rotateIn {
+ 0% {
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(-200deg);
+ transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateIn {
+ 0% {
+ -webkit-transform-origin: center center;
+ -ms-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(-200deg);
+ -ms-transform: rotate(-200deg);
+ transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ -ms-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.rotateIn {
+ -webkit-animation-name: rotateIn;
+ animation-name: rotateIn;
+}
+
+@-webkit-keyframes rotateInDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ -ms-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.rotateInDownLeft {
+ -webkit-animation-name: rotateInDownLeft;
+ animation-name: rotateInDownLeft;
+}
+
+@-webkit-keyframes rotateInDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.rotateInDownRight {
+ -webkit-animation-name: rotateInDownRight;
+ animation-name: rotateInDownRight;
+}
+
+@-webkit-keyframes rotateInUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.rotateInUpLeft {
+ -webkit-animation-name: rotateInUpLeft;
+ animation-name: rotateInUpLeft;
+}
+
+@-webkit-keyframes rotateInUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ -ms-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.rotateInUpRight {
+ -webkit-animation-name: rotateInUpRight;
+ animation-name: rotateInUpRight;
+}
+
+@-webkit-keyframes rotateOut {
+ 0% {
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(200deg);
+ transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOut {
+ 0% {
+ -webkit-transform-origin: center center;
+ -ms-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ -ms-transform-origin: center center;
+ transform-origin: center center;
+ -webkit-transform: rotate(200deg);
+ -ms-transform: rotate(200deg);
+ transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+.rotateOut {
+ -webkit-animation-name: rotateOut;
+ animation-name: rotateOut;
+}
+
+@-webkit-keyframes rotateOutDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownLeft {
+ -webkit-animation-name: rotateOutDownLeft;
+ animation-name: rotateOutDownLeft;
+}
+
+@-webkit-keyframes rotateOutDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ -ms-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownRight {
+ -webkit-animation-name: rotateOutDownRight;
+ animation-name: rotateOutDownRight;
+}
+
+@-webkit-keyframes rotateOutUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -ms-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ -ms-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpLeft {
+ -webkit-animation-name: rotateOutUpLeft;
+ animation-name: rotateOutUpLeft;
+}
+
+@-webkit-keyframes rotateOutUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -ms-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpRight {
+ -webkit-animation-name: rotateOutUpRight;
+ animation-name: rotateOutUpRight;
+}
+
+@-webkit-keyframes slideInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+@keyframes slideInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+}
+
+.slideInDown {
+ -webkit-animation-name: slideInDown;
+ animation-name: slideInDown;
+}
+
+@-webkit-keyframes slideInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes slideInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.slideInLeft {
+ -webkit-animation-name: slideInLeft;
+ animation-name: slideInLeft;
+}
+
+@-webkit-keyframes slideInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+@keyframes slideInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+
+.slideInRight {
+ -webkit-animation-name: slideInRight;
+ animation-name: slideInRight;
+}
+
+@-webkit-keyframes slideOutLeft {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+@keyframes slideOutLeft {
+ 0% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ -ms-transform: translateX(-2000px);
+ transform: translateX(-2000px);
+ }
+}
+
+.slideOutLeft {
+ -webkit-animation-name: slideOutLeft;
+ animation-name: slideOutLeft;
+}
+
+@-webkit-keyframes slideOutRight {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+@keyframes slideOutRight {
+ 0% {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ -ms-transform: translateX(2000px);
+ transform: translateX(2000px);
+ }
+}
+
+.slideOutRight {
+ -webkit-animation-name: slideOutRight;
+ animation-name: slideOutRight;
+}
+
+@-webkit-keyframes slideOutUp {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+@keyframes slideOutUp {
+ 0% {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ -ms-transform: translateY(-2000px);
+ transform: translateY(-2000px);
+ }
+}
+
+.slideOutUp {
+ -webkit-animation-name: slideOutUp;
+ animation-name: slideOutUp;
+}
+
+@-webkit-keyframes hinge {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%, 60% {
+ -webkit-transform: rotate(80deg);
+ transform: rotate(80deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40% {
+ -webkit-transform: rotate(60deg);
+ transform: rotate(60deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 80% {
+ -webkit-transform: rotate(60deg) translateY(0);
+ transform: rotate(60deg) translateY(0);
+ opacity: 1;
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 100% {
+ -webkit-transform: translateY(700px);
+ transform: translateY(700px);
+ opacity: 0;
+ }
+}
+
+@keyframes hinge {
+ 0% {
+ -webkit-transform: rotate(0);
+ -ms-transform: rotate(0);
+ transform: rotate(0);
+ -webkit-transform-origin: top left;
+ -ms-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%, 60% {
+ -webkit-transform: rotate(80deg);
+ -ms-transform: rotate(80deg);
+ transform: rotate(80deg);
+ -webkit-transform-origin: top left;
+ -ms-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40% {
+ -webkit-transform: rotate(60deg);
+ -ms-transform: rotate(60deg);
+ transform: rotate(60deg);
+ -webkit-transform-origin: top left;
+ -ms-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 80% {
+ -webkit-transform: rotate(60deg) translateY(0);
+ -ms-transform: rotate(60deg) translateY(0);
+ transform: rotate(60deg) translateY(0);
+ opacity: 1;
+ -webkit-transform-origin: top left;
+ -ms-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 100% {
+ -webkit-transform: translateY(700px);
+ -ms-transform: translateY(700px);
+ transform: translateY(700px);
+ opacity: 0;
+ }
+}
+
+.hinge {
+ -webkit-animation-name: hinge;
+ animation-name: hinge;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-100%) rotate(-120deg);
+ transform: translateX(-100%) rotate(-120deg);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0px) rotate(0deg);
+ transform: translateX(0px) rotate(0deg);
+ }
+}
+
+@keyframes rollIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-100%) rotate(-120deg);
+ -ms-transform: translateX(-100%) rotate(-120deg);
+ transform: translateX(-100%) rotate(-120deg);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0px) rotate(0deg);
+ -ms-transform: translateX(0px) rotate(0deg);
+ transform: translateX(0px) rotate(0deg);
+ }
+}
+
+.rollIn {
+ -webkit-animation-name: rollIn;
+ animation-name: rollIn;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0px) rotate(0deg);
+ transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(100%) rotate(120deg);
+ transform: translateX(100%) rotate(120deg);
+ }
+}
+
+@keyframes rollOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0px) rotate(0deg);
+ -ms-transform: translateX(0px) rotate(0deg);
+ transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(100%) rotate(120deg);
+ -ms-transform: translateX(100%) rotate(120deg);
+ transform: translateX(100%) rotate(120deg);
+ }
+}
+
+.rollOut {
+ -webkit-animation-name: rollOut;
+ animation-name: rollOut;
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/aos.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/aos.css
new file mode 100644
index 0000000..2e1a9be
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/aos.css
@@ -0,0 +1 @@
+[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0s}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos]{pointer-events:none}[data-aos].aos-animate{pointer-events:auto}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}@media screen{html:not(.no-js) [data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;-webkit-transform:none;transform:none}html:not(.no-js) [data-aos=fade-up]{-webkit-transform:translate3d(0,100px,0);transform:translate3d(0,100px,0)}html:not(.no-js) [data-aos=fade-down]{-webkit-transform:translate3d(0,-100px,0);transform:translate3d(0,-100px,0)}html:not(.no-js) [data-aos=fade-right]{-webkit-transform:translate3d(-100px,0,0);transform:translate3d(-100px,0,0)}html:not(.no-js) [data-aos=fade-left]{-webkit-transform:translate3d(100px,0,0);transform:translate3d(100px,0,0)}html:not(.no-js) [data-aos=fade-up-right]{-webkit-transform:translate3d(-100px,100px,0);transform:translate3d(-100px,100px,0)}html:not(.no-js) [data-aos=fade-up-left]{-webkit-transform:translate3d(100px,100px,0);transform:translate3d(100px,100px,0)}html:not(.no-js) [data-aos=fade-down-right]{-webkit-transform:translate3d(-100px,-100px,0);transform:translate3d(-100px,-100px,0)}html:not(.no-js) [data-aos=fade-down-left]{-webkit-transform:translate3d(100px,-100px,0);transform:translate3d(100px,-100px,0)}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}html:not(.no-js) [data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;-webkit-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1)}html:not(.no-js) [data-aos=zoom-in]{-webkit-transform:scale(.6);transform:scale(.6)}html:not(.no-js) [data-aos=zoom-in-up]{-webkit-transform:translate3d(0,100px,0) scale(.6);transform:translate3d(0,100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-down]{-webkit-transform:translate3d(0,-100px,0) scale(.6);transform:translate3d(0,-100px,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-right]{-webkit-transform:translate3d(-100px,0,0) scale(.6);transform:translate3d(-100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-in-left]{-webkit-transform:translate3d(100px,0,0) scale(.6);transform:translate3d(100px,0,0) scale(.6)}html:not(.no-js) [data-aos=zoom-out]{-webkit-transform:scale(1.2);transform:scale(1.2)}html:not(.no-js) [data-aos=zoom-out-up]{-webkit-transform:translate3d(0,100px,0) scale(1.2);transform:translate3d(0,100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-down]{-webkit-transform:translate3d(0,-100px,0) scale(1.2);transform:translate3d(0,-100px,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-right]{-webkit-transform:translate3d(-100px,0,0) scale(1.2);transform:translate3d(-100px,0,0) scale(1.2)}html:not(.no-js) [data-aos=zoom-out-left]{-webkit-transform:translate3d(100px,0,0) scale(1.2);transform:translate3d(100px,0,0) scale(1.2)}html:not(.no-js) [data-aos^=slide][data-aos^=slide]{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;visibility:hidden}html:not(.no-js) [data-aos^=slide][data-aos^=slide].aos-animate{visibility:visible;-webkit-transform:translateZ(0);transform:translateZ(0)}html:not(.no-js) [data-aos=slide-up]{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}html:not(.no-js) [data-aos=slide-down]{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}html:not(.no-js) [data-aos=slide-right]{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}html:not(.no-js) [data-aos=slide-left]{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}html:not(.no-js) [data-aos^=flip][data-aos^=flip]{-webkit-backface-visibility:hidden;backface-visibility:hidden;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}html:not(.no-js) [data-aos=flip-left]{-webkit-transform:perspective(2500px) rotateY(-100deg);transform:perspective(2500px) rotateY(-100deg)}html:not(.no-js) [data-aos=flip-left].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-right]{-webkit-transform:perspective(2500px) rotateY(100deg);transform:perspective(2500px) rotateY(100deg)}html:not(.no-js) [data-aos=flip-right].aos-animate{-webkit-transform:perspective(2500px) rotateY(0);transform:perspective(2500px) rotateY(0)}html:not(.no-js) [data-aos=flip-up]{-webkit-transform:perspective(2500px) rotateX(-100deg);transform:perspective(2500px) rotateX(-100deg)}html:not(.no-js) [data-aos=flip-up].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}html:not(.no-js) [data-aos=flip-down]{-webkit-transform:perspective(2500px) rotateX(100deg);transform:perspective(2500px) rotateX(100deg)}html:not(.no-js) [data-aos=flip-down].aos-animate{-webkit-transform:perspective(2500px) rotateX(0);transform:perspective(2500px) rotateX(0)}}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/bootstrap.min.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/bootstrap.min.css
new file mode 100644
index 0000000..ad5e002
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/bootstrap.min.css
@@ -0,0 +1,5 @@
+@charset "UTF-8";/*!
+ * Bootstrap v5.3.3 (https://getbootstrap.com/)
+ * Copyright 2011-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/jquery-ui.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/jquery-ui.css
new file mode 100644
index 0000000..644809a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/jquery-ui.css
@@ -0,0 +1,1314 @@
+/*! jQuery UI - v1.13.2 - 2022-07-14
+* http://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ -ms-filter: "alpha(opacity=0)"; /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+ pointer-events: none;
+}
+
+
+/* Icons
+----------------------------------*/
+.ui-icon {
+ display: inline-block;
+ vertical-align: middle;
+ margin-top: -.25em;
+ position: relative;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+.ui-widget-icon-block {
+ left: 50%;
+ margin-left: -8px;
+ display: block;
+}
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: 0;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ margin: 0;
+ cursor: pointer;
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-item-wrapper {
+ position: relative;
+ padding: 3px 1em 3px .4em;
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item-wrapper {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-button {
+ padding: .4em 1em;
+ display: inline-block;
+ position: relative;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ /* Support: IE <= 11 */
+ overflow: visible;
+}
+
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2em;
+ box-sizing: border-box;
+ text-indent: -9999px;
+ white-space: nowrap;
+}
+
+/* no icon support for input elements */
+input.ui-button.ui-button-icon-only {
+ text-indent: 0;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -8px;
+ margin-left: -8px;
+}
+
+.ui-button.ui-icon-notext .ui-icon {
+ padding: 0;
+ width: 2.1em;
+ height: 2.1em;
+ text-indent: -9999px;
+ white-space: nowrap;
+
+}
+
+input.ui-button.ui-icon-notext .ui-icon {
+ width: auto;
+ height: auto;
+ text-indent: 0;
+ white-space: normal;
+ padding: .4em 1em;
+}
+
+/* workarounds */
+/* Support: Firefox 5 - 40 */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-controlgroup {
+ vertical-align: middle;
+ display: inline-block;
+}
+.ui-controlgroup > .ui-controlgroup-item {
+ float: left;
+ margin-left: 0;
+ margin-right: 0;
+}
+.ui-controlgroup > .ui-controlgroup-item:focus,
+.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
+ z-index: 9999;
+}
+.ui-controlgroup-vertical > .ui-controlgroup-item {
+ display: block;
+ float: none;
+ width: 100%;
+ margin-top: 0;
+ margin-bottom: 0;
+ text-align: left;
+}
+.ui-controlgroup-vertical .ui-controlgroup-item {
+ box-sizing: border-box;
+}
+.ui-controlgroup .ui-controlgroup-label {
+ padding: .4em 1em;
+}
+.ui-controlgroup .ui-controlgroup-label span {
+ font-size: 80%;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
+ border-left: none;
+}
+.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
+ border-top: none;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
+ border-right: none;
+}
+.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
+ border-bottom: none;
+}
+
+/* Spinner specific style fixes */
+.ui-controlgroup-vertical .ui-spinner-input {
+
+ /* Support: IE8 only, Android < 4.4 only */
+ width: 75%;
+ width: calc( 100% - 2.4em );
+}
+.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
+ border-top-style: solid;
+}
+
+.ui-checkboxradio-label .ui-icon-background {
+ box-shadow: inset 1px 1px 1px #ccc;
+ border-radius: .12em;
+ border: none;
+}
+.ui-checkboxradio-radio-label .ui-icon-background {
+ width: 16px;
+ height: 16px;
+ border-radius: 1em;
+ overflow: visible;
+ border: none;
+}
+.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
+.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
+ background-image: none;
+ width: 8px;
+ height: 8px;
+ border-width: 4px;
+ border-style: solid;
+}
+.ui-checkboxradio-disabled {
+ pointer-events: none;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+
+/* Icons */
+.ui-datepicker .ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+ left: .5em;
+ top: .3em;
+}
+.ui-dialog {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-n {
+ height: 2px;
+ top: 0;
+}
+.ui-dialog .ui-resizable-e {
+ width: 2px;
+ right: 0;
+}
+.ui-dialog .ui-resizable-s {
+ height: 2px;
+ bottom: 0;
+}
+.ui-dialog .ui-resizable-w {
+ width: 2px;
+ left: 0;
+}
+.ui-dialog .ui-resizable-se,
+.ui-dialog .ui-resizable-sw,
+.ui-dialog .ui-resizable-ne,
+.ui-dialog .ui-resizable-nw {
+ width: 7px;
+ height: 7px;
+}
+.ui-dialog .ui-resizable-se {
+ right: 0;
+ bottom: 0;
+}
+.ui-dialog .ui-resizable-sw {
+ left: 0;
+ bottom: 0;
+}
+.ui-dialog .ui-resizable-ne {
+ right: 0;
+ top: 0;
+}
+.ui-dialog .ui-resizable-nw {
+ left: 0;
+ top: 0;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-progressbar {
+ height: 2em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ -ms-filter: "alpha(opacity=25)"; /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-text {
+ display: block;
+ margin-right: 20px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-selectmenu-button.ui-button {
+ text-align: left;
+ white-space: nowrap;
+ width: 14em;
+}
+.ui-selectmenu-icon.ui-icon {
+ float: right;
+ margin-top: 0;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: pointer;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: .222em 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 2em;
+}
+.ui-spinner-button {
+ width: 1.6em;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top-style: none;
+ border-bottom-style: none;
+ border-right-style: none;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Arial,Helvetica,sans-serif;
+ font-size: 1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Arial,Helvetica,sans-serif;
+ font-size: 1em;
+}
+.ui-widget.ui-widget-content {
+ border: 1px solid #c5c5c5;
+}
+.ui-widget-content {
+ border: 1px solid #dddddd;
+ background: #ffffff;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #dddddd;
+ background: #e9e9e9;
+ color: #333333;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #333333;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default,
+.ui-button,
+
+/* We use html here because we need a greater specificity to make sure disabled
+works properly when clicked or hovered */
+html .ui-button.ui-state-disabled:hover,
+html .ui-button.ui-state-disabled:active {
+ border: 1px solid #c5c5c5;
+ background: #f6f6f6;
+ font-weight: normal;
+ color: #454545;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited,
+a.ui-button,
+a:link.ui-button,
+a:visited.ui-button,
+.ui-button {
+ color: #454545;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus,
+.ui-button:hover,
+.ui-button:focus {
+ border: 1px solid #cccccc;
+ background: #ededed;
+ font-weight: normal;
+ color: #2b2b2b;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited,
+a.ui-button:hover,
+a.ui-button:focus {
+ color: #2b2b2b;
+ text-decoration: none;
+}
+
+.ui-visual-focus {
+ box-shadow: 0 0 3px 1px rgb(94, 158, 214);
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+ border: 1px solid #003eff;
+ background: #007fff;
+ font-weight: normal;
+ color: #ffffff;
+}
+.ui-icon-background,
+.ui-state-active .ui-icon-background {
+ border: #003eff;
+ background-color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #dad55e;
+ background: #fffa90;
+ color: #777620;
+}
+.ui-state-checked {
+ border: 1px solid #dad55e;
+ background: #fffa90;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #777620;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #f1a899;
+ background: #fddfdf;
+ color: #5f3f3f;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #5f3f3f;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #5f3f3f;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ -ms-filter: "alpha(opacity=70)"; /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ -ms-filter: "alpha(opacity=35)"; /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("images/ui-icons_444444_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon,
+.ui-button:hover .ui-icon,
+.ui-button:focus .ui-icon {
+ background-image: url("images/ui-icons_555555_256x240.png");
+}
+.ui-state-active .ui-icon,
+.ui-button:active .ui-icon {
+ background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-highlight .ui-icon,
+.ui-button .ui-state-highlight.ui-icon {
+ background-image: url("images/ui-icons_777620_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("images/ui-icons_cc0000_256x240.png");
+}
+.ui-button .ui-icon {
+ background-image: url("images/ui-icons_777777_256x240.png");
+}
+
+/* positioning */
+/* Three classes needed to override `.ui-button:hover .ui-icon` */
+.ui-icon-blank.ui-icon-blank.ui-icon-blank {
+ background-image: none;
+}
+.ui-icon-caret-1-n { background-position: 0 0; }
+.ui-icon-caret-1-ne { background-position: -16px 0; }
+.ui-icon-caret-1-e { background-position: -32px 0; }
+.ui-icon-caret-1-se { background-position: -48px 0; }
+.ui-icon-caret-1-s { background-position: -65px 0; }
+.ui-icon-caret-1-sw { background-position: -80px 0; }
+.ui-icon-caret-1-w { background-position: -96px 0; }
+.ui-icon-caret-1-nw { background-position: -112px 0; }
+.ui-icon-caret-2-n-s { background-position: -128px 0; }
+.ui-icon-caret-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -65px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -65px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 3px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 3px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #aaaaaa;
+ opacity: .3;
+ -ms-filter: Alpha(Opacity=30); /* support: IE8 */
+}
+.ui-widget-shadow {
+ -webkit-box-shadow: 0px 0px 5px #666666;
+ box-shadow: 0px 0px 5px #666666;
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css
new file mode 100644
index 0000000..d23ad98
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css
@@ -0,0 +1,9493 @@
+/*====================== CSS Index Here =======================*/
+/*
+01. Abstracts
+ 1.1. Classes
+ 1.2. Extend
+ 1.3. Functions
+ 1.4. Mixins
+ 1.5. Variable
+ 1.6. Wordpress Default
+
+02. Base
+ 2.1. Margin
+ 2.2. Padding
+ 2.3. Typography
+
+03. Components
+ 3.1. Accordion
+ 3.2. Button
+ 3.3. Form
+ 3.4. Pagination
+ 3.6. Tab
+
+04. Layout
+ 4.1. Blog Sidebar
+ 4.2. Breadcrumb
+ 4.3. Comment
+ 4.4. Footer
+ 4.5. Header Top
+ 4.6. Header
+ 4.7. Preloader
+ 4.8. Scroll Top
+ 4.9. Section Heading
+ 4.10. Slick
+ 4.11. Social Icon
+*/
+/*======================== CSS Index End ======================*/
+/* Convert to Rem start */
+/* Convert to Rem End */
+/* ======================== Functions Css End ======================= */
+/* ======================== Functions Css End ======================= */
+/* Font Family*/
+@import url("https://fonts.googleapis.com/css2?family=Exo:ital,wght@0,100..900;1,100..900&family=Inter:wght@100..900&family=Quicksand:wght@300..700&display=swap");
+/* ========================= Variable Css Start ======================== */
+:root {
+ /* Font Family Variable */
+ --heading-font: "Quicksand", sans-serif;
+ --heading-font-two: "Exo", sans-serif;
+ --body-font: "Inter", sans-serif;
+ /* Font Size Variable Start */
+ --heading-one: clamp(2.25rem, -0.0733rem + 6.3692vw, 4.5rem);
+ --heading-two: clamp(2rem, 0.7133rem + 2.8846vw, 3.5rem);
+ --heading-three: clamp(1.75rem, 0.3353rem + 2.1661vw, 3rem);
+ --heading-four: clamp(1.5rem, 0.5569rem + 1.444vw, 2.5rem);
+ --heading-five: clamp(1.25rem, 1.2rem + 0.722vw, 2.25rem);
+ --heading-six: clamp(1.125rem, 0.769rem + 0.6813vw, 1.5rem);
+ /* Font Size End */
+ /* template main color */
+ --main-h: 230;
+ --main-s: 100%;
+ --main-l: 71%;
+ --main: var(--main-h) var(--main-s) var(--main-l);
+ /* template main color */
+ --main-two-h: 257;
+ --main-two-s: 65%;
+ --main-two-l: 26%;
+ --main-two: var(--main-two-h) var(--main-two-s) var(--main-two-l);
+ /* White Color */
+ --white: 0 0% 100%;
+ --black: 210 19% 13%;
+ --light: 0 0% 51%;
+ --heading-color: var(--black);
+ --body-color: var(--light);
+ --body-bg: var(--gray);
+ --border-color: 210 29% 87%;
+ --bg-color-one: #F7FBFE;
+ --bg-color-two: #FFFDFA;
+ --bg-color-three: #D3DDE7;
+ --neutral: #1A2026;
+ --translate-x-middle: translateX(-50%);
+ --translate-y-middle: translateY(-50%);
+ --size-2: 0.125rem;
+ --size-3: 0.1875rem;
+ --size-4: 0.25rem;
+ --size-5: 0.3125rem;
+ --size-6: 0.375rem;
+ --size-7: 0.4375rem;
+ --size-8: 0.5rem;
+ --size-9: 0.5625rem;
+ --size-10: 0.625rem;
+ --size-11: 0.6875rem;
+ --size-12: 0.75rem;
+ --size-13: 0.8125rem;
+ --size-14: 0.875rem;
+ --size-16: 1rem;
+ --size-18: 1.125rem;
+ --size-20: 1.25rem;
+ --size-22: 1.375rem;
+ --size-24: 1.5rem;
+ --size-26: 1.625rem;
+ --size-28: 1.75rem;
+ --size-30: 1.875rem;
+ --size-32: 2rem;
+ --size-36: 2rem;
+ --size-40: 2.5rem;
+ --size-44: 2.75rem;
+ --size-48: 3rem;
+ --size-52: 3.25rem;
+ --size-56: 3.5rem;
+ --size-60: 3.75rem;
+ --size-64: 4rem;
+ --size-68: 4.25rem;
+ --size-72: 4.5rem;
+ --size-76: 4.75rem;
+ --size-80: 5rem;
+ --size-90: 5.625rem;
+ --size-110: 6.875rem;
+ --size-120: 7.5rem;
+ --size-144: 9rem;
+ --size-160: 10rem;
+ --main-50: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.9));
+ --main-100: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.8));
+ --main-200: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.7));
+ --main-300: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.6));
+ --main-400: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.5));
+ --main-500: hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.4));
+ --main-600: hsl(var(--main-h), var(--main-s), var(--main-l));
+ --main-700: hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.1));
+ --main-800: hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.2));
+ --main-900: hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.3));
+ --main-two-50: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.9));
+ --main-two-100: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.8));
+ --main-two-200: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.7));
+ --main-two-300: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.6));
+ --main-two-400: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.5));
+ --main-two-500: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.4));
+ --main-two-600: hsl(var(--main-two-h), var(--main-two-s), var(--main-two-l));
+ --main-two-700: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.1));
+ --main-two-800: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.2));
+ --main-two-900: hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.3));
+ --neutral-50: #F7FBFE;
+ --neutral-100: #E6E6E6;
+ --neutral-200: #CCCCCC;
+ --neutral-300: #B3B3B3;
+ --neutral-400: #999999;
+ --neutral-500: #808080;
+ --neutral-600: #1A2026;
+ --neutral-700: #141A1F;
+ --neutral-800: #0F1318;
+ --neutral-900: #1A1A1A;
+ --gray-50: #F1F1F1;
+ --gray-100: #E6E6E6;
+ --gray-200: #CCCCCC;
+ --gray-300: #B3B3B3;
+ --gray-400: #999999;
+ --gray-500: #808080;
+ --gray-600: #666666;
+ --gray-700: #4D4D4D;
+ --gray-800: #333333;
+ --gray-900: #1A1A1A;
+ --light-50: #F7FBFE;
+ --light-100: #FFFDFA;
+ --light-600: #D3DDE7;
+ --light-700: #3D4A56;
+ --light-800: #1A2026;
+ --primary-50: #E4F1FF;
+ --primary-100: #BFDCFF;
+ --primary-200: #95C7FF;
+ --primary-300: #6BB1FF;
+ --primary-400: #519FFF;
+ --primary-500: #6983FF;
+ --primary-600: #5570E6;
+ --primary-700: #415DCC;
+ --primary-800: #30176E;
+ --primary-900: #1A0E3D;
+ --danger-50: #FDF2F4;
+ --danger-100: #F9E0E5;
+ --danger-200: #F0BCC5;
+ --danger-300: #E0A2AF;
+ --danger-400: #C46B7E;
+ --danger-500: #9E3F55;
+ --danger-600: #642637;
+ --danger-700: #501E2C;
+ --danger-800: #3C1621;
+ --danger-900: #280F16;
+ --success-50: #F0FDF4;
+ --success-100: #DCFCE7;
+ --success-200: #BBF7D0;
+ --success-300: #86EFAC;
+ --success-400: #4ADE80;
+ --success-500: #22C55E;
+ --success-600: #27AE60;
+ --success-700: #15803D;
+ --success-800: #166534;
+ --success-900: #14532D;
+ --warning-50: #FEFCE8;
+ --warning-100: #FEF9C3;
+ --warning-200: #FEF08A;
+ --warning-300: #FDE047;
+ --warning-400: #FACC15;
+ --warning-500: #EAB308;
+ --warning-600: #FF9F29;
+ --warning-700: #f39016;
+ --warning-800: #e58209;
+ --warning-900: #d77907;
+ --info-50: #EFF6FF;
+ --info-100: #DBEAFE;
+ --info-200: #BFDBFE;
+ --info-300: #93C5FD;
+ --info-400: #60A5FA;
+ --info-500: #3B82F6;
+ --info-600: #2563EB;
+ --info-700: #1D4ED8;
+ --info-800: #1E40AF;
+ --info-900: #1E3A8A;
+ --tertiary-50: #E8E5F7;
+ --tertiary-100: #BCB5E7;
+ --tertiary-600: #30176E;
+ --font-xs: 0.75rem;
+ --font-sm: 0.875rem;
+ --font-md: 1rem;
+ --font-lg: 1.125rem;
+ --font-xl: 1.25rem;
+ --font-2xl: 1.5rem;
+ --font-3xl: 1.875rem;
+ --font-4xl: 2.25rem;
+ --font-5xl: 3rem;
+ --font-6xl: 3.75rem;
+}
+
+/* ========================= Variable Css End ======================== */
+/* ============================ Mixins Css Start ============================ */
+/* Media Breakpoint for Each Device Start */
+/* Media Breakpoint for Each Device End */
+/* ============================ Mixins Css End ============================ */
+/* =========================== Accordion Css start ============================= */
+.common-accordion .accordion-item {
+ border: 1px solid var(--border-color);
+ background-color: hsl(var(--white)) !important;
+ border-radius: 8px;
+ overflow: hidden;
+}
+
+.common-accordion .accordion-item:not(:last-child) {
+ margin-block-end: 20px;
+}
+
+.common-accordion .accordion-header {
+ line-height: 1;
+}
+
+.common-accordion .accordion-body {
+ padding: 20px 30px;
+ padding-block-start: 0;
+}
+
+@media screen and (max-width: 575px) {
+ .common-accordion .accordion-body {
+ padding: 12px 20px;
+ padding-block-start: 0;
+ }
+}
+
+.common-accordion:first-of-type .accordion-button.collapsed {
+ border-radius: 5px;
+}
+
+.common-accordion:last-of-type .accordion-button.collapsed {
+ border-radius: 5px;
+}
+
+.common-accordion .accordion-button {
+ color: var(--heading-color);
+ padding: 20px 30px;
+ padding-inline-end: 46px;
+ font-weight: 600;
+ font-size: clamp(1rem, 0.696rem + 0.634vw, 1.25rem);
+ font-family: var(--heading-font);
+}
+
+@media screen and (max-width: 575px) {
+ .common-accordion .accordion-button {
+ padding: 12px 20px;
+ padding-inline-end: 36px;
+ }
+}
+
+.common-accordion .accordion-button::after {
+ background-image: none;
+}
+
+.common-accordion .accordion-button:focus {
+ box-shadow: none;
+}
+
+.common-accordion .accordion-button:not(.collapsed) {
+ background-color: transparent !important;
+ box-shadow: none;
+ color: hsl(var(--main));
+}
+
+.common-accordion .accordion-button:not(.collapsed)::after {
+ background-image: none;
+ color: hsl(var(--main));
+}
+
+.common-accordion .accordion-button[aria-expanded=true]::after, .common-accordion .accordion-button[aria-expanded=false]::after {
+ font-family: "Phosphor";
+ font-weight: 900;
+ content: "\e136";
+ color: hsl(var(--main));
+ display: inline-block;
+ position: absolute;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-end: 30px;
+ height: unset;
+ text-align: center;
+}
+
+@media screen and (max-width: 575px) {
+ .common-accordion .accordion-button[aria-expanded=true]::after, .common-accordion .accordion-button[aria-expanded=false]::after {
+ inset-inline-end: 20px;
+ }
+}
+
+.common-accordion .accordion-button[aria-expanded=false]::after {
+ content: "\f107";
+ color: hsl(var(--heading-color));
+}
+
+/* ================================= Accordion Css End =========================== */
+/* ================================= Button Css Start =========================== */
+.btn-check:checked + .btn, .btn.active, .btn.show, .btn:first-child:active, :not(.btn-check) + .btn:active {
+ color: none;
+ background-color: none;
+ border-color: none;
+}
+
+.btn {
+ position: relative;
+ border-radius: 5px;
+ border: 1px solid transparent;
+ font-weight: 500;
+ font-family: var(--body-font);
+ color: hsl(var(--white)) !important;
+ z-index: 1;
+ line-height: 1;
+ padding: 13px 24px;
+}
+
+.btn:hover, .btn:focus, .btn:focus-visible {
+ box-shadow: none !important;
+}
+
+@media screen and (max-width: 1399px) {
+ .btn {
+ padding: 10px 20px;
+ font-size: 0.875rem;
+ }
+}
+
+.btn-sm {
+ padding: 10px 16px !important;
+}
+
+.btn:active {
+ transform: scale(1.01);
+}
+
+.btn-main {
+ background-color: hsl(var(--main)) !important;
+ border-color: hsl(var(--main)) !important;
+}
+
+.btn-main:hover {
+ background-color: var(--main-800) !important;
+ border-color: var(--main-800) !important;
+}
+
+.btn-outline-main {
+ background-color: transparent !important;
+ border-color: hsl(var(--main)) !important;
+ color: hsl(var(--main)) !important;
+}
+
+.btn-outline-main:hover {
+ background-color: hsl(var(--main)/0.15) !important;
+ border-color: hsl(var(--main)/0.4) !important;
+}
+
+.btn-main-two {
+ background-color: hsl(var(--main-two)) !important;
+ border-color: hsl(var(--main-two)) !important;
+ color: hsl(var(--white)) !important;
+}
+
+.btn-main-two:hover {
+ background-color: var(--main-two-800) !important;
+ border-color: var(--main-two-800) !important;
+}
+
+.btn-outline-main-two {
+ background-color: transparent !important;
+ border-color: hsl(var(--main-two)) !important;
+ color: hsl(var(--main-two)) !important;
+}
+
+.btn-outline-main-two:hover {
+ background-color: hsl(var(--main-two)/0.15) !important;
+ border-color: hsl(var(--main-two)/0.4) !important;
+}
+
+.btn-white {
+ background-color: hsl(var(--white)) !important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--heading-color)) !important;
+}
+
+.btn-white:hover {
+ background-color: hsl(var(--white)/0.9) !important;
+ border-color: hsl(var(--white)/0.9) !important;
+}
+
+.btn-outline-white {
+ background-color: transparent !important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--white)) !important;
+}
+
+.btn-outline-white:hover {
+ background-color: hsl(var(--white)) !important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--heading-color)) !important;
+}
+
+.btn-black {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--white)) !important;
+}
+
+.btn-black:hover {
+ background-color: hsl(var(--black)/0.8) !important;
+ border-color: hsl(var(--black)/0.8) !important;
+}
+
+.btn-outline-black {
+ background-color: transparent !important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--black)) !important;
+}
+
+.btn-outline-black:hover {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--white)) !important;
+}
+
+/* ================================= Button Css End =========================== */
+/* ================================= Form Css Start =========================== */
+/* input Start */
+.common-input {
+ border-radius: 5px;
+ font-weight: 400;
+ outline: none;
+ width: 100%;
+ padding: 17px 24px;
+ background-color: transparent !important;
+ border: 1px solid var(--gray-100);
+ color: hsl(var(--black));
+ line-height: 1;
+}
+
+.common-input.style-two {
+ background-color: hsl(var(--white)) !important;
+ color: hsl(var(--black));
+}
+
+@media screen and (max-width: 991px) {
+ .common-input {
+ padding: 12px 24px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .common-input {
+ padding: 10px 16px;
+ }
+}
+
+.common-input::placeholder {
+ color: var(--gray-500);
+ transition: 0.2s linear;
+ font-size: 0.875rem;
+ font-weight: 400;
+}
+
+.common-input--md {
+ padding: 13px 16px;
+}
+
+.common-input--lg {
+ padding: 23px 24px;
+}
+
+@media screen and (max-width: 767px) {
+ .common-input--lg {
+ padding: 18px 24px;
+ }
+}
+
+.common-input:focus {
+ border-color: hsl(var(--main));
+ box-shadow: none;
+}
+
+.common-input:focus::placeholder {
+ visibility: hidden;
+ opacity: 0;
+}
+
+.common-input:disabled, .common-input[readonly] {
+ background-color: hsl(var(--black)/0.2);
+ opacity: 1;
+ border: 0;
+}
+
+.common-input[type=password] {
+ color: hsl(var(--black)/0.5);
+}
+
+.common-input[type=password]:focus {
+ color: hsl(var(--black));
+}
+
+.common-input[type=file] {
+ line-height: 50px;
+ padding: 0;
+ position: relative;
+}
+
+.common-input[type=file]::file-selector-button {
+ border: 1px solid hsl(var(--black)/0.08);
+ padding: 4px 6px;
+ border-radius: 0.2em;
+ background-color: hsl(var(--main)) !important;
+ transition: 0.2s linear;
+ line-height: 25px;
+ position: relative;
+ margin-inline-start: 15px;
+ color: hsl(var(--body-color)) !important;
+}
+
+.common-input[type=file]::file-selector-button:hover {
+ background-color: hsl(var(--main));
+ border: 1px solid hsl(var(--main));
+ color: hsl(var(--black));
+}
+
+.common-input--withIcon {
+ padding-inline-end: 50px !important;
+}
+
+.common-input--withLeftIcon {
+ padding-inline-start: 50px !important;
+}
+
+/* input End */
+/* input icon */
+.input-icon {
+ position: absolute;
+ inset-inline-end: 24px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ color: hsl(var(--heading-color));
+}
+
+.input-icon--left {
+ inset-inline-start: 20px;
+ inset-inline-end: auto;
+}
+
+textarea + .input-icon {
+ inset-block-start: 15px;
+ transform: translateY(0);
+}
+
+/* input icon */
+/* Label */
+.form-label {
+ margin-block-end: 6px;
+ color: hsl(var(--heading-color));
+ font-weight: 500;
+}
+
+/* Form Select */
+.select-has-icon {
+ position: relative;
+}
+
+.select-has-icon::before {
+ position: absolute;
+ content: "\f107";
+ inset-inline-end: 20px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--main));
+ transition: 0.2s linear;
+ pointer-events: none;
+ color: hsl(var(--black)) !important;
+}
+
+.select-has-icon.icon-black::before {
+ -webkit-text-fill-color: hsl(var(--black));
+}
+
+.select-has-icon select {
+ background-image: none;
+ -webkit-appearance: none;
+ padding: 20px 24px;
+ font-size: 18px;
+}
+
+@media screen and (max-width: 991px) {
+ .select-has-icon select {
+ padding: 15px 24px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .select-has-icon select {
+ padding: 12px 16px;
+ }
+}
+
+.select-has-icon .common-input {
+ padding-inline-end: 30px !important;
+}
+
+.select {
+ color: hsl(var(--black)/0.6) !important;
+ padding: 16px 24px;
+}
+
+@media screen and (max-width: 991px) {
+ .select {
+ padding: 11px 24px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .select {
+ padding: 9px 24px;
+ }
+}
+
+.select:focus {
+ border-color: hsl(var(--main));
+ color: hsl(var(--black)) !important;
+ outline: none;
+}
+
+.select option {
+ background-color: hsl(var(--white));
+ color: hsl(var(--heading-color));
+}
+
+/* Form Select End */
+textarea.common-input {
+ height: 140px;
+}
+
+@media screen and (max-width: 767px) {
+ textarea.common-input {
+ height: 110px;
+ }
+}
+/* Autofill Css */
+input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active,
+textarea:-webkit-autofill, textarea:-webkit-autofill:hover, textarea:-webkit-autofill:focus, textarea:-webkit-autofill:active {
+ -webkit-transition: background-color 5000s ease-in-out 0s;
+ transition: background-color 5000s ease-in-out 0s;
+}
+
+input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill {
+ -webkit-box-shadow: 0 0 0px 1000px transparent inset;
+ -webkit-text-fill-color: hsl(var(--heading-color)) !important;
+ caret-color: hsl(var(--heading-color));
+}
+
+/* Autofill Css End */
+/* Show Hide Password */
+input#your-password, input#confirm-password {
+ padding-inline-end: 50px;
+}
+
+.password-show-hide {
+ position: absolute;
+ inset-inline-end: 20px;
+ z-index: 5;
+ cursor: pointer;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ color: hsl(var(--black)/0.4);
+}
+
+/* Number Arrow None */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+}
+
+input[type=number] {
+ -moz-appearance: textfield;
+}
+
+/* Custom Checkbox & Radio Css Start */
+.common-check {
+ margin-block-end: 16px;
+}
+
+.common-check:last-child {
+ margin-block-end: 0;
+}
+
+.common-check a {
+ display: inline;
+}
+
+.common-check.common-radio .form-check-input {
+ border-radius: 50%;
+}
+
+.common-check.common-radio .form-check-input:checked {
+ background-color: transparent !important;
+}
+
+.common-check.common-radio .form-check-input:checked::after {
+ visibility: visible;
+ opacity: 1;
+ -webkit-transform: translate(-50%, -50%) scale(1);
+ transform: translate(-50%, -50%) scale(1);
+}
+
+.common-check .form-check-input {
+ transition: 0.2s linear;
+ box-shadow: none;
+ background-color: transparent;
+ box-shadow: none !important;
+ border: 0;
+ position: relative;
+ border-radius: 3px;
+ width: 18px;
+ height: 18px;
+ border: 1px solid hsl(var(--black)/0.4);
+ cursor: pointer;
+ transition: 0.2s linear;
+ margin-block-start: 0;
+}
+
+.common-check .form-check-input::before {
+ position: absolute;
+ content: "\e182";
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--white));
+ font-size: 12px;
+ inset-block-start: 50%;
+ inset-inline-start: 50%;
+ transform: translate(-50%, -50%);
+ transition: 0.2s linear;
+ visibility: hidden;
+ opacity: 0;
+}
+
+.common-check .form-check-input::after {
+ position: absolute;
+ content: "";
+ inset-block-start: 50%;
+ inset-inline-start: 50%;
+ -webkit-transform: translate(-50%, -50%) scale(0.2);
+ transform: translate(-50%, -50%) scale(0.2);
+ width: 10px;
+ height: 10px;
+ background-color: hsl(var(--main));
+ border-radius: 50%;
+ transition: 0.2s linear;
+ z-index: 1;
+ visibility: hidden;
+ opacity: 0;
+}
+
+.common-check .form-check-input:checked {
+ background-color: hsl(var(--main)) !important;
+ border-color: hsl(var(--main)) !important;
+ box-shadow: none;
+}
+
+.common-check .form-check-input:checked[type=checkbox] {
+ background-image: none;
+}
+
+.common-check .form-check-input:checked::before {
+ visibility: visible;
+ opacity: 1;
+}
+
+.common-check .form-check-label {
+ font-weight: 500;
+ width: calc(100% - 18px);
+ padding-inline-start: 12px;
+ cursor: pointer;
+ color: hsl(var(--heading-color));
+ font-family: var(--poppins-font);
+}
+
+.checked-black .form-check-input {
+ border: 1px solid hsl(var(--black));
+}
+
+.checked-black .form-check-input::after {
+ background-color: hsl(var(--black));
+}
+
+.checked-black .form-check-input:checked {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+}
+
+.checked-primary .form-check-input {
+ border: 1px solid var(--primary-600);
+}
+
+.checked-primary .form-check-input::after {
+ background-color: var(--primary-600);
+}
+
+.checked-primary .form-check-input:checked {
+ background-color: var(--primary-600) !important;
+ border-color: var(--primary-600) !important;
+}
+
+.checked-gray .form-check-input {
+ border: 1px solid var(--gray-600);
+}
+
+.checked-gray .form-check-input::after {
+ background-color: var(--gray-600);
+}
+
+.checked-gray .form-check-input:checked {
+ background-color: var(--gray-600) !important;
+ border-color: var(--gray-600) !important;
+}
+
+.checked-success .form-check-input {
+ border: 1px solid var(--success-600);
+}
+
+.checked-success .form-check-input::after {
+ background-color: var(--success-600);
+}
+
+.checked-success .form-check-input:checked {
+ background-color: var(--success-600) !important;
+ border-color: var(--success-600) !important;
+}
+
+.checked-danger .form-check-input {
+ border: 1px solid var(--danger-600);
+}
+
+.checked-danger .form-check-input::after {
+ background-color: var(--danger-600);
+}
+
+.checked-danger .form-check-input:checked {
+ background-color: var(--danger-600) !important;
+ border-color: var(--danger-600) !important;
+}
+
+.checked-purple .form-check-input {
+ border: 1px solid var(--tertiary-600);
+}
+
+.checked-purple .form-check-input::after {
+ background-color: var(--tertiary-600);
+}
+
+.checked-purple .form-check-input:checked {
+ background-color: var(--tertiary-600) !important;
+ border-color: var(--tertiary-600) !important;
+}
+
+.checked-white .form-check-input {
+ border: 1px solid var(--gray-100);
+}
+
+.checked-white .form-check-input::after {
+ background-color: var(--gray-100);
+}
+
+.checked-white .form-check-input:checked {
+ background-color: var(--gray-100) !important;
+ border-color: var(--gray-100) !important;
+}
+
+/* Custom Checkbox & Radio Css End */
+.toggle-password.active::before {
+ content: "\e220" !important;
+}
+
+/* ================================= Form Css End =========================== */
+/* ================================= Pagination Css Start =========================== */
+.pagination {
+ margin-block-start: 64px;
+}
+
+@media screen and (max-width: 1199px) {
+ .pagination {
+ margin-block-start: 48px;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .pagination {
+ margin-block-start: 40px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .pagination {
+ margin-block-start: 32px;
+ }
+}
+
+.pagination .page-item.active .page-link {
+ background-color: var(--main-600) !important;
+ border-color: var(--main-600) !important;
+ color: hsl(var(--white)) !important;
+}
+
+.pagination .page-item .page-link {
+ box-shadow: none !important;
+}
+
+.pagination .page-item .page-link:hover, .pagination .page-item .page-link:active, .pagination .page-item .page-link:focus {
+ color: var(--main-600) !important;
+ background-color: var(--main-100) !important;
+ border-color: var(--main-300) !important;
+}
+
+/* ================================= Pagination Css End =========================== */
+/* ================================= Tab Css Start =========================== */
+.common-tab {
+ margin-block-end: 20px;
+ gap: 8px;
+}
+
+.common-tab .nav-item {
+ border-bottom: 0;
+}
+
+.common-tab .nav-item .nav-link {
+ color: var(--gray-500);
+ padding: 9px 24px !important;
+ background-color: transparent;
+ transition: 0.2s linear;
+ border: 1px solid var(--border-color);
+ position: relative;
+ font-weight: 400;
+ overflow: hidden;
+ border-radius: 50px;
+ font-size: 16px;
+}
+
+@media screen and (max-width: 1399px) {
+ .common-tab .nav-item .nav-link {
+ padding: 6px 16px !important;
+ font-size: 0.875rem;
+ }
+}
+
+.common-tab .nav-item .nav-link.active {
+ color: hsl(var(--white)) !important;
+ border-color: var(--main-600) !important;
+ background-color: var(--main-600) !important;
+}
+
+.common-tab .nav-item .nav-link:hover {
+ color: var(--main-600);
+}
+
+.common-tab.style-two .nav-link {
+ border: 1px solid var(--gray-100);
+ color: var(--neutral-600);
+}
+
+.common-tab.style-two .nav-link.active {
+ color: hsl(var(--white)) !important;
+ border-color: var(--main-two-600) !important;
+ background-color: var(--main-two-600) !important;
+}
+
+.common-tab.style-two .nav-link:hover {
+ color: var(--main-two-600);
+}
+
+/* ================================= Tab Css End =========================== */
+/* ======================= Common Table Css Start ======================= */
+.table-card {
+ border: 1px solid hsl(var(--white)/0.2);
+ border-radius: 10px;
+ padding: clamp(1.25rem, 0.033rem + 2.536vw, 2.25rem);
+}
+
+.table {
+ color: hsl(var(--white));
+ margin-block-end: 0;
+ min-width: max-content;
+}
+
+.table > :not(caption) > * > * {
+ border-bottom: 0;
+}
+
+.table tr th {
+ padding-inline-start: 0;
+ padding: 32px;
+}
+
+.table tr th:first-child {
+ padding-inline-start: 0;
+}
+
+.table tr th:last-child {
+ padding-inline-end: 0;
+}
+
+.table tr th, .table tr td {
+ text-align: center;
+ vertical-align: middle;
+}
+
+.table tr th:first-child, .table tr td:first-child {
+ text-align: left;
+}
+
+.table tr th:last-child, .table tr td:last-child {
+ text-align: right;
+ padding-inline-end: 0;
+}
+
+.table thead tr {
+ border-bottom: 1px solid hsl(var(--white)/0.2);
+}
+
+.table thead tr th {
+ padding-block-start: 0;
+ font-size: clamp(1rem, 0.696rem + 0.634vw, 1.25rem);
+ font-weight: 400;
+ padding-block-end: clamp(1rem, -0.065rem + 2.219vw, 1.875rem);
+}
+
+.table tbody tr {
+ border-bottom: 1px solid hsl(var(--white)/0.2);
+}
+
+.table tbody tr:last-child {
+ border-bottom: 0;
+}
+
+.table tbody tr:last-child td {
+ padding-block-end: 0;
+}
+
+.table tbody tr td {
+ font-size: clamp(0.875rem, 0.723rem + 0.317vw, 1rem);
+ font-weight: 400;
+ padding: clamp(1rem, -0.065rem + 2.219vw, 1.875rem) 0;
+}
+
+.table.style-two {
+ color: hsl(var(--heading-color));
+}
+
+.table.style-two thead tr, .table.style-two tbody tr {
+ border-bottom: 1px solid hsl(var(--black)/0.1);
+}
+
+.table.style-two thead tr th {
+ padding-block-end: 16px;
+ font-size: 15px;
+}
+
+.table.style-three tbody tr {
+ border-bottom: 1px solid var(--gray-100);
+}
+
+.table.style-three tbody tr:last-child {
+ border: 0;
+}
+
+.table.style-three tbody tr td:first-child {
+ padding-inline-start: 0;
+}
+
+.table.style-three tbody tr td:last-child {
+ padding-inline-end: 0;
+}
+
+.table.style-three tbody tr td {
+ padding: clamp(1.5rem, 0.283rem + 2.536vw, 2.5rem) 24px;
+}
+
+/* ======================= Common Table Css End ======================= */
+/* ================= Common Card Css Start ========================= */
+.common-card {
+ border: 0;
+}
+
+.common-card .card-header, .common-card .card-footer {
+ padding: 12px 24px;
+ background-color: transparent;
+ border-bottom: 1px solid var(--border-color);
+}
+
+@media screen and (max-width: 424px) {
+ .common-card .card-header, .common-card .card-footer {
+ padding: 12px 16px;
+ }
+}
+
+.common-card .card-header {
+ background-color: hsl(var(--black));
+}
+
+.common-card .card-header .title {
+ color: hsl(var(--white));
+ margin-block-end: 0;
+}
+
+.common-card .card-body {
+ padding: 24px;
+}
+
+@media screen and (max-width: 424px) {
+ .common-card .card-body {
+ padding: 16px;
+ }
+}
+
+.common-card .card-footer {
+ border-top: 1px solid var(--border-color);
+ border-bottom: 0;
+}
+
+/* ================= Common Card Css End ========================= */
+/* ======================= Select 2 Css Start =========================== */
+.select2-container--default .select2-selection--single {
+ border: 0;
+}
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border: 0;
+ position: relative;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
+ position: relative;
+ content: "\e136";
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--heading-color)/0.4);
+ transition: 0.2s linear;
+}
+
+.select2-container--open.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
+ content: "\e13c" !important;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border: 0 !important;
+ margin: 0 !important;
+ inset-block-start: 0 !important;
+ inset-inline-start: 0 !important;
+ position: relative !important;
+}
+
+.select2-container {
+ height: inherit !important;
+ width: auto !important;
+}
+
+.select2-selection.select2-selection--single {
+ height: inherit !important;
+ border: 1px solid var(--gray-200) !important;
+ background-color: transparent !important;
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+}
+
+.radius-end-0 .select2-selection.select2-selection--single {
+ border-start-start-radius: 50px !important;
+ border-end-start-radius: 50px !important;
+}
+
+.select2-selection.select2-selection--single {
+ position: relative;
+}
+
+.select2-container .selection {
+ height: inherit;
+}
+
+.select2-selection__arrow {
+ right: 16px !important;
+ inset-block-start: 50% !important;
+ transform: translateY(-50%) !important;
+ width: unset !important;
+}
+
+@media screen and (max-width: 1199px) {
+ .select2-selection__arrow {
+ right: 6px !important;
+ }
+}
+
+.select2-container .select2-selection--single .select2-selection__rendered {
+ padding-inline-start: 24px !important;
+ padding-inline-end: 40px !important;
+}
+
+@media screen and (max-width: 1199px) {
+ .select2-container .select2-selection--single .select2-selection__rendered {
+ padding-inline-start: 10px !important;
+ padding-inline-end: 24px !important;
+ }
+}
+
+.select-border-end-0 .select2-selection.select2-selection--single {
+ border-inline-end: 0 !important;
+}
+
+.select2-dropdown {
+ border: 1px solid var(--gray-100) !important;
+ padding: 10px !important;
+ border-radius: 6px !important;
+ min-width: 200px;
+}
+
+@media screen and (max-width: 767px) {
+ .select2-dropdown {
+ min-width: 170px;
+ }
+}
+
+@media screen and (max-width: 424px) {
+ .select2-dropdown {
+ min-width: 150px;
+ }
+}
+
+.select2-search--dropdown {
+ padding: 0 !important;
+}
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border: 1px solid var(--gray-100) !important;
+ border-radius: 6px !important;
+ padding: 4px 10px;
+}
+
+.select2-container--default .select2-search--dropdown .select2-search__field:focus-visible {
+ outline: 1px solid var(--main-200);
+}
+
+.select2-results {
+ margin-block-start: 8px !important;
+}
+
+.select2-results__option.select2-results__option--selectable {
+ border-radius: 6px !important;
+ padding: 6px 12px !important;
+ color: var(--gray-500);
+ font-size: 14px !important;
+}
+
+@media screen and (max-width: 767px) {
+ .select2-results__option.select2-results__option--selectable {
+ padding: 4px 10px !important;
+ font-size: 12px !important;
+ }
+}
+
+.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable {
+ background-color: var(--main-600) !important;
+ color: white !important;
+}
+
+.select2-results__option.select2-results__option--selectable:hover {
+ background-color: var(--main-100) !important;
+ color: var(--main-600) !important;
+}
+
+.select2-container--default .select2-results__option--selected, .select2-container--default .select2-results__option--selected:hover {
+ background-color: var(--main-600) !important;
+ color: #fff !important;
+}
+
+.select2-container--default .select2-results > .select2-results__options {
+ padding-inline-end: 8px;
+}
+
+.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar {
+ width: 6px;
+}
+
+.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-track {
+ background: #e4e4e4;
+}
+
+.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-thumb {
+ background: #a2a2a2;
+ border-radius: 50px;
+}
+
+.select2-container--default .select2-results > .select2-results__options::-webkit-scrollbar-thumb:hover {
+ background: #6d6d6d;
+}
+
+.select2-container--open.select2-container--default .select2-selection--single .select2-selection__rendered {
+ color: var(--main-600) !important;
+}
+
+.select2-container--open.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
+ color: var(--main-600) !important;
+}
+
+/* Location Box Css */
+.location-box .select2-container .select2-selection--single .select2-selection__rendered {
+ padding-inline-start: 0px !important;
+ padding-inline-end: 50px !important;
+}
+
+.location-box .select2-selection__arrow {
+ right: 0px !important;
+ inset-block-start: 10% !important;
+}
+
+.location-box .select2-selection.select2-selection--single {
+ border: 0 !important;
+}
+
+.location-box .select2-container--default .select2-selection--single .select2-selection__rendered {
+ line-height: 14px;
+ color: var(--gray-900);
+ font-weight: 700;
+ font-family: var(--heading-font-two);
+}
+
+@media screen and (max-width: 991px) {
+ .select2-container--open .select2-dropdown {
+ left: -74px;
+ }
+}
+
+@media screen and (max-width: 424px) {
+ .select2-container--open .select2-dropdown {
+ left: -40px;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .location-box, .search-category.h-48 {
+ height: 40px !important;
+ }
+
+ .location-box .select2-selection__rendered, .search-category.h-48 .select2-selection__rendered {
+ font-size: 12px;
+ }
+}
+/* ======================= Select 2 Css End =========================== */
+/* ========================== Count Down Css Start =============================== */
+.countdown-list {
+ gap: 20px;
+}
+
+@media screen and (max-width: 1399px) {
+ .countdown-list {
+ gap: 6px;
+ }
+}
+
+.countdown-list__item {
+ background-color: hsl(var(--white));
+ padding: clamp(0.375rem, -2.248rem + 3vw, 0.75rem) clamp(0.5rem, -2.998rem + 4vw, 1rem);
+ border-radius: 8px;
+ position: relative;
+}
+
+@media screen and (max-width: 1399px) {
+ .countdown-list__item {
+ font-size: 0.75rem !important;
+ }
+}
+
+.countdown-list__item:last-child::before {
+ display: none;
+}
+
+.countdown-list__item::before {
+ position: absolute;
+ content: ":";
+ inset-block-start: 50%;
+ inset-inline-end: -10px;
+ transform: translateY(-50%);
+ font-weight: 700;
+}
+
+@media screen and (max-width: 1399px) {
+ .countdown-list__item::before {
+ display: none;
+ }
+}
+
+.countdown-list__item.colon-white::before {
+ color: #fff;
+}
+
+.countdown-list.style-two .countdown-list__item {
+ background-color: var(--main-600);
+ color: #fff !important;
+}
+
+.countdown-list.style-two .countdown-list__item::before {
+ color: var(--main-600) !important;
+}
+
+.countdown-list.style-three {
+ gap: 12px;
+}
+
+.countdown-list.style-three .countdown-list__item {
+ background-color: var(--main-50);
+ font-size: 11px !important;
+ padding: 6px;
+ color: #1A1A1A !important;
+}
+
+.countdown-list.style-four .countdown-list__item {
+ width: 64px;
+ height: 64px;
+ align-items: center;
+ padding: 2px;
+ justify-content: center;
+}
+
+.countdown-list.style-four .countdown-list__item::before {
+ color: var(--neutral-600);
+}
+
+/* ========================== Count Down Css End =============================== */
+.badge-notification {
+ margin-bottom: 6px;
+ position: absolute;
+ inset-block-start: -18px;
+ inset-inline-start: 0;
+}
+
+.badge-notification::before {
+ position: absolute;
+ content: "";
+ width: 11px;
+ height: 6px;
+ background-color: inherit;
+ top: calc(100% - 1px);
+ clip-path: polygon(0% 0%, 100% 0%, 0% 100%, 0% 100%);
+}
+
+.badge-style-two::before {
+ position: absolute;
+ content: "";
+ width: 12px;
+ height: 12px;
+ background: var(--main-two-600);
+ border-radius: 2px;
+ inset-inline-start: -4px;
+ transform: translateY(-50%) rotate(45deg);
+ top: 50%;
+}
+
+/* ================================= Range Slider Css Start =========================== */
+.custom--range #slider-range {
+ height: 4px;
+ border: 0;
+ background: var(--gray-200);
+ margin: 8px;
+}
+
+.custom--range #slider-range .ui-slider-handle {
+ width: 16px !important;
+ height: 16px !important;
+ background-color: var(--main-600) !important;
+ border-radius: 50%;
+ top: 50%;
+ transform: translateY(-50%);
+ border: 0 !important;
+ outline: 0 !important;
+ transition: 0.2s linear;
+}
+
+.custom--range #slider-range .ui-slider-handle:hover, .custom--range #slider-range .ui-slider-handle.ui-state-active {
+ transform: translateY(-50%) scale(1.3);
+}
+
+.custom--range #slider-range .ui-slider-handle.ui-state-active {
+ box-shadow: 0px 0px 12px 4px #95959541 !important;
+}
+
+.custom--range #slider-range .ui-widget-header {
+ background-color: var(--main-600);
+ transition: 0.2s linear;
+}
+
+.custom--range #slider-range span:focus {
+ background-color: var(--main-600);
+}
+
+.custom--range__prices {
+ width: 58px;
+}
+
+.custom--range input {
+ border: 0;
+ color: hsl(var(--body-color));
+ font-weight: 500;
+ outline: 0;
+}
+
+/* ================================= Range Slider Css End =========================== */
+/* ================================= Typography Css Start =========================== */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: var(--body-font);
+ color: hsl(var(--body-color));
+ word-break: break-word;
+ background-color: hsl(var(--white));
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+
+p {
+ font-weight: 400;
+ margin: 0;
+ line-height: 1.6;
+}
+
+span {
+ display: inline-block;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 0 0 16px 0;
+ font-family: var(--heading-font);
+ color: hsl(var(--heading-color));
+ line-height: 1.2;
+ font-weight: 700;
+}
+
+h1, .h1 {
+ font-size: var(--heading-one);
+}
+
+h2, .h2 {
+ font-size: var(--heading-two);
+}
+
+h3, .h3 {
+ font-size: var(--heading-three);
+}
+
+h4, .h4 {
+ font-size: var(--heading-four);
+}
+
+h5, .h5 {
+ font-size: var(--heading-five);
+}
+
+h6, .h6 {
+ font-size: var(--heading-six);
+}
+
+h1 > a,
+h2 > a,
+h3 > a,
+h4 > a,
+h5 > a,
+h6 > a {
+ font-weight: inherit;
+ font-size: inherit;
+ color: inherit;
+ transition: 0.2s linear;
+ line-height: inherit;
+}
+
+h1 > a:hover,
+h2 > a:hover,
+h3 > a:hover,
+h4 > a:hover,
+h5 > a:hover,
+h6 > a:hover {
+ color: hsl(var(--main));
+}
+
+a {
+ display: inline-block;
+ transition: 0.2s linear;
+ text-decoration: none;
+ color: #0661e9;
+}
+
+a:hover {
+ color: #1d72f2;
+}
+
+img {
+ max-width: 100%;
+ height: auto;
+}
+
+select {
+ cursor: pointer;
+}
+
+ul,
+ol {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+button {
+ border: 0;
+ background-color: transparent;
+}
+
+button:focus {
+ outline: none;
+ box-shadow: none;
+}
+
+.form-select:focus {
+ outline: 0;
+ box-shadow: none;
+}
+
+input:focus-visible {
+ outline: 0;
+}
+
+/* ================================= Typography Css End =========================== */
+/* ================================= Margin Css Start =========================== */
+.m-2 {
+ margin: var(--size-2) !important;
+}
+
+.m-3 {
+ margin: var(--size-3) !important;
+}
+
+.m-4 {
+ margin: var(--size-4) !important;
+}
+
+.m-5 {
+ margin: var(--size-5) !important;
+}
+
+.m-6 {
+ margin: var(--size-6) !important;
+}
+
+.m-7 {
+ margin: var(--size-7) !important;
+}
+
+.m-8 {
+ margin: var(--size-8) !important;
+}
+
+.m-9 {
+ margin: var(--size-9) !important;
+}
+
+.m-10 {
+ margin: var(--size-10) !important;
+}
+
+.m-11 {
+ margin: var(--size-11) !important;
+}
+
+.m-12 {
+ margin: var(--size-12) !important;
+}
+
+.m-13 {
+ margin: var(--size-13) !important;
+}
+
+.m-14 {
+ margin: var(--size-14) !important;
+}
+
+.m-16 {
+ margin: var(--size-16) !important;
+}
+
+.m-18 {
+ margin: var(--size-18) !important;
+}
+
+.m-20 {
+ margin: var(--size-20) !important;
+}
+
+.m-22 {
+ margin: var(--size-22) !important;
+}
+
+.m-24 {
+ margin: var(--size-24) !important;
+}
+
+.m-26 {
+ margin: var(--size-26) !important;
+}
+
+.m-28 {
+ margin: var(--size-28) !important;
+}
+
+.m-30 {
+ margin: var(--size-30) !important;
+}
+
+.m-32 {
+ margin: var(--size-32) !important;
+}
+
+.m-36 {
+ margin: var(--size-36) !important;
+}
+
+.m-40 {
+ margin: var(--size-40) !important;
+}
+
+.m-44 {
+ margin: var(--size-44) !important;
+}
+
+.m-48 {
+ margin: var(--size-48) !important;
+}
+
+.m-52 {
+ margin: var(--size-52) !important;
+}
+
+.m-56 {
+ margin: var(--size-56) !important;
+}
+
+.m-60 {
+ margin: var(--size-60) !important;
+}
+
+.m-64 {
+ margin: var(--size-64) !important;
+}
+
+.m-68 {
+ margin: var(--size-68) !important;
+}
+
+.m-72 {
+ margin: var(--size-72) !important;
+}
+
+.m-76 {
+ margin: var(--size-76) !important;
+}
+
+.m-80 {
+ margin: var(--size-80) !important;
+}
+
+.m-90 {
+ margin: var(--size-90) !important;
+}
+
+.m-110 {
+ margin: var(--size-110) !important;
+}
+
+.m-120 {
+ margin: var(--size-120) !important;
+}
+
+.m-144 {
+ margin: var(--size-144) !important;
+}
+
+.m-160 {
+ margin: var(--size-160) !important;
+}
+
+.mx-2 {
+ margin-inline: var(--size-2) !important;
+}
+
+.mx-3 {
+ margin-inline: var(--size-3) !important;
+}
+
+.mx-4 {
+ margin-inline: var(--size-4) !important;
+}
+
+.mx-5 {
+ margin-inline: var(--size-5) !important;
+}
+
+.mx-6 {
+ margin-inline: var(--size-6) !important;
+}
+
+.mx-7 {
+ margin-inline: var(--size-7) !important;
+}
+
+.mx-8 {
+ margin-inline: var(--size-8) !important;
+}
+
+.mx-9 {
+ margin-inline: var(--size-9) !important;
+}
+
+.mx-10 {
+ margin-inline: var(--size-10) !important;
+}
+
+.mx-11 {
+ margin-inline: var(--size-11) !important;
+}
+
+.mx-12 {
+ margin-inline: var(--size-12) !important;
+}
+
+.mx-13 {
+ margin-inline: var(--size-13) !important;
+}
+
+.mx-14 {
+ margin-inline: var(--size-14) !important;
+}
+
+.mx-16 {
+ margin-inline: var(--size-16) !important;
+}
+
+.mx-18 {
+ margin-inline: var(--size-18) !important;
+}
+
+.mx-20 {
+ margin-inline: var(--size-20) !important;
+}
+
+.mx-22 {
+ margin-inline: var(--size-22) !important;
+}
+
+.mx-24 {
+ margin-inline: var(--size-24) !important;
+}
+
+.mx-26 {
+ margin-inline: var(--size-26) !important;
+}
+
+.mx-28 {
+ margin-inline: var(--size-28) !important;
+}
+
+.mx-30 {
+ margin-inline: var(--size-30) !important;
+}
+
+.mx-32 {
+ margin-inline: var(--size-32) !important;
+}
+
+.mx-36 {
+ margin-inline: var(--size-36) !important;
+}
+
+.mx-40 {
+ margin-inline: var(--size-40) !important;
+}
+
+.mx-44 {
+ margin-inline: var(--size-44) !important;
+}
+
+.mx-48 {
+ margin-inline: var(--size-48) !important;
+}
+
+.mx-52 {
+ margin-inline: var(--size-52) !important;
+}
+
+.mx-56 {
+ margin-inline: var(--size-56) !important;
+}
+
+.mx-60 {
+ margin-inline: var(--size-60) !important;
+}
+
+.mx-64 {
+ margin-inline: var(--size-64) !important;
+}
+
+.mx-68 {
+ margin-inline: var(--size-68) !important;
+}
+
+.mx-72 {
+ margin-inline: var(--size-72) !important;
+}
+
+.mx-76 {
+ margin-inline: var(--size-76) !important;
+}
+
+.mx-80 {
+ margin-inline: var(--size-80) !important;
+}
+
+.mx-90 {
+ margin-inline: var(--size-90) !important;
+}
+
+.mx-110 {
+ margin-inline: var(--size-110) !important;
+}
+
+.mx-120 {
+ margin-inline: var(--size-120) !important;
+}
+
+.mx-144 {
+ margin-inline: var(--size-144) !important;
+}
+
+.mx-160 {
+ margin-inline: var(--size-160) !important;
+}
+
+.my-2 {
+ margin-block: var(--size-2) !important;
+}
+
+.my-3 {
+ margin-block: var(--size-3) !important;
+}
+
+.my-4 {
+ margin-block: var(--size-4) !important;
+}
+
+.my-5 {
+ margin-block: var(--size-5) !important;
+}
+
+.my-6 {
+ margin-block: var(--size-6) !important;
+}
+
+.my-7 {
+ margin-block: var(--size-7) !important;
+}
+
+.my-8 {
+ margin-block: var(--size-8) !important;
+}
+
+.my-9 {
+ margin-block: var(--size-9) !important;
+}
+
+.my-10 {
+ margin-block: var(--size-10) !important;
+}
+
+.my-11 {
+ margin-block: var(--size-11) !important;
+}
+
+.my-12 {
+ margin-block: var(--size-12) !important;
+}
+
+.my-13 {
+ margin-block: var(--size-13) !important;
+}
+
+.my-14 {
+ margin-block: var(--size-14) !important;
+}
+
+.my-16 {
+ margin-block: var(--size-16) !important;
+}
+
+.my-18 {
+ margin-block: var(--size-18) !important;
+}
+
+.my-20 {
+ margin-block: var(--size-20) !important;
+}
+
+.my-22 {
+ margin-block: var(--size-22) !important;
+}
+
+.my-24 {
+ margin-block: var(--size-24) !important;
+}
+
+.my-26 {
+ margin-block: var(--size-26) !important;
+}
+
+.my-28 {
+ margin-block: var(--size-28) !important;
+}
+
+.my-30 {
+ margin-block: var(--size-30) !important;
+}
+
+.my-32 {
+ margin-block: var(--size-32) !important;
+}
+
+.my-36 {
+ margin-block: var(--size-36) !important;
+}
+
+.my-40 {
+ margin-block: var(--size-40) !important;
+}
+
+.my-44 {
+ margin-block: var(--size-44) !important;
+}
+
+.my-48 {
+ margin-block: var(--size-48) !important;
+}
+
+.my-52 {
+ margin-block: var(--size-52) !important;
+}
+
+.my-56 {
+ margin-block: var(--size-56) !important;
+}
+
+.my-60 {
+ margin-block: var(--size-60) !important;
+}
+
+.my-64 {
+ margin-block: var(--size-64) !important;
+}
+
+.my-68 {
+ margin-block: var(--size-68) !important;
+}
+
+.my-72 {
+ margin-block: var(--size-72) !important;
+}
+
+.my-76 {
+ margin-block: var(--size-76) !important;
+}
+
+.my-80 {
+ margin-block: var(--size-80) !important;
+}
+
+.my-90 {
+ margin-block: var(--size-90) !important;
+}
+
+.my-110 {
+ margin-block: var(--size-110) !important;
+}
+
+.my-120 {
+ margin-block: var(--size-120) !important;
+}
+
+.my-144 {
+ margin-block: var(--size-144) !important;
+}
+
+.my-160 {
+ margin-block: var(--size-160) !important;
+}
+
+.ms-2 {
+ margin-inline-start: var(--size-2) !important;
+}
+
+.ms-3 {
+ margin-inline-start: var(--size-3) !important;
+}
+
+.ms-4 {
+ margin-inline-start: var(--size-4) !important;
+}
+
+.ms-5 {
+ margin-inline-start: var(--size-5) !important;
+}
+
+.ms-6 {
+ margin-inline-start: var(--size-6) !important;
+}
+
+.ms-7 {
+ margin-inline-start: var(--size-7) !important;
+}
+
+.ms-8 {
+ margin-inline-start: var(--size-8) !important;
+}
+
+.ms-9 {
+ margin-inline-start: var(--size-9) !important;
+}
+
+.ms-10 {
+ margin-inline-start: var(--size-10) !important;
+}
+
+.ms-11 {
+ margin-inline-start: var(--size-11) !important;
+}
+
+.ms-12 {
+ margin-inline-start: var(--size-12) !important;
+}
+
+.ms-13 {
+ margin-inline-start: var(--size-13) !important;
+}
+
+.ms-14 {
+ margin-inline-start: var(--size-14) !important;
+}
+
+.ms-16 {
+ margin-inline-start: var(--size-16) !important;
+}
+
+.ms-18 {
+ margin-inline-start: var(--size-18) !important;
+}
+
+.ms-20 {
+ margin-inline-start: var(--size-20) !important;
+}
+
+.ms-22 {
+ margin-inline-start: var(--size-22) !important;
+}
+
+.ms-24 {
+ margin-inline-start: var(--size-24) !important;
+}
+
+.ms-26 {
+ margin-inline-start: var(--size-26) !important;
+}
+
+.ms-28 {
+ margin-inline-start: var(--size-28) !important;
+}
+
+.ms-30 {
+ margin-inline-start: var(--size-30) !important;
+}
+
+.ms-32 {
+ margin-inline-start: var(--size-32) !important;
+}
+
+.ms-36 {
+ margin-inline-start: var(--size-36) !important;
+}
+
+.ms-40 {
+ margin-inline-start: var(--size-40) !important;
+}
+
+.ms-44 {
+ margin-inline-start: var(--size-44) !important;
+}
+
+.ms-48 {
+ margin-inline-start: var(--size-48) !important;
+}
+
+.ms-52 {
+ margin-inline-start: var(--size-52) !important;
+}
+
+.ms-56 {
+ margin-inline-start: var(--size-56) !important;
+}
+
+.ms-60 {
+ margin-inline-start: var(--size-60) !important;
+}
+
+.ms-64 {
+ margin-inline-start: var(--size-64) !important;
+}
+
+.ms-68 {
+ margin-inline-start: var(--size-68) !important;
+}
+
+.ms-72 {
+ margin-inline-start: var(--size-72) !important;
+}
+
+.ms-76 {
+ margin-inline-start: var(--size-76) !important;
+}
+
+.ms-80 {
+ margin-inline-start: var(--size-80) !important;
+}
+
+.ms-90 {
+ margin-inline-start: var(--size-90) !important;
+}
+
+.ms-110 {
+ margin-inline-start: var(--size-110) !important;
+}
+
+.ms-120 {
+ margin-inline-start: var(--size-120) !important;
+}
+
+.ms-144 {
+ margin-inline-start: var(--size-144) !important;
+}
+
+.ms-160 {
+ margin-inline-start: var(--size-160) !important;
+}
+
+.me-2 {
+ margin-inline-end: var(--size-2) !important;
+}
+
+.me-3 {
+ margin-inline-end: var(--size-3) !important;
+}
+
+.me-4 {
+ margin-inline-end: var(--size-4) !important;
+}
+
+.me-5 {
+ margin-inline-end: var(--size-5) !important;
+}
+
+.me-6 {
+ margin-inline-end: var(--size-6) !important;
+}
+
+.me-7 {
+ margin-inline-end: var(--size-7) !important;
+}
+
+.me-8 {
+ margin-inline-end: var(--size-8) !important;
+}
+
+.me-9 {
+ margin-inline-end: var(--size-9) !important;
+}
+
+.me-10 {
+ margin-inline-end: var(--size-10) !important;
+}
+
+.me-11 {
+ margin-inline-end: var(--size-11) !important;
+}
+
+.me-12 {
+ margin-inline-end: var(--size-12) !important;
+}
+
+.me-13 {
+ margin-inline-end: var(--size-13) !important;
+}
+
+.me-14 {
+ margin-inline-end: var(--size-14) !important;
+}
+
+.me-16 {
+ margin-inline-end: var(--size-16) !important;
+}
+
+.me-18 {
+ margin-inline-end: var(--size-18) !important;
+}
+
+.me-20 {
+ margin-inline-end: var(--size-20) !important;
+}
+
+.me-22 {
+ margin-inline-end: var(--size-22) !important;
+}
+
+.me-24 {
+ margin-inline-end: var(--size-24) !important;
+}
+
+.me-26 {
+ margin-inline-end: var(--size-26) !important;
+}
+
+.me-28 {
+ margin-inline-end: var(--size-28) !important;
+}
+
+.me-30 {
+ margin-inline-end: var(--size-30) !important;
+}
+
+.me-32 {
+ margin-inline-end: var(--size-32) !important;
+}
+
+.me-36 {
+ margin-inline-end: var(--size-36) !important;
+}
+
+.me-40 {
+ margin-inline-end: var(--size-40) !important;
+}
+
+.me-44 {
+ margin-inline-end: var(--size-44) !important;
+}
+
+.me-48 {
+ margin-inline-end: var(--size-48) !important;
+}
+
+.me-52 {
+ margin-inline-end: var(--size-52) !important;
+}
+
+.me-56 {
+ margin-inline-end: var(--size-56) !important;
+}
+
+.me-60 {
+ margin-inline-end: var(--size-60) !important;
+}
+
+.me-64 {
+ margin-inline-end: var(--size-64) !important;
+}
+
+.me-68 {
+ margin-inline-end: var(--size-68) !important;
+}
+
+.me-72 {
+ margin-inline-end: var(--size-72) !important;
+}
+
+.me-76 {
+ margin-inline-end: var(--size-76) !important;
+}
+
+.me-80 {
+ margin-inline-end: var(--size-80) !important;
+}
+
+.me-90 {
+ margin-inline-end: var(--size-90) !important;
+}
+
+.me-110 {
+ margin-inline-end: var(--size-110) !important;
+}
+
+.me-120 {
+ margin-inline-end: var(--size-120) !important;
+}
+
+.me-144 {
+ margin-inline-end: var(--size-144) !important;
+}
+
+.me-160 {
+ margin-inline-end: var(--size-160) !important;
+}
+
+.mt-2 {
+ margin-block-start: var(--size-2) !important;
+}
+
+.mt-3 {
+ margin-block-start: var(--size-3) !important;
+}
+
+.mt-4 {
+ margin-block-start: var(--size-4) !important;
+}
+
+.mt-5 {
+ margin-block-start: var(--size-5) !important;
+}
+
+.mt-6 {
+ margin-block-start: var(--size-6) !important;
+}
+
+.mt-7 {
+ margin-block-start: var(--size-7) !important;
+}
+
+.mt-8 {
+ margin-block-start: var(--size-8) !important;
+}
+
+.mt-9 {
+ margin-block-start: var(--size-9) !important;
+}
+
+.mt-10 {
+ margin-block-start: var(--size-10) !important;
+}
+
+.mt-11 {
+ margin-block-start: var(--size-11) !important;
+}
+
+.mt-12 {
+ margin-block-start: var(--size-12) !important;
+}
+
+.mt-13 {
+ margin-block-start: var(--size-13) !important;
+}
+
+.mt-14 {
+ margin-block-start: var(--size-14) !important;
+}
+
+.mt-16 {
+ margin-block-start: var(--size-16) !important;
+}
+
+.mt-18 {
+ margin-block-start: var(--size-18) !important;
+}
+
+.mt-20 {
+ margin-block-start: var(--size-20) !important;
+}
+
+.mt-22 {
+ margin-block-start: var(--size-22) !important;
+}
+
+.mt-24 {
+ margin-block-start: var(--size-24) !important;
+}
+
+.mt-26 {
+ margin-block-start: var(--size-26) !important;
+}
+
+.mt-28 {
+ margin-block-start: var(--size-28) !important;
+}
+
+.mt-30 {
+ margin-block-start: var(--size-30) !important;
+}
+
+.mt-32 {
+ margin-block-start: var(--size-32) !important;
+}
+
+.mt-36 {
+ margin-block-start: var(--size-36) !important;
+}
+
+.mt-40 {
+ margin-block-start: var(--size-40) !important;
+}
+
+.mt-44 {
+ margin-block-start: var(--size-44) !important;
+}
+
+.mt-48 {
+ margin-block-start: var(--size-48) !important;
+}
+
+.mt-52 {
+ margin-block-start: var(--size-52) !important;
+}
+
+.mt-56 {
+ margin-block-start: var(--size-56) !important;
+}
+
+.mt-60 {
+ margin-block-start: var(--size-60) !important;
+}
+
+.mt-64 {
+ margin-block-start: var(--size-64) !important;
+}
+
+.mt-68 {
+ margin-block-start: var(--size-68) !important;
+}
+
+.mt-72 {
+ margin-block-start: var(--size-72) !important;
+}
+
+.mt-76 {
+ margin-block-start: var(--size-76) !important;
+}
+
+.mt-80 {
+ margin-block-start: var(--size-80) !important;
+}
+
+.mt-90 {
+ margin-block-start: var(--size-90) !important;
+}
+
+.mt-110 {
+ margin-block-start: var(--size-110) !important;
+}
+
+.mt-120 {
+ margin-block-start: var(--size-120) !important;
+}
+
+.mt-144 {
+ margin-block-start: var(--size-144) !important;
+}
+
+.mt-160 {
+ margin-block-start: var(--size-160) !important;
+}
+
+.mb-2 {
+ margin-block-end: var(--size-2) !important;
+}
+
+.mb-3 {
+ margin-block-end: var(--size-3) !important;
+}
+
+.mb-4 {
+ margin-block-end: var(--size-4) !important;
+}
+
+.mb-5 {
+ margin-block-end: var(--size-5) !important;
+}
+
+.mb-6 {
+ margin-block-end: var(--size-6) !important;
+}
+
+.mb-7 {
+ margin-block-end: var(--size-7) !important;
+}
+
+.mb-8 {
+ margin-block-end: var(--size-8) !important;
+}
+
+.mb-9 {
+ margin-block-end: var(--size-9) !important;
+}
+
+.mb-10 {
+ margin-block-end: var(--size-10) !important;
+}
+
+.mb-11 {
+ margin-block-end: var(--size-11) !important;
+}
+
+.mb-12 {
+ margin-block-end: var(--size-12) !important;
+}
+
+.mb-13 {
+ margin-block-end: var(--size-13) !important;
+}
+
+.mb-14 {
+ margin-block-end: var(--size-14) !important;
+}
+
+.mb-16 {
+ margin-block-end: var(--size-16) !important;
+}
+
+.mb-18 {
+ margin-block-end: var(--size-18) !important;
+}
+
+.mb-20 {
+ margin-block-end: var(--size-20) !important;
+}
+
+.mb-22 {
+ margin-block-end: var(--size-22) !important;
+}
+
+.mb-24 {
+ margin-block-end: var(--size-24) !important;
+}
+
+.mb-26 {
+ margin-block-end: var(--size-26) !important;
+}
+
+.mb-28 {
+ margin-block-end: var(--size-28) !important;
+}
+
+.mb-30 {
+ margin-block-end: var(--size-30) !important;
+}
+
+.mb-32 {
+ margin-block-end: var(--size-32) !important;
+}
+
+.mb-36 {
+ margin-block-end: var(--size-36) !important;
+}
+
+.mb-40 {
+ margin-block-end: var(--size-40) !important;
+}
+
+.mb-44 {
+ margin-block-end: var(--size-44) !important;
+}
+
+.mb-48 {
+ margin-block-end: var(--size-48) !important;
+}
+
+.mb-52 {
+ margin-block-end: var(--size-52) !important;
+}
+
+.mb-56 {
+ margin-block-end: var(--size-56) !important;
+}
+
+.mb-60 {
+ margin-block-end: var(--size-60) !important;
+}
+
+.mb-64 {
+ margin-block-end: var(--size-64) !important;
+}
+
+.mb-68 {
+ margin-block-end: var(--size-68) !important;
+}
+
+.mb-72 {
+ margin-block-end: var(--size-72) !important;
+}
+
+.mb-76 {
+ margin-block-end: var(--size-76) !important;
+}
+
+.mb-80 {
+ margin-block-end: var(--size-80) !important;
+}
+
+.mb-90 {
+ margin-block-end: var(--size-90) !important;
+}
+
+.mb-110 {
+ margin-block-end: var(--size-110) !important;
+}
+
+.mb-120 {
+ margin-block-end: var(--size-120) !important;
+}
+
+.mb-144 {
+ margin-block-end: var(--size-144) !important;
+}
+
+.mb-160 {
+ margin-block-end: var(--size-160) !important;
+}
+
+.mt-0 {
+ margin-block-start: 0 !important;
+}
+
+.mb-0 {
+ margin-block-end: 0 !important;
+}
+
+.ms-0 {
+ margin-inline-start: 0 !important;
+}
+
+.me-0 {
+ margin-inline-end: 0 !important;
+}
+
+.my-120 {
+ margin-block-start: 60px !important;
+ margin-block-end: 60px !important;
+}
+
+@media (min-width: 576px) {
+ .my-120 {
+ margin-block-start: 80px !important;
+ margin-block-end: 80px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .my-120 {
+ margin-block-start: 120px !important;
+ margin-block-end: 120px !important;
+ }
+}
+
+.mt-120 {
+ margin-block-start: 60px !important;
+}
+
+@media (min-width: 576px) {
+ .mt-120 {
+ margin-block-start: 80px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .mt-120 {
+ margin-block-start: 120px !important;
+ }
+}
+
+.mb-120 {
+ margin-block-end: 60px !important;
+}
+
+@media (min-width: 576px) {
+ .mb-120 {
+ margin-block-end: 80px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .mb-120 {
+ margin-block-end: 120px !important;
+ }
+}
+
+.my-60 {
+ margin-block-start: 30px !important;
+ margin-block-end: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .my-60 {
+ margin-block-start: 40px !important;
+ margin-block-end: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .my-60 {
+ margin-block-start: 60px !important;
+ margin-block-end: 60px !important;
+ }
+}
+
+.mt-60 {
+ margin-block-start: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .mt-60 {
+ margin-block-start: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .mt-60 {
+ margin-block-start: 60px !important;
+ }
+}
+
+.mb-60 {
+ margin-block-end: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .mb-60 {
+ margin-block-end: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .mb-60 {
+ margin-block-end: 60px !important;
+ }
+}
+/* ================================= Margin Css End =========================== */
+/* ================================= Padding Css Start =========================== */
+.p-2 {
+ padding: var(--size-2) !important;
+}
+
+.p-3 {
+ padding: var(--size-3) !important;
+}
+
+.p-4 {
+ padding: var(--size-4) !important;
+}
+
+.p-5 {
+ padding: var(--size-5) !important;
+}
+
+.p-6 {
+ padding: var(--size-6) !important;
+}
+
+.p-7 {
+ padding: var(--size-7) !important;
+}
+
+.p-8 {
+ padding: var(--size-8) !important;
+}
+
+.p-9 {
+ padding: var(--size-9) !important;
+}
+
+.p-10 {
+ padding: var(--size-10) !important;
+}
+
+.p-11 {
+ padding: var(--size-11) !important;
+}
+
+.p-12 {
+ padding: var(--size-12) !important;
+}
+
+.p-13 {
+ padding: var(--size-13) !important;
+}
+
+.p-14 {
+ padding: var(--size-14) !important;
+}
+
+.p-16 {
+ padding: var(--size-16) !important;
+}
+
+.p-18 {
+ padding: var(--size-18) !important;
+}
+
+.p-20 {
+ padding: var(--size-20) !important;
+}
+
+.p-22 {
+ padding: var(--size-22) !important;
+}
+
+.p-24 {
+ padding: var(--size-24) !important;
+}
+
+.p-26 {
+ padding: var(--size-26) !important;
+}
+
+.p-28 {
+ padding: var(--size-28) !important;
+}
+
+.p-30 {
+ padding: var(--size-30) !important;
+}
+
+.p-32 {
+ padding: var(--size-32) !important;
+}
+
+.p-36 {
+ padding: var(--size-36) !important;
+}
+
+.p-40 {
+ padding: var(--size-40) !important;
+}
+
+.p-44 {
+ padding: var(--size-44) !important;
+}
+
+.p-48 {
+ padding: var(--size-48) !important;
+}
+
+.p-52 {
+ padding: var(--size-52) !important;
+}
+
+.p-56 {
+ padding: var(--size-56) !important;
+}
+
+.p-60 {
+ padding: var(--size-60) !important;
+}
+
+.p-64 {
+ padding: var(--size-64) !important;
+}
+
+.p-68 {
+ padding: var(--size-68) !important;
+}
+
+.p-72 {
+ padding: var(--size-72) !important;
+}
+
+.p-76 {
+ padding: var(--size-76) !important;
+}
+
+.p-80 {
+ padding: var(--size-80) !important;
+}
+
+.p-90 {
+ padding: var(--size-90) !important;
+}
+
+.p-110 {
+ padding: var(--size-110) !important;
+}
+
+.p-120 {
+ padding: var(--size-120) !important;
+}
+
+.p-144 {
+ padding: var(--size-144) !important;
+}
+
+.p-160 {
+ padding: var(--size-160) !important;
+}
+
+.px-2 {
+ padding-inline: var(--size-2) !important;
+}
+
+.px-3 {
+ padding-inline: var(--size-3) !important;
+}
+
+.px-4 {
+ padding-inline: var(--size-4) !important;
+}
+
+.px-5 {
+ padding-inline: var(--size-5) !important;
+}
+
+.px-6 {
+ padding-inline: var(--size-6) !important;
+}
+
+.px-7 {
+ padding-inline: var(--size-7) !important;
+}
+
+.px-8 {
+ padding-inline: var(--size-8) !important;
+}
+
+.px-9 {
+ padding-inline: var(--size-9) !important;
+}
+
+.px-10 {
+ padding-inline: var(--size-10) !important;
+}
+
+.px-11 {
+ padding-inline: var(--size-11) !important;
+}
+
+.px-12 {
+ padding-inline: var(--size-12) !important;
+}
+
+.px-13 {
+ padding-inline: var(--size-13) !important;
+}
+
+.px-14 {
+ padding-inline: var(--size-14) !important;
+}
+
+.px-16 {
+ padding-inline: var(--size-16) !important;
+}
+
+.px-18 {
+ padding-inline: var(--size-18) !important;
+}
+
+.px-20 {
+ padding-inline: var(--size-20) !important;
+}
+
+.px-22 {
+ padding-inline: var(--size-22) !important;
+}
+
+.px-24 {
+ padding-inline: var(--size-24) !important;
+}
+
+.px-26 {
+ padding-inline: var(--size-26) !important;
+}
+
+.px-28 {
+ padding-inline: var(--size-28) !important;
+}
+
+.px-30 {
+ padding-inline: var(--size-30) !important;
+}
+
+.px-32 {
+ padding-inline: var(--size-32) !important;
+}
+
+.px-36 {
+ padding-inline: var(--size-36) !important;
+}
+
+.px-40 {
+ padding-inline: var(--size-40) !important;
+}
+
+.px-44 {
+ padding-inline: var(--size-44) !important;
+}
+
+.px-48 {
+ padding-inline: var(--size-48) !important;
+}
+
+.px-52 {
+ padding-inline: var(--size-52) !important;
+}
+
+.px-56 {
+ padding-inline: var(--size-56) !important;
+}
+
+.px-60 {
+ padding-inline: var(--size-60) !important;
+}
+
+.px-64 {
+ padding-inline: var(--size-64) !important;
+}
+
+.px-68 {
+ padding-inline: var(--size-68) !important;
+}
+
+.px-72 {
+ padding-inline: var(--size-72) !important;
+}
+
+.px-76 {
+ padding-inline: var(--size-76) !important;
+}
+
+.px-80 {
+ padding-inline: var(--size-80) !important;
+}
+
+.px-90 {
+ padding-inline: var(--size-90) !important;
+}
+
+.px-110 {
+ padding-inline: var(--size-110) !important;
+}
+
+.px-120 {
+ padding-inline: var(--size-120) !important;
+}
+
+.px-144 {
+ padding-inline: var(--size-144) !important;
+}
+
+.px-160 {
+ padding-inline: var(--size-160) !important;
+}
+
+.py-2 {
+ padding-block: var(--size-2) !important;
+}
+
+.py-3 {
+ padding-block: var(--size-3) !important;
+}
+
+.py-4 {
+ padding-block: var(--size-4) !important;
+}
+
+.py-5 {
+ padding-block: var(--size-5) !important;
+}
+
+.py-6 {
+ padding-block: var(--size-6) !important;
+}
+
+.py-7 {
+ padding-block: var(--size-7) !important;
+}
+
+.py-8 {
+ padding-block: var(--size-8) !important;
+}
+
+.py-9 {
+ padding-block: var(--size-9) !important;
+}
+
+.py-10 {
+ padding-block: var(--size-10) !important;
+}
+
+.py-11 {
+ padding-block: var(--size-11) !important;
+}
+
+.py-12 {
+ padding-block: var(--size-12) !important;
+}
+
+.py-13 {
+ padding-block: var(--size-13) !important;
+}
+
+.py-14 {
+ padding-block: var(--size-14) !important;
+}
+
+.py-16 {
+ padding-block: var(--size-16) !important;
+}
+
+.py-18 {
+ padding-block: var(--size-18) !important;
+}
+
+.py-20 {
+ padding-block: var(--size-20) !important;
+}
+
+.py-22 {
+ padding-block: var(--size-22) !important;
+}
+
+.py-24 {
+ padding-block: var(--size-24) !important;
+}
+
+.py-26 {
+ padding-block: var(--size-26) !important;
+}
+
+.py-28 {
+ padding-block: var(--size-28) !important;
+}
+
+.py-30 {
+ padding-block: var(--size-30) !important;
+}
+
+.py-32 {
+ padding-block: var(--size-32) !important;
+}
+
+.py-36 {
+ padding-block: var(--size-36) !important;
+}
+
+.py-40 {
+ padding-block: var(--size-40) !important;
+}
+
+.py-44 {
+ padding-block: var(--size-44) !important;
+}
+
+.py-48 {
+ padding-block: var(--size-48) !important;
+}
+
+.py-52 {
+ padding-block: var(--size-52) !important;
+}
+
+.py-56 {
+ padding-block: var(--size-56) !important;
+}
+
+.py-60 {
+ padding-block: var(--size-60) !important;
+}
+
+.py-64 {
+ padding-block: var(--size-64) !important;
+}
+
+.py-68 {
+ padding-block: var(--size-68) !important;
+}
+
+.py-72 {
+ padding-block: var(--size-72) !important;
+}
+
+.py-76 {
+ padding-block: var(--size-76) !important;
+}
+
+.py-80 {
+ padding-block: var(--size-80) !important;
+}
+
+.py-90 {
+ padding-block: var(--size-90) !important;
+}
+
+.py-110 {
+ padding-block: var(--size-110) !important;
+}
+
+.py-120 {
+ padding-block: var(--size-120) !important;
+}
+
+.py-144 {
+ padding-block: var(--size-144) !important;
+}
+
+.py-160 {
+ padding-block: var(--size-160) !important;
+}
+
+.ps-2 {
+ padding-inline-start: var(--size-2) !important;
+}
+
+.ps-3 {
+ padding-inline-start: var(--size-3) !important;
+}
+
+.ps-4 {
+ padding-inline-start: var(--size-4) !important;
+}
+
+.ps-5 {
+ padding-inline-start: var(--size-5) !important;
+}
+
+.ps-6 {
+ padding-inline-start: var(--size-6) !important;
+}
+
+.ps-7 {
+ padding-inline-start: var(--size-7) !important;
+}
+
+.ps-8 {
+ padding-inline-start: var(--size-8) !important;
+}
+
+.ps-9 {
+ padding-inline-start: var(--size-9) !important;
+}
+
+.ps-10 {
+ padding-inline-start: var(--size-10) !important;
+}
+
+.ps-11 {
+ padding-inline-start: var(--size-11) !important;
+}
+
+.ps-12 {
+ padding-inline-start: var(--size-12) !important;
+}
+
+.ps-13 {
+ padding-inline-start: var(--size-13) !important;
+}
+
+.ps-14 {
+ padding-inline-start: var(--size-14) !important;
+}
+
+.ps-16 {
+ padding-inline-start: var(--size-16) !important;
+}
+
+.ps-18 {
+ padding-inline-start: var(--size-18) !important;
+}
+
+.ps-20 {
+ padding-inline-start: var(--size-20) !important;
+}
+
+.ps-22 {
+ padding-inline-start: var(--size-22) !important;
+}
+
+.ps-24 {
+ padding-inline-start: var(--size-24) !important;
+}
+
+.ps-26 {
+ padding-inline-start: var(--size-26) !important;
+}
+
+.ps-28 {
+ padding-inline-start: var(--size-28) !important;
+}
+
+.ps-30 {
+ padding-inline-start: var(--size-30) !important;
+}
+
+.ps-32 {
+ padding-inline-start: var(--size-32) !important;
+}
+
+.ps-36 {
+ padding-inline-start: var(--size-36) !important;
+}
+
+.ps-40 {
+ padding-inline-start: var(--size-40) !important;
+}
+
+.ps-44 {
+ padding-inline-start: var(--size-44) !important;
+}
+
+.ps-48 {
+ padding-inline-start: var(--size-48) !important;
+}
+
+.ps-52 {
+ padding-inline-start: var(--size-52) !important;
+}
+
+.ps-56 {
+ padding-inline-start: var(--size-56) !important;
+}
+
+.ps-60 {
+ padding-inline-start: var(--size-60) !important;
+}
+
+.ps-64 {
+ padding-inline-start: var(--size-64) !important;
+}
+
+.ps-68 {
+ padding-inline-start: var(--size-68) !important;
+}
+
+.ps-72 {
+ padding-inline-start: var(--size-72) !important;
+}
+
+.ps-76 {
+ padding-inline-start: var(--size-76) !important;
+}
+
+.ps-80 {
+ padding-inline-start: var(--size-80) !important;
+}
+
+.ps-90 {
+ padding-inline-start: var(--size-90) !important;
+}
+
+.ps-110 {
+ padding-inline-start: var(--size-110) !important;
+}
+
+.ps-120 {
+ padding-inline-start: var(--size-120) !important;
+}
+
+.ps-144 {
+ padding-inline-start: var(--size-144) !important;
+}
+
+.ps-160 {
+ padding-inline-start: var(--size-160) !important;
+}
+
+.pe-2 {
+ padding-inline-end: var(--size-2) !important;
+}
+
+.pe-3 {
+ padding-inline-end: var(--size-3) !important;
+}
+
+.pe-4 {
+ padding-inline-end: var(--size-4) !important;
+}
+
+.pe-5 {
+ padding-inline-end: var(--size-5) !important;
+}
+
+.pe-6 {
+ padding-inline-end: var(--size-6) !important;
+}
+
+.pe-7 {
+ padding-inline-end: var(--size-7) !important;
+}
+
+.pe-8 {
+ padding-inline-end: var(--size-8) !important;
+}
+
+.pe-9 {
+ padding-inline-end: var(--size-9) !important;
+}
+
+.pe-10 {
+ padding-inline-end: var(--size-10) !important;
+}
+
+.pe-11 {
+ padding-inline-end: var(--size-11) !important;
+}
+
+.pe-12 {
+ padding-inline-end: var(--size-12) !important;
+}
+
+.pe-13 {
+ padding-inline-end: var(--size-13) !important;
+}
+
+.pe-14 {
+ padding-inline-end: var(--size-14) !important;
+}
+
+.pe-16 {
+ padding-inline-end: var(--size-16) !important;
+}
+
+.pe-18 {
+ padding-inline-end: var(--size-18) !important;
+}
+
+.pe-20 {
+ padding-inline-end: var(--size-20) !important;
+}
+
+.pe-22 {
+ padding-inline-end: var(--size-22) !important;
+}
+
+.pe-24 {
+ padding-inline-end: var(--size-24) !important;
+}
+
+.pe-26 {
+ padding-inline-end: var(--size-26) !important;
+}
+
+.pe-28 {
+ padding-inline-end: var(--size-28) !important;
+}
+
+.pe-30 {
+ padding-inline-end: var(--size-30) !important;
+}
+
+.pe-32 {
+ padding-inline-end: var(--size-32) !important;
+}
+
+.pe-36 {
+ padding-inline-end: var(--size-36) !important;
+}
+
+.pe-40 {
+ padding-inline-end: var(--size-40) !important;
+}
+
+.pe-44 {
+ padding-inline-end: var(--size-44) !important;
+}
+
+.pe-48 {
+ padding-inline-end: var(--size-48) !important;
+}
+
+.pe-52 {
+ padding-inline-end: var(--size-52) !important;
+}
+
+.pe-56 {
+ padding-inline-end: var(--size-56) !important;
+}
+
+.pe-60 {
+ padding-inline-end: var(--size-60) !important;
+}
+
+.pe-64 {
+ padding-inline-end: var(--size-64) !important;
+}
+
+.pe-68 {
+ padding-inline-end: var(--size-68) !important;
+}
+
+.pe-72 {
+ padding-inline-end: var(--size-72) !important;
+}
+
+.pe-76 {
+ padding-inline-end: var(--size-76) !important;
+}
+
+.pe-80 {
+ padding-inline-end: var(--size-80) !important;
+}
+
+.pe-90 {
+ padding-inline-end: var(--size-90) !important;
+}
+
+.pe-110 {
+ padding-inline-end: var(--size-110) !important;
+}
+
+.pe-120 {
+ padding-inline-end: var(--size-120) !important;
+}
+
+.pe-144 {
+ padding-inline-end: var(--size-144) !important;
+}
+
+.pe-160 {
+ padding-inline-end: var(--size-160) !important;
+}
+
+.pt-2 {
+ padding-block-start: var(--size-2) !important;
+}
+
+.pt-3 {
+ padding-block-start: var(--size-3) !important;
+}
+
+.pt-4 {
+ padding-block-start: var(--size-4) !important;
+}
+
+.pt-5 {
+ padding-block-start: var(--size-5) !important;
+}
+
+.pt-6 {
+ padding-block-start: var(--size-6) !important;
+}
+
+.pt-7 {
+ padding-block-start: var(--size-7) !important;
+}
+
+.pt-8 {
+ padding-block-start: var(--size-8) !important;
+}
+
+.pt-9 {
+ padding-block-start: var(--size-9) !important;
+}
+
+.pt-10 {
+ padding-block-start: var(--size-10) !important;
+}
+
+.pt-11 {
+ padding-block-start: var(--size-11) !important;
+}
+
+.pt-12 {
+ padding-block-start: var(--size-12) !important;
+}
+
+.pt-13 {
+ padding-block-start: var(--size-13) !important;
+}
+
+.pt-14 {
+ padding-block-start: var(--size-14) !important;
+}
+
+.pt-16 {
+ padding-block-start: var(--size-16) !important;
+}
+
+.pt-18 {
+ padding-block-start: var(--size-18) !important;
+}
+
+.pt-20 {
+ padding-block-start: var(--size-20) !important;
+}
+
+.pt-22 {
+ padding-block-start: var(--size-22) !important;
+}
+
+.pt-24 {
+ padding-block-start: var(--size-24) !important;
+}
+
+.pt-26 {
+ padding-block-start: var(--size-26) !important;
+}
+
+.pt-28 {
+ padding-block-start: var(--size-28) !important;
+}
+
+.pt-30 {
+ padding-block-start: var(--size-30) !important;
+}
+
+.pt-32 {
+ padding-block-start: var(--size-32) !important;
+}
+
+.pt-36 {
+ padding-block-start: var(--size-36) !important;
+}
+
+.pt-40 {
+ padding-block-start: var(--size-40) !important;
+}
+
+.pt-44 {
+ padding-block-start: var(--size-44) !important;
+}
+
+.pt-48 {
+ padding-block-start: var(--size-48) !important;
+}
+
+.pt-52 {
+ padding-block-start: var(--size-52) !important;
+}
+
+.pt-56 {
+ padding-block-start: var(--size-56) !important;
+}
+
+.pt-60 {
+ padding-block-start: var(--size-60) !important;
+}
+
+.pt-64 {
+ padding-block-start: var(--size-64) !important;
+}
+
+.pt-68 {
+ padding-block-start: var(--size-68) !important;
+}
+
+.pt-72 {
+ padding-block-start: var(--size-72) !important;
+}
+
+.pt-76 {
+ padding-block-start: var(--size-76) !important;
+}
+
+.pt-80 {
+ padding-block-start: var(--size-80) !important;
+}
+
+.pt-90 {
+ padding-block-start: var(--size-90) !important;
+}
+
+.pt-110 {
+ padding-block-start: var(--size-110) !important;
+}
+
+.pt-120 {
+ padding-block-start: var(--size-120) !important;
+}
+
+.pt-144 {
+ padding-block-start: var(--size-144) !important;
+}
+
+.pt-160 {
+ padding-block-start: var(--size-160) !important;
+}
+
+.pb-2 {
+ padding-block-end: var(--size-2) !important;
+}
+
+.pb-3 {
+ padding-block-end: var(--size-3) !important;
+}
+
+.pb-4 {
+ padding-block-end: var(--size-4) !important;
+}
+
+.pb-5 {
+ padding-block-end: var(--size-5) !important;
+}
+
+.pb-6 {
+ padding-block-end: var(--size-6) !important;
+}
+
+.pb-7 {
+ padding-block-end: var(--size-7) !important;
+}
+
+.pb-8 {
+ padding-block-end: var(--size-8) !important;
+}
+
+.pb-9 {
+ padding-block-end: var(--size-9) !important;
+}
+
+.pb-10 {
+ padding-block-end: var(--size-10) !important;
+}
+
+.pb-11 {
+ padding-block-end: var(--size-11) !important;
+}
+
+.pb-12 {
+ padding-block-end: var(--size-12) !important;
+}
+
+.pb-13 {
+ padding-block-end: var(--size-13) !important;
+}
+
+.pb-14 {
+ padding-block-end: var(--size-14) !important;
+}
+
+.pb-16 {
+ padding-block-end: var(--size-16) !important;
+}
+
+.pb-18 {
+ padding-block-end: var(--size-18) !important;
+}
+
+.pb-20 {
+ padding-block-end: var(--size-20) !important;
+}
+
+.pb-22 {
+ padding-block-end: var(--size-22) !important;
+}
+
+.pb-24 {
+ padding-block-end: var(--size-24) !important;
+}
+
+.pb-26 {
+ padding-block-end: var(--size-26) !important;
+}
+
+.pb-28 {
+ padding-block-end: var(--size-28) !important;
+}
+
+.pb-30 {
+ padding-block-end: var(--size-30) !important;
+}
+
+.pb-32 {
+ padding-block-end: var(--size-32) !important;
+}
+
+.pb-36 {
+ padding-block-end: var(--size-36) !important;
+}
+
+.pb-40 {
+ padding-block-end: var(--size-40) !important;
+}
+
+.pb-44 {
+ padding-block-end: var(--size-44) !important;
+}
+
+.pb-48 {
+ padding-block-end: var(--size-48) !important;
+}
+
+.pb-52 {
+ padding-block-end: var(--size-52) !important;
+}
+
+.pb-56 {
+ padding-block-end: var(--size-56) !important;
+}
+
+.pb-60 {
+ padding-block-end: var(--size-60) !important;
+}
+
+.pb-64 {
+ padding-block-end: var(--size-64) !important;
+}
+
+.pb-68 {
+ padding-block-end: var(--size-68) !important;
+}
+
+.pb-72 {
+ padding-block-end: var(--size-72) !important;
+}
+
+.pb-76 {
+ padding-block-end: var(--size-76) !important;
+}
+
+.pb-80 {
+ padding-block-end: var(--size-80) !important;
+}
+
+.pb-90 {
+ padding-block-end: var(--size-90) !important;
+}
+
+.pb-110 {
+ padding-block-end: var(--size-110) !important;
+}
+
+.pb-120 {
+ padding-block-end: var(--size-120) !important;
+}
+
+.pb-144 {
+ padding-block-end: var(--size-144) !important;
+}
+
+.pb-160 {
+ padding-block-end: var(--size-160) !important;
+}
+
+.pt-0 {
+ padding-block-start: 0 !important;
+}
+
+.pb-0 {
+ padding-block-end: 0 !important;
+}
+
+.ps-0 {
+ padding-inline-start: 0 !important;
+}
+
+.pe-0 {
+ padding-inline-end: 0 !important;
+}
+
+.py-80 {
+ padding-block-start: 60px !important;
+ padding-block-end: 60px !important;
+}
+
+@media (min-width: 992px) {
+ .py-80 {
+ padding-block-start: 80px !important;
+ padding-block-end: 80px !important;
+ }
+}
+
+.pt-80 {
+ padding-block-start: 60px !important;
+}
+
+@media (min-width: 992px) {
+ .pt-80 {
+ padding-block-start: 80px !important;
+ }
+}
+
+.pb-80 {
+ padding-block-end: 60px !important;
+}
+
+@media (min-width: 992px) {
+ .pb-80 {
+ padding-block-end: 80px !important;
+ }
+}
+
+.py-60 {
+ padding-block-start: 30px !important;
+ padding-block-end: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .py-60 {
+ padding-block-start: 40px !important;
+ padding-block-end: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .py-60 {
+ padding-block-start: 60px !important;
+ padding-block-end: 60px !important;
+ }
+}
+
+.pt-60 {
+ padding-block-start: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .pt-60 {
+ padding-block-start: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .pt-60 {
+ padding-block-start: 60px !important;
+ }
+}
+
+.pb-60 {
+ padding-block-end: 30px !important;
+}
+
+@media (min-width: 576px) {
+ .pb-60 {
+ padding-block-end: 40px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .pb-60 {
+ padding-block-end: 60px !important;
+ }
+}
+/* ================================= Padding Css End =========================== */
+/* ================================= Classes Css Start =========================== */
+/* Section Background */
+.bg-color-one {
+ background-color: var(--bg-color-one) !important;
+}
+
+.bg-color-two {
+ background-color: var(--bg-color-two) !important;
+}
+
+.bg-color-three {
+ background-color: var(--bg-color-three) !important;
+}
+
+.bg-color-neutral {
+ background-color: var(--neutral) !important;
+}
+
+.container-lg {
+ max-width: 1680px;
+}
+
+/* Column Extra Small Screen */
+@media screen and (min-width: 425px) and (max-width: 575px) {
+ .col-xs-6 {
+ width: 50%;
+ }
+}
+
+@media (min-width: 424px) {
+ .d-xs-flex {
+ display: flex !important;
+ }
+}
+
+.opacity-6 {
+ opacity: 0.06 !important;
+}
+
+/* Transition */
+.transition-1 {
+ transition: 0.1s linear;
+}
+
+.transition-2 {
+ transition: 0.2s linear;
+}
+
+.transition-3 {
+ transition: 0.3s linear;
+}
+
+.min-width-max-content {
+ min-width: max-content;
+}
+
+.inset-inline-start-0 {
+ inset-inline-start: 0 !important;
+}
+
+.inset-inline-start-100 {
+ inset-inline-start: 100% !important;
+}
+
+.inset-inline-start-auto {
+ inset-inline-start: auto !important;
+}
+
+.inset-inline-end-0 {
+ inset-inline-end: 0 !important;
+}
+
+.inset-inline-end-auto {
+ inset-inline-end: auto !important;
+}
+
+.inset-block-start-0 {
+ inset-block-start: 0 !important;
+}
+
+.inset-block-end-0 {
+ inset-block-end: 0 !important;
+}
+
+.start-auto {
+ inset-inline-start: auto !important;
+}
+
+.end-auto {
+ inset-inline-end: auto !important;
+}
+
+.line-height-0 {
+ line-height: 0;
+}
+
+.line-height-1 {
+ line-height: 1;
+}
+
+/* Text Color */
+.hover-text-decoration-underline:hover {
+ text-decoration: underline;
+}
+
+.hover-text-decoration-none:hover {
+ text-decoration: none;
+}
+
+.font-heading {
+ font-family: var(--heading-font);
+}
+
+.font-heading-two {
+ font-family: var(--heading-font-two);
+}
+
+.font-body {
+ font-family: var(--body-font);
+}
+
+/* Bg Image Css */
+.bg-img {
+ background-size: cover !important;
+ background-repeat: no-repeat !important;
+ background-position: center center !important;
+ width: 100%;
+ height: 100%;
+}
+
+.list-inside {
+ list-style: inside !important;
+}
+
+.aspect-ratio-1 {
+ aspect-ratio: 1;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+/* ================================= Classes Css End =========================== */
+/* ============================ Extend Css Start ======================== */
+/* Cover image Css */
+.cover-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+/* Display Flex Css Start */
+.flex-align, .common-check {
+ display: flex;
+ align-items: center;
+}
+
+.flex-center {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.flex-between {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+/* Display Flex Css End */
+/* ============================ Extend Css End ======================== */
+.w-2 {
+ width: 0.125rem !important;
+}
+
+.w-3 {
+ width: 0.1875rem !important;
+}
+
+.w-4 {
+ width: 0.25rem !important;
+}
+
+.w-5 {
+ width: 0.3125rem !important;
+}
+
+.w-6 {
+ width: 0.375rem !important;
+}
+
+.w-7 {
+ width: 0.4375rem !important;
+}
+
+.w-8 {
+ width: 0.5rem !important;
+}
+
+.w-9 {
+ width: 0.5625rem !important;
+}
+
+.w-10 {
+ width: 0.625rem !important;
+}
+
+.w-11 {
+ width: 0.6875rem !important;
+}
+
+.w-12 {
+ width: 0.75rem !important;
+}
+
+.w-13 {
+ width: 0.8125rem !important;
+}
+
+.w-14 {
+ width: 0.875rem !important;
+}
+
+.w-16 {
+ width: 1rem !important;
+}
+
+.w-18 {
+ width: 1.125rem !important;
+}
+
+.w-20 {
+ width: 1.25rem !important;
+}
+
+.w-22 {
+ width: 1.375rem !important;
+}
+
+.w-24 {
+ width: 1.5rem !important;
+}
+
+.w-26 {
+ width: 1.625rem !important;
+}
+
+.w-28 {
+ width: 1.75rem !important;
+}
+
+.w-30 {
+ width: 1.875rem !important;
+}
+
+.w-32 {
+ width: 2rem !important;
+}
+
+.w-36 {
+ width: 2rem !important;
+}
+
+.w-40 {
+ width: 2.5rem !important;
+}
+
+.w-44 {
+ width: 2.75rem !important;
+}
+
+.w-48 {
+ width: 3rem !important;
+}
+
+.w-52 {
+ width: 3.25rem !important;
+}
+
+.w-56 {
+ width: 3.5rem !important;
+}
+
+.w-60 {
+ width: 3.75rem !important;
+}
+
+.w-64 {
+ width: 4rem !important;
+}
+
+.w-68 {
+ width: 4.25rem !important;
+}
+
+.w-72 {
+ width: 4.5rem !important;
+}
+
+.w-76 {
+ width: 4.75rem !important;
+}
+
+.w-80 {
+ width: 5rem !important;
+}
+
+.w-90 {
+ width: 5.625rem !important;
+}
+
+.w-110 {
+ width: 6.875rem !important;
+}
+
+.w-120 {
+ width: 7.5rem !important;
+}
+
+.w-144 {
+ width: 9rem !important;
+}
+
+.w-160 {
+ width: 10rem !important;
+}
+
+.w-300 {
+ width: 300px !important;
+}
+
+.w-265 {
+ width: 265px !important;
+}
+
+.w-unset {
+ width: unset !important;
+}
+
+.h-2 {
+ height: 0.125rem !important;
+}
+
+.h-3 {
+ height: 0.1875rem !important;
+}
+
+.h-4 {
+ height: 0.25rem !important;
+}
+
+.h-5 {
+ height: 0.3125rem !important;
+}
+
+.h-6 {
+ height: 0.375rem !important;
+}
+
+.h-7 {
+ height: 0.4375rem !important;
+}
+
+.h-8 {
+ height: 0.5rem !important;
+}
+
+.h-9 {
+ height: 0.5625rem !important;
+}
+
+.h-10 {
+ height: 0.625rem !important;
+}
+
+.h-11 {
+ height: 0.6875rem !important;
+}
+
+.h-12 {
+ height: 0.75rem !important;
+}
+
+.h-13 {
+ height: 0.8125rem !important;
+}
+
+.h-14 {
+ height: 0.875rem !important;
+}
+
+.h-16 {
+ height: 1rem !important;
+}
+
+.h-18 {
+ height: 1.125rem !important;
+}
+
+.h-20 {
+ height: 1.25rem !important;
+}
+
+.h-22 {
+ height: 1.375rem !important;
+}
+
+.h-24 {
+ height: 1.5rem !important;
+}
+
+.h-26 {
+ height: 1.625rem !important;
+}
+
+.h-28 {
+ height: 1.75rem !important;
+}
+
+.h-30 {
+ height: 1.875rem !important;
+}
+
+.h-32 {
+ height: 2rem !important;
+}
+
+.h-36 {
+ height: 2rem !important;
+}
+
+.h-40 {
+ height: 2.5rem !important;
+}
+
+.h-44 {
+ height: 2.75rem !important;
+}
+
+.h-48 {
+ height: 3rem !important;
+}
+
+.h-52 {
+ height: 3.25rem !important;
+}
+
+.h-56 {
+ height: 3.5rem !important;
+}
+
+.h-60 {
+ height: 3.75rem !important;
+}
+
+.h-64 {
+ height: 4rem !important;
+}
+
+.h-68 {
+ height: 4.25rem !important;
+}
+
+.h-72 {
+ height: 4.5rem !important;
+}
+
+.h-76 {
+ height: 4.75rem !important;
+}
+
+.h-80 {
+ height: 5rem !important;
+}
+
+.h-90 {
+ height: 5.625rem !important;
+}
+
+.h-110 {
+ height: 6.875rem !important;
+}
+
+.h-120 {
+ height: 7.5rem !important;
+}
+
+.h-144 {
+ height: 9rem !important;
+}
+
+.h-160 {
+ height: 10rem !important;
+}
+
+.h-unset {
+ height: unset !important;
+}
+
+.max-h-unset {
+ max-height: unset !important;
+}
+
+.max-h-120 {
+ max-height: 120px !important;
+}
+
+.max-h-200 {
+ max-height: 200px !important;
+}
+
+.max-h-300 {
+ max-height: 300px !important;
+}
+
+.max-h-400 {
+ max-height: 400px !important;
+}
+
+.max-h-540 {
+ max-height: 540px !important;
+}
+
+.max-w-unset {
+ max-width: unset !important;
+}
+
+.max-w-120 {
+ max-width: 120px;
+}
+
+.max-w-275 {
+ max-width: 275px;
+}
+
+.top-n6 {
+ inset-block-start: -6px;
+}
+
+.end-n4 {
+ inset-inline-end: -6px;
+}
+
+.text-main-50 {
+ color: var(--main-50) !important;
+}
+
+.text-main-100 {
+ color: var(--main-100) !important;
+}
+
+.text-main-200 {
+ color: var(--main-200) !important;
+}
+
+.text-main-300 {
+ color: var(--main-300) !important;
+}
+
+.text-main-400 {
+ color: var(--main-400) !important;
+}
+
+.text-main-500 {
+ color: var(--main-500) !important;
+}
+
+.text-main-600 {
+ color: var(--main-600) !important;
+}
+
+.text-main-700 {
+ color: var(--main-700) !important;
+}
+
+.text-main-800 {
+ color: var(--main-800) !important;
+}
+
+.text-main-900 {
+ color: var(--main-900) !important;
+}
+
+.text-main-two-50 {
+ color: var(--main-two-50) !important;
+}
+
+.text-main-two-100 {
+ color: var(--main-two-100) !important;
+}
+
+.text-main-two-200 {
+ color: var(--main-two-200) !important;
+}
+
+.text-main-two-300 {
+ color: var(--main-two-300) !important;
+}
+
+.text-main-two-400 {
+ color: var(--main-two-400) !important;
+}
+
+.text-main-two-500 {
+ color: var(--main-two-500) !important;
+}
+
+.text-main-two-600 {
+ color: var(--main-two-600) !important;
+}
+
+.text-main-two-700 {
+ color: var(--main-two-700) !important;
+}
+
+.text-main-two-800 {
+ color: var(--main-two-800) !important;
+}
+
+.text-main-two-900 {
+ color: var(--main-two-900) !important;
+}
+
+.text-neutral-50 {
+ color: var(--neutral-50) !important;
+}
+
+.text-neutral-100 {
+ color: var(--neutral-100) !important;
+}
+
+.text-neutral-200 {
+ color: var(--neutral-200) !important;
+}
+
+.text-neutral-300 {
+ color: var(--neutral-300) !important;
+}
+
+.text-neutral-400 {
+ color: var(--neutral-400) !important;
+}
+
+.text-neutral-500 {
+ color: var(--neutral-500) !important;
+}
+
+.text-neutral-600 {
+ color: var(--neutral-600) !important;
+}
+
+.text-neutral-700 {
+ color: var(--neutral-700) !important;
+}
+
+.text-neutral-800 {
+ color: var(--neutral-800) !important;
+}
+
+.text-neutral-900 {
+ color: var(--neutral-900) !important;
+}
+
+.text-gray-50 {
+ color: var(--gray-50) !important;
+}
+
+.text-gray-100 {
+ color: var(--gray-100) !important;
+}
+
+.text-gray-200 {
+ color: var(--gray-200) !important;
+}
+
+.text-gray-300 {
+ color: var(--gray-300) !important;
+}
+
+.text-gray-400 {
+ color: var(--gray-400) !important;
+}
+
+.text-gray-500 {
+ color: var(--gray-500) !important;
+}
+
+.text-gray-600 {
+ color: var(--gray-600) !important;
+}
+
+.text-gray-700 {
+ color: var(--gray-700) !important;
+}
+
+.text-gray-800 {
+ color: var(--gray-800) !important;
+}
+
+.text-gray-900 {
+ color: var(--gray-900) !important;
+}
+
+.text-light-50 {
+ color: var(--light-50) !important;
+}
+
+.text-light-100 {
+ color: var(--light-100) !important;
+}
+
+.text-light-600 {
+ color: var(--light-600) !important;
+}
+
+.text-light-700 {
+ color: var(--light-700) !important;
+}
+
+.text-light-800 {
+ color: var(--light-800) !important;
+}
+
+.text-primary-50 {
+ color: var(--primary-50) !important;
+}
+
+.text-primary-100 {
+ color: var(--primary-100) !important;
+}
+
+.text-primary-200 {
+ color: var(--primary-200) !important;
+}
+
+.text-primary-300 {
+ color: var(--primary-300) !important;
+}
+
+.text-primary-400 {
+ color: var(--primary-400) !important;
+}
+
+.text-primary-500 {
+ color: var(--primary-500) !important;
+}
+
+.text-primary-600 {
+ color: var(--primary-600) !important;
+}
+
+.text-primary-700 {
+ color: var(--primary-700) !important;
+}
+
+.text-primary-800 {
+ color: var(--primary-800) !important;
+}
+
+.text-primary-900 {
+ color: var(--primary-900) !important;
+}
+
+.text-danger-50 {
+ color: var(--danger-50) !important;
+}
+
+.text-danger-100 {
+ color: var(--danger-100) !important;
+}
+
+.text-danger-200 {
+ color: var(--danger-200) !important;
+}
+
+.text-danger-300 {
+ color: var(--danger-300) !important;
+}
+
+.text-danger-400 {
+ color: var(--danger-400) !important;
+}
+
+.text-danger-500 {
+ color: var(--danger-500) !important;
+}
+
+.text-danger-600 {
+ color: var(--danger-600) !important;
+}
+
+.text-danger-700 {
+ color: var(--danger-700) !important;
+}
+
+.text-danger-800 {
+ color: var(--danger-800) !important;
+}
+
+.text-danger-900 {
+ color: var(--danger-900) !important;
+}
+
+.text-success-50 {
+ color: var(--success-50) !important;
+}
+
+.text-success-100 {
+ color: var(--success-100) !important;
+}
+
+.text-success-200 {
+ color: var(--success-200) !important;
+}
+
+.text-success-300 {
+ color: var(--success-300) !important;
+}
+
+.text-success-400 {
+ color: var(--success-400) !important;
+}
+
+.text-success-500 {
+ color: var(--success-500) !important;
+}
+
+.text-success-600 {
+ color: var(--success-600) !important;
+}
+
+.text-success-700 {
+ color: var(--success-700) !important;
+}
+
+.text-success-800 {
+ color: var(--success-800) !important;
+}
+
+.text-success-900 {
+ color: var(--success-900) !important;
+}
+
+.text-warning-50 {
+ color: var(--warning-50) !important;
+}
+
+.text-warning-100 {
+ color: var(--warning-100) !important;
+}
+
+.text-warning-200 {
+ color: var(--warning-200) !important;
+}
+
+.text-warning-300 {
+ color: var(--warning-300) !important;
+}
+
+.text-warning-400 {
+ color: var(--warning-400) !important;
+}
+
+.text-warning-500 {
+ color: var(--warning-500) !important;
+}
+
+.text-warning-600 {
+ color: var(--warning-600) !important;
+}
+
+.text-warning-700 {
+ color: var(--warning-700) !important;
+}
+
+.text-warning-800 {
+ color: var(--warning-800) !important;
+}
+
+.text-warning-900 {
+ color: var(--warning-900) !important;
+}
+
+.text-info-50 {
+ color: var(--info-50) !important;
+}
+
+.text-info-100 {
+ color: var(--info-100) !important;
+}
+
+.text-info-200 {
+ color: var(--info-200) !important;
+}
+
+.text-info-300 {
+ color: var(--info-300) !important;
+}
+
+.text-info-400 {
+ color: var(--info-400) !important;
+}
+
+.text-info-500 {
+ color: var(--info-500) !important;
+}
+
+.text-info-600 {
+ color: var(--info-600) !important;
+}
+
+.text-info-700 {
+ color: var(--info-700) !important;
+}
+
+.text-info-800 {
+ color: var(--info-800) !important;
+}
+
+.text-info-900 {
+ color: var(--info-900) !important;
+}
+
+.text-tertiary-50 {
+ color: var(--tertiary-50) !important;
+}
+
+.text-tertiary-100 {
+ color: var(--tertiary-100) !important;
+}
+
+.text-tertiary-600 {
+ color: var(--tertiary-600) !important;
+}
+
+.text-heading {
+ color: hsl(var(--heading-color)) !important;
+}
+
+.text-body {
+ color: hsl(var(--body-color)) !important;
+}
+
+.text-main {
+ color: hsl(var(--main)) !important;
+}
+
+.hover-text-main-50:hover {
+ color: var(--main-50) !important;
+}
+
+.hover-text-main-100:hover {
+ color: var(--main-100) !important;
+}
+
+.hover-text-main-200:hover {
+ color: var(--main-200) !important;
+}
+
+.hover-text-main-300:hover {
+ color: var(--main-300) !important;
+}
+
+.hover-text-main-400:hover {
+ color: var(--main-400) !important;
+}
+
+.hover-text-main-500:hover {
+ color: var(--main-500) !important;
+}
+
+.hover-text-main-600:hover {
+ color: var(--main-600) !important;
+}
+
+.hover-text-main-700:hover {
+ color: var(--main-700) !important;
+}
+
+.hover-text-main-800:hover {
+ color: var(--main-800) !important;
+}
+
+.hover-text-main-900:hover {
+ color: var(--main-900) !important;
+}
+
+.hover-text-main-two-50:hover {
+ color: var(--main-two-50) !important;
+}
+
+.hover-text-main-two-100:hover {
+ color: var(--main-two-100) !important;
+}
+
+.hover-text-main-two-200:hover {
+ color: var(--main-two-200) !important;
+}
+
+.hover-text-main-two-300:hover {
+ color: var(--main-two-300) !important;
+}
+
+.hover-text-main-two-400:hover {
+ color: var(--main-two-400) !important;
+}
+
+.hover-text-main-two-500:hover {
+ color: var(--main-two-500) !important;
+}
+
+.hover-text-main-two-600:hover {
+ color: var(--main-two-600) !important;
+}
+
+.hover-text-main-two-700:hover {
+ color: var(--main-two-700) !important;
+}
+
+.hover-text-main-two-800:hover {
+ color: var(--main-two-800) !important;
+}
+
+.hover-text-main-two-900:hover {
+ color: var(--main-two-900) !important;
+}
+
+.hover-text-neutral-50:hover {
+ color: var(--neutral-50) !important;
+}
+
+.hover-text-neutral-100:hover {
+ color: var(--neutral-100) !important;
+}
+
+.hover-text-neutral-200:hover {
+ color: var(--neutral-200) !important;
+}
+
+.hover-text-neutral-300:hover {
+ color: var(--neutral-300) !important;
+}
+
+.hover-text-neutral-400:hover {
+ color: var(--neutral-400) !important;
+}
+
+.hover-text-neutral-500:hover {
+ color: var(--neutral-500) !important;
+}
+
+.hover-text-neutral-600:hover {
+ color: var(--neutral-600) !important;
+}
+
+.hover-text-neutral-700:hover {
+ color: var(--neutral-700) !important;
+}
+
+.hover-text-neutral-800:hover {
+ color: var(--neutral-800) !important;
+}
+
+.hover-text-neutral-900:hover {
+ color: var(--neutral-900) !important;
+}
+
+.hover-text-gray-50:hover {
+ color: var(--gray-50) !important;
+}
+
+.hover-text-gray-100:hover {
+ color: var(--gray-100) !important;
+}
+
+.hover-text-gray-200:hover {
+ color: var(--gray-200) !important;
+}
+
+.hover-text-gray-300:hover {
+ color: var(--gray-300) !important;
+}
+
+.hover-text-gray-400:hover {
+ color: var(--gray-400) !important;
+}
+
+.hover-text-gray-500:hover {
+ color: var(--gray-500) !important;
+}
+
+.hover-text-gray-600:hover {
+ color: var(--gray-600) !important;
+}
+
+.hover-text-gray-700:hover {
+ color: var(--gray-700) !important;
+}
+
+.hover-text-gray-800:hover {
+ color: var(--gray-800) !important;
+}
+
+.hover-text-gray-900:hover {
+ color: var(--gray-900) !important;
+}
+
+.hover-text-light-50:hover {
+ color: var(--light-50) !important;
+}
+
+.hover-text-light-100:hover {
+ color: var(--light-100) !important;
+}
+
+.hover-text-light-600:hover {
+ color: var(--light-600) !important;
+}
+
+.hover-text-light-700:hover {
+ color: var(--light-700) !important;
+}
+
+.hover-text-light-800:hover {
+ color: var(--light-800) !important;
+}
+
+.hover-text-primary-50:hover {
+ color: var(--primary-50) !important;
+}
+
+.hover-text-primary-100:hover {
+ color: var(--primary-100) !important;
+}
+
+.hover-text-primary-200:hover {
+ color: var(--primary-200) !important;
+}
+
+.hover-text-primary-300:hover {
+ color: var(--primary-300) !important;
+}
+
+.hover-text-primary-400:hover {
+ color: var(--primary-400) !important;
+}
+
+.hover-text-primary-500:hover {
+ color: var(--primary-500) !important;
+}
+
+.hover-text-primary-600:hover {
+ color: var(--primary-600) !important;
+}
+
+.hover-text-primary-700:hover {
+ color: var(--primary-700) !important;
+}
+
+.hover-text-primary-800:hover {
+ color: var(--primary-800) !important;
+}
+
+.hover-text-primary-900:hover {
+ color: var(--primary-900) !important;
+}
+
+.hover-text-danger-50:hover {
+ color: var(--danger-50) !important;
+}
+
+.hover-text-danger-100:hover {
+ color: var(--danger-100) !important;
+}
+
+.hover-text-danger-200:hover {
+ color: var(--danger-200) !important;
+}
+
+.hover-text-danger-300:hover {
+ color: var(--danger-300) !important;
+}
+
+.hover-text-danger-400:hover {
+ color: var(--danger-400) !important;
+}
+
+.hover-text-danger-500:hover {
+ color: var(--danger-500) !important;
+}
+
+.hover-text-danger-600:hover {
+ color: var(--danger-600) !important;
+}
+
+.hover-text-danger-700:hover {
+ color: var(--danger-700) !important;
+}
+
+.hover-text-danger-800:hover {
+ color: var(--danger-800) !important;
+}
+
+.hover-text-danger-900:hover {
+ color: var(--danger-900) !important;
+}
+
+.hover-text-success-50:hover {
+ color: var(--success-50) !important;
+}
+
+.hover-text-success-100:hover {
+ color: var(--success-100) !important;
+}
+
+.hover-text-success-200:hover {
+ color: var(--success-200) !important;
+}
+
+.hover-text-success-300:hover {
+ color: var(--success-300) !important;
+}
+
+.hover-text-success-400:hover {
+ color: var(--success-400) !important;
+}
+
+.hover-text-success-500:hover {
+ color: var(--success-500) !important;
+}
+
+.hover-text-success-600:hover {
+ color: var(--success-600) !important;
+}
+
+.hover-text-success-700:hover {
+ color: var(--success-700) !important;
+}
+
+.hover-text-success-800:hover {
+ color: var(--success-800) !important;
+}
+
+.hover-text-success-900:hover {
+ color: var(--success-900) !important;
+}
+
+.hover-text-warning-50:hover {
+ color: var(--warning-50) !important;
+}
+
+.hover-text-warning-100:hover {
+ color: var(--warning-100) !important;
+}
+
+.hover-text-warning-200:hover {
+ color: var(--warning-200) !important;
+}
+
+.hover-text-warning-300:hover {
+ color: var(--warning-300) !important;
+}
+
+.hover-text-warning-400:hover {
+ color: var(--warning-400) !important;
+}
+
+.hover-text-warning-500:hover {
+ color: var(--warning-500) !important;
+}
+
+.hover-text-warning-600:hover {
+ color: var(--warning-600) !important;
+}
+
+.hover-text-warning-700:hover {
+ color: var(--warning-700) !important;
+}
+
+.hover-text-warning-800:hover {
+ color: var(--warning-800) !important;
+}
+
+.hover-text-warning-900:hover {
+ color: var(--warning-900) !important;
+}
+
+.hover-text-info-50:hover {
+ color: var(--info-50) !important;
+}
+
+.hover-text-info-100:hover {
+ color: var(--info-100) !important;
+}
+
+.hover-text-info-200:hover {
+ color: var(--info-200) !important;
+}
+
+.hover-text-info-300:hover {
+ color: var(--info-300) !important;
+}
+
+.hover-text-info-400:hover {
+ color: var(--info-400) !important;
+}
+
+.hover-text-info-500:hover {
+ color: var(--info-500) !important;
+}
+
+.hover-text-info-600:hover {
+ color: var(--info-600) !important;
+}
+
+.hover-text-info-700:hover {
+ color: var(--info-700) !important;
+}
+
+.hover-text-info-800:hover {
+ color: var(--info-800) !important;
+}
+
+.hover-text-info-900:hover {
+ color: var(--info-900) !important;
+}
+
+.hover-text-tertiary-50:hover {
+ color: var(--tertiary-50) !important;
+}
+
+.hover-text-tertiary-100:hover {
+ color: var(--tertiary-100) !important;
+}
+
+.hover-text-tertiary-600:hover {
+ color: var(--tertiary-600) !important;
+}
+
+/* Text Color */
+.hover-text-white:hover {
+ color: #fff !important;
+}
+
+.hover-text-heading:hover {
+ color: hsl(var(--heading-color)) !important;
+}
+
+.hover-text-body:hover {
+ color: hsl(var(--body-color)) !important;
+}
+
+.hover-text-main:hover {
+ color: hsl(var(--main)) !important;
+}
+
+.border-main-50 {
+ border-color: var(--main-50) !important;
+}
+
+.border-main-100 {
+ border-color: var(--main-100) !important;
+}
+
+.border-main-200 {
+ border-color: var(--main-200) !important;
+}
+
+.border-main-300 {
+ border-color: var(--main-300) !important;
+}
+
+.border-main-400 {
+ border-color: var(--main-400) !important;
+}
+
+.border-main-500 {
+ border-color: var(--main-500) !important;
+}
+
+.border-main-600 {
+ border-color: var(--main-600) !important;
+}
+
+.border-main-700 {
+ border-color: var(--main-700) !important;
+}
+
+.border-main-800 {
+ border-color: var(--main-800) !important;
+}
+
+.border-main-900 {
+ border-color: var(--main-900) !important;
+}
+
+.border-main-two-50 {
+ border-color: var(--main-two-50) !important;
+}
+
+.border-main-two-100 {
+ border-color: var(--main-two-100) !important;
+}
+
+.border-main-two-200 {
+ border-color: var(--main-two-200) !important;
+}
+
+.border-main-two-300 {
+ border-color: var(--main-two-300) !important;
+}
+
+.border-main-two-400 {
+ border-color: var(--main-two-400) !important;
+}
+
+.border-main-two-500 {
+ border-color: var(--main-two-500) !important;
+}
+
+.border-main-two-600 {
+ border-color: var(--main-two-600) !important;
+}
+
+.border-main-two-700 {
+ border-color: var(--main-two-700) !important;
+}
+
+.border-main-two-800 {
+ border-color: var(--main-two-800) !important;
+}
+
+.border-main-two-900 {
+ border-color: var(--main-two-900) !important;
+}
+
+.border-neutral-50 {
+ border-color: var(--neutral-50) !important;
+}
+
+.border-neutral-100 {
+ border-color: var(--neutral-100) !important;
+}
+
+.border-neutral-200 {
+ border-color: var(--neutral-200) !important;
+}
+
+.border-neutral-300 {
+ border-color: var(--neutral-300) !important;
+}
+
+.border-neutral-400 {
+ border-color: var(--neutral-400) !important;
+}
+
+.border-neutral-500 {
+ border-color: var(--neutral-500) !important;
+}
+
+.border-neutral-600 {
+ border-color: var(--neutral-600) !important;
+}
+
+.border-neutral-700 {
+ border-color: var(--neutral-700) !important;
+}
+
+.border-neutral-800 {
+ border-color: var(--neutral-800) !important;
+}
+
+.border-neutral-900 {
+ border-color: var(--neutral-900) !important;
+}
+
+.border-gray-50 {
+ border-color: var(--gray-50) !important;
+}
+
+.border-gray-100 {
+ border-color: var(--gray-100) !important;
+}
+
+.border-gray-200 {
+ border-color: var(--gray-200) !important;
+}
+
+.border-gray-300 {
+ border-color: var(--gray-300) !important;
+}
+
+.border-gray-400 {
+ border-color: var(--gray-400) !important;
+}
+
+.border-gray-500 {
+ border-color: var(--gray-500) !important;
+}
+
+.border-gray-600 {
+ border-color: var(--gray-600) !important;
+}
+
+.border-gray-700 {
+ border-color: var(--gray-700) !important;
+}
+
+.border-gray-800 {
+ border-color: var(--gray-800) !important;
+}
+
+.border-gray-900 {
+ border-color: var(--gray-900) !important;
+}
+
+.border-light-50 {
+ border-color: var(--light-50) !important;
+}
+
+.border-light-100 {
+ border-color: var(--light-100) !important;
+}
+
+.border-light-600 {
+ border-color: var(--light-600) !important;
+}
+
+.border-light-700 {
+ border-color: var(--light-700) !important;
+}
+
+.border-light-800 {
+ border-color: var(--light-800) !important;
+}
+
+.border-primary-50 {
+ border-color: var(--primary-50) !important;
+}
+
+.border-primary-100 {
+ border-color: var(--primary-100) !important;
+}
+
+.border-primary-200 {
+ border-color: var(--primary-200) !important;
+}
+
+.border-primary-300 {
+ border-color: var(--primary-300) !important;
+}
+
+.border-primary-400 {
+ border-color: var(--primary-400) !important;
+}
+
+.border-primary-500 {
+ border-color: var(--primary-500) !important;
+}
+
+.border-primary-600 {
+ border-color: var(--primary-600) !important;
+}
+
+.border-primary-700 {
+ border-color: var(--primary-700) !important;
+}
+
+.border-primary-800 {
+ border-color: var(--primary-800) !important;
+}
+
+.border-primary-900 {
+ border-color: var(--primary-900) !important;
+}
+
+.border-danger-50 {
+ border-color: var(--danger-50) !important;
+}
+
+.border-danger-100 {
+ border-color: var(--danger-100) !important;
+}
+
+.border-danger-200 {
+ border-color: var(--danger-200) !important;
+}
+
+.border-danger-300 {
+ border-color: var(--danger-300) !important;
+}
+
+.border-danger-400 {
+ border-color: var(--danger-400) !important;
+}
+
+.border-danger-500 {
+ border-color: var(--danger-500) !important;
+}
+
+.border-danger-600 {
+ border-color: var(--danger-600) !important;
+}
+
+.border-danger-700 {
+ border-color: var(--danger-700) !important;
+}
+
+.border-danger-800 {
+ border-color: var(--danger-800) !important;
+}
+
+.border-danger-900 {
+ border-color: var(--danger-900) !important;
+}
+
+.border-success-50 {
+ border-color: var(--success-50) !important;
+}
+
+.border-success-100 {
+ border-color: var(--success-100) !important;
+}
+
+.border-success-200 {
+ border-color: var(--success-200) !important;
+}
+
+.border-success-300 {
+ border-color: var(--success-300) !important;
+}
+
+.border-success-400 {
+ border-color: var(--success-400) !important;
+}
+
+.border-success-500 {
+ border-color: var(--success-500) !important;
+}
+
+.border-success-600 {
+ border-color: var(--success-600) !important;
+}
+
+.border-success-700 {
+ border-color: var(--success-700) !important;
+}
+
+.border-success-800 {
+ border-color: var(--success-800) !important;
+}
+
+.border-success-900 {
+ border-color: var(--success-900) !important;
+}
+
+.border-warning-50 {
+ border-color: var(--warning-50) !important;
+}
+
+.border-warning-100 {
+ border-color: var(--warning-100) !important;
+}
+
+.border-warning-200 {
+ border-color: var(--warning-200) !important;
+}
+
+.border-warning-300 {
+ border-color: var(--warning-300) !important;
+}
+
+.border-warning-400 {
+ border-color: var(--warning-400) !important;
+}
+
+.border-warning-500 {
+ border-color: var(--warning-500) !important;
+}
+
+.border-warning-600 {
+ border-color: var(--warning-600) !important;
+}
+
+.border-warning-700 {
+ border-color: var(--warning-700) !important;
+}
+
+.border-warning-800 {
+ border-color: var(--warning-800) !important;
+}
+
+.border-warning-900 {
+ border-color: var(--warning-900) !important;
+}
+
+.border-info-50 {
+ border-color: var(--info-50) !important;
+}
+
+.border-info-100 {
+ border-color: var(--info-100) !important;
+}
+
+.border-info-200 {
+ border-color: var(--info-200) !important;
+}
+
+.border-info-300 {
+ border-color: var(--info-300) !important;
+}
+
+.border-info-400 {
+ border-color: var(--info-400) !important;
+}
+
+.border-info-500 {
+ border-color: var(--info-500) !important;
+}
+
+.border-info-600 {
+ border-color: var(--info-600) !important;
+}
+
+.border-info-700 {
+ border-color: var(--info-700) !important;
+}
+
+.border-info-800 {
+ border-color: var(--info-800) !important;
+}
+
+.border-info-900 {
+ border-color: var(--info-900) !important;
+}
+
+.border-tertiary-50 {
+ border-color: var(--tertiary-50) !important;
+}
+
+.border-tertiary-100 {
+ border-color: var(--tertiary-100) !important;
+}
+
+.border-tertiary-600 {
+ border-color: var(--tertiary-600) !important;
+}
+
+.hover-border-main-50:hover {
+ border-color: var(--main-50) !important;
+}
+
+.hover-border-main-100:hover {
+ border-color: var(--main-100) !important;
+}
+
+.hover-border-main-200:hover {
+ border-color: var(--main-200) !important;
+}
+
+.hover-border-main-300:hover {
+ border-color: var(--main-300) !important;
+}
+
+.hover-border-main-400:hover {
+ border-color: var(--main-400) !important;
+}
+
+.hover-border-main-500:hover {
+ border-color: var(--main-500) !important;
+}
+
+.hover-border-main-600:hover {
+ border-color: var(--main-600) !important;
+}
+
+.hover-border-main-700:hover {
+ border-color: var(--main-700) !important;
+}
+
+.hover-border-main-800:hover {
+ border-color: var(--main-800) !important;
+}
+
+.hover-border-main-900:hover {
+ border-color: var(--main-900) !important;
+}
+
+.hover-border-main-two-50:hover {
+ border-color: var(--main-two-50) !important;
+}
+
+.hover-border-main-two-100:hover {
+ border-color: var(--main-two-100) !important;
+}
+
+.hover-border-main-two-200:hover {
+ border-color: var(--main-two-200) !important;
+}
+
+.hover-border-main-two-300:hover {
+ border-color: var(--main-two-300) !important;
+}
+
+.hover-border-main-two-400:hover {
+ border-color: var(--main-two-400) !important;
+}
+
+.hover-border-main-two-500:hover {
+ border-color: var(--main-two-500) !important;
+}
+
+.hover-border-main-two-600:hover {
+ border-color: var(--main-two-600) !important;
+}
+
+.hover-border-main-two-700:hover {
+ border-color: var(--main-two-700) !important;
+}
+
+.hover-border-main-two-800:hover {
+ border-color: var(--main-two-800) !important;
+}
+
+.hover-border-main-two-900:hover {
+ border-color: var(--main-two-900) !important;
+}
+
+.hover-border-neutral-50:hover {
+ border-color: var(--neutral-50) !important;
+}
+
+.hover-border-neutral-100:hover {
+ border-color: var(--neutral-100) !important;
+}
+
+.hover-border-neutral-200:hover {
+ border-color: var(--neutral-200) !important;
+}
+
+.hover-border-neutral-300:hover {
+ border-color: var(--neutral-300) !important;
+}
+
+.hover-border-neutral-400:hover {
+ border-color: var(--neutral-400) !important;
+}
+
+.hover-border-neutral-500:hover {
+ border-color: var(--neutral-500) !important;
+}
+
+.hover-border-neutral-600:hover {
+ border-color: var(--neutral-600) !important;
+}
+
+.hover-border-neutral-700:hover {
+ border-color: var(--neutral-700) !important;
+}
+
+.hover-border-neutral-800:hover {
+ border-color: var(--neutral-800) !important;
+}
+
+.hover-border-neutral-900:hover {
+ border-color: var(--neutral-900) !important;
+}
+
+.hover-border-gray-50:hover {
+ border-color: var(--gray-50) !important;
+}
+
+.hover-border-gray-100:hover {
+ border-color: var(--gray-100) !important;
+}
+
+.hover-border-gray-200:hover {
+ border-color: var(--gray-200) !important;
+}
+
+.hover-border-gray-300:hover {
+ border-color: var(--gray-300) !important;
+}
+
+.hover-border-gray-400:hover {
+ border-color: var(--gray-400) !important;
+}
+
+.hover-border-gray-500:hover {
+ border-color: var(--gray-500) !important;
+}
+
+.hover-border-gray-600:hover {
+ border-color: var(--gray-600) !important;
+}
+
+.hover-border-gray-700:hover {
+ border-color: var(--gray-700) !important;
+}
+
+.hover-border-gray-800:hover {
+ border-color: var(--gray-800) !important;
+}
+
+.hover-border-gray-900:hover {
+ border-color: var(--gray-900) !important;
+}
+
+.hover-border-light-50:hover {
+ border-color: var(--light-50) !important;
+}
+
+.hover-border-light-100:hover {
+ border-color: var(--light-100) !important;
+}
+
+.hover-border-light-600:hover {
+ border-color: var(--light-600) !important;
+}
+
+.hover-border-light-700:hover {
+ border-color: var(--light-700) !important;
+}
+
+.hover-border-light-800:hover {
+ border-color: var(--light-800) !important;
+}
+
+.hover-border-primary-50:hover {
+ border-color: var(--primary-50) !important;
+}
+
+.hover-border-primary-100:hover {
+ border-color: var(--primary-100) !important;
+}
+
+.hover-border-primary-200:hover {
+ border-color: var(--primary-200) !important;
+}
+
+.hover-border-primary-300:hover {
+ border-color: var(--primary-300) !important;
+}
+
+.hover-border-primary-400:hover {
+ border-color: var(--primary-400) !important;
+}
+
+.hover-border-primary-500:hover {
+ border-color: var(--primary-500) !important;
+}
+
+.hover-border-primary-600:hover {
+ border-color: var(--primary-600) !important;
+}
+
+.hover-border-primary-700:hover {
+ border-color: var(--primary-700) !important;
+}
+
+.hover-border-primary-800:hover {
+ border-color: var(--primary-800) !important;
+}
+
+.hover-border-primary-900:hover {
+ border-color: var(--primary-900) !important;
+}
+
+.hover-border-danger-50:hover {
+ border-color: var(--danger-50) !important;
+}
+
+.hover-border-danger-100:hover {
+ border-color: var(--danger-100) !important;
+}
+
+.hover-border-danger-200:hover {
+ border-color: var(--danger-200) !important;
+}
+
+.hover-border-danger-300:hover {
+ border-color: var(--danger-300) !important;
+}
+
+.hover-border-danger-400:hover {
+ border-color: var(--danger-400) !important;
+}
+
+.hover-border-danger-500:hover {
+ border-color: var(--danger-500) !important;
+}
+
+.hover-border-danger-600:hover {
+ border-color: var(--danger-600) !important;
+}
+
+.hover-border-danger-700:hover {
+ border-color: var(--danger-700) !important;
+}
+
+.hover-border-danger-800:hover {
+ border-color: var(--danger-800) !important;
+}
+
+.hover-border-danger-900:hover {
+ border-color: var(--danger-900) !important;
+}
+
+.hover-border-success-50:hover {
+ border-color: var(--success-50) !important;
+}
+
+.hover-border-success-100:hover {
+ border-color: var(--success-100) !important;
+}
+
+.hover-border-success-200:hover {
+ border-color: var(--success-200) !important;
+}
+
+.hover-border-success-300:hover {
+ border-color: var(--success-300) !important;
+}
+
+.hover-border-success-400:hover {
+ border-color: var(--success-400) !important;
+}
+
+.hover-border-success-500:hover {
+ border-color: var(--success-500) !important;
+}
+
+.hover-border-success-600:hover {
+ border-color: var(--success-600) !important;
+}
+
+.hover-border-success-700:hover {
+ border-color: var(--success-700) !important;
+}
+
+.hover-border-success-800:hover {
+ border-color: var(--success-800) !important;
+}
+
+.hover-border-success-900:hover {
+ border-color: var(--success-900) !important;
+}
+
+.hover-border-warning-50:hover {
+ border-color: var(--warning-50) !important;
+}
+
+.hover-border-warning-100:hover {
+ border-color: var(--warning-100) !important;
+}
+
+.hover-border-warning-200:hover {
+ border-color: var(--warning-200) !important;
+}
+
+.hover-border-warning-300:hover {
+ border-color: var(--warning-300) !important;
+}
+
+.hover-border-warning-400:hover {
+ border-color: var(--warning-400) !important;
+}
+
+.hover-border-warning-500:hover {
+ border-color: var(--warning-500) !important;
+}
+
+.hover-border-warning-600:hover {
+ border-color: var(--warning-600) !important;
+}
+
+.hover-border-warning-700:hover {
+ border-color: var(--warning-700) !important;
+}
+
+.hover-border-warning-800:hover {
+ border-color: var(--warning-800) !important;
+}
+
+.hover-border-warning-900:hover {
+ border-color: var(--warning-900) !important;
+}
+
+.hover-border-info-50:hover {
+ border-color: var(--info-50) !important;
+}
+
+.hover-border-info-100:hover {
+ border-color: var(--info-100) !important;
+}
+
+.hover-border-info-200:hover {
+ border-color: var(--info-200) !important;
+}
+
+.hover-border-info-300:hover {
+ border-color: var(--info-300) !important;
+}
+
+.hover-border-info-400:hover {
+ border-color: var(--info-400) !important;
+}
+
+.hover-border-info-500:hover {
+ border-color: var(--info-500) !important;
+}
+
+.hover-border-info-600:hover {
+ border-color: var(--info-600) !important;
+}
+
+.hover-border-info-700:hover {
+ border-color: var(--info-700) !important;
+}
+
+.hover-border-info-800:hover {
+ border-color: var(--info-800) !important;
+}
+
+.hover-border-info-900:hover {
+ border-color: var(--info-900) !important;
+}
+
+.hover-border-tertiary-50:hover {
+ border-color: var(--tertiary-50) !important;
+}
+
+.hover-border-tertiary-100:hover {
+ border-color: var(--tertiary-100) !important;
+}
+
+.hover-border-tertiary-600:hover {
+ border-color: var(--tertiary-600) !important;
+}
+
+.border-dashed {
+ border-style: dashed !important;
+}
+
+.border-dotted {
+ border-style: dotted !important;
+}
+
+.bg-main-50 {
+ background-color: var(--main-50) !important;
+}
+
+.bg-main-100 {
+ background-color: var(--main-100) !important;
+}
+
+.bg-main-200 {
+ background-color: var(--main-200) !important;
+}
+
+.bg-main-300 {
+ background-color: var(--main-300) !important;
+}
+
+.bg-main-400 {
+ background-color: var(--main-400) !important;
+}
+
+.bg-main-500 {
+ background-color: var(--main-500) !important;
+}
+
+.bg-main-600 {
+ background-color: var(--main-600) !important;
+}
+
+.bg-main-700 {
+ background-color: var(--main-700) !important;
+}
+
+.bg-main-800 {
+ background-color: var(--main-800) !important;
+}
+
+.bg-main-900 {
+ background-color: var(--main-900) !important;
+}
+
+.bg-main-two-50 {
+ background-color: var(--main-two-50) !important;
+}
+
+.bg-main-two-100 {
+ background-color: var(--main-two-100) !important;
+}
+
+.bg-main-two-200 {
+ background-color: var(--main-two-200) !important;
+}
+
+.bg-main-two-300 {
+ background-color: var(--main-two-300) !important;
+}
+
+.bg-main-two-400 {
+ background-color: var(--main-two-400) !important;
+}
+
+.bg-main-two-500 {
+ background-color: var(--main-two-500) !important;
+}
+
+.bg-main-two-600 {
+ background-color: var(--main-two-600) !important;
+}
+
+.bg-main-two-700 {
+ background-color: var(--main-two-700) !important;
+}
+
+.bg-main-two-800 {
+ background-color: var(--main-two-800) !important;
+}
+
+.bg-main-two-900 {
+ background-color: var(--main-two-900) !important;
+}
+
+.bg-neutral-50 {
+ background-color: var(--neutral-50) !important;
+}
+
+.bg-neutral-100 {
+ background-color: var(--neutral-100) !important;
+}
+
+.bg-neutral-200 {
+ background-color: var(--neutral-200) !important;
+}
+
+.bg-neutral-300 {
+ background-color: var(--neutral-300) !important;
+}
+
+.bg-neutral-400 {
+ background-color: var(--neutral-400) !important;
+}
+
+.bg-neutral-500 {
+ background-color: var(--neutral-500) !important;
+}
+
+.bg-neutral-600 {
+ background-color: var(--neutral-600) !important;
+}
+
+.bg-neutral-700 {
+ background-color: var(--neutral-700) !important;
+}
+
+.bg-neutral-800 {
+ background-color: var(--neutral-800) !important;
+}
+
+.bg-neutral-900 {
+ background-color: var(--neutral-900) !important;
+}
+
+.bg-gray-50 {
+ background-color: var(--gray-50) !important;
+}
+
+.bg-gray-100 {
+ background-color: var(--gray-100) !important;
+}
+
+.bg-gray-200 {
+ background-color: var(--gray-200) !important;
+}
+
+.bg-gray-300 {
+ background-color: var(--gray-300) !important;
+}
+
+.bg-gray-400 {
+ background-color: var(--gray-400) !important;
+}
+
+.bg-gray-500 {
+ background-color: var(--gray-500) !important;
+}
+
+.bg-gray-600 {
+ background-color: var(--gray-600) !important;
+}
+
+.bg-gray-700 {
+ background-color: var(--gray-700) !important;
+}
+
+.bg-gray-800 {
+ background-color: var(--gray-800) !important;
+}
+
+.bg-gray-900 {
+ background-color: var(--gray-900) !important;
+}
+
+.bg-light-50 {
+ background-color: var(--light-50) !important;
+}
+
+.bg-light-100 {
+ background-color: var(--light-100) !important;
+}
+
+.bg-light-600 {
+ background-color: var(--light-600) !important;
+}
+
+.bg-light-700 {
+ background-color: var(--light-700) !important;
+}
+
+.bg-light-800 {
+ background-color: var(--light-800) !important;
+}
+
+.bg-primary-50 {
+ background-color: var(--primary-50) !important;
+}
+
+.bg-primary-100 {
+ background-color: var(--primary-100) !important;
+}
+
+.bg-primary-200 {
+ background-color: var(--primary-200) !important;
+}
+
+.bg-primary-300 {
+ background-color: var(--primary-300) !important;
+}
+
+.bg-primary-400 {
+ background-color: var(--primary-400) !important;
+}
+
+.bg-primary-500 {
+ background-color: var(--primary-500) !important;
+}
+
+.bg-primary-600 {
+ background-color: var(--primary-600) !important;
+}
+
+.bg-primary-700 {
+ background-color: var(--primary-700) !important;
+}
+
+.bg-primary-800 {
+ background-color: var(--primary-800) !important;
+}
+
+.bg-primary-900 {
+ background-color: var(--primary-900) !important;
+}
+
+.bg-danger-50 {
+ background-color: var(--danger-50) !important;
+}
+
+.bg-danger-100 {
+ background-color: var(--danger-100) !important;
+}
+
+.bg-danger-200 {
+ background-color: var(--danger-200) !important;
+}
+
+.bg-danger-300 {
+ background-color: var(--danger-300) !important;
+}
+
+.bg-danger-400 {
+ background-color: var(--danger-400) !important;
+}
+
+.bg-danger-500 {
+ background-color: var(--danger-500) !important;
+}
+
+.bg-danger-600 {
+ background-color: var(--danger-600) !important;
+}
+
+.bg-danger-700 {
+ background-color: var(--danger-700) !important;
+}
+
+.bg-danger-800 {
+ background-color: var(--danger-800) !important;
+}
+
+.bg-danger-900 {
+ background-color: var(--danger-900) !important;
+}
+
+.bg-success-50 {
+ background-color: var(--success-50) !important;
+}
+
+.bg-success-100 {
+ background-color: var(--success-100) !important;
+}
+
+.bg-success-200 {
+ background-color: var(--success-200) !important;
+}
+
+.bg-success-300 {
+ background-color: var(--success-300) !important;
+}
+
+.bg-success-400 {
+ background-color: var(--success-400) !important;
+}
+
+.bg-success-500 {
+ background-color: var(--success-500) !important;
+}
+
+.bg-success-600 {
+ background-color: var(--success-600) !important;
+}
+
+.bg-success-700 {
+ background-color: var(--success-700) !important;
+}
+
+.bg-success-800 {
+ background-color: var(--success-800) !important;
+}
+
+.bg-success-900 {
+ background-color: var(--success-900) !important;
+}
+
+.bg-warning-50 {
+ background-color: var(--warning-50) !important;
+}
+
+.bg-warning-100 {
+ background-color: var(--warning-100) !important;
+}
+
+.bg-warning-200 {
+ background-color: var(--warning-200) !important;
+}
+
+.bg-warning-300 {
+ background-color: var(--warning-300) !important;
+}
+
+.bg-warning-400 {
+ background-color: var(--warning-400) !important;
+}
+
+.bg-warning-500 {
+ background-color: var(--warning-500) !important;
+}
+
+.bg-warning-600 {
+ background-color: var(--warning-600) !important;
+}
+
+.bg-warning-700 {
+ background-color: var(--warning-700) !important;
+}
+
+.bg-warning-800 {
+ background-color: var(--warning-800) !important;
+}
+
+.bg-warning-900 {
+ background-color: var(--warning-900) !important;
+}
+
+.bg-info-50 {
+ background-color: var(--info-50) !important;
+}
+
+.bg-info-100 {
+ background-color: var(--info-100) !important;
+}
+
+.bg-info-200 {
+ background-color: var(--info-200) !important;
+}
+
+.bg-info-300 {
+ background-color: var(--info-300) !important;
+}
+
+.bg-info-400 {
+ background-color: var(--info-400) !important;
+}
+
+.bg-info-500 {
+ background-color: var(--info-500) !important;
+}
+
+.bg-info-600 {
+ background-color: var(--info-600) !important;
+}
+
+.bg-info-700 {
+ background-color: var(--info-700) !important;
+}
+
+.bg-info-800 {
+ background-color: var(--info-800) !important;
+}
+
+.bg-info-900 {
+ background-color: var(--info-900) !important;
+}
+
+.bg-tertiary-50 {
+ background-color: var(--tertiary-50) !important;
+}
+
+.bg-tertiary-100 {
+ background-color: var(--tertiary-100) !important;
+}
+
+.bg-tertiary-600 {
+ background-color: var(--tertiary-600) !important;
+}
+
+.hover-bg-main-50:hover {
+ background-color: var(--main-50) !important;
+}
+
+.hover-bg-main-100:hover {
+ background-color: var(--main-100) !important;
+}
+
+.hover-bg-main-200:hover {
+ background-color: var(--main-200) !important;
+}
+
+.hover-bg-main-300:hover {
+ background-color: var(--main-300) !important;
+}
+
+.hover-bg-main-400:hover {
+ background-color: var(--main-400) !important;
+}
+
+.hover-bg-main-500:hover {
+ background-color: var(--main-500) !important;
+}
+
+.hover-bg-main-600:hover {
+ background-color: var(--main-600) !important;
+}
+
+.hover-bg-main-700:hover {
+ background-color: var(--main-700) !important;
+}
+
+.hover-bg-main-800:hover {
+ background-color: var(--main-800) !important;
+}
+
+.hover-bg-main-900:hover {
+ background-color: var(--main-900) !important;
+}
+
+.hover-bg-main-two-50:hover {
+ background-color: var(--main-two-50) !important;
+}
+
+.hover-bg-main-two-100:hover {
+ background-color: var(--main-two-100) !important;
+}
+
+.hover-bg-main-two-200:hover {
+ background-color: var(--main-two-200) !important;
+}
+
+.hover-bg-main-two-300:hover {
+ background-color: var(--main-two-300) !important;
+}
+
+.hover-bg-main-two-400:hover {
+ background-color: var(--main-two-400) !important;
+}
+
+.hover-bg-main-two-500:hover {
+ background-color: var(--main-two-500) !important;
+}
+
+.hover-bg-main-two-600:hover {
+ background-color: var(--main-two-600) !important;
+}
+
+.hover-bg-main-two-700:hover {
+ background-color: var(--main-two-700) !important;
+}
+
+.hover-bg-main-two-800:hover {
+ background-color: var(--main-two-800) !important;
+}
+
+.hover-bg-main-two-900:hover {
+ background-color: var(--main-two-900) !important;
+}
+
+.hover-bg-neutral-50:hover {
+ background-color: var(--neutral-50) !important;
+}
+
+.hover-bg-neutral-100:hover {
+ background-color: var(--neutral-100) !important;
+}
+
+.hover-bg-neutral-200:hover {
+ background-color: var(--neutral-200) !important;
+}
+
+.hover-bg-neutral-300:hover {
+ background-color: var(--neutral-300) !important;
+}
+
+.hover-bg-neutral-400:hover {
+ background-color: var(--neutral-400) !important;
+}
+
+.hover-bg-neutral-500:hover {
+ background-color: var(--neutral-500) !important;
+}
+
+.hover-bg-neutral-600:hover {
+ background-color: var(--neutral-600) !important;
+}
+
+.hover-bg-neutral-700:hover {
+ background-color: var(--neutral-700) !important;
+}
+
+.hover-bg-neutral-800:hover {
+ background-color: var(--neutral-800) !important;
+}
+
+.hover-bg-neutral-900:hover {
+ background-color: var(--neutral-900) !important;
+}
+
+.hover-bg-gray-50:hover {
+ background-color: var(--gray-50) !important;
+}
+
+.hover-bg-gray-100:hover {
+ background-color: var(--gray-100) !important;
+}
+
+.hover-bg-gray-200:hover {
+ background-color: var(--gray-200) !important;
+}
+
+.hover-bg-gray-300:hover {
+ background-color: var(--gray-300) !important;
+}
+
+.hover-bg-gray-400:hover {
+ background-color: var(--gray-400) !important;
+}
+
+.hover-bg-gray-500:hover {
+ background-color: var(--gray-500) !important;
+}
+
+.hover-bg-gray-600:hover {
+ background-color: var(--gray-600) !important;
+}
+
+.hover-bg-gray-700:hover {
+ background-color: var(--gray-700) !important;
+}
+
+.hover-bg-gray-800:hover {
+ background-color: var(--gray-800) !important;
+}
+
+.hover-bg-gray-900:hover {
+ background-color: var(--gray-900) !important;
+}
+
+.hover-bg-light-50:hover {
+ background-color: var(--light-50) !important;
+}
+
+.hover-bg-light-100:hover {
+ background-color: var(--light-100) !important;
+}
+
+.hover-bg-light-600:hover {
+ background-color: var(--light-600) !important;
+}
+
+.hover-bg-light-700:hover {
+ background-color: var(--light-700) !important;
+}
+
+.hover-bg-light-800:hover {
+ background-color: var(--light-800) !important;
+}
+
+.hover-bg-primary-50:hover {
+ background-color: var(--primary-50) !important;
+}
+
+.hover-bg-primary-100:hover {
+ background-color: var(--primary-100) !important;
+}
+
+.hover-bg-primary-200:hover {
+ background-color: var(--primary-200) !important;
+}
+
+.hover-bg-primary-300:hover {
+ background-color: var(--primary-300) !important;
+}
+
+.hover-bg-primary-400:hover {
+ background-color: var(--primary-400) !important;
+}
+
+.hover-bg-primary-500:hover {
+ background-color: var(--primary-500) !important;
+}
+
+.hover-bg-primary-600:hover {
+ background-color: var(--primary-600) !important;
+}
+
+.hover-bg-primary-700:hover {
+ background-color: var(--primary-700) !important;
+}
+
+.hover-bg-primary-800:hover {
+ background-color: var(--primary-800) !important;
+}
+
+.hover-bg-primary-900:hover {
+ background-color: var(--primary-900) !important;
+}
+
+.hover-bg-danger-50:hover {
+ background-color: var(--danger-50) !important;
+}
+
+.hover-bg-danger-100:hover {
+ background-color: var(--danger-100) !important;
+}
+
+.hover-bg-danger-200:hover {
+ background-color: var(--danger-200) !important;
+}
+
+.hover-bg-danger-300:hover {
+ background-color: var(--danger-300) !important;
+}
+
+.hover-bg-danger-400:hover {
+ background-color: var(--danger-400) !important;
+}
+
+.hover-bg-danger-500:hover {
+ background-color: var(--danger-500) !important;
+}
+
+.hover-bg-danger-600:hover {
+ background-color: var(--danger-600) !important;
+}
+
+.hover-bg-danger-700:hover {
+ background-color: var(--danger-700) !important;
+}
+
+.hover-bg-danger-800:hover {
+ background-color: var(--danger-800) !important;
+}
+
+.hover-bg-danger-900:hover {
+ background-color: var(--danger-900) !important;
+}
+
+.hover-bg-success-50:hover {
+ background-color: var(--success-50) !important;
+}
+
+.hover-bg-success-100:hover {
+ background-color: var(--success-100) !important;
+}
+
+.hover-bg-success-200:hover {
+ background-color: var(--success-200) !important;
+}
+
+.hover-bg-success-300:hover {
+ background-color: var(--success-300) !important;
+}
+
+.hover-bg-success-400:hover {
+ background-color: var(--success-400) !important;
+}
+
+.hover-bg-success-500:hover {
+ background-color: var(--success-500) !important;
+}
+
+.hover-bg-success-600:hover {
+ background-color: var(--success-600) !important;
+}
+
+.hover-bg-success-700:hover {
+ background-color: var(--success-700) !important;
+}
+
+.hover-bg-success-800:hover {
+ background-color: var(--success-800) !important;
+}
+
+.hover-bg-success-900:hover {
+ background-color: var(--success-900) !important;
+}
+
+.hover-bg-warning-50:hover {
+ background-color: var(--warning-50) !important;
+}
+
+.hover-bg-warning-100:hover {
+ background-color: var(--warning-100) !important;
+}
+
+.hover-bg-warning-200:hover {
+ background-color: var(--warning-200) !important;
+}
+
+.hover-bg-warning-300:hover {
+ background-color: var(--warning-300) !important;
+}
+
+.hover-bg-warning-400:hover {
+ background-color: var(--warning-400) !important;
+}
+
+.hover-bg-warning-500:hover {
+ background-color: var(--warning-500) !important;
+}
+
+.hover-bg-warning-600:hover {
+ background-color: var(--warning-600) !important;
+}
+
+.hover-bg-warning-700:hover {
+ background-color: var(--warning-700) !important;
+}
+
+.hover-bg-warning-800:hover {
+ background-color: var(--warning-800) !important;
+}
+
+.hover-bg-warning-900:hover {
+ background-color: var(--warning-900) !important;
+}
+
+.hover-bg-info-50:hover {
+ background-color: var(--info-50) !important;
+}
+
+.hover-bg-info-100:hover {
+ background-color: var(--info-100) !important;
+}
+
+.hover-bg-info-200:hover {
+ background-color: var(--info-200) !important;
+}
+
+.hover-bg-info-300:hover {
+ background-color: var(--info-300) !important;
+}
+
+.hover-bg-info-400:hover {
+ background-color: var(--info-400) !important;
+}
+
+.hover-bg-info-500:hover {
+ background-color: var(--info-500) !important;
+}
+
+.hover-bg-info-600:hover {
+ background-color: var(--info-600) !important;
+}
+
+.hover-bg-info-700:hover {
+ background-color: var(--info-700) !important;
+}
+
+.hover-bg-info-800:hover {
+ background-color: var(--info-800) !important;
+}
+
+.hover-bg-info-900:hover {
+ background-color: var(--info-900) !important;
+}
+
+.hover-bg-tertiary-50:hover {
+ background-color: var(--tertiary-50) !important;
+}
+
+.hover-bg-tertiary-100:hover {
+ background-color: var(--tertiary-100) !important;
+}
+
+.hover-bg-tertiary-600:hover {
+ background-color: var(--tertiary-600) !important;
+}
+
+.hover-bg-white:hover {
+ background-color: hsl(var(--white)) !important;
+}
+
+.bg-light-purple {
+ background: #ECDBEC !important;
+}
+
+/* Font Size Class Start */
+.text-inherit {
+ font-size: inherit;
+}
+
+.text-xs {
+ font-size: 0.75rem !important;
+}
+
+.text-sm {
+ font-size: 0.875rem !important;
+}
+
+.text-md {
+ font-size: 1rem !important;
+}
+
+.text-lg {
+ font-size: 1.125rem !important;
+}
+
+.text-xl {
+ font-size: 1.25rem !important;
+}
+
+.text-2xl {
+ font-size: 1.5rem !important;
+}
+
+.text-3xl {
+ font-size: 1.875rem !important;
+}
+
+.text-4xl {
+ font-size: 2.25rem !important;
+}
+
+.text-5xl {
+ font-size: 3rem !important;
+}
+
+.text-6xl {
+ font-size: 3.75rem !important;
+}
+
+.text-2 {
+ font-size: 0.125rem !important;
+}
+
+.text-3 {
+ font-size: 0.1875rem !important;
+}
+
+.text-4 {
+ font-size: 0.25rem !important;
+}
+
+.text-5 {
+ font-size: 0.3125rem !important;
+}
+
+.text-6 {
+ font-size: 0.375rem !important;
+}
+
+.text-7 {
+ font-size: 0.4375rem !important;
+}
+
+.text-8 {
+ font-size: 0.5rem !important;
+}
+
+.text-9 {
+ font-size: 0.5625rem !important;
+}
+
+.text-10 {
+ font-size: 0.625rem !important;
+}
+
+.text-11 {
+ font-size: 0.6875rem !important;
+}
+
+.text-12 {
+ font-size: 0.75rem !important;
+}
+
+.text-13 {
+ font-size: 0.8125rem !important;
+}
+
+.text-14 {
+ font-size: 0.875rem !important;
+}
+
+.text-16 {
+ font-size: 1rem !important;
+}
+
+.text-18 {
+ font-size: 1.125rem !important;
+}
+
+.text-20 {
+ font-size: 1.25rem !important;
+}
+
+.text-22 {
+ font-size: 1.375rem !important;
+}
+
+.text-24 {
+ font-size: 1.5rem !important;
+}
+
+.text-26 {
+ font-size: 1.625rem !important;
+}
+
+.text-28 {
+ font-size: 1.75rem !important;
+}
+
+.text-30 {
+ font-size: 1.875rem !important;
+}
+
+.text-32 {
+ font-size: 2rem !important;
+}
+
+.text-36 {
+ font-size: 2rem !important;
+}
+
+.text-40 {
+ font-size: 2.5rem !important;
+}
+
+.text-44 {
+ font-size: 2.75rem !important;
+}
+
+.text-48 {
+ font-size: 3rem !important;
+}
+
+.text-52 {
+ font-size: 3.25rem !important;
+}
+
+.text-56 {
+ font-size: 3.5rem !important;
+}
+
+.text-60 {
+ font-size: 3.75rem !important;
+}
+
+.text-64 {
+ font-size: 4rem !important;
+}
+
+.text-68 {
+ font-size: 4.25rem !important;
+}
+
+.text-72 {
+ font-size: 4.5rem !important;
+}
+
+.text-76 {
+ font-size: 4.75rem !important;
+}
+
+.text-80 {
+ font-size: 5rem !important;
+}
+
+.text-90 {
+ font-size: 5.625rem !important;
+}
+
+.text-110 {
+ font-size: 6.875rem !important;
+}
+
+.text-120 {
+ font-size: 7.5rem !important;
+}
+
+.text-144 {
+ font-size: 9rem !important;
+}
+
+.text-160 {
+ font-size: 10rem !important;
+}
+
+/* Font Size Class End */
+/* Box shadow start */
+.box-shadow-sm {
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
+}
+
+.box-shadow-md {
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
+}
+
+.box-shadow-lg, .submenus-submenu, .common-dropdown {
+ box-shadow: 0px 7px 21px -5px rgba(0, 0, 0, 0.1), 0 4px 21px -4px rgba(0, 0, 0, 0.1);
+}
+
+.box-shadow-xl {
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
+}
+
+.box-shadow-2xl {
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
+}
+
+.box-shadow-inner {
+ box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
+}
+
+/* Box shadow End */
+/* Border Radius */
+.rounded-2 {
+ border-radius: 0.125rem !important;
+}
+
+.rounded-3 {
+ border-radius: 0.1875rem !important;
+}
+
+.rounded-4 {
+ border-radius: 0.25rem !important;
+}
+
+.rounded-5 {
+ border-radius: 0.3125rem !important;
+}
+
+.rounded-6 {
+ border-radius: 0.375rem !important;
+}
+
+.rounded-7 {
+ border-radius: 0.4375rem !important;
+}
+
+.rounded-8 {
+ border-radius: 0.5rem !important;
+}
+
+.rounded-9 {
+ border-radius: 0.5625rem !important;
+}
+
+.rounded-10 {
+ border-radius: 0.625rem !important;
+}
+
+.rounded-11 {
+ border-radius: 0.6875rem !important;
+}
+
+.rounded-12 {
+ border-radius: 0.75rem !important;
+}
+
+.rounded-13 {
+ border-radius: 0.8125rem !important;
+}
+
+.rounded-14 {
+ border-radius: 0.875rem !important;
+}
+
+.rounded-16 {
+ border-radius: 1rem !important;
+}
+
+.rounded-18 {
+ border-radius: 1.125rem !important;
+}
+
+.rounded-20 {
+ border-radius: 1.25rem !important;
+}
+
+.rounded-22 {
+ border-radius: 1.375rem !important;
+}
+
+.rounded-24 {
+ border-radius: 1.5rem !important;
+}
+
+.rounded-26 {
+ border-radius: 1.625rem !important;
+}
+
+.rounded-28 {
+ border-radius: 1.75rem !important;
+}
+
+.rounded-30 {
+ border-radius: 1.875rem !important;
+}
+
+.rounded-32 {
+ border-radius: 2rem !important;
+}
+
+.rounded-36 {
+ border-radius: 2rem !important;
+}
+
+.rounded-40 {
+ border-radius: 2.5rem !important;
+}
+
+.rounded-44 {
+ border-radius: 2.75rem !important;
+}
+
+.rounded-48 {
+ border-radius: 3rem !important;
+}
+
+.rounded-52 {
+ border-radius: 3.25rem !important;
+}
+
+.rounded-56 {
+ border-radius: 3.5rem !important;
+}
+
+.rounded-60 {
+ border-radius: 3.75rem !important;
+}
+
+.rounded-64 {
+ border-radius: 4rem !important;
+}
+
+.rounded-68 {
+ border-radius: 4.25rem !important;
+}
+
+.rounded-72 {
+ border-radius: 4.5rem !important;
+}
+
+.rounded-76 {
+ border-radius: 4.75rem !important;
+}
+
+.rounded-80 {
+ border-radius: 5rem !important;
+}
+
+.rounded-90 {
+ border-radius: 5.625rem !important;
+}
+
+.rounded-110 {
+ border-radius: 6.875rem !important;
+}
+
+.rounded-120 {
+ border-radius: 7.5rem !important;
+}
+
+.rounded-144 {
+ border-radius: 9rem !important;
+}
+
+.rounded-160 {
+ border-radius: 10rem !important;
+}
+
+/* Hide Scroll bar Css For Custom Modal */
+.scroll-hide {
+ position: absolute;
+ overflow-y: hidden;
+ padding-inline-end: 17px;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+ width: 100%;
+}
+
+@media screen and (max-width: 991px) {
+ .scroll-hide {
+ padding-inline-end: 0;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .scroll-hide-sm {
+ position: absolute;
+ overflow-y: hidden;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+ width: calc(100% - 0px);
+ }
+}
+/* Hide Scroll bar Css For Custom Modal End */
+/* Overlay Start */
+.overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ content: "";
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ background-color: hsl(var(--black)/0.6);
+ z-index: 99;
+ transition: 0.2s linear;
+ visibility: hidden;
+ opacity: 0;
+}
+
+.overlay.show-overlay {
+ visibility: visible;
+ opacity: 1;
+}
+
+.side-overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ content: "";
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ background-color: hsl(var(--black)/0.6);
+ z-index: 8;
+ transition: 0.2s linear;
+ visibility: hidden;
+ opacity: 0;
+}
+
+@media screen and (max-width: 991px) {
+ .side-overlay.show {
+ visibility: visible;
+ opacity: 1;
+ }
+}
+/* Overlay End */
+.text-line-1 {
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.text-line-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.text-line-3 {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.scroll-sm::-webkit-scrollbar {
+ width: 4px !important;
+ height: 4px !important;
+}
+
+.scroll-sm::-webkit-scrollbar-thumb {
+ background-color: #b1b3b8;
+}
+
+.scroll-sm::-webkit-scrollbar-thumb:hover {
+ background-color: #7e7d7d;
+}
+
+.scroll-sm::-webkit-scrollbar-track {
+ background-color: #d6d9de;
+}
+
+.gap-2 {
+ gap: var(--size-2) !important;
+}
+
+.gap-3 {
+ gap: var(--size-3) !important;
+}
+
+.gap-4 {
+ gap: var(--size-4) !important;
+}
+
+.gap-5 {
+ gap: var(--size-5) !important;
+}
+
+.gap-6 {
+ gap: var(--size-6) !important;
+}
+
+.gap-7 {
+ gap: var(--size-7) !important;
+}
+
+.gap-8 {
+ gap: var(--size-8) !important;
+}
+
+.gap-9 {
+ gap: var(--size-9) !important;
+}
+
+.gap-10 {
+ gap: var(--size-10) !important;
+}
+
+.gap-11 {
+ gap: var(--size-11) !important;
+}
+
+.gap-12 {
+ gap: var(--size-12) !important;
+}
+
+.gap-13 {
+ gap: var(--size-13) !important;
+}
+
+.gap-14 {
+ gap: var(--size-14) !important;
+}
+
+.gap-16 {
+ gap: var(--size-16) !important;
+}
+
+.gap-18 {
+ gap: var(--size-18) !important;
+}
+
+.gap-20 {
+ gap: var(--size-20) !important;
+}
+
+.gap-22 {
+ gap: var(--size-22) !important;
+}
+
+.gap-24 {
+ gap: var(--size-24) !important;
+}
+
+.gap-26 {
+ gap: var(--size-26) !important;
+}
+
+.gap-28 {
+ gap: var(--size-28) !important;
+}
+
+.gap-30 {
+ gap: var(--size-30) !important;
+}
+
+.gap-32 {
+ gap: var(--size-32) !important;
+}
+
+.gap-36 {
+ gap: var(--size-36) !important;
+}
+
+.gap-40 {
+ gap: var(--size-40) !important;
+}
+
+.gap-44 {
+ gap: var(--size-44) !important;
+}
+
+.gap-48 {
+ gap: var(--size-48) !important;
+}
+
+.gap-52 {
+ gap: var(--size-52) !important;
+}
+
+.gap-56 {
+ gap: var(--size-56) !important;
+}
+
+.gap-60 {
+ gap: var(--size-60) !important;
+}
+
+.gap-64 {
+ gap: var(--size-64) !important;
+}
+
+.gap-68 {
+ gap: var(--size-68) !important;
+}
+
+.gap-72 {
+ gap: var(--size-72) !important;
+}
+
+.gap-76 {
+ gap: var(--size-76) !important;
+}
+
+.gap-80 {
+ gap: var(--size-80) !important;
+}
+
+.gap-90 {
+ gap: var(--size-90) !important;
+}
+
+.gap-110 {
+ gap: var(--size-110) !important;
+}
+
+.gap-120 {
+ gap: var(--size-120) !important;
+}
+
+.gap-144 {
+ gap: var(--size-144) !important;
+}
+
+.gap-160 {
+ gap: var(--size-160) !important;
+}
+
+/* Hover Classes Start */
+.item-hover:hover .item-hover__text {
+ color: var(--main-600) !important;
+}
+
+.item-hover-two:hover .item-hover__text {
+ color: var(--main-two-600) !important;
+}
+
+.on-hover-dropdown {
+ visibility: hidden;
+ opacity: 0;
+ margin-block-start: 16px;
+}
+
+.on-hover-item {
+ position: relative;
+}
+
+.on-hover-item:hover .on-hover-dropdown {
+ visibility: visible;
+ opacity: 1;
+ margin-block-start: 0;
+}
+
+@media (min-width: 992px) {
+ .on-hover-item:hover > a::before {
+ color: hsl(var(--main));
+ transform: translateY(-50%) rotate(180deg);
+ }
+}
+/* Hover Classes End */
+.g-8, .gy-8 {
+ --bs-gutter-y: .5rem !important;
+}
+
+.g-12, .gy-12 {
+ --bs-gutter-y: .75rem !important;
+}
+
+.g-8, .gx-8 {
+ --bs-gutter-x: .5rem !important;
+}
+
+.g-12, .gx-12 {
+ --bs-gutter-x: .75rem !important;
+}
+
+/* ================================= preload Css Start =========================== */
+.preloader {
+ background-color: hsl(var(--white));
+ inset-block-end: 0;
+ inset-inline-start: 0;
+ position: fixed;
+ inset-inline-end: 0;
+ inset-block-start: 0;
+ z-index: 9999;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+/* ================================= preload Css End =========================== */
+/* =========================== header top Css Start =============================== */
+@media screen and (max-width: 767px) {
+ .header-top__right {
+ width: 100%;
+ }
+
+ .header-top__right li:last-child {
+ margin-inline-start: auto;
+ }
+
+ .header-top__right li:nth-last-child(2) {
+ margin-inline-end: 0 !important;
+ padding-inline-end: 0 !important;
+ }
+
+ .header-top__right li:nth-last-child(2)::before {
+ display: none;
+ }
+}
+
+.header-top__right.style-two > li {
+ padding-inline-end: 16px !important;
+ margin-inline-end: 0 !important;
+}
+
+.header-top__right.style-two > li:last-child {
+ padding-inline-end: 0 !important;
+}
+
+.header-top__right.style-two > li::before {
+ display: none !important;
+}
+
+.header-top__right.style-two > li a {
+ padding-inline-end: 20px;
+}
+
+@media screen and (max-width: 991px) {
+ .header-top__right.style-two > li a {
+ color: #fff !important;
+ }
+}
+
+.header-top__right.style-two > li a::before {
+ color: var(--heading-color) !important;
+ font-size: 14px !important;
+}
+
+.header-top__right.style-two > li > ul {
+ inset-inline-end: auto !important;
+ inset-inline-start: calc(-100% - 24px) !important;
+}
+
+@media screen and (max-width: 991px) {
+ .header-top__right.style-two > li > ul li a {
+ color: var(--neutral-600) !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .border-right-item a {
+ font-size: 12px !important;
+ }
+}
+
+.border-right-item {
+ position: relative;
+}
+
+.border-right-item:not(:last-child) {
+ margin-inline-end: 24px;
+ padding-inline-end: 24px;
+}
+
+@media screen and (max-width: 1399px) {
+ .border-right-item:not(:last-child) {
+ margin-inline-end: 16px !important;
+ padding-inline-end: 16px !important;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .border-right-item:not(:last-child) {
+ margin-inline-end: 10px !important;
+ padding-inline-end: 10px !important;
+ }
+}
+
+.border-right-item:not(:last-child)::before {
+ position: absolute;
+ content: "";
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-end: 0;
+ width: 1px;
+ height: 15px;
+ background-color: hsl(var(--white)/0.3);
+}
+
+.border-right-item-sm-space:not(:last-child) {
+ margin-inline-end: 20px;
+ padding-inline-end: 20px;
+}
+
+/* Has Dropdown Css */
+.arrow-white > a {
+ padding-inline-end: 12px;
+}
+
+.arrow-white > a::before {
+ color: hsl(var(--white)) !important;
+ font-size: 8px;
+}
+
+/* =========================== header top Css End =============================== */
+/* ============= Header Start Here ======================= */
+.header {
+ transition: 0.2s linear;
+}
+
+.header.fixed-header {
+ position: sticky;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ inset-inline-end: 0;
+ width: 100%;
+ z-index: 8;
+ backdrop-filter: blur(24px);
+ animation: slideDown 0.35s ease-out;
+ box-shadow: 0 5px 16px rgba(0, 0, 0, 0.1);
+}
+
+@media screen and (max-width: 991px) {
+ .header.fixed-header {
+ inset-block-start: -1px;
+ }
+}
+
+@keyframes slideDown {
+ from {
+ transform: translateY(-100%);
+ }
+
+ to {
+ transform: translateY(0);
+ }
+}
+
+.logo img {
+ max-width: 200px;
+}
+
+@media screen and (max-width: 424px) {
+ .logo img {
+ max-width: 148px;
+ }
+}
+/* Header Menu and Submenu Css Start */
+.nav-menu {
+ gap: 32px;
+}
+
+@media screen and (max-width: 1399px) {
+ .nav-menu {
+ gap: 24px;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .nav-menu {
+ gap: 16px;
+ }
+}
+
+.nav-menu__item.activePage > a {
+ color: hsl(var(--main));
+}
+
+.nav-menu__item.activePage > a::before {
+ color: hsl(var(--main));
+}
+
+.nav-menu__item:hover > a {
+ color: var(--gray-400);
+}
+
+@media (min-width: 992px) {
+ .nav-menu__item:hover > a {
+ color: hsl(var(--main));
+ }
+}
+
+.nav-menu__link {
+ color: var(--gray-400);
+ font-weight: 500;
+ width: 100%;
+ padding: 16px 0;
+ width: 100%;
+}
+
+@media (max-width: 1299px) {
+ .nav-menu__link {
+ font-size: 0.875rem;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .nav-menu__link {
+ font-size: 0.8125rem;
+ }
+}
+
+@media (max-width: 1299px) {
+ .nav-menu .common-dropdown__link {
+ font-size: 0.875rem;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .nav-menu .common-dropdown__link {
+ font-size: 0.8125rem;
+ }
+}
+
+.has-submenu {
+ position: relative;
+}
+
+.has-submenu .nav-menu__link {
+ padding-inline-end: 16px;
+}
+
+.has-submenu.active > a, .has-submenu.active > a::before {
+ color: hsl(var(--main));
+}
+
+.has-submenu.active > a::before {
+ transform: translateY(-50%) rotate(180deg) !important;
+}
+
+.has-submenu > a {
+ position: relative;
+}
+
+.has-submenu > a::before {
+ position: absolute;
+ content: "\e136";
+ inset-inline-end: 0;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--heading-color)/0.4);
+ transition: 0.2s linear;
+}
+
+/* Submenu Start */
+.common-dropdown {
+ position: absolute;
+ inset-inline-start: 0;
+ inset-block-start: 100%;
+ width: max-content;
+ background-color: hsl(var(--white));
+ border-radius: 6px;
+ min-width: 190px;
+ overflow: hidden;
+ padding: 8px;
+ transition: 0.2s linear;
+ z-index: 99;
+}
+
+@media (min-width: 992px) {
+ .common-dropdown {
+ max-height: 400px;
+ overflow-y: auto;
+ }
+}
+
+.common-dropdown--sm {
+ width: 132px;
+ min-width: unset;
+}
+
+.common-dropdown__item {
+ display: block;
+ border-radius: 4px;
+ transition: 0.2s linear;
+ position: relative;
+}
+
+@media screen and (max-width: 991px) {
+ .common-dropdown__item {
+ border-radius: 0;
+ }
+}
+
+.common-dropdown__item.activePage .common-dropdown__link {
+ color: hsl(var(--main)) !important;
+}
+
+.common-dropdown__link {
+ color: var(--gray-400);
+ font-weight: 500;
+ width: 100%;
+ padding-inline-end: 16px;
+ width: 100%;
+ padding: 8px 14px;
+ border-radius: inherit;
+}
+
+.common-dropdown__link:hover {
+ color: var(--gray-600) !important;
+}
+
+.common-dropdown__link::before {
+ position: absolute;
+}
+
+/* Submenu End */
+/* Header Menu and Submenu Css End */
+/* Category Submenus Submenu Css Start */
+.menu-category-wrapper {
+ gap: clamp(0.75rem, -8.243rem + 12vw, 4.5rem);
+}
+
+.submenus-submenu-wrapper {
+ overflow: unset;
+}
+
+.submenus-submenu {
+ position: absolute;
+ z-index: 99999999999;
+ background: hsl(var(--white));
+ width: 300px;
+ inset-inline-start: 100%;
+ inset-block-start: 0px;
+ border-radius: 6px;
+ visibility: hidden;
+ opacity: 0;
+ overflow: hidden;
+}
+
+.submenus-submenu__list li a {
+ padding: 10px 16px;
+ padding-inline-start: 32px;
+ display: block;
+ color: var(--gray-500);
+ position: relative;
+}
+
+.submenus-submenu__list li a::before {
+ position: absolute;
+ content: "";
+ width: 8px;
+ height: 8px;
+ inset-inline-start: 16px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ background: var(--gray-300);
+ border-radius: 80%;
+ transition: 0.2s linear;
+}
+
+.submenus-submenu__list li a:hover {
+ background-color: var(--gray-50);
+ color: var(--gray-800);
+ font-weight: 600;
+}
+
+.submenus-submenu__list li a:hover::before {
+ background: var(--gray-600);
+}
+
+@media (min-width: 991px) {
+ .has-submenus-submenu:hover > a {
+ background-color: var(--gray-50);
+ color: var(--gray-900) !important;
+ font-weight: 600;
+ }
+
+ .has-submenus-submenu:hover .submenus-submenu {
+ visibility: visible;
+ opacity: 1;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .category .category__button {
+ padding: 12px 3px !important;
+ font-size: 12px !important;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .category .category__button {
+ padding-left: 10px !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .category:hover .category__button {
+ color: var(--main-600) !important;
+ background-color: var(--gray-50) !important;
+ }
+
+ .category:hover .category__button .arrow-icon i::before {
+ content: "\e13c";
+ }
+}
+/* Style Two */
+.category-two {
+ position: relative;
+}
+
+@media (min-width: 992px) {
+ .category-two {
+ width: 265px;
+ }
+}
+
+.category-two .category__button {
+ width: 100%;
+}
+
+@media screen and (max-width: 575px) {
+ .category-two .category__button {
+ font-size: 12px;
+ padding: 8px 4px !important;
+ }
+}
+
+.category-two .category__button.active .arrow-icon i::before {
+ content: "\e13a";
+}
+
+.responsive-dropdown.style-two {
+ width: 100%;
+ border-radius: 0 0 16px 16px;
+ width: 265px;
+ max-height: 900px;
+}
+
+.responsive-dropdown.style-two .responsive-dropdown__list {
+ max-height: 900px;
+}
+
+@media screen and (max-width: 1199px) {
+ .responsive-dropdown.style-two .responsive-dropdown__list {
+ max-height: 438px;
+ }
+}
+
+@media (min-width: 992px) {
+ .responsive-dropdown.style-two {
+ z-index: 1;
+ }
+}
+/* Category Submenus Submenu Css End */
+/* ================================= Header Css End =========================== */
+/* =========================== header Middle Css Start =============================== */
+.header-middle {
+ padding: 30px 0;
+}
+
+.header-middle.style-two {
+ padding: 24px 0;
+}
+
+@media screen and (max-width: 1399px) {
+ .header-middle {
+ padding: 24px 0;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .header-middle {
+ padding: 16px 0 !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .header-middle {
+ padding: 8px 0 !important;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .header-middle .location-box {
+ padding: 6px 8px !important;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .header-middle .location-box {
+ padding-left: 14px !important;
+ }
+}
+
+.form-location-wrapper {
+ gap: clamp(0.5rem, -0.999rem + 2vw, 1rem);
+}
+
+/* Search Form Css Here */
+@media screen and (max-width: 991px) {
+ .search-form .select2-selection.select2-selection--single {
+ border-radius: 50px !important;
+ border-radius: 50px !important;
+ background-color: hsl(var(--white)) !important;
+ border: 1px solid var(--gray-100) !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .search-form__wrapper {
+ display: none;
+ }
+}
+
+.search-form__input {
+ border-color: var(--gray-200) !important;
+ width: 520px;
+}
+
+@media screen and (max-width: 1499px) {
+ .search-form__input {
+ width: 400px;
+ }
+}
+
+@media screen and (max-width: 1399px) {
+ .search-form__input {
+ width: 300px;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .search-form__input {
+ width: 200px;
+ }
+}
+/* Header Activities Css Start */
+@media screen and (max-width: 1399px) {
+ .header-two-activities {
+ gap: 24px !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .header-two-activities {
+ gap: 16px !important;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .header-two-activities {
+ gap: 10px !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .header-two-activities .item-hover-two > span {
+ font-size: 18px !important;
+ color: var(--neutral-600) !important;
+ }
+}
+/* Header Activities Css End */
+/* Header Activities Css start */
+.search-category.style-two {
+ background-color: hsl(var(--white));
+ border-radius: 8px;
+ overflow: hidden;
+}
+
+.search-category.style-two .select2-container--default .select2-selection--single {
+ border-radius: 0;
+ border-left: 0 !important;
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+}
+
+/* Header Activities Css End */
+/* Category Dropdown Responsive Css Start */
+@media screen and (max-width: 991px) {
+ .responsive-dropdown {
+ position: fixed;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ visibility: visible;
+ opacity: 1;
+ margin-top: 0;
+ border-radius: 0;
+ width: unset !important;
+ height: 100vh;
+ overflow-y: auto;
+ transform: translateX(-100%);
+ padding-top: 8px !important;
+ }
+
+ .responsive-dropdown.active {
+ transform: translateX(0);
+ }
+
+ .responsive-dropdown ul {
+ max-height: 100% !important;
+ }
+
+ .responsive-dropdown ul li.active > a {
+ background: var(--gray-50);
+ color: var(--gray-800) !important;
+ font-weight: 600;
+ }
+
+ .responsive-dropdown ul li.active > a .icon {
+ transform: rotate(90deg);
+ }
+
+ .responsive-dropdown ul li a {
+ border-bottom: 1px solid var(--gray-100);
+ }
+
+ .responsive-dropdown .submenus-submenu {
+ position: static;
+ visibility: visible;
+ opacity: 1;
+ box-shadow: none;
+ border-radius: 0;
+ margin-left: 40px;
+ width: unset;
+ padding-top: 8px !important;
+ display: none;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+
+ .responsive-dropdown .submenus-submenu__title {
+ display: none;
+ }
+
+ .responsive-dropdown .submenus-submenu__list {
+ max-height: unset !important;
+ }
+
+ .responsive-dropdown .submenus-submenu__list li a {
+ padding-left: 16px;
+ }
+
+ .responsive-dropdown .submenus-submenu__list li a::before {
+ inset-inline-start: 0;
+ }
+}
+/* Category Dropdown Responsive Css End */
+/* =========================== header Middle Css End =============================== */
+/* Mobile Menu Sidebar Start */
+.mobile-menu {
+ position: fixed;
+ background-color: hsl(var(--white));
+ width: 300px;
+ height: 100vh;
+ overflow-y: auto;
+ padding: 24px;
+ z-index: 991;
+ transform: translateX(-100%);
+ transition: 0.2s linear;
+ padding-block-end: 68px;
+}
+
+.mobile-menu.active {
+ transform: translateX(0%);
+}
+
+.close-button {
+ position: absolute;
+ inset-inline-end: 8px;
+ inset-block-start: 8px;
+ width: 28px;
+ height: 28px;
+ background-color: var(--gray-200);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ transition: 0.2s;
+}
+
+.close-button:hover {
+ background-color: hsl(var(--black));
+ color: hsl(var(--white));
+}
+
+.nav-menu--mobile {
+ display: block;
+ margin-block-start: 16px;
+}
+
+.nav-menu--mobile .nav-menu__item > a::before {
+ transform: translateY(-50%) rotate(0deg);
+}
+
+.nav-menu--mobile .nav-menu__link {
+ border-bottom: 1px solid var(--gray-100) !important;
+ position: relative;
+ padding: 12px 0;
+ padding-inline-end: 16px;
+}
+
+.nav-menu--mobile .nav-submenu {
+ position: static;
+ visibility: visible;
+ opacity: 1;
+ box-shadow: none;
+ width: 100%;
+ margin-block-start: 0;
+ padding: 0;
+ margin-inline-start: 16px;
+ display: none;
+ transition: 0s;
+}
+
+.nav-menu--mobile .nav-submenu__link {
+ width: 100%;
+ padding: 10px 0;
+ border-bottom: 1px solid var(--gray-100) !important;
+}
+
+.nav-menu--mobile .nav-submenu__item:hover {
+ background-color: transparent;
+ color: hsl(var(--main));
+}
+
+.nav-menu--mobile .nav-submenu__item::before {
+ display: none;
+}
+
+/* Mobile Menu Sidebar Start */
+/* ============= Footer Start Here ======================= */
+.footer {
+ margin-block-start: auto;
+}
+
+.footer-item-wrapper {
+ gap: clamp(2rem, 0.715rem + 1.714vw, 2.75rem);
+}
+
+.footer-item-two-wrapper {
+ gap: clamp(2rem, -4.209rem + 8.286vw, 5.625rem);
+}
+
+.footer-item__logo {
+ margin-block-end: 20px;
+}
+
+.footer-item__logo a img {
+ width: 100%;
+ height: 100%;
+ max-width: 190px;
+ max-height: 64px;
+}
+
+.body-bottom-bg {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ z-index: -1;
+}
+
+/* ============= Footer End Here ======================= */
+/* ===================== Scroll to Top Start ================================= */
+.progress-wrap {
+ position: fixed;
+ inset-inline-end: 36px;
+ inset-block-end: 36px;
+ height: 46px;
+ line-height: 46px;
+ width: 46px;
+ cursor: pointer;
+ display: block;
+ border-radius: 50px;
+ box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.2);
+ z-index: 10000;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(15px);
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+ background-color: transparent;
+}
+
+@media screen and (max-width: 991px) {
+ .progress-wrap {
+ inset-inline-end: 24px;
+ inset-block-end: 24px;
+ height: 40px;
+ width: 40px;
+ line-height: 40px;
+ }
+}
+
+.progress-wrap.active-progress {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+
+.progress-wrap:hover {
+ transform: scale(1.06);
+}
+
+.progress-wrap::after {
+ position: absolute;
+ font-family: "Phosphor";
+ font-weight: 900;
+ content: "\e08e";
+ text-align: center;
+ height: 46px;
+ width: 46px;
+ line-height: 46px;
+ font-size: 18px;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ cursor: pointer;
+ display: block;
+ z-index: 1;
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+ color: hsl(var(--main)) !important;
+}
+
+@media screen and (max-width: 991px) {
+ .progress-wrap::after {
+ height: 40px;
+ width: 40px;
+ line-height: 40px;
+ }
+}
+
+.progress-wrap svg path {
+ fill: none;
+}
+
+.progress-wrap svg.progress-circle path {
+ stroke: hsl(var(--main));
+ stroke-width: 5;
+ box-sizing: border-box;
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+}
+
+/* ===================== Scroll to Top End ================================= */
+.search-box {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ z-index: 9;
+ background: hsl(var(--black));
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ visibility: hidden;
+ opacity: 0;
+ transition: 0.2s linear;
+ transform: scale(0.8);
+ z-index: 9;
+}
+
+.search-box.active {
+ visibility: visible;
+ opacity: 1;
+ transform: scale(1);
+}
+
+/* ================= Slick Arrow & Dots css Start ================ */
+.slick-initialized.slick-slider .slick-track {
+ display: flex;
+}
+
+.slick-initialized.slick-slider .slick-slide {
+ cursor: grab;
+ height: auto;
+ margin: 0 10px;
+}
+
+.slick-initialized.slick-slider .slick-slide > div {
+ height: 100%;
+}
+
+.slick-initialized.slick-slider .slick-slide > div > div {
+ height: 100%;
+}
+
+/* Slick Slider Arrow */
+.slick-arrow {
+ width: 48px;
+ height: 48px;
+}
+
+@media screen and (max-width: 991px) {
+ .slick-arrow {
+ width: 40px;
+ height: 40px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .slick-arrow {
+ width: 32px;
+ height: 32px;
+ }
+}
+/* Arrow Style Two */
+.arrow-center {
+ position: relative;
+}
+
+.arrow-center .slick-arrow {
+ position: absolute;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-start: 16px;
+ z-index: 2;
+}
+
+.arrow-center .slick-arrow.slick-next {
+ inset-inline-start: auto;
+ inset-inline-end: 16px;
+}
+
+.slick-arrows-style-three .slick-arrow {
+ visibility: hidden;
+ opacity: 0;
+}
+
+.slick-arrows-style-three:hover .slick-arrow {
+ visibility: visible;
+ opacity: 1;
+}
+
+/* Dots Css Start */
+.slick-dots {
+ text-align: center;
+ position: absolute;
+ inset-block-end: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ z-index: 1;
+ line-height: 1;
+}
+
+.slick-dots li {
+ display: inline-block;
+ display: flex;
+}
+
+.slick-dots li button {
+ border: none;
+ background-color: hsl(var(--white)/0.3);
+ color: hsl(var(--white));
+ margin: 0 3px;
+ width: 12px;
+ height: 12px;
+ border-radius: 1px;
+ border-radius: 50px;
+ text-indent: -9999px;
+ transition: 0.3s linear;
+}
+
+.slick-dots li.slick-active button {
+ width: 40px;
+ background-color: hsl(var(--main-two));
+}
+
+/* Dots Css End */
+/* ================= Slick Arrow & Dots css Start ================ */
+/* ================== Section Heading Css Start ========================= */
+.section-heading {
+ margin-bottom: 40px;
+}
+
+@media screen and (max-width: 1199px) {
+ .section-heading {
+ margin-bottom: 24px;
+ }
+}
+/* ================== Section Heading Css End ========================= */
+/* ============================== Banner Css Start ========================== */
+.banner {
+ margin-top: 32px;
+}
+
+@media screen and (max-width: 767px) {
+ .banner {
+ margin-bottom: 32px;
+ }
+}
+
+.banner .slick-slider {
+ position: unset;
+}
+
+.banner .slick-initialized.slick-slider .slick-slide {
+ margin: 0;
+}
+
+.banner-item {
+ position: relative;
+ padding-block-start: clamp(2rem, -1.928rem + 8.183vw, 6.25rem);
+ padding-block-end: clamp(2rem, -8.859rem + 22.623vw, 13.75rem);
+ padding-inline-start: clamp(1rem, -11.87rem + 20.758vw, 8.875rem);
+ padding-inline-end: clamp(1rem, -5.129rem + 9.885vw, 4.75rem);
+ -webkit-mask-image: url(../images/bg/banner-bg2.png);
+ mask-image: url(../images/bg/banner-bg2.png);
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ background: #D3EBC0;
+ mask-position: top;
+ mask-size: 100% 100%;
+ gap: clamp(1.5rem, -2.151rem + 7.607vw, 4.5rem);
+}
+
+@media screen and (max-width: 767px) {
+ .banner-item {
+ mask-image: none;
+ overflow: unset !important;
+ }
+}
+
+.banner-item__title {
+ margin-block-end: clamp(1rem, -2.347rem + 6.973vw, 3.75rem);
+}
+
+@media screen and (max-width: 1499px) {
+ .banner-item__title {
+ font-size: 3.5rem;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .banner-item__title {
+ font-size: 2.875rem;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .banner-item__title {
+ font-size: 1.75rem;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .banner-item__title {
+ font-size: 1.625rem;
+ }
+}
+
+.banner-item__content {
+ max-width: 852px;
+}
+
+@media screen and (max-width: 1499px) {
+ .banner-item__content {
+ max-width: 750px;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .banner-item__thumb img {
+ max-width: 350px;
+ width: 100%;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .banner-slider__inner {
+ flex-wrap: wrap;
+ }
+}
+
+.scroll-down {
+ width: 94px;
+ height: 94px;
+ position: relative;
+ margin-bottom: 24px;
+ z-index: 2;
+}
+
+@media screen and (max-width: 1399px) {
+ .scroll-down {
+ width: 74px;
+ height: 74px;
+ margin-bottom: 16px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .scroll-down {
+ margin-bottom: -36px;
+ }
+}
+
+.scroll-down::before {
+ position: absolute;
+ content: "";
+ width: 2px;
+ height: 32px;
+ border: 2px dashed hsl(var(--white)/0.4);
+ top: 16px;
+ animation: upDown 2s linear infinite;
+}
+
+@media screen and (max-width: 1399px) {
+ .scroll-down::before {
+ top: 8px;
+ }
+}
+
+.scroll-down .icon {
+ animation: upDown 2s linear infinite;
+ font-size: 1.75rem;
+ margin-top: 16px;
+}
+
+@keyframes upDown {
+ 0% {
+ transform: translateY(10px);
+ }
+
+ 50% {
+ transform: translateY(0px);
+ }
+
+ 100% {
+ transform: translateY(10px);
+ }
+}
+/* ============================== Banner Css End ========================== */
+/* ============================ Feature Section Css start =============================== */
+.feature {
+ margin-top: 32px;
+}
+
+.feature .arrow-center:hover .slick-arrow {
+ visibility: visible;
+ opacity: 1;
+}
+
+.feature .arrow-center .slick-arrow {
+ transform: translateY(0);
+ margin-left: -28px;
+ border: 1px solid var(--gray-100);
+ visibility: hidden;
+ opacity: 0;
+ top: 54px;
+}
+
+.feature .arrow-center .slick-arrow.slick-next {
+ margin-right: -20px;
+}
+
+.feature-item-wrapper {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));
+ gap: 16px;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+1) .feature-item__thumb {
+ background: #E8F9E9;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+2) .feature-item__thumb {
+ background: #FCEDED;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+3) .feature-item__thumb {
+ background: #F6EBF3;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+4) .feature-item__thumb {
+ background: #FCF2E7;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+5) .feature-item__thumb {
+ background: #F5FBE3;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+6) .feature-item__thumb {
+ background: #E3FBE9;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+7) .feature-item__thumb {
+ background: #E9E3FB;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+8) .feature-item__thumb {
+ background: #ECF8F2;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+9) .feature-item__thumb {
+ background: #F8F5E5;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+10) .feature-item__thumb {
+ background: #F0F8E5;
+}
+
+.feature-item-wrapper .feature-item:nth-child(10n+11) .feature-item__thumb {
+ background: #ddd;
+}
+
+.feature-item__thumb {
+ max-width: 153px;
+ max-height: 153px;
+ background-color: var(--main-50);
+ aspect-ratio: 1;
+ margin: 0 auto;
+}
+
+.featured-products .product-card, .popular-products .product-card {
+ flex-direction: row;
+ align-items: unset;
+}
+
+.popular-products .product-card__thumb {
+ width: 120px !important;
+}
+
+/* ============================ Feature Section Css End =============================== */
+/* ======================== promotional banner Css Start ============================== */
+.promotional-banner-item {
+ padding: clamp(2rem, -1.956rem + 8.241vw, 5.25rem) 24px;
+}
+
+@media screen and (max-width: 575px) {
+ .promotional-banner-item {
+ padding: 24px 16px;
+ }
+}
+
+.promotional-banner-item__content {
+ max-width: 200px;
+}
+
+@media screen and (max-width: 1399px) {
+ .promotional-banner-item__title {
+ font-size: 1.5rem !important;
+ }
+}
+/* ======================== promotional banner Css End ============================== */
+/* ========================= flash sales Start ================================ */
+.flash-sales-item {
+ padding: 40px 32px;
+}
+
+/* ========================= flash sales End ================================ */
+/* ============================= Product Card Css Start ========================== */
+.product-card {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: start;
+}
+
+@media screen and (max-width: 1499px) {
+ .product-card__cart {
+ font-size: 12px;
+ padding: 9px 12px !important;
+ }
+}
+
+.product-card__badge {
+ border-radius: 16px 0 16px 0;
+}
+
+.product-card__thumb {
+ height: 232px;
+ width: 100%;
+ transition: 0s !important;
+}
+
+.product-card__thumb img {
+ max-width: 160px;
+ width: 100%;
+}
+
+.product-card.style-two {
+ flex-direction: row;
+}
+
+.product-card.style-two .product-card__thumb {
+ width: 260px;
+ height: 190px;
+}
+
+@media screen and (max-width: 991px) {
+ .product-card.style-two .product-card__thumb {
+ width: 190px;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .product-card.style-two .product-card__thumb {
+ width: 124px;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .product-card__thumb {
+ height: 160px;
+ }
+
+ .product-card__thumb img {
+ max-width: 120px;
+ }
+
+ .product-card__content .product-card__price span {
+ font-size: 0.75rem !important;
+ }
+
+ .product-card__content .title .link {
+ font-size: 0.875rem;
+ }
+
+ .product-card__content .text-xs {
+ font-size: 0.625rem !important;
+ }
+}
+/* ============================= Product Card Css End ========================== */
+/* ======================= Offer Css Start =========================== */
+@media screen and (max-width: 1499px) {
+ .offer-card__thumb img {
+ max-width: 246px;
+ width: 100%;
+ }
+}
+
+@media screen and (max-width: 1199px) {
+ .offer-card__thumb img {
+ max-width: 163px;
+ }
+}
+/* ======================= Offer Css End =========================== */
+/* ===================================== Vendor Css Start ================================== */
+.vendor-card {
+ background-color: var(--main-100);
+ -webkit-mask-image: url(../images/shape/box-shape2.png);
+ mask-image: url(../images/shape/box-shape2.png);
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ background: #F4F6E6;
+ mask-position: top;
+ mask-size: 100% 100%;
+}
+
+.vendor-card__logo {
+ max-width: 66px;
+}
+
+.vendor-card__item {
+ max-width: 64px;
+ max-height: 64px;
+ aspect-ratio: 1;
+ width: 100%;
+ height: 100%;
+}
+
+.vendor-card .vendor-card__list.style-two .vendor-card__item {
+ max-width: 88px;
+ max-height: 88px;
+ border-radius: 8px !important;
+}
+
+.vendor-card .vendor-card__list.style-two .slick-slide {
+ margin: 0 4px !important;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+1) .vendor-card {
+ background: #F4F6E6;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+2) .vendor-card {
+ background: #E6F6F6;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+3) .vendor-card {
+ background: #F6E6F6;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+4) .vendor-card {
+ background: #F8EAE4;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+5) .vendor-card {
+ background: #F8EAE4;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+6) .vendor-card {
+ background: #DEE6F3;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+7) .vendor-card {
+ background: #DAF2DB;
+}
+
+.vendor-card-wrapper div[class*=col]:nth-child(8n+8) .vendor-card {
+ background: #EBF1DA;
+}
+
+/* ===================================== Vendor Css End ================================== */
+@media (min-width: 768px) {
+ .delivery-section {
+ margin-bottom: 28px;
+ }
+}
+
+.delivery__man {
+ margin-bottom: -56px;
+}
+
+/* ================================== short product Css Start ================================== */
+.underlined-line::before, .underlined-line::after {
+ position: absolute;
+ content: "";
+ width: 100%;
+ height: 2px;
+ left: 0;
+ bottom: 0;
+ background-color: hsl(var(--white));
+}
+
+.underlined-line::after {
+ width: 50%;
+ background-color: var(--main-600);
+}
+
+.short-product-list.arrow-style-two .slick-arrow {
+ inset-inline-end: 16px;
+ inset-block-end: calc(100% + 52px);
+}
+
+.short-product-list.arrow-style-two .slick-prev {
+ inset-inline-end: 50px;
+}
+
+/* ================================== short product Css End ================================== */
+/* ========================= Brand Css Start ======================== */
+.brand-item img {
+ max-width: 152px !important;
+}
+
+@media screen and (max-width: 1399px) {
+ .brand-item img {
+ max-width: 132px !important;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .brand-item img {
+ max-width: 86px !important;
+ }
+}
+/* ========================= Brand Css End ======================== */
+/* Shipping Css Start */
+.shipping-item {
+ padding: clamp(1.5rem, 0.891rem + 1.268vw, 2rem) clamp(1.5rem, -3.746rem + 6vw, 3.375rem);
+}
+
+/* Shipping Css End */
+/* ======================= Newsletter Css Start =========================== */
+.newsletter-box {
+ background-color: #1A2026;
+ padding: 32px clamp(1.5rem, -8.492rem + 13.333vw, 4rem);
+}
+
+@media screen and (max-width: 991px) {
+ .newsletter-two__form {
+ width: 100% !important;
+ }
+}
+/* ======================= Newsletter Css End =========================== */
+/* Home Two Css Start */
+.color-two:root {
+ --main-h: 24;
+ --main-s: 100%;
+ --main-l: 49%;
+}
+
+.color-two h1,
+.color-two h2,
+.color-two h3,
+.color-two h4,
+.color-two h5,
+.color-two h6 {
+ font-family: var(--heading-font-two);
+}
+
+.color-two h1, .color-two .h1, .color-two h2, .color-two .h2, .color-two h3, .color-two .h3, .color-two h4, .color-two .h4, .color-two h5, .color-two .h5, .color-two h6, .color-two .h6 {
+ font-family: var(--heading-font-two);
+}
+
+/* Home Two Css End */
+/* ================================= Banner Two Css Start ================================= */
+.banner-item-two {
+ padding: 186px clamp(2rem, -10.739rem + 17vw, 6.25rem) 186px;
+ position: relative;
+}
+
+@media screen and (max-width: 1199px) {
+ .banner-item-two {
+ padding: 86px clamp(2rem, -10.739rem + 17vw, 6.25rem) 86px;
+ }
+}
+
+@media screen and (max-width: 991px) {
+ .banner-item-two {
+ padding: 60px clamp(2rem, -10.739rem + 17vw, 6.25rem) 60px;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .banner-item-two {
+ padding: 40px clamp(2rem, -10.739rem + 17vw, 6.25rem) 40px;
+ }
+}
+
+.banner-item-two-wrapper {
+ margin: 32px;
+ margin-inline-end: 0;
+}
+
+@media screen and (max-width: 991px) {
+ .banner-item-two-wrapper {
+ margin-inline-start: 0;
+ }
+}
+
+.banner-item-two__content {
+ max-width: 504px;
+}
+
+@media screen and (max-width: 991px) {
+ .banner-item-two__content {
+ max-width: 362px;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .banner-item-two__content {
+ max-width: 320px;
+ }
+}
+
+@media screen and (max-width: 575px) {
+ .banner-item-two__title {
+ font-size: 1.5rem;
+ }
+}
+
+.banner-item-two__thumb {
+ inset-inline-end: clamp(1.5rem, -20.232rem + 29vw, 8.75rem);
+ text-align: end;
+ max-width: 41%;
+}
+
+@media screen and (max-width: 575px) {
+ .banner-item-two__thumb {
+ max-width: 50%;
+ position: relative !important;
+ margin-top: 32px;
+ inset-inline-end: 0;
+ }
+}
+/* ================================= Banner Two Css End ================================= */
+/* Week Deals Start */
+.deal-week-box__content {
+ padding: clamp(1.5rem, -1.239rem + 5.705vw, 3.75rem) 0;
+}
+
+/* Week Deals End */
+/* ============================ trending products css Start =========================== */
+.trending-products-box {
+ background-color: #F3EDDE;
+}
+
+.trending-products-box__title {
+ max-width: 364px;
+ margin: 0 auto;
+}
+
+/* ============================ trending products css End =========================== */
+/* =============================== Discount css Start ============================ */
+.discount-item {
+ padding: clamp(1.5rem, -2.996rem + 6vw, 3rem);
+}
+
+.discount-item__content {
+ max-width: 320px;
+}
+
+/* =============================== Discount css End ============================ */
+/* ====================== Popular Products Start ==================== */
+@media screen and (max-width: 767px) {
+ .popular-products .product-card {
+ flex-direction: column;
+ }
+}
+/* ====================== Popular Products End ==================== */
+/* */
+.day-sale-box__content {
+ max-width: 500px;
+}
+
+/* */
+/* ========================== Top Brand Section Start ================================ */
+.top-brand__item {
+ max-height: 84px;
+ max-width: 160px;
+ width: 100%;
+ aspect-ratio: 1;
+}
+
+/* ========================== Top Brand Section End ================================ */
+/* ================================ Featured Products Css Start ============================ */
+@media screen and (max-width: 424px) {
+ .featured-products .product-card {
+ flex-direction: column;
+ }
+}
+/* ================================ Featured Products Css End ============================ */
+/* ============================ Product Details Css Start ============================= */
+.product-details__thumb-slider {
+ padding: clamp(3rem, -2.173rem + 10.777vw, 7.25rem);
+}
+
+.product-details .slick-initialized.slick-slider .slick-slide > div > div {
+ height: 100%;
+}
+
+.product-dContent__box, .product-dContent__header {
+ padding: 16px 40px;
+}
+
+.product-dContent__box {
+ padding-top: 48px;
+ padding-bottom: 48px;
+}
+
+/* ============================ Product Details Css End ============================= */
+/* ================================ Shop Page css Start =============================== */
+@media (max-width: 479px) {
+ .list-grid-btns {
+ display: none;
+ }
+}
+
+.list-grid-wrapper {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
+ gap: 24px;
+}
+
+@media (min-width: 480px) {
+ .list-view {
+ grid-template-columns: repeat(auto-fit, minmax(430px, 1fr));
+ }
+
+ .list-view .product-card {
+ display: flex;
+ align-items: center;
+ }
+
+ .list-view .product-card__thumb {
+ max-width: 200px;
+ height: 100% !important;
+ }
+
+ .list-view .product-card__content {
+ margin-top: 0 !important;
+ margin-left: 20px;
+ flex-grow: 1;
+ }
+}
+
+@media (max-width: 1199px) {
+ .shop-sidebar__box {
+ padding: 16px !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .shop-sidebar {
+ position: fixed;
+ top: 0;
+ height: 100vh;
+ background-color: #fff;
+ z-index: 11;
+ left: 0;
+ border-radius: 0 !important;
+ overflow-y: auto;
+ width: 300px;
+ border-right: 1px solid var(--gray-100);
+ transform: translateX(-100%);
+ transition: 0.2s linear;
+ }
+
+ .shop-sidebar.active {
+ transform: translateX(0);
+ }
+
+ .shop-sidebar__box {
+ border-radius: 0 !important;
+ border: 0 !important;
+ }
+}
+/* ================================ Shop Page css End =============================== */
+/* ========================== Cart Page Css Start ============================ */
+.table-product__thumb {
+ max-width: 150px;
+ max-height: 150px;
+ width: 100%;
+ height: 100%;
+ aspect-ratio: 1;
+}
+
+.table-product__thumb img {
+ max-width: 75px;
+}
+
+/* ========================== Cart Page Css End ============================ */
+/* ======================= Checkout Css Start ============================= */
+.payment-item__content {
+ display: none;
+}
+
+.payment-item__content::before {
+ position: absolute;
+ content: "";
+ width: 20px;
+ height: 14px;
+ background-color: var(--main-50);
+ left: 32px;
+ bottom: calc(100% - 1px);
+ clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
+}
+
+/* ======================= Checkout Css End ============================= */
+/* ========================= Blog Css Start ============================= */
+.blog-item {
+ margin-bottom: 48px;
+}
+
+.blog-item:last-child {
+ margin-bottom: 0;
+}
+
+/* ========================= Blog Css End ============================= */
+/*# sourceMappingURL=main.css.map */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css.map b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css.map
new file mode 100644
index 0000000..3512cb9
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/main.css.map
@@ -0,0 +1,2 @@
+{"version":3,"sources":["abstracts/_css-index.scss","abstracts/_functions.scss","abstracts/_variable.scss","abstracts/_mixins.scss","components/_accordion.scss","components/_button.scss","components/_form.scss","components/_pagination.scss","components/_tab.scss","components/_table.scss","components/_card.scss","components/_select2.scss","components/_countdown.scss","components/_badge.scss","components/_range-slider.scss","utilities/_typography.scss","utilities/_margin.scss","utilities/_padding.scss","utilities/_classes.scss","utilities/_extend.scss","utilities/_size.scss","utilities/_colors.scss","utilities/_border.scss","utilities/_bg.scss","utilities/_font-size.scss","utilities/_shadow.scss","utilities/_radius.scss","utilities/_scroll-hide.scss","utilities/_overlay.scss","utilities/_line-clamp.scss","utilities/_scrollbar.scss","utilities/_gap.scss","utilities/_hover.scss","utilities/_gutter.scss","layout/_preloader.scss","layout/_header-top.scss","layout/_header.scss","layout/_header-middle.scss","layout/_mobile-nav-menu.scss","layout/_footer.scss","layout/_scroll-top.scss","layout/_search-form.scss","layout/_slick.scss","layout/_section-heading.scss","partials/home/_banner.scss","partials/home/_feature.scss","partials/home/_promotional-banner.scss","partials/home/_flash-sales.scss","partials/home/_product-card.scss","partials/home/_offer.scss","partials/home/_vendor.scss","partials/home/_delivery.scss","partials/home/_short-product.scss","partials/home/_brand.scss","partials/home/_shipping.scss","partials/home/_newsletter.scss","partials/home-two/_color-two.scss","partials/home-two/_banner-two.scss","partials/home-two/_deals.scss","partials/home-two/_trending-products.scss","partials/home-two/_discount.scss","partials/home-two/_popular-products.scss","partials/home-two/_day-sale.scss","partials/home-two/_top-brand.scss","partials/home-two/_featured-products.scss","partials/othersPage/_product-details.scss","partials/othersPage/_shop.scss","partials/othersPage/_cart.scss","partials/othersPage/_checkout.scss","partials/othersPage/_blog.scss"],"names":[],"mappings":"AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCA;ACnCA;AAQA;AAGA;AA2CA;ACtDA;AACQ;AAgMR;AACA;AAEE;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;AAEA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;AAEC;EACD;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAIE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAME;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAMF;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;;;AAGJ;ACjQA;AACA;AA4DA;AAEA;AC/DA;AAEI;EACI;EACA;EACA;EACA;;;AACA;EACI;;;AAGR;EACI;;;AAEJ;EACI;EAEA;;;ADDN;ECFE;IAKQ;IACA;;;AAGR;EACI;;;AAEJ;EACI;;;AAEJ;EACI;EAEA;EACA;EACA;EACA;EACA;;;ADpBN;ECaE;IASQ;IACA;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;;ADrDd;ECyCU;IAcQ;;;AAKR;EACI;EACA;;;AAKhB;ACnFA;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AF0BN;EErCF;IAcQ;IACA;;;AAEJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;EACA;;;AAIZ;ACzGA;AACA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;;;AHgBN;EG5BF;IAeQ;;;AHMN;EGrBF;IAkBQ;;;AAGJ;EACI;EACA;EACA;EACA;;;AAEJ;EACI;;;AAGJ;EACI;;;AHXN;EGUE;IAGQ;;;AAGR;EACI;EACA;;;AACA;EACI;EACA;;;AAGR;EACI;EACA;EACA;;;AAEJ;EACI;;;AACA;EACI;;;AAGR;EACI;EACA;EACA;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;;;AAMZ;EACI;;;AAEJ;EACI;;;AAGR;AAEA;AACA;EACI;EACA;EACA;EACA;EACA;;;AAEA;EACI;EACA;;;AAGR;EACI;EACA;;;AAEJ;AAEA;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAEJ;EACI;;;AAEJ;EACI;EACA;EACA;EACA;;;AH9GN;EG0GE;IAMQ;;;AHvHV;EGiHE;IASQ;;;AAGR;EACI;;;AAGR;EACI;EACA;;;AH5HF;EG0HF;IAIQ;;;AHrIN;EGiIF;IAOQ;;;AAGJ;EACI;EACA;EACA;;;AAEJ;EACI;EACA;;;AAGR;AAII;EACI;;;AH1JN;EGyJE;IAGQ;;;AAIZ;AACA;AAAA;EAEI;EACA;;;AAEJ;EACI;EACA;EACA;;;AAEJ;AAEA;AACA;EACI;;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;AAAA;EAEI;;;AAEJ;EACI;;;AAGJ;AACA;EAEI;;;AACA;EACI;;;AAEJ;EACI;;;AAGA;EACI;;;AACA;EACI;;;AACA;EACI;EACA;EACA;EACA;;;AAMhB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;EACA;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAIZ;EACI;EACA;EACA;EACA;EAEA;EACA;;;AAMA;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKhB;AAEA;EACI;;;AAEJ;ACnZA;AACA;EACI;;;AJmCF;EIpCF;IAGQ;;;AJ0BN;EI7BF;IAMQ;;;AJgBN;EItBF;IASQ;;;AAII;EACI;EACA;EACA;;;AAGR;EACI;;;AACA;EACI;EACA;EACA;;;AAMhB;AC/BA;AACA;EACI;EACA;;;AACA;EACI;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AL4BV;EKtCM;IAYQ;IACA;;;AAEJ;EACI;EACA;EACA;;;AAEJ;EACI;;;AAKR;EACI;EACA;;;AACA;EACI;EACA;EACA;;;AAEJ;EACI;;;AAKhB;AC9CA;AACA;EACI;EACA;EACA;;;AAEJ;EACI;EACA;EACA;;;AACA;EACI;;;AAGA;EACI;EACA;;;AACA;EACI;;;AAEJ;EACI;;;AAGR;EACI;EACA;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAKR;EACI;;;AACA;EACI;EACA;EACA;EACA;;;AAKR;EACI;;;AACA;EACI;;;AACA;EACI;;;AAGR;EACI;EACA;EACA;;;AAKZ;EACI;;;AACA;EACI;;;AAEJ;EACI;EACA;;;AAIJ;EACI;;;AACA;EACI;;;AAGA;EACI;;;AAEJ;EACI;;;AAGR;EACI;;;AAKhB;AC9FA;AACA;EACI;;;AACA;EACI;EACA;EACA;;;APIN;EOPE;IAKQ;;;AAGR;EACI;;;AACA;EACI;EACA;;;AAGR;EACI;;;APTN;EOQE;IAGQ;;;AAGR;EACI;EACA;;;AAGR;AC7BA;AACA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGA;EACI;EACA;;;AAIR;EACI;;;AAEJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AR1BF;EQsBF;IAMQ;;;AAIR;EACI;EACA;;;ARlCF;EQgCF;IAIQ;IACA;;;AAKJ;EACI;;;AAMR;EACI;EACA;EACA;EACA;;;ARnEF;EQ+DF;IAMQ;;;ARlFN;EQ4EF;IASQ;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;;;AAEJ;EACI;;;AAGJ;EACI;;;AAIJ;EACI;EACA;EACA;EACA;;;ARlGF;EQ8FF;IAMQ;IACA;;;AAIR;EACI;EACA;;;AAEJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AACA;EACI;;;AAEJ;EACI;;;AAEJ;EACI;EACA;;;AAEJ;EACI;;;AAOA;EACI;;;AAEJ;EACI;;;AAMZ;AAEI;EACI;EACA;;;AAEJ;EACI;EACA;;;AAEJ;EACI;;;AAEJ;EACI;EACA;EACA;EACA;;;AR/JN;EQoKF;IAEQ;;;AR1LN;EQwLF;IAKQ;;;ARzKN;EQ+KE;IACI;;;EACA;IACI;;;AAIZ;ACpNA;AACA;EACI;;;AT0CF;ES3CF;IAGQ;;;AAEJ;EACI;EACA;EACA;EACA;;;ATkCN;EStCE;IAMQ;;;AAGA;EACI;;;AAGR;EACI;EACA;EACA;EACA;EACA;EACA;;;ATmBV;ESzBM;IAQQ;;;AAIJ;EACI;;;AAOJ;EACI;EACA;;;AACA;EACI;;;AAMhB;EACI;;;AAEI;EACI;EACA;EACA;EACA;;;AAOJ;EACI;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAMpB;AC5EA;EACI;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACzBJ;AAEC;EACC;EACA;EACA;EACM;;;AACN;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACC;;;AAED;EACa;;;AAGd;EACC;EACS;;;AAGT;EACC;;;AAIA;EACI;;;AAEP;EACC;EACA;EACA;EACA;;;AAGF;AC5CA;AACA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;EACA;;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;AAAA;EAEE;EACA;EACA;;;AAEF;EACE;EACA;;;AACA;EACE;EACA;;;AAGJ;EACE;EACA;;;AAEF;EACE;;;AAEF;ACpHA;AAEE;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AACA;EAHF;IAII;IACA;;;AAEF;EAPF;IAQI;IACA;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAEA;EALJ;IAMI;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAEA;EALJ;IAMI;;;AAGJ;EACI;EACA;;;AACA;EAHJ;IAII;IACA;;;AAEA;EAPJ;IAQI;IACA;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAEA;EALJ;IAMI;;;AAGF;EACE;;;AACA;EAFF;IAGE;;;AAEA;EALF;IAME;;;AAEH;ACvHD;AAEE;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAIJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIF;EACE;EACA;;;AACA;EAHF;IAII;IACA;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAIJ;EACI;EACA;;;AACA;EAHJ;IAII;IACA;;;AAEA;EAPJ;IAQI;IACA;;;AAGJ;EACI;;;AACA;EAFJ;IAGI;;;AAEA;EALJ;IAMI;;;AAGF;EACE;;;AACA;EAFF;IAGE;;;AAEA;EALF;IAME;;;AAGJ;AC9GA;AACA;AAEI;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAIR;EACI;;;AAGJ;AAEI;EADJ;IAEQ;;;AAIR;EACI;IACI;;;AAKJ;EACI;;;AAIR;AAEI;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAIR;EACI;;;AAIA;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAKJ;EACI;;;AAKJ;EACI;;;AAKJ;EACI;;;AAEJ;EACI;;;AAIR;AAGQ;EACI;;;AAIJ;EACI;;;AAMR;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAEJ;AClJA;AACA;AACE;EACE;EACA;EACA;;;AAEJ;AACE;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEJ;AACA;ACtBI;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKJ;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAKA;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAGN;EACE;;;AAIA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAKF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAKJ;EACE;;;AAGF;EACE;;;AC/DI;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAOJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAOA;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AAMZ;AAGQ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;ACjDN;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASA;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AAOV;EACE;;;AAEF;EACE;;;ACtBE;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AASA;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AADJ;EACI;;;AAQN;EACE;;;AAMR;EACE;;;AC9BF;AAEI;EACI;;;AAKJ;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAKF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AAGN;ACjBA;AAEI;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGN;ACtBA;AAEI;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;AADH;EACG;;;ACFP;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AxBsBF;EwB5BF;IAQQ;;;AxBoBN;EwBlBE;IAEQ;IACA;IACA;IACA;IACA;;;AAIZ;ACrBA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AzBDF;EyBGM;IACI;IACA;;;AAIZ;ACrCA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;ACtBE;EACE;EACA;;;AAEF;EACE;;;AACA;EACE;;;AAGJ;EACE;;;ACVF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;AADF;EACE;;;ACHN;AAGI;EACE;;;AAMF;EACE;;;AAON;EACI;EACA;EACA;;;AAGJ;EACI;;;AAEI;EACI;EACA;EACA;;;AAII;EADJ;IAEQ;IACA;;;AAMpB;AC1CA;EACI;;;AAEJ;EACI;;;AAIJ;EACI;;;AAEJ;EACI;;;ACZJ;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;ACbA;AhCuBE;EgCrBE;IAEQ;;;EAEI;IACI;;;EAEJ;IACI;IACA;;;EACA;IACI;;;AAOb;EACK;EACA;;;AACA;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AhCAlB;EgCDc;IAGQ;;;AAEJ;EACI;EACA;;;AAGR;EACI;EACA;;;AhCXlB;EgCYkB;IAEQ;;;AhCd1B;EgCyBM;IACI;;;AAKZ;EACI;;;AACA;EACI;EACA;;;AhCrBN;EgCmBE;IAIQ;IACA;;;AhC/BV;EgC0BE;IAQQ;IACA;;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACI;EACA;;;AAIZ;AAEI;EACI;;;AACA;EACI;EACA;;;AAKZ;ACvGA;AACA;EACI;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AjCkBN;EiC3BE;IAWQ;;;AAIZ;EACI;IACE;;EAEF;IACE;;;AAKF;EACI;;;AjCnBN;EiCkBE;IAGQ;;;AAKZ;AACA;EACI;;;AjCMF;EiCPF;IAGQ;;;AjCHN;EiCAF;IAMQ;;;AAII;EACI;;;AACA;EACI;;;AAKR;EACI;;;AACA;EAFJ;IAGQ;;;AAKhB;EACI;EACA;EACA;EACA;EACA;;;AACA;EANJ;IAOQ;;;AjCjCV;EiC0BE;IAUQ;;;AAKJ;EADJ;IAEQ;;;AjC1CV;EiCwCE;IAKQ;;;AAKZ;EACI;;;AAEI;EACI;;;AAKJ;EACI;;;AAEJ;EACI;;;AAGR;EACI;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKZ;AACA;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EAbJ;IAcQ;IACA;;;AAEJ;EACI;EACA;;;AAEJ;EACI;EACA;EACA;EACA;;;AjCnHN;EiC+GE;IAMQ;;;AAII;EACI;;;AAKhB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAEJ;EACI;;;AAIZ;AACA;AAGA;AACA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGQ;EACI;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;EACA;;;AACA;EACI;;;AAQxB;EAGY;IACI;IACA;IACA;;;EAEJ;IACI;IACA;;;AjC1Nd;EiCiOE;IAEQ;IACA;;;AjC3OV;EiCwOE;IAMQ;;;AAGR;EAEQ;IACI;IACA;;;EACA;IACI;;;AAOpB;AACA;EACI;;;AACA;EAFJ;IAGQ;;;AAEJ;EACI;;;AjCrQN;EiCoQE;IAGQ;IACA;;;AAEJ;EACI;;;AAIZ;EACI;EACA;EACA;EACA;;;AACA;EACI;;;AjChQN;EiC+PE;IAGQ;;;AAGR;EAXJ;IAYQ;;;AAIR;AAIA;ACnTA;AACA;EACI;;;AACA;EACI;;;AlCwCN;EkC3CF;IAMQ;;;AlC8BN;EkCpCF;IASQ;;;AlCoBN;EkC7BF;IAYQ;;;AlCwBN;EkCrBE;IAEQ;;;AlCKV;EkCPE;IAKQ;;;AAKZ;EACI;;;AAGJ;AlCAE;EkCGM;IACI;IACA;IACA;IACA;;;AlCPV;EkCUE;IAEQ;;;AAGR;EACI;EACA;;;AlCIN;EkCNE;IAIQ;;;AlCLV;EkCCE;IAOQ;;;AlCfV;EkCQE;IAUQ;;;AAKZ;AlChBE;EkCiBF;IAEQ;;;AlCjCN;EkC+BF;IAKQ;;;AlC3CN;EkCsCF;IAQQ;;;AlCvCN;EkC4CU;IACI;IACA;;;AAKhB;AAGA;AAEI;EACI;EACA;EACA;;;AACA;EACI;EACA;EACA;EACA;;;AAIZ;AAGA;AlCvEE;EkCyEE;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;EACA;IACI;;;EAEJ;IACI;;;EAGQ;IACI;IACA;IACA;;;EACA;IACI;;;EAIZ;IACI;;;EAIZ;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;EACA;IACI;;;EAEJ;IACI;;;EAEI;IACI;;;EACA;IACI;;;AAQ5B;AACA;ACrKA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAGR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;;;AAKJ;EACI;EACA;;;AAIY;EACI;;;AAIZ;EACI;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;;;AAGA;EACI;EACA;;;AAEJ;EACI;;;AAMpB;ACnFA;AACA;EACI;;;AACA;EACI;;;AAEJ;EACI;;;AAGA;EACI;;;AAEI;EACI;EACA;EACA;EACA;;;AAOpB;EACI;EACA;EACA;EACA;;;AAEJ;AC9BA;AACE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ArCWF;EqC5BA;IAmBI;IACA;IACA;IACA;IACA;;;AAEF;EACI;EACA;EACA;;;AAEJ;EACE;;;AAEF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ArCtBN;EqCKE;IAmBM;IACA;IACA;;;AAKR;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEJ;ACvEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;EACA;;;ACjBR;AAEE;EACI;;;AAEJ;EACE;EACE;EACA;;;AACA;EACI;;;AACA;EACE;;;AAMZ;AACA;EACE;EACA;;;AvCSA;EuCXF;IAII;IACA;;;AvCDF;EuCJF;IAQI;IACA;;;AAKJ;AACA;EACE;;;AACA;EACE;EACA;EACA;EACA;EACA;;;AACA;EACE;EACA;;;AAMJ;EACE;EACA;;;AAGA;EACE;EACA;;;AAKN;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;EACA;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;;;AAIZ;AACA;AC/FA;AACA;EACI;;;AxCmCF;EwCpCF;IAGQ;;;AAGR;ACPA;AACA;EACI;;;AzCqBF;EyCtBF;IAGQ;;;AAEJ;EACI;;;AAEJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AzCJF;EyCTF;IAeQ;IACA;;;AAGJ;EACI;;;AzCiBN;EyClBE;IAGQ;;;AzCCV;EyCJE;IAMQ;;;AzCTV;EyCGE;IASQ;;;AzCnBV;EyCUE;IAYQ;;;AAGR;EACI;;;AzCEN;EyCHE;IAGQ;;;AzCnCV;EyCuCM;IAEQ;IACA;;;AzC1Cd;EyCgDF;IAEQ;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AzC/BF;EyC0BF;IAOQ;IACA;IACA;;;AzCxDN;EyC+CF;IAYQ;;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AzC/CN;EyCwCE;IASQ;;;AAGR;EACI;EACA;EACA;;;AAIR;EACI;IACI;;EAEJ;IACI;;EAEJ;IACI;;;AAGR;AClHA;AACA;EACI;;;AAGQ;EACI;EACA;;;AAGR;EACI;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAOZ;EACI;EACA;EACA;;;AAGQ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAKhB;EACI;EACA;EACA;EACA;EACA;;;AAKJ;EACI;EACA;;;AAIJ;EACI;;;AAGR;AC3GA;AACA;EACI;;;A3CcF;E2CfF;IAGQ;;;AAEJ;EACI;;;A3CqCN;E2CnCE;IAEQ;;;AAIZ;ACfA;AACA;EACI;;;AAEJ;ACJA;AACA;EACI;EACA;EACA;EACA;;;A7C8CF;E6C7CE;IAEQ;IACA;;;AAGR;EACI;;;AAEJ;EACI;EACA;EACA;;;AACA;EACI;EACA;;;AAIR;EACI;;;AAEI;EACI;EACA;;;A7CAd;E6CFU;IAIQ;;;A7ChBlB;E6CYU;IAOQ;;;A7CElB;E6COM;IACI;;;EACA;IACI;;;EAKA;IACI;;;EAGR;IACI;;;EAEJ;IACI;;;AAKhB;ACjEA;A9CmDE;E8ChDM;IAEQ;IACA;;;A9C+Bd;E8ClCM;IAMQ;;;AAKhB;ACdA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAEJ;EACI;EACA;EACA;EACA;EACA;;;AAII;EACI;EACA;EACA;;;AAEJ;EACI;;;AAQJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAIhB;AC1EQ;EADJ;IAEQ;;;AAGR;EACI;;;ACPR;AAEI;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;;;AAMA;EACI;EACA;;;AAEJ;EACI;;;AAIZ;AC5BA;AAEI;EACI;;;AlDyCN;EkD1CE;IAGQ;;;AlDyBV;EkD5BE;IAMQ;;;AAIZ;ACZA;AACA;EACI;;;AAEJ;ACJA;AACA;EACI;EACA;;;ApD2BF;EoDvBE;IAEQ;;;AAIZ;ACbA;AAEI;EACI;EACA;EACA;;;AAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;;;AAEJ;EACI;;;AAGR;ACnBA;AACA;EACI;EACA;;;AtDkCF;EsDpCF;IAIQ;;;AtDyBN;EsD7BF;IAOQ;;;AtDeN;EsDtBF;IAUQ;;;AAEJ;EACI;EACA;;;AtDeN;EsDjBE;IAIQ;;;AAGR;EACI;;;AtDSN;EsDVE;IAGQ;;;AtDPV;EsDIE;IAMQ;;;AtDVV;EsDaE;IAEQ;;;AAGR;EACI;EACA;EACA;;;AtDrBN;EsDkBE;IAKQ;IACA;IACA;IACA;;;AAIZ;AC9CA;AAEI;EACI;;;AAGR;ACNA;AAEI;EACI;;;AACA;EACI;EACA;;;AAOZ;ACbA;AACA;EACI;;;AACA;EACI;;;AAGR;ACPA;A1DuBE;E0DrBE;IAEQ;;;AAIZ;ACRA;AAGQ;EACI;;;AAIZ;ACRA;AAEI;EACI;EACA;EACA;EACA;;;AAGR;ACTA;A7DUE;E6DRE;IAEQ;;;AAIZ;ACRA;AAGQ;EACI;;;AAIR;EACI;;;AAKR;EACI;;;AAGA;EACI;EACA;;;AAGR;ACvBA;AAEI;EADJ;IAEQ;;;AAGR;EACI;EACA;EACA;;;AAGJ;EACI;IACI;;;EACA;IACI;IACA;;;EACA;IACI;IACA;;;EAEJ;IACI;IACA;IACA;;;AAMhB;EACI;IACI;;;AAIR;EACI;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;EACA;IACI;;;EAEJ;IACI;IACA;;;AAIZ;AC5DA;AAEI;EACI;EACA;EACA;EACA;EACA;;;AACA;EACI;;;AAOZ;AChBA;AAEI;EACI;;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIZ;AChBA;AACA;EACI;;;AACA;EACI;;;AAGR","file":"main.css","sourcesContent":["/*====================== CSS Index Here =======================*/\r\n/*\r\n01. Abstracts\r\n 1.1. Classes\r\n 1.2. Extend\r\n 1.3. Functions\r\n 1.4. Mixins\r\n 1.5. Variable\r\n 1.6. Wordpress Default\r\n\r\n02. Base\r\n 2.1. Margin\r\n 2.2. Padding\r\n 2.3. Typography\r\n\r\n03. Components\r\n 3.1. Accordion\r\n 3.2. Button\r\n 3.3. Form\r\n 3.4. Pagination\r\n 3.6. Tab\r\n\r\n04. Layout\r\n 4.1. Blog Sidebar\r\n 4.2. Breadcrumb\r\n 4.3. Comment\r\n 4.4. Footer\r\n 4.5. Header Top\r\n 4.6. Header\r\n 4.7. Preloader\r\n 4.8. Scroll Top\r\n 4.9. Section Heading\r\n 4.10. Slick\r\n 4.11. Social Icon\r\n*/\r\n/*======================== CSS Index End ======================*/","/* Convert to Rem start */\r\n$font-base: 16px;\r\n@function rem($target, $context: $font-base) {\r\n @if ($target == 0) {\r\n @return 0;\r\n }\r\n @return calc($target / $context * 1rem);\r\n}\r\n/* Convert to Rem End */\r\n\r\n\r\n/* ======================== Functions Css End ======================= */\r\n// Convert px to REM \r\n@function convertToRem($px) {\r\n $val: calc($px / 16);\r\n @return $val;\r\n}\r\n@function formatFloatingNumber($number) {\r\n @return calc(round($number * 1000) / 1000);\r\n}\r\n@function clampCal($minSize, $maxSize, $minWidth: 768, $maxWidth: 1399) {\r\n $minREMsize: convertToRem($minSize);\r\n $maxREMsize: convertToRem($maxSize);\r\n $minREMwidth: convertToRem($minWidth);\r\n $maxREMwidth: convertToRem($maxWidth);\r\n\r\n $slopFontCal: calc($maxREMsize - $minREMsize);\r\n $slopWidthCal: calc($maxREMwidth - $minREMwidth);\r\n $slop: calc($slopFontCal / $slopWidthCal);\r\n\r\n $minusWidth: calc($minREMwidth * -1);\r\n $xAxisIntersection: calc($minusWidth * $slop + $minREMsize);\r\n $preferred: calc($slop * 100);\r\n\r\n $xAxisMax: formatFloatingNumber($xAxisIntersection);\r\n $preferredMax: formatFloatingNumber($preferred);\r\n\r\n @return clamp(\r\n #{$minREMsize}rem,\r\n #{$xAxisMax}rem + #{$preferredMax}vw,\r\n #{$maxREMsize}rem\r\n );\r\n}\r\n\r\n\r\n// Use of this function, Please Uncomment this class and see how it works \r\n// .demoClass {\r\n// padding: clampCal(24, 40);\r\n// font-size: clampCal(20, 48);\r\n// }\r\n// ============ If You need all properties you can use like this way ============ \r\n// .demoClass {\r\n// padding: clampCal(24, 40, 424, 991); // Here Properties are small device padding, Large device padding, small device width, Large device width \r\n// }\r\n/* ======================== Functions Css End ======================= */\r\n\r\n","/* Font Family*/\r\n@import url('https://fonts.googleapis.com/css2?family=Exo:ital,wght@0,100..900;1,100..900&family=Inter:wght@100..900&family=Quicksand:wght@300..700&display=swap');\r\n\r\n$colors: (\r\n \"main\": (\r\n \"50\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.9)),\r\n \"100\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.8)),\r\n \"200\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.7)),\r\n \"300\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.6)),\r\n \"400\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.5)),\r\n \"500\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.4)),\r\n \"600\": hsl(var(--main-h), var(--main-s), var(--main-l)), // main theme color\r\n \"700\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.1)),\r\n \"800\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.2)),\r\n \"900\": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.3))\r\n ),\r\n \"main-two\": (\r\n \"50\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.9)),\r\n \"100\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.8)),\r\n \"200\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.7)),\r\n \"300\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.6)),\r\n \"400\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.5)),\r\n \"500\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.4)),\r\n \"600\": hsl(var(--main-two-h), var(--main-two-s), var(--main-two-l)), // main-two theme secondary color\r\n \"700\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.1)),\r\n \"800\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.2)),\r\n \"900\": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.3))\r\n ),\r\n \r\n \"neutral\": (\r\n \"50\": #ECF1F9,\r\n \"100\": #E6E6E6,\r\n \"200\": #CCCCCC,\r\n \"300\": #B3B3B3,\r\n \"400\": #999999,\r\n \"500\": #808080,\r\n \"600\": #121535,\r\n \"700\": #060710,\r\n \"800\": #11132e,\r\n \"900\": #1A1A1A,\r\n ),\r\n \r\n \"gray\": (\r\n \"50\": #F1F1F1,\r\n \"100\": #E6E6E6,\r\n \"200\": #CCCCCC,\r\n \"300\": #B3B3B3,\r\n \"400\": #999999,\r\n \"500\": #808080,\r\n \"600\": #666666,\r\n \"700\": #4D4D4D,\r\n \"800\": #333333,\r\n \"900\": #1A1A1A,\r\n ),\r\n\r\n\r\n\r\n \"light\": (\r\n \"50\": #F5F6FA,\r\n \"100\": #F3F4F6,\r\n \"600\": #E4F1FF,\r\n \"700\": #374151,\r\n \"800\": #1F2937,\r\n ),\r\n \r\n \"primary\": (\r\n \"50\": #E4F1FF,\r\n \"100\": #BFDCFF,\r\n \"200\": #95C7FF,\r\n \"300\": #6BB1FF,\r\n \"400\": #519FFF,\r\n \"500\": #458EFF,\r\n \"600\": #487FFF,\r\n \"700\": #486CEA,\r\n \"800\": #4759D6,\r\n \"900\": #4536B6\r\n ),\r\n\r\n \"danger\": (\r\n \"50\": #FEF2F2,\r\n \"100\": #FEE2E2,\r\n \"200\": #FECACA,\r\n \"300\": #FCA5A5,\r\n \"400\": #F87171,\r\n \"500\": #EF4444,\r\n \"600\": #DC2626,\r\n \"700\": #B91C1C,\r\n \"800\": #991B1B,\r\n \"900\": #7F1D1D\r\n ),\r\n\r\n \"success\": (\r\n \"50\": #F0FDF4,\r\n \"100\": #DCFCE7,\r\n \"200\": #BBF7D0,\r\n \"300\": #86EFAC,\r\n \"400\": #4ADE80,\r\n \"500\": #22C55E,\r\n \"600\": #27AE60,\r\n \"700\": #15803D,\r\n \"800\": #166534,\r\n \"900\": #14532D\r\n ),\r\n\r\n \"warning\": (\r\n \"50\": #FEFCE8, \r\n \"100\": #FEF9C3,\r\n \"200\": #FEF08A,\r\n \"300\": #FDE047,\r\n \"400\": #FACC15,\r\n \"500\": #EAB308,\r\n \"600\": #FF9F29,\r\n \"700\": #f39016,\r\n \"800\": #e58209,\r\n \"900\": #d77907\r\n ),\r\n\r\n \"info\": (\r\n \"50\": #EFF6FF,\r\n \"100\": #DBEAFE,\r\n \"200\": #BFDBFE,\r\n \"300\": #93C5FD,\r\n \"400\": #60A5FA,\r\n \"500\": #3B82F6,\r\n \"600\": #2563EB,\r\n \"700\": #1D4ED8,\r\n \"800\": #1E40AF,\r\n \"900\": #1E3A8A\r\n ),\r\n\r\n \"tertiary\": (\r\n \"50\": #d1c8ff,\r\n \"100\": #c2b6ff,\r\n \"600\": #3C23B5,\r\n ),\r\n);\r\n\r\n// Space\r\n$spaces: (\r\n \"2\": #{rem(2px)},\r\n \"3\": #{rem(3px)},\r\n \"4\": #{rem(4px)},\r\n \"5\": #{rem(5px)},\r\n \"6\": #{rem(6px)},\r\n \"7\": #{rem(7px)},\r\n \"8\": #{rem(8px)},\r\n \"9\": #{rem(9px)},\r\n \"10\": #{rem(10px)},\r\n \"11\": #{rem(11px)},\r\n \"12\": #{rem(12px)},\r\n \"13\": #{rem(13px)},\r\n \"14\": #{rem(14px)},\r\n \"16\": #{rem(16px)},\r\n \"18\": #{rem(18px)},\r\n \"20\": #{rem(20px)},\r\n \"22\": #{rem(22px)},\r\n \"24\": #{rem(24px)},\r\n \"26\": #{rem(26px)},\r\n \"28\": #{rem(28px)},\r\n \"30\": #{rem(30px)},\r\n \"32\": #{rem(32px)},\r\n \"36\": #{rem(32px)},\r\n \"40\": #{rem(40px)}, \r\n \"44\": #{rem(44px)}, \r\n \"48\": #{rem(48px)},\r\n \"52\": #{rem(52px)},\r\n \"56\": #{rem(56px)},\r\n \"60\": #{rem(60px)},\r\n \"64\": #{rem(64px)},\r\n \"68\": #{rem(68px)},\r\n \"72\": #{rem(72px)},\r\n \"76\": #{rem(76px)},\r\n \"80\": #{rem(80px)},\r\n \"90\": #{rem(90px)},\r\n \"110\": #{rem(110px)},\r\n \"120\": #{rem(120px)},\r\n \"144\": #{rem(144px)},\r\n \"160\": #{rem(160px)},\r\n);\r\n\r\n$font-sizes: (\r\n \"xs\": #{rem(12px)},\r\n \"sm\": #{rem(14px)},\r\n \"md\": #{rem(16px)},\r\n \"lg\": #{rem(18px)},\r\n \"xl\": #{rem(20px)},\r\n \"2xl\": #{rem(24px)},\r\n \"3xl\": #{rem(30px)},\r\n \"4xl\": #{rem(36px)},\r\n \"5xl\": #{rem(48px)},\r\n \"6xl\": #{rem(60px)},\r\n);\r\n\r\n/* ========================= Variable Css Start ======================== */\r\n:root { \r\n\r\n /* Font Family Variable */\r\n --heading-font: \"Quicksand\", sans-serif ;\r\n --heading-font-two: \"Exo\", sans-serif;\r\n --body-font: \"Inter\", sans-serif;\r\n \r\n /* Font Size Variable Start */\r\n --heading-one: clamp(2.25rem, -0.0733rem + 6.3692vw, 4.5rem); // Min:36px - Max:72px\r\n --heading-two: clamp(2rem, 0.7133rem + 2.8846vw, 3.5rem); // Min: 32px - Max: 56px\r\n --heading-three: clamp(1.75rem, 0.3353rem + 2.1661vw, 3rem); // Min: 28px - Max: 48px\r\n --heading-four: clamp(1.5rem, 0.5569rem + 1.444vw, 2.5rem); // Min: 24px - Max: 40px\r\n --heading-five: clamp(1.25rem, 1.2rem + 0.722vw, 2.25rem); // Min: 20px - Max: 36px\r\n --heading-six: clamp(1.125rem, 0.769rem + 0.6813vw, 1.5rem); // Min: 18px - Max-24px\r\n /* Font Size End */\r\n\r\n /* template main color */\r\n --main-h: 148;\r\n --main-s: 59%;\r\n --main-l: 39%;\r\n --main: var(--main-h) var(--main-s) var(--main-l);\r\n\r\n /* template main color */\r\n --main-two-h: 25;\r\n --main-two-s: 100%;\r\n --main-two-l: 49%;\r\n --main-two: var(--main-two-h) var(--main-two-s) var(--main-two-l);\r\n\r\n /* White Color */\r\n --white: 0 0% 100%;\r\n --black: 235 49% 14%;\r\n --light: 0 0% 51%;\r\n \r\n --heading-color: var(--black);\r\n --body-color: var(--light);\r\n --body-bg: var(--gray);\r\n --border-color: 236 13% 77%;\r\n\r\n --bg-color-one: #F3FAF2; \r\n --bg-color-two: #FFFBF4; \r\n --bg-color-three: #F1F1F1; \r\n --neutral: #121535; \r\n\r\n --translate-x-middle: translateX(-50%); \r\n --translate-y-middle: translateY(-50%); \r\n \r\n // spacing\r\n @each $property, $value in $spaces {\r\n --size-#{$property}: #{$value};\r\n }\r\n \r\n // Colors\r\n @each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n --#{$color}-#{$shade}: #{$value};\r\n }\r\n }\r\n\r\n // font sizes\r\n @each $property, $value in $font-sizes {\r\n --font-#{$property}: #{$value};\r\n } \r\n}\r\n/* ========================= Variable Css End ======================== */\r\n","/* ============================ Mixins Css Start ============================ */\r\n/* Media Breakpoint for Each Device Start */\r\n@mixin xxsm-screen {\r\n @media screen and (max-width: 374px) {\r\n @content;\r\n }\r\n}\r\n\r\n// Xtra Small\r\n@mixin xsm-screen {\r\n @media screen and (max-width: 424px) {\r\n @content;\r\n }\r\n}\r\n// Medium Small Screen (max-width: 575)\r\n@mixin msm-screen {\r\n @media screen and (max-width: 575px) {\r\n @content;\r\n }\r\n}\r\n\r\n//Small Screen (max-width: 767)\r\n@mixin sm-screen {\r\n @media screen and (max-width: 767px) {\r\n @content;\r\n }\r\n}\r\n\r\n//Large Screen (max-width: 991)\r\n@mixin md-screen {\r\n @media screen and (max-width: 991px) {\r\n @content;\r\n }\r\n}\r\n\r\n//Xtra Large Screen (max-width: 1199)\r\n@mixin lg-screen {\r\n @media screen and (max-width: 1199px) {\r\n @content;\r\n }\r\n}\r\n\r\n//Xtra Large Screen i (max-width: 1399)\r\n@mixin xl-screen {\r\n @media screen and (max-width: 1399px) {\r\n @content;\r\n }\r\n}\r\n\r\n//Xtra Large Screen ii (max-width: 1499)\r\n@mixin xxl-screen {\r\n @media screen and (max-width: 1499px) {\r\n @content;\r\n }\r\n}\r\n//Xtra Large Screen ii (max-width: 1599)\r\n@mixin xxxl-screen {\r\n @media screen and (max-width: 1599px) {\r\n @content;\r\n }\r\n}\r\n/* Media Breakpoint for Each Device End */\r\n\r\n/* ============================ Mixins Css End ============================ */\r\n","/* =========================== Accordion Css start ============================= */ \r\n.common-accordion {\r\n .accordion-item {\r\n border: 1px solid var(--border-color);\r\n background-color: hsl(var(--white)) !important;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n &:not(:last-child) {\r\n margin-block-end:20px;\r\n }\r\n }\r\n .accordion-header {\r\n line-height: 1;\r\n }\r\n .accordion-body {\r\n padding: 20px 30px;\r\n \r\n padding-block-start: 0;\r\n @include msm-screen {\r\n padding: 12px 20px;\r\n padding-block-start: 0;\r\n }\r\n }\r\n &:first-of-type .accordion-button.collapsed {\r\n border-radius: 5px; \r\n }\r\n &:last-of-type .accordion-button.collapsed {\r\n border-radius: 5px; \r\n }\r\n .accordion-button{\r\n color: var(--heading-color);\r\n \r\n padding: 20px 30px;\r\n padding-inline-end: 46px; \r\n font-weight: 600;\r\n font-size: clampCal(16, 20);\r\n font-family: var(--heading-font);\r\n @include msm-screen {\r\n padding: 12px 20px;\r\n padding-inline-end: 36px;\r\n }\r\n &::after {\r\n background-image: none;\r\n }\r\n &:focus {\r\n box-shadow: none;\r\n }\r\n &:not(.collapsed) {\r\n background-color: transparent !important;\r\n box-shadow: none;\r\n color: hsl(var(--main));\r\n &::after {\r\n background-image: none;\r\n color: hsl(var(--main)); ; \r\n }\r\n }\r\n &[aria-expanded=\"true\"], &[aria-expanded=\"false\"] {\r\n &::after {\r\n font-family: \"Phosphor\";\r\n font-weight: 900;\r\n content: \"\\E136\";\r\n color: hsl(var(--main));\r\n display: inline-block;\r\n position: absolute;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n inset-inline-end: 30px;\r\n height: unset;\r\n \r\n text-align: center;\r\n @include msm-screen {\r\n inset-inline-end: 20px;\r\n }\r\n }\r\n }\r\n &[aria-expanded=\"false\"] {\r\n &::after {\r\n content: \"\\f107\";\r\n color: hsl(var(--heading-color));\r\n }\r\n }\r\n }\r\n}\r\n/* ================================= Accordion Css End =========================== */","/* ================================= Button Css Start =========================== */\r\n.btn-check:checked+.btn, .btn.active, .btn.show, .btn:first-child:active, :not(.btn-check)+.btn:active {\r\n color: none;\r\n background-color: none;\r\n border-color: none;\r\n}\r\n\r\n.btn {\r\n position: relative;\r\n border-radius: 5px;\r\n border: 1px solid transparent;\r\n font-weight: 500;\r\n font-family: var(--body-font);\r\n color: hsl(var(--white)) !important;\r\n z-index: 1;\r\n line-height: 1;\r\n padding: 13px 24px;\r\n &:hover, &:focus, &:focus-visible {\r\n box-shadow: none !important;\r\n }\r\n @include xl-screen {\r\n padding: 10px 20px; \r\n font-size: rem(14px);\r\n }\r\n &-sm {\r\n padding: 10px 16px !important;\r\n }\r\n &:active {\r\n transform: scale(1.01);\r\n }\r\n // ============= Different Color Button Start ==================\r\n &-main {\r\n background-color: hsl(var(--main)) !important;\r\n border-color: hsl(var(--main)) !important;\r\n &:hover {\r\n background-color: var(--main-800) !important;\r\n border-color: var(--main-800) !important;\r\n }\r\n }\r\n &-outline-main {\r\n background-color: transparent!important;\r\n border-color: hsl(var(--main)) !important;\r\n color: hsl(var(--main)) !important;\r\n &:hover {\r\n background-color: hsl(var(--main)/.15) !important;\r\n border-color: hsl(var(--main)/.4) !important;\r\n }\r\n }\r\n &-main-two {\r\n background-color: hsl(var(--main-two)) !important;\r\n border-color: hsl(var(--main-two)) !important;\r\n color: hsl(var(--white)) !important;\r\n &:hover {\r\n background-color: var(--main-two-800) !important;\r\n border-color: var(--main-two-800) !important;\r\n }\r\n }\r\n &-outline-main-two {\r\n background-color: transparent!important;\r\n border-color: hsl(var(--main-two)) !important;\r\n color: hsl(var(--main-two)) !important;\r\n &:hover {\r\n background-color: hsl(var(--main-two)/.15) !important;\r\n border-color: hsl(var(--main-two)/.4) !important;\r\n }\r\n }\r\n &-white {\r\n background-color: hsl(var(--white)) !important;\r\n border-color: hsl(var(--white)) !important;\r\n color: hsl(var(--heading-color)) !important;\r\n &:hover {\r\n background-color: hsl(var(--white)/.9) !important;\r\n border-color: hsl(var(--white)/.9) !important;\r\n }\r\n }\r\n &-outline-white {\r\n background-color: transparent!important;\r\n border-color: hsl(var(--white)) !important;\r\n color: hsl(var(--white)) !important;\r\n &:hover {\r\n background-color: hsl(var(--white)) !important;\r\n border-color: hsl(var(--white)) !important;\r\n color: hsl(var(--heading-color)) !important;\r\n }\r\n }\r\n &-black {\r\n background-color: hsl(var(--black)) !important;\r\n border-color: hsl(var(--black)) !important;\r\n color: hsl(var(--white)) !important;\r\n &:hover {\r\n background-color: hsl(var(--black)/.8) !important;\r\n border-color: hsl(var(--black)/.8) !important;\r\n }\r\n }\r\n &-outline-black {\r\n background-color: transparent!important;\r\n border-color: hsl(var(--black)) !important;\r\n color: hsl(var(--black)) !important;\r\n &:hover {\r\n background-color: hsl(var(--black)) !important;\r\n border-color: hsl(var(--black)) !important;\r\n color: hsl(var(--white)) !important;\r\n }\r\n }\r\n}\r\n/* ================================= Button Css End =========================== */","/* ================================= Form Css Start =========================== */\r\n/* input Start */\r\n.common-input {\r\n border-radius: 5px;\r\n font-weight: 400;\r\n outline: none;\r\n width: 100%;\r\n padding: 17px 24px;\r\n background-color: transparent !important; \r\n border: 1px solid var(--gray-100);\r\n color: hsl(var(--black)); \r\n line-height: 1;\r\n &.style-two {\r\n background-color: hsl(var(--white)) !important;\r\n color: hsl(var(--black)); \r\n }\r\n @include md-screen {\r\n padding: 12px 24px;\r\n }\r\n @include sm-screen {\r\n padding: 10px 16px;\r\n \r\n }\r\n &::placeholder {\r\n color: var(--gray-500);\r\n transition: .2s linear;\r\n font-size: rem(14px);\r\n font-weight: 400;\r\n }\r\n &--md {\r\n padding: 13px 16px;\r\n \r\n }\r\n &--lg {\r\n padding: 23px 24px;\r\n @include sm-screen {\r\n padding: 18px 24px;\r\n }\r\n } \r\n &:focus {\r\n border-color: hsl(var(--main)); \r\n box-shadow: none;\r\n &::placeholder {\r\n visibility: hidden;\r\n opacity: 0;\r\n }\r\n }\r\n &:disabled, &[readonly] {\r\n background-color: hsl(var(--black)/.2); \r\n opacity: 1;\r\n border: 0;\r\n }\r\n &[type=\"password\"] {\r\n color: hsl(var(--black)/.5);\r\n &:focus {\r\n color: hsl(var(--black)); \r\n }\r\n }\r\n &[type=\"file\"] {\r\n line-height: 50px;\r\n padding: 0;\r\n position: relative;\r\n &::file-selector-button {\r\n border: 1px solid hsl(var(--black) / .08);\r\n padding: 4px 6px;\r\n border-radius: .2em;\r\n background-color: hsl(var(--main)) !important;\r\n transition: .2s linear;\r\n line-height: 25px;\r\n position: relative;\r\n margin-inline-start: 15px;\r\n color: hsl(var(--body-color)) !important;\r\n &:hover {\r\n background-color: hsl(var(--main));\r\n border: 1px solid hsl(var(--main));\r\n color: hsl(var(--black));\r\n }\r\n }\r\n }\r\n}\r\n.common-input {\r\n &--withIcon {\r\n padding-inline-end: 50px !important;\r\n }\r\n &--withLeftIcon {\r\n padding-inline-start: 50px !important;\r\n }\r\n}\r\n/* input End */\r\n\r\n/* input icon */\r\n.input-icon {\r\n position: absolute;\r\n inset-inline-end: 24px;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n color: hsl(var(--heading-color));\r\n \r\n &--left {\r\n inset-inline-start: 20px;\r\n inset-inline-end: auto;\r\n }\r\n}\r\ntextarea+.input-icon {\r\n inset-block-start: 15px;\r\n transform: translateY(0);\r\n}\r\n/* input icon */\r\n\r\n/* Label */\r\n.form-label {\r\n margin-block-end: 6px;\r\n color: hsl(var(--heading-color));\r\n font-weight: 500;\r\n}\r\n\r\n/* Form Select */ \r\n.select-has-icon {\r\n position: relative;\r\n &::before {\r\n position: absolute;\r\n content: \"\\f107\";\r\n inset-inline-end: 20px;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n font-family: \"Phosphor\";\r\n font-weight: 900;\r\n \r\n color: hsl(var(--main)); \r\n transition: 0.2s linear;\r\n pointer-events: none;\r\n color: hsl(var(--black)) !important; \r\n }\r\n &.icon-black::before {\r\n -webkit-text-fill-color: hsl(var(--black)); \r\n }\r\n select {\r\n background-image: none;\r\n -webkit-appearance: none;\r\n padding: 20px 24px;\r\n font-size: 18px;\r\n @include md-screen {\r\n padding: 15px 24px;\r\n }\r\n @include sm-screen {\r\n padding: 12px 16px;\r\n }\r\n }\r\n .common-input {\r\n padding-inline-end: 30px !important;\r\n }\r\n} \r\n.select {\r\n color: hsl(var(--black) / .6) !important;\r\n padding: 16px 24px;\r\n @include md-screen {\r\n padding: 11px 24px;\r\n }\r\n @include sm-screen {\r\n padding: 9px 24px;\r\n \r\n }\r\n &:focus {\r\n border-color: hsl(var(--main));\r\n color: hsl(var(--black)) !important;\r\n outline: none;\r\n }\r\n option {\r\n background-color: hsl(var(--white));\r\n color: hsl(var(--heading-color));\r\n }\r\n}\r\n/* Form Select End */\r\n\r\n// Message Field Css\r\ntextarea {\r\n &.common-input {\r\n height: 140px;\r\n @include sm-screen {\r\n height: 110px;\r\n }\r\n }\r\n}\r\n/* Autofill Css */\r\ninput:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active, \r\ntextarea:-webkit-autofill, textarea:-webkit-autofill:hover, textarea:-webkit-autofill:focus, textarea:-webkit-autofill:active {\r\n -webkit-transition: background-color 5000s ease-in-out 0s;\r\n transition: background-color 5000s ease-in-out 0s;\r\n}\r\ninput:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill {\r\n -webkit-box-shadow: 0 0 0px 1000px transparent inset;\r\n -webkit-text-fill-color: hsl(var(--heading-color)) !important;\r\n caret-color: hsl(var(--heading-color));\r\n}\r\n/* Autofill Css End */\r\n\r\n/* Show Hide Password */\r\ninput#your-password, input#confirm-password {\r\n padding-inline-end: 50px;\r\n}\r\n.password-show-hide {\r\n position: absolute;\r\n inset-inline-end: 20px;\r\n z-index: 5;\r\n cursor: pointer;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n color: hsl(var(--black)/.4);\r\n}\r\n\r\n/* Number Arrow None */\r\ninput::-webkit-outer-spin-button,\r\ninput::-webkit-inner-spin-button {\r\n -webkit-appearance: none;\r\n}\r\ninput[type=number]{\r\n -moz-appearance: textfield;\r\n}\r\n\r\n/* Custom Checkbox & Radio Css Start */\r\n.common-check {\r\n @extend .flex-align; \r\n margin-block-end: 16px;\r\n &:last-child {\r\n margin-block-end: 0;\r\n }\r\n a {\r\n display: inline;\r\n }\r\n &.common-radio {\r\n .form-check-input {\r\n border-radius: 50%;\r\n &:checked { \r\n background-color: transparent !important;\r\n &::after {\r\n visibility: visible;\r\n opacity: 1;\r\n -webkit-transform: translate(-50%, -50%) scale(1);\r\n transform: translate(-50%, -50%) scale(1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n .form-check-input {\r\n transition: .2s linear;\r\n box-shadow: none;\r\n background-color: transparent;\r\n box-shadow: none !important;\r\n border: 0;\r\n position: relative;\r\n border-radius: 3px;\r\n width: 18px;\r\n height: 18px;\r\n border: 1px solid hsl(var(--black) / .4); \r\n cursor: pointer;\r\n transition: .2s linear;\r\n margin-block-start: 0;\r\n &::before {\r\n position: absolute;\r\n content: \"\\E182\";\r\n font-family: \"Phosphor\";\r\n font-weight: 900;\r\n color: hsl(var(--white)); \r\n font-size: 12px;\r\n inset-block-start: 50%;\r\n inset-inline-start: 50%;\r\n transform: translate(-50%, -50%);\r\n transition: .2s linear;\r\n visibility: hidden;\r\n opacity: 0;\r\n }\r\n &::after {\r\n position: absolute;\r\n content: \"\";\r\n inset-block-start: 50%;\r\n inset-inline-start: 50%;\r\n -webkit-transform: translate(-50%, -50%) scale(.2);\r\n transform: translate(-50%, -50%) scale(.2);\r\n width: 10px;\r\n height: 10px;\r\n background-color: hsl(var(--main));\r\n border-radius: 50%;\r\n transition: .2s linear;\r\n z-index: 1;\r\n visibility: hidden;\r\n opacity: 0;\r\n }\r\n &:checked {\r\n background-color: hsl(var(--main)) !important;\r\n border-color: hsl(var(--main)) !important;\r\n box-shadow: none;\r\n &[type=checkbox] {\r\n background-image:none;\r\n }\r\n &::before {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n }\r\n }\r\n .form-check-label {\r\n font-weight: 500;\r\n width: calc(100% - 18px);\r\n padding-inline-start: 12px;\r\n cursor: pointer;\r\n \r\n color: hsl(var(--heading-color)); \r\n font-family: var(--poppins-font)\r\n }\r\n}\r\n\r\n.checked {\r\n &-black {\r\n .form-check-input {\r\n border: 1px solid hsl(var(--black)); \r\n &::after {\r\n background-color: hsl(var(--black));\r\n }\r\n &:checked {\r\n background-color: hsl(var(--black)) !important;\r\n border-color: hsl(var(--black)) !important;\r\n }\r\n }\r\n }\r\n &-primary {\r\n .form-check-input {\r\n border: 1px solid var(--primary-600); \r\n &::after {\r\n background-color: var(--primary-600);\r\n }\r\n &:checked {\r\n background-color: var(--primary-600) !important;\r\n border-color: var(--primary-600) !important;\r\n }\r\n }\r\n }\r\n &-gray {\r\n .form-check-input {\r\n border: 1px solid var(--gray-600); \r\n &::after {\r\n background-color: var(--gray-600);\r\n }\r\n &:checked {\r\n background-color: var(--gray-600) !important;\r\n border-color: var(--gray-600) !important;\r\n }\r\n }\r\n }\r\n &-success {\r\n .form-check-input {\r\n border: 1px solid var(--success-600); \r\n &::after {\r\n background-color: var(--success-600);\r\n }\r\n &:checked {\r\n background-color: var(--success-600) !important;\r\n border-color: var(--success-600) !important;\r\n }\r\n }\r\n }\r\n &-danger {\r\n .form-check-input {\r\n border: 1px solid var(--danger-600); \r\n &::after {\r\n background-color: var(--danger-600);\r\n }\r\n &:checked {\r\n background-color: var(--danger-600) !important;\r\n border-color: var(--danger-600) !important;\r\n }\r\n }\r\n }\r\n &-purple {\r\n .form-check-input {\r\n border: 1px solid var(--tertiary-600); \r\n &::after {\r\n background-color: var(--tertiary-600);\r\n }\r\n &:checked {\r\n background-color: var(--tertiary-600) !important;\r\n border-color: var(--tertiary-600) !important;\r\n }\r\n }\r\n }\r\n &-white {\r\n .form-check-input {\r\n border: 1px solid var(--gray-100); \r\n &::after {\r\n background-color: var(--gray-100);\r\n }\r\n &:checked {\r\n background-color: var(--gray-100) !important;\r\n border-color: var(--gray-100) !important;\r\n }\r\n }\r\n }\r\n}\r\n/* Custom Checkbox & Radio Css End */\r\n\r\n.toggle-password.active::before {\r\n content: \"\\e220\" !important;\r\n}\r\n/* ================================= Form Css End =========================== */","/* ================================= Pagination Css Start =========================== */\r\n.pagination {\r\n margin-block-start: 64px;\r\n @include lg-screen {\r\n margin-block-start: 48px;\r\n }\r\n @include md-screen {\r\n margin-block-start: 40px;\r\n }\r\n @include sm-screen {\r\n margin-block-start: 32px;\r\n }\r\n .page-item {\r\n &.active {\r\n .page-link {\r\n background-color: var(--main-600) !important;\r\n border-color: var(--main-600) !important;\r\n color: hsl(var(--white)) !important;\r\n }\r\n }\r\n .page-link {\r\n box-shadow: none !important; \r\n &:hover, &:active, &:focus {\r\n color: var(--main-600) !important;\r\n background-color: var(--main-100) !important;\r\n border-color: var(--main-300) !important;\r\n \r\n }\r\n }\r\n }\r\n}\r\n/* ================================= Pagination Css End =========================== */","/* ================================= Tab Css Start =========================== */\r\n.common-tab {\r\n margin-block-end: 20px;\r\n gap: 8px;\r\n .nav-item {\r\n border-bottom: 0;\r\n .nav-link {\r\n color: var(--gray-500);\r\n padding: 9px 24px !important;\r\n background-color: transparent;\r\n transition: .2s linear;\r\n border: 1px solid var(--border-color);\r\n position: relative;\r\n font-weight: 400;\r\n overflow: hidden;\r\n border-radius: 50px;\r\n font-size: 16px;\r\n @include xl-screen {\r\n padding: 6px 16px !important;\r\n font-size: rem(14px);\r\n }\r\n &.active {\r\n color: hsl(var(--white)) !important; \r\n border-color: var(--main-600) !important;\r\n background-color: var(--main-600) !important;\r\n }\r\n &:hover {\r\n color: var(--main-600);\r\n }\r\n }\r\n }\r\n &.style-two {\r\n .nav-link {\r\n border: 1px solid var(--gray-100);\r\n color: var(--neutral-600);\r\n &.active {\r\n color: hsl(var(--white)) !important; \r\n border-color: var(--main-two-600) !important;\r\n background-color: var(--main-two-600) !important;\r\n }\r\n &:hover {\r\n color: var(--main-two-600);\r\n }\r\n }\r\n }\r\n}\r\n/* ================================= Tab Css End =========================== */\r\n","/* ======================= Common Table Css Start ======================= */\r\n.table-card {\r\n border: 1px solid hsl(var(--white)/.2);\r\n border-radius: 10px;\r\n padding: clampCal(20, 36);\r\n}\r\n.table {\r\n color: hsl(var(--white));\r\n margin-block-end: 0;\r\n min-width: max-content;\r\n &>:not(caption)>*>* {\r\n border-bottom: 0;\r\n }\r\n tr {\r\n th {\r\n padding-inline-start: 0;\r\n padding: 32px;\r\n &:first-child {\r\n padding-inline-start: 0;\r\n }\r\n &:last-child {\r\n padding-inline-end: 0;\r\n }\r\n }\r\n th, td {\r\n text-align: center;\r\n vertical-align: middle;\r\n &:first-child {\r\n text-align: left;\r\n }\r\n &:last-child {\r\n text-align: right;\r\n padding-inline-end: 0;\r\n }\r\n }\r\n }\r\n thead {\r\n tr {\r\n border-bottom: 1px solid hsl(var(--white)/.2);\r\n th {\r\n padding-block-start: 0;\r\n font-size: clampCal(16, 20);\r\n font-weight: 400;\r\n padding-block-end: clampCal(16, 30);\r\n }\r\n }\r\n }\r\n tbody {\r\n tr {\r\n border-bottom: 1px solid hsl(var(--white)/.2);\r\n &:last-child {\r\n border-bottom: 0;\r\n td {\r\n padding-block-end: 0;\r\n }\r\n }\r\n td {\r\n font-size: clampCal(14, 16);\r\n font-weight: 400;\r\n padding: clampCal(16, 30) 0;\r\n }\r\n }\r\n }\r\n\r\n &.style-two {\r\n color: hsl(var(--heading-color));\r\n thead tr, tbody tr {\r\n border-bottom: 1px solid hsl(var(--black)/.1);\r\n }\r\n thead tr th {\r\n padding-block-end: 16px;\r\n font-size: 15px;\r\n }\r\n }\r\n &.style-three {\r\n tbody tr {\r\n border-bottom: 1px solid var(--gray-100);\r\n &:last-child {\r\n border: 0;\r\n }\r\n td {\r\n &:first-child {\r\n padding-inline-start: 0;\r\n }\r\n &:last-child {\r\n padding-inline-end: 0;\r\n }\r\n }\r\n td {\r\n padding: clampCal(24, 40) 24px;\r\n }\r\n }\r\n }\r\n}\r\n/* ======================= Common Table Css End ======================= */","/* ================= Common Card Css Start ========================= */\r\n.common-card {\r\n border: 0;\r\n .card-header, .card-footer {\r\n padding: 12px 24px;\r\n background-color: transparent;\r\n border-bottom: 1px solid var(--border-color);\r\n @include xsm-screen {\r\n padding: 12px 16px;\r\n }\r\n }\r\n .card-header {\r\n background-color: hsl(var(--black));\r\n .title {\r\n color: hsl(var(--white));\r\n margin-block-end: 0;\r\n }\r\n }\r\n .card-body {\r\n padding: 24px;\r\n @include xsm-screen {\r\n padding: 16px;\r\n }\r\n }\r\n .card-footer {\r\n border-top: 1px solid var(--border-color);\r\n border-bottom: 0;\r\n }\r\n}\r\n/* ================= Common Card Css End ========================= */","/* ======================= Select 2 Css Start =========================== */\r\n.select2-container--default .select2-selection--single {\r\n border: 0;\r\n}\r\n\r\n.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {\r\n border: 0;\r\n position: relative;\r\n}\r\n\r\n.select2-container--default .select2-selection--single .select2-selection__arrow b::before {\r\n position: relative;\r\n content: \"\\e136\";\r\n font-family: \"Phosphor\";\r\n font-weight: 900;\r\n color: hsl(var(--heading-color) / 0.4);\r\n transition: 0.2s linear;\r\n}\r\n\r\n.select2-container--open.select2-container--default .select2-selection--single .select2-selection__arrow b::before {\r\n content: \"\\E13C\" !important;\r\n}\r\n\r\n.select2-container--default .select2-selection--single .select2-selection__arrow b {\r\n border: 0 !important;\r\n margin: 0 !important;\r\n inset-block-start: 0 !important;\r\n inset-inline-start: 0 !important;\r\n position: relative !important; \r\n}\r\n\r\n\r\n.select2-container {\r\n height: inherit !important;\r\n width: auto !important;\r\n}\r\n\r\n.select2-selection.select2-selection--single {\r\n height: inherit !important;\r\n border: 1px solid var(--gray-200) !important;\r\n background-color: transparent !important;\r\n display: flex !important;\r\n justify-content: center !important;\r\n align-items: center !important;\r\n}\r\n.radius-end-0 {\r\n .select2-selection.select2-selection--single {\r\n border-start-start-radius: 50px !important;\r\n border-end-start-radius: 50px !important;\r\n }\r\n}\r\n\r\n.select2-selection.select2-selection--single {\r\n position: relative;\r\n}\r\n.select2-container .selection {\r\n height: inherit;\r\n}\r\n\r\n.select2-selection__arrow {\r\n right: 16px !important;\r\n inset-block-start: 50% !important;\r\n transform: translateY(-50%) !important;\r\n width: unset !important;\r\n @include lg-screen {\r\n right: 6px !important;\r\n }\r\n}\r\n\r\n.select2-container .select2-selection--single .select2-selection__rendered {\r\n padding-inline-start: 24px !important;\r\n padding-inline-end: 40px !important;\r\n @include lg-screen {\r\n padding-inline-start: 10px !important;\r\n padding-inline-end: 24px !important;\r\n }\r\n}\r\n\r\n.select-border-end-0 {\r\n .select2-selection.select2-selection--single { \r\n border-inline-end: 0 !important;\r\n }\r\n}\r\n\r\n\r\n\r\n.select2-dropdown {\r\n border: 1px solid var(--gray-100) !important; \r\n padding: 10px !important; \r\n border-radius: 6px !important; \r\n min-width: 200px;\r\n @include sm-screen {\r\n min-width: 170px;\r\n }\r\n @include xsm-screen {\r\n min-width: 150px;\r\n }\r\n}\r\n\r\n.select2-search--dropdown {\r\n padding: 0 !important;\r\n}\r\n\r\n.select2-container--default .select2-search--dropdown .select2-search__field {\r\n border: 1px solid var(--gray-100) !important;\r\n border-radius: 6px !important;\r\n padding: 4px 10px;\r\n}\r\n.select2-container--default .select2-search--dropdown .select2-search__field:focus-visible {\r\n outline: 1px solid var(--main-200);\r\n}\r\n\r\n.select2-results {\r\n margin-block-start: 8px !important;\r\n}\r\n\r\n\r\n.select2-results__option.select2-results__option--selectable {\r\n border-radius: 6px !important;\r\n padding: 6px 12px !important;\r\n color: var(--gray-500);\r\n font-size: 14px !important;\r\n @include sm-screen {\r\n padding: 4px 10px !important;\r\n font-size: 12px !important;\r\n }\r\n}\r\n\r\n.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable {\r\n background-color: var(--main-600) !important;\r\n color: white !important;\r\n}\r\n.select2-results__option.select2-results__option--selectable:hover {\r\n background-color: var(--main-100) !important;\r\n color: var(--main-600) !important;\r\n}\r\n\r\n.select2-container--default .select2-results__option--selected, .select2-container--default .select2-results__option--selected:hover {\r\n background-color: var(--main-600) !important;\r\n color: #fff !important;\r\n}\r\n\r\n.select2-container--default .select2-results>.select2-results__options {\r\n padding-inline-end: 8px;\r\n &::-webkit-scrollbar {\r\n width: 6px;\r\n }\r\n &::-webkit-scrollbar-track {\r\n background: #e4e4e4;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background: #a2a2a2;\r\n border-radius: 50px;\r\n }\r\n &::-webkit-scrollbar-thumb:hover {\r\n background: #6d6d6d;\r\n }\r\n}\r\n\r\n\r\n.select2-container--open {\r\n &.select2-container--default .select2-selection--single {\r\n .select2-selection__rendered {\r\n color: var(--main-600) !important;\r\n }\r\n .select2-selection__arrow b::before {\r\n color: var(--main-600) !important;\r\n }\r\n }\r\n}\r\n\r\n\r\n/* Location Box Css */\r\n.location-box {\r\n .select2-container .select2-selection--single .select2-selection__rendered {\r\n padding-inline-start: 0px !important;\r\n padding-inline-end: 50px !important;\r\n }\r\n .select2-selection__arrow {\r\n right: 0px !important;\r\n inset-block-start: 10% !important;\r\n }\r\n .select2-selection.select2-selection--single {\r\n border: 0 !important;\r\n }\r\n .select2-container--default .select2-selection--single .select2-selection__rendered {\r\n line-height: 14px;\r\n color: var(--gray-900);\r\n font-weight: 700;\r\n font-family: var(--heading-font-two);\r\n }\r\n}\r\n\r\n\r\n.select2-container--open .select2-dropdown {\r\n @include md-screen {\r\n left: -74px;\r\n }\r\n @include xsm-screen {\r\n left: -40px;\r\n }\r\n}\r\n\r\n\r\n@include md-screen {\r\n .location-box, .search-category.h-48 {\r\n height: 40px !important;\r\n .select2-selection__rendered {\r\n font-size: 12px;\r\n }\r\n }\r\n}\r\n/* ======================= Select 2 Css End =========================== */","/* ========================== Count Down Css Start =============================== */\r\n.countdown-list {\r\n gap: 20px;\r\n @include xl-screen {\r\n gap: 6px;\r\n }\r\n &__item {\r\n background-color: hsl(var(--white));\r\n padding: clampCal(6, 12, 1399, 1599) clampCal(8, 16, 1399, 1599);\r\n border-radius: 8px;\r\n position: relative;\r\n @include xl-screen {\r\n font-size: rem(12px) !important;\r\n }\r\n &:last-child {\r\n &::before {\r\n display: none;\r\n }\r\n }\r\n &::before {\r\n position: absolute;\r\n content: \":\";\r\n inset-block-start: 50%;\r\n inset-inline-end: -10px;\r\n transform: translateY(-50%);\r\n font-weight: 700;\r\n @include xl-screen {\r\n display: none;\r\n }\r\n }\r\n &.colon-white {\r\n &::before {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n &.style-two {\r\n .countdown-list {\r\n &__item {\r\n background-color: var(--main-600);\r\n color: #fff !important;\r\n &::before {\r\n color: var(--main-600) !important;\r\n }\r\n }\r\n }\r\n }\r\n\r\n &.style-three {\r\n gap: 12px;\r\n .countdown-list {\r\n &__item {\r\n background-color: var(--main-50);\r\n font-size: 11px !important;\r\n padding: 6px;\r\n color: #1A1A1A !important;\r\n }\r\n }\r\n }\r\n\r\n &.style-four {\r\n .countdown-list {\r\n &__item {\r\n width: 64px;\r\n height: 64px;\r\n align-items: center;\r\n padding: 2px;\r\n justify-content: center;\r\n &::before {\r\n color: var(--neutral-600);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n/* ========================== Count Down Css End =============================== */",".badge-notification {\r\n margin-bottom: 6px;\r\n position: absolute;\r\n inset-block-start: -18px;\r\n inset-inline-start: 0;\r\n &::before {\r\n position: absolute;\r\n content: \"\";\r\n width: 11px;\r\n height: 6px;\r\n background-color: inherit;\r\n top: calc(100% - 1px);\r\n clip-path: polygon(0% 0%, 100% 0%, 0% 100%, 0% 100%);\r\n }\r\n}\r\n\r\n.badge-style-two::before {\r\n position: absolute;\r\n content: \"\";\r\n width: 12px;\r\n height: 12px;\r\n background: var(--main-two-600);\r\n border-radius: 2px;\r\n inset-inline-start: -4px;\r\n transform: translateY(-50%) rotate(45deg);\r\n top: 50%;\r\n}","/* ================================= Range Slider Css Start =========================== */\r\n.custom--range {\r\n\t#slider-range {\r\n\t\theight: 4px;\r\n\t\tborder: 0;\r\n\t\tbackground: var(--gray-200);\r\n margin: 8px;\r\n\t\t.ui-slider-handle {\r\n\t\t\twidth: 16px !important;\r\n\t\t\theight: 16px !important;\r\n\t\t\tbackground-color: var(--main-600) !important;\r\n\t\t\tborder-radius: 50%;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tborder: 0 !important;\r\n\t\t\toutline: 0 !important;\r\n\t\t\ttransition: .2s linear;\r\n\t\t\t&:hover, &.ui-state-active {\r\n\t\t\t\ttransform: translateY(-50%) scale(1.3);\r\n\t\t\t}\r\n\t\t\t&.ui-state-active {\r\n box-shadow: 0px 0px 12px 4px #95959541 !important; \r\n\t\t\t}\r\n\t\t}\r\n\t\t.ui-widget-header {\r\n\t\t\tbackground-color: var(--main-600);\r\n transition: .2s linear;\r\n\t\t}\r\n\t\tspan {\r\n\t\t\t&:focus {\r\n\t\t\t\tbackground-color: var(--main-600);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n &__prices{\r\n width: 58px;\r\n }\r\n\tinput {\r\n\t\tborder: 0;\r\n\t\tcolor: hsl(var(--body-color));\r\n\t\tfont-weight: 500;\r\n\t\toutline: 0;\r\n\t}\r\n}\r\n/* ================================= Range Slider Css End =========================== */","/* ================================= Typography Css Start =========================== */\r\n* {\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\nhtml {\r\n scroll-behavior: smooth;\r\n}\r\n\r\nbody {\r\n font-family: var(--body-font);\r\n color: hsl(var(--body-color));\r\n word-break: break-word;\r\n background-color: hsl(var(--white));\r\n min-height: 100vh;\r\n display: flex;\r\n flex-direction: column;\r\n position: relative;\r\n}\r\n\r\np {\r\n font-weight: 400;\r\n margin: 0;\r\n line-height: 1.6;\r\n}\r\n\r\nspan {\r\n display: inline-block;\r\n}\r\n\r\nh1,\r\nh2,\r\nh3,\r\nh4,\r\nh5,\r\nh6 {\r\n margin: 0 0 16px 0;\r\n font-family: var(--heading-font);\r\n color: hsl(var(--heading-color));\r\n line-height: 1.2;\r\n font-weight: 700;\r\n}\r\nh1, .h1 {\r\n font-size: var(--heading-one);\r\n}\r\nh2, .h2 {\r\n font-size: var(--heading-two);\r\n}\r\nh3, .h3 {\r\n font-size: var(--heading-three);\r\n}\r\nh4, .h4 {\r\n font-size: var(--heading-four);\r\n}\r\nh5, .h5 {\r\n font-size: var(--heading-five);\r\n}\r\nh6, .h6 {\r\n font-size: var(--heading-six);\r\n}\r\n\r\nh1 > a,\r\nh2 > a,\r\nh3 > a,\r\nh4 > a,\r\nh5 > a,\r\nh6 > a {\r\n font-weight: inherit;\r\n font-size: inherit;\r\n color: inherit;\r\n transition: 0.2s linear;\r\n line-height: inherit;\r\n &:hover {\r\n color: hsl(var(--main));\r\n }\r\n}\r\n\r\na {\r\n display: inline-block;\r\n transition: 0.2s linear;\r\n text-decoration: none;\r\n color: #0661e9;\r\n}\r\na:hover {\r\n color: #1d72f2;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n}\r\nselect {\r\n cursor: pointer;\r\n}\r\nul,\r\nol {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n}\r\nbutton {\r\n border: 0;\r\n background-color: transparent;\r\n &:focus {\r\n outline: none;\r\n box-shadow: none;\r\n }\r\n}\r\n.form-select:focus {\r\n outline: 0;\r\n box-shadow: none;\r\n}\r\ninput:focus-visible {\r\n outline: 0;\r\n}\r\n/* ================================= Typography Css End =========================== */\r\n","/* ================================= Margin Css Start =========================== */\r\n@each $property, $value in $spaces {\r\n .m-#{$property} {\r\n margin: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .mx-#{$property} {\r\n margin-inline: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .my-#{$property} {\r\n margin-block: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .ms-#{$property} {\r\n margin-inline-start: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .me-#{$property} {\r\n margin-inline-end: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .mt-#{$property} {\r\n margin-block-start: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .mb-#{$property} {\r\n margin-block-end: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n\r\n.mt-0 {\r\n margin-block-start: 0!important;\r\n}\r\n\r\n.mb-0 {\r\n margin-block-end: 0!important;\r\n}\r\n\r\n.ms-0 {\r\n margin-inline-start: 0!important;\r\n}\r\n\r\n.me-0 {\r\n margin-inline-end: 0!important;\r\n}\r\n\r\n.my-120 {\r\n margin-block-start: 60px !important;\r\n margin-block-end: 60px !important;\r\n @media (min-width: 576px) {\r\n margin-block-start: 80px !important;\r\n margin-block-end: 80px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-start: 120px !important;\r\n margin-block-end: 120px !important;\r\n }\r\n}\r\n.mt-120 {\r\n margin-block-start: 60px !important;\r\n @media (min-width: 576px) {\r\n margin-block-start: 80px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-start: 120px !important;\r\n }\r\n}\r\n.mb-120 {\r\n margin-block-end: 60px !important;\r\n @media (min-width: 576px) {\r\n margin-block-end: 80px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-end: 120px !important;\r\n }\r\n}\r\n.my-60 {\r\n margin-block-start: 30px !important;\r\n margin-block-end: 30px !important;\r\n @media (min-width: 576px) {\r\n margin-block-start: 40px !important;\r\n margin-block-end: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-start: 60px !important;\r\n margin-block-end: 60px !important;\r\n }\r\n}\r\n.mt-60 {\r\n margin-block-start: 30px !important;\r\n @media (min-width: 576px) {\r\n margin-block-start: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-start: 60px !important;\r\n }\r\n}\r\n .mb-60 {\r\n margin-block-end: 30px !important;\r\n @media (min-width: 576px) {\r\n margin-block-end: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n margin-block-end: 60px !important;\r\n }\r\n}/* ================================= Margin Css End =========================== */\r\n","/* ================================= Padding Css Start =========================== */\r\n@each $property, $value in $spaces {\r\n .p-#{$property} {\r\n padding: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .px-#{$property} {\r\n padding-inline: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .py-#{$property} {\r\n padding-block: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .ps-#{$property} {\r\n padding-inline-start: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .pe-#{$property} {\r\n padding-inline-end: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .pt-#{$property} {\r\n padding-block-start: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .pb-#{$property} {\r\n padding-block-end: var(--size-#{$property}) !important;\r\n }\r\n}\r\n\r\n.pt-0 {\r\n padding-block-start: 0!important;\r\n}\r\n\r\n.pb-0 {\r\n padding-block-end: 0!important;\r\n}\r\n\r\n.ps-0 {\r\n padding-inline-start: 0!important;\r\n}\r\n\r\n.pe-0 {\r\n padding-inline-end: 0!important;\r\n}\r\n\r\n\r\n.py-80 {\r\n padding-block-start: 60px !important;\r\n padding-block-end: 60px !important;\r\n @media (min-width: 992px) {\r\n padding-block-start: 80px !important;\r\n padding-block-end: 80px !important;\r\n }\r\n}\r\n.pt-80 {\r\n padding-block-start: 60px !important;\r\n @media (min-width: 992px) {\r\n padding-block-start: 80px !important;\r\n }\r\n}\r\n.pb-80 {\r\n padding-block-end: 60px !important;\r\n @media (min-width: 992px) {\r\n padding-block-end: 80px !important;\r\n }\r\n}\r\n\r\n.py-60 {\r\n padding-block-start: 30px !important;\r\n padding-block-end: 30px !important;\r\n @media (min-width: 576px) {\r\n padding-block-start: 40px !important;\r\n padding-block-end: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n padding-block-start: 60px !important;\r\n padding-block-end: 60px !important;\r\n }\r\n}\r\n.pt-60 {\r\n padding-block-start: 30px !important;\r\n @media (min-width: 576px) {\r\n padding-block-start: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n padding-block-start: 60px !important;\r\n }\r\n}\r\n .pb-60 {\r\n padding-block-end: 30px !important;\r\n @media (min-width: 576px) {\r\n padding-block-end: 40px !important;\r\n }\r\n @media (min-width: 992px) {\r\n padding-block-end: 60px !important;\r\n }\r\n}\r\n/* ================================= Padding Css End =========================== */\r\n","\r\n/* ================================= Classes Css Start =========================== */\r\n/* Section Background */\r\n.bg-color {\r\n &-one {\r\n background-color: var(--bg-color-one) !important;\r\n }\r\n &-two {\r\n background-color: var(--bg-color-two) !important;\r\n }\r\n &-three {\r\n background-color: var(--bg-color-three) !important;\r\n }\r\n &-neutral {\r\n background-color: var(--neutral) !important;\r\n }\r\n}\r\n\r\n.container-lg {\r\n max-width: 1680px;\r\n}\r\n\r\n/* Column Extra Small Screen */\r\n.col-xs-6 {\r\n @media screen and (min-width: 425px) and (max-width: 575px) {\r\n width: 50%;\r\n }\r\n}\r\n\r\n@media (min-width: 424px) {\r\n .d-xs-flex {\r\n display: flex !important;\r\n }\r\n}\r\n\r\n.opacity {\r\n &-6 {\r\n opacity: .06 !important;\r\n }\r\n}\r\n\r\n/* Transition */\r\n.transition {\r\n &-1 {\r\n transition: .1s linear;\r\n }\r\n &-2 {\r\n transition: .2s linear;\r\n }\r\n &-3 {\r\n transition: .3s linear;\r\n }\r\n}\r\n\r\n.min-width-max-content {\r\n min-width: max-content;\r\n}\r\n\r\n.inset {\r\n &-inline-start-0 {\r\n inset-inline-start: 0 !important;\r\n }\r\n &-inline-start-100 {\r\n inset-inline-start: 100% !important;\r\n }\r\n &-inline-start-auto {\r\n inset-inline-start: auto !important;\r\n }\r\n &-inline-end-0 {\r\n inset-inline-end: 0 !important;\r\n }\r\n &-inline-end-auto {\r\n inset-inline-end: auto !important;\r\n }\r\n &-block-start-0 {\r\n inset-block-start: 0 !important;\r\n }\r\n &-block-end-0 {\r\n inset-block-end: 0 !important;\r\n }\r\n}\r\n\r\n.start {\r\n &-auto {\r\n inset-inline-start: auto !important;\r\n }\r\n}\r\n\r\n.end {\r\n &-auto {\r\n inset-inline-end: auto !important;\r\n }\r\n}\r\n\r\n.line-height {\r\n &-0 {\r\n line-height: 0;\r\n }\r\n &-1 {\r\n line-height: 1;\r\n }\r\n}\r\n\r\n/* Text Color */\r\n.hover-text {\r\n &-decoration-underline {\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n }\r\n &-decoration-none {\r\n &:hover {\r\n text-decoration: none;\r\n }\r\n }\r\n}\r\n\r\n.font {\r\n &-heading {\r\n font-family: var(--heading-font);\r\n }\r\n &-heading-two {\r\n font-family: var(--heading-font-two);\r\n }\r\n &-body {\r\n font-family: var(--body-font);\r\n }\r\n}\r\n\r\n/* Bg Image Css */\r\n.bg-img {\r\n background-size: cover !important;\r\n background-repeat: no-repeat !important;\r\n background-position: center center !important;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.list-inside {\r\n list-style: inside !important;\r\n}\r\n.aspect-ratio-1 {\r\n aspect-ratio: 1;\r\n}\r\n.cursor-pointer {\r\n cursor: pointer;\r\n}\r\n/* ================================= Classes Css End =========================== */","\r\n/* ============================ Extend Css Start ======================== */\r\n/* Cover image Css */\r\n .cover-img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover; \r\n }\r\n/* Display Flex Css Start */ \r\n .flex-align {\r\n display: flex;\r\n align-items: center;\r\n }\r\n .flex-center {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n .flex-between {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n }\r\n/* Display Flex Css End */\r\n/* ============================ Extend Css End ======================== */\r\n\r\n","// width height\r\n@each $property, $value in $spaces {\r\n .w-#{$property} {\r\n width: $value !important;\r\n }\r\n}\r\n\r\n.w {\r\n &-300 {\r\n width: 300px !important;\r\n }\r\n &-265 {\r\n width: 265px !important;\r\n }\r\n &-unset {\r\n width: unset !important;\r\n }\r\n}\r\n\r\n@each $property, $value in $spaces {\r\n .h-#{$property} {\r\n height: $value !important;\r\n }\r\n}\r\n.h-unset {\r\n height: unset !important;\r\n}\r\n\r\n.max-h {\r\n &-unset {\r\n max-height: unset !important;\r\n }\r\n &-120 {\r\n max-height: 120px !important;\r\n }\r\n &-200 {\r\n max-height: 200px !important;\r\n }\r\n &-300 {\r\n max-height: 300px !important;\r\n }\r\n &-400 {\r\n max-height: 400px !important;\r\n }\r\n &-540 {\r\n max-height: 540px !important;\r\n }\r\n}\r\n\r\n.max-w {\r\n &-unset {\r\n max-width: unset !important;\r\n }\r\n &-120 {\r\n max-width: 120px;\r\n }\r\n &-275 {\r\n max-width: 275px;\r\n }\r\n}\r\n\r\n\r\n.top-n6 {\r\n inset-block-start: -6px;\r\n}\r\n\r\n.end-n4 {\r\n inset-inline-end: -6px;\r\n}\r\n","\r\n// // Colors\r\n@each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .text-#{$color}-#{$shade} {\r\n color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n }\r\n\r\n \r\n.text {\r\n &-heading {\r\n color: hsl(var(--heading-color)) !important;\r\n }\r\n &-body {\r\n color: hsl(var(--body-color)) !important;\r\n }\r\n &-main {\r\n color: hsl(var(--main)) !important;\r\n }\r\n}\r\n \r\n @each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .hover-text-#{$color}-#{$shade} {\r\n &:hover {\r\n color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n }\r\n }\r\n\r\n/* Text Color */\r\n.hover-text {\r\n &-white {\r\n &:hover {\r\n color: #fff !important;\r\n }\r\n }\r\n &-heading {\r\n &:hover {\r\n color: hsl(var(--heading-color)) !important;\r\n }\r\n }\r\n &-body {\r\n &:hover {\r\n color: hsl(var(--body-color)) !important;\r\n }\r\n }\r\n &-main {\r\n &:hover {\r\n color: hsl(var(--main)) !important;\r\n }\r\n }\r\n}\r\n","// border\r\n@each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .border-#{$color}-#{$shade} {\r\n border-color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n}\r\n\r\n// hover border\r\n@each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .hover-border-#{$color}-#{$shade} {\r\n &:hover {\r\n border-color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.border {\r\n &-dashed {\r\n border-style: dashed !important;\r\n }\r\n &-dotted {\r\n border-style: dotted !important;\r\n }\r\n}\r\n","// background\r\n@each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .bg-#{$color}-#{$shade} {\r\n background-color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n}\r\n\r\n// hover background\r\n@each $color, $shades in $colors {\r\n @each $shade, $value in $shades {\r\n .hover-bg-#{$color}-#{$shade} {\r\n &:hover {\r\n background-color: var(--#{$color}-#{$shade}) !important;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .hover-bg {\r\n &-white {\r\n &:hover {\r\n background-color: hsl(var(--white)) !important;\r\n }\r\n }\r\n }\r\n\r\n\r\n.bg-light-purple {\r\n background: #ECDBEC !important;\r\n}","/* Font Size Class Start */\r\n.text {\r\n &-inherit {\r\n font-size: inherit;\r\n }\r\n}\r\n\r\n@each $property, $value in $font-sizes {\r\n .text-#{$property} {\r\n font-size: $value !important;\r\n }\r\n} \r\n\r\n@each $property, $value in $spaces {\r\n .text-#{$property} {\r\n font-size: $value !important;\r\n }\r\n} \r\n/* Font Size Class End */","\r\n/* Box shadow start */\r\n.box-shadow {\r\n &-sm {\r\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); \r\n }\r\n &-md {\r\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); \r\n }\r\n &-lg {\r\n box-shadow: 0px 7px 21px -5px rgb(0 0 0 / 10%), 0 4px 21px -4px rgb(0 0 0 / 10%); \r\n }\r\n &-xl {\r\n box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); \r\n }\r\n &-2xl {\r\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); \r\n }\r\n &-inner {\r\n box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); \r\n }\r\n}\r\n/* Box shadow End */\r\n","/* Border Radius */\r\n@each $property, $value in $spaces {\r\n .rounded-#{$property} {\r\n border-radius: #{$value} !important;\r\n }\r\n }\r\n ","\r\n/* Hide Scroll bar Css For Custom Modal */\r\n.scroll-hide {\r\n position: absolute;\r\n overflow-y: hidden;\r\n padding-inline-end: 17px;\r\n inset-block-start: 0;\r\n inset-inline-start: 0;\r\n width: 100%;\r\n @include md-screen {\r\n padding-inline-end: 0;\r\n }\r\n &-sm {\r\n @include md-screen {\r\n position: absolute;\r\n overflow-y: hidden;\r\n inset-block-start: 0;\r\n inset-inline-start: 0;\r\n width: calc(100% - 0px);\r\n }\r\n }\r\n}\r\n/* Hide Scroll bar Css For Custom Modal End */\r\n","\r\n/* Overlay Start */\r\n.overlay {\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;\r\n content: \"\";\r\n inset-inline-start: 0;\r\n inset-block-start: 0;\r\n background-color: hsl(var(--black) / .6);\r\n z-index: 99;\r\n transition: .2s linear;\r\n visibility: hidden;\r\n opacity: 0;\r\n &.show-overlay {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n}\r\n\r\n.side-overlay {\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;\r\n content: \"\";\r\n inset-inline-start: 0;\r\n inset-block-start: 0;\r\n background-color: hsl(var(--black) / .6);\r\n z-index: 8;\r\n transition: .2s linear;\r\n visibility: hidden;\r\n opacity: 0;\r\n @include md-screen {\r\n &.show {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n }\r\n}\r\n/* Overlay End */","\r\n// Line Clamp start\r\n.text-line-1 {\r\n display: -webkit-box;\r\n -webkit-line-clamp: 1;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n \r\n.text-line-2 {\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n \r\n.text-line-3 {\r\n display: -webkit-box;\r\n -webkit-line-clamp: 3;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n // Line Clamp End",".scroll-sm {\r\n &::-webkit-scrollbar {\r\n width: 4px !important;\r\n height: 4px !important;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background-color: #b1b3b8;\r\n &:hover {\r\n background-color: #7e7d7d;\r\n }\r\n }\r\n &::-webkit-scrollbar-track {\r\n background-color: #d6d9de;\r\n }\r\n}","// Gap Css\r\n@each $property, $value in $spaces {\r\n .gap-#{$property} {\r\n gap: var(--size-#{$property}) !important;\r\n }\r\n }","/* Hover Classes Start */\r\n.item-hover {\r\n &:hover {\r\n .item-hover__text {\r\n color: var(--main-600) !important;\r\n }\r\n }\r\n}\r\n.item-hover-two {\r\n &:hover {\r\n .item-hover__text {\r\n color: var(--main-two-600) !important;\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n.on-hover-dropdown {\r\n visibility: hidden;\r\n opacity: 0;\r\n margin-block-start: 16px;\r\n}\r\n\r\n.on-hover-item {\r\n position: relative;\r\n &:hover {\r\n .on-hover-dropdown {\r\n visibility: visible;\r\n opacity: 1;\r\n margin-block-start: 0;\r\n }\r\n > a {\r\n &::before {\r\n @media (min-width: 992px) {\r\n color: hsl(var(--main));\r\n transform: translateY(-50%) rotate(180deg);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n/* Hover Classes End */\r\n",".g-8, .gy-8 {\r\n --bs-gutter-y: .5rem !important;\r\n}\r\n.g-12, .gy-12 {\r\n --bs-gutter-y: .75rem !important;\r\n}\r\n\r\n\r\n.g-8, .gx-8 {\r\n --bs-gutter-x: .5rem !important;\r\n}\r\n.g-12, .gx-12 {\r\n --bs-gutter-x: .75rem !important;\r\n}","/* ================================= preload Css Start =========================== */\r\n.preloader {\r\n background-color: hsl(var(--white));\r\n inset-block-end: 0;\r\n inset-inline-start: 0;\r\n position: fixed;\r\n inset-inline-end: 0;\r\n inset-block-start: 0;\r\n z-index: 9999;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n/* ================================= preload Css End =========================== */\r\n","/* =========================== header top Css Start =============================== */\r\n.header-top {\r\n &__right {\r\n @include sm-screen {\r\n width: 100%;\r\n li {\r\n &:last-child {\r\n margin-inline-start: auto;\r\n }\r\n &:nth-last-child(2) {\r\n margin-inline-end: 0 !important;\r\n padding-inline-end: 0 !important;\r\n &::before {\r\n display: none;\r\n }\r\n }\r\n \r\n }\r\n }\r\n &.style-two {\r\n > li {\r\n padding-inline-end: 16px !important; \r\n margin-inline-end: 0 !important;\r\n &:last-child {\r\n padding-inline-end: 0 !important;\r\n }\r\n &::before {\r\n display: none !important;\r\n }\r\n a {\r\n padding-inline-end: 20px;\r\n @include md-screen {\r\n color: #fff !important;\r\n }\r\n &::before {\r\n color: var(--heading-color) !important;\r\n font-size: 14px !important;\r\n }\r\n }\r\n > ul {\r\n inset-inline-end: auto !important;\r\n inset-inline-start: calc(-100% + -24px) !important;\r\n li a {\r\n @include md-screen {\r\n color: var(--neutral-600) !important;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n@include md-screen {\r\n .border-right-item {\r\n a {\r\n font-size: 12px !important;\r\n }\r\n }\r\n}\r\n\r\n.border-right-item {\r\n position: relative;\r\n &:not(:last-child) {\r\n margin-inline-end: 24px;\r\n padding-inline-end: 24px;\r\n @include xl-screen {\r\n margin-inline-end: 16px !important;\r\n padding-inline-end: 16px !important;\r\n }\r\n @include lg-screen {\r\n margin-inline-end: 10px !important;\r\n padding-inline-end: 10px !important;\r\n }\r\n &::before {\r\n position: absolute;\r\n content: \"\";\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n inset-inline-end: 0;\r\n width: 1px;\r\n height: 15px;\r\n background-color: hsl(var(--white)/.3);\r\n }\r\n }\r\n &-sm-space {\r\n &:not(:last-child) {\r\n margin-inline-end: 20px;\r\n padding-inline-end: 20px;\r\n }\r\n }\r\n}\r\n/* Has Dropdown Css */\r\n.arrow-white {\r\n > a {\r\n padding-inline-end: 12px;\r\n &::before {\r\n color: hsl(var(--white)) !important; \r\n font-size: 8px;\r\n }\r\n }\r\n}\r\n\r\n/* =========================== header top Css End =============================== */","/* ============= Header Start Here ======================= */\r\n.header {\r\n transition: .2s linear;\r\n &.fixed-header {\r\n position: sticky;\r\n inset-inline-start: 0;\r\n inset-block-start: 0;\r\n inset-inline-end: 0;\r\n width: 100%;\r\n z-index: 8;\r\n backdrop-filter: blur(24px);\r\n animation: slideDown 0.35s ease-out; \r\n box-shadow: 0 5px 16px rgba(0, 0, 0, 0.1);\r\n @include md-screen {\r\n inset-block-start: -1px;\r\n }\r\n }\r\n}\r\n@keyframes slideDown {\r\n from {\r\n transform: translateY(-100%);\r\n }\r\n to {\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.logo {\r\n img {\r\n max-width: 200px;\r\n @include xsm-screen {\r\n max-width: 148px;\r\n }\r\n }\r\n}\r\n\r\n/* Header Menu and Submenu Css Start */\r\n.nav-menu {\r\n gap: 32px;\r\n @include xl-screen {\r\n gap: 24px;\r\n }\r\n @include lg-screen {\r\n gap: 16px;\r\n }\r\n &__item {\r\n &.activePage {\r\n > a {\r\n color: hsl(var(--main));\r\n &::before {\r\n color: hsl(var(--main));\r\n }\r\n }\r\n }\r\n &:hover {\r\n > a {\r\n color: var(--gray-400);\r\n @media (min-width: 992px) {\r\n color: hsl(var(--main));\r\n }\r\n }\r\n }\r\n }\r\n &__link {\r\n color: var(--gray-400);\r\n font-weight: 500;\r\n width: 100%;\r\n padding: 16px 0;\r\n width: 100%;\r\n @media (max-width: 1299px) {\r\n font-size: rem(14px);\r\n } \r\n @include lg-screen {\r\n font-size: rem(13px);\r\n }\r\n } \r\n\r\n .common-dropdown__link {\r\n @media (max-width: 1299px) {\r\n font-size: rem(14px);\r\n } \r\n @include lg-screen {\r\n font-size: rem(13px);\r\n }\r\n }\r\n}\r\n\r\n.has-submenu {\r\n position: relative;\r\n .nav-menu {\r\n &__link {\r\n padding-inline-end: 16px;\r\n }\r\n }\r\n\r\n &.active {\r\n > a, > a::before{\r\n color: hsl(var(--main));\r\n }\r\n > a::before {\r\n transform: translateY(-50%) rotate(180deg) !important; \r\n }\r\n }\r\n > a {\r\n position: relative;\r\n &::before {\r\n position: absolute;\r\n content: \"\\E136\";\r\n inset-inline-end: 0;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n font-family: 'Phosphor';\r\n font-weight: 900;\r\n color: hsl(var(--heading-color)/.4);\r\n transition: .2s linear;\r\n }\r\n }\r\n}\r\n\r\n/* Submenu Start */\r\n.common-dropdown {\r\n position: absolute;\r\n inset-inline-start: 0;\r\n @extend .box-shadow-lg; \r\n inset-block-start: 100%;\r\n width: max-content;\r\n background-color: hsl(var(--white));\r\n border-radius: 6px;\r\n min-width: 190px;\r\n overflow: hidden;\r\n padding: 8px;\r\n transition: .2s linear;\r\n z-index: 99;\r\n @media (min-width: 992px) {\r\n max-height: 400px;\r\n overflow-y: auto;\r\n }\r\n &--sm {\r\n width: 132px;\r\n min-width: unset;\r\n }\r\n &__item {\r\n display: block;\r\n border-radius: 4px;\r\n transition: .2s linear;\r\n position: relative;\r\n @include md-screen {\r\n border-radius: 0;\r\n }\r\n &.activePage {\r\n .common-dropdown {\r\n &__link {\r\n color: hsl(var(--main)) !important;\r\n }\r\n }\r\n }\r\n }\r\n &__link {\r\n color: var(--gray-400);\r\n font-weight: 500;\r\n width: 100%;\r\n padding-inline-end: 16px;\r\n width: 100%;\r\n padding: 8px 14px;\r\n border-radius: inherit;\r\n &:hover {\r\n color: var(--gray-600) !important;\r\n }\r\n &::before {\r\n position: absolute;\r\n }\r\n }\r\n}\r\n/* Submenu End */\r\n/* Header Menu and Submenu Css End */\r\n\r\n\r\n/* Category Submenus Submenu Css Start */\r\n.menu-category-wrapper {\r\n gap: clampCal(12, 72, 1199, 1699);\r\n}\r\n\r\n.submenus-submenu-wrapper {\r\n overflow: unset;\r\n}\r\n\r\n.submenus-submenu {\r\n position: absolute;\r\n z-index: 99999999999;\r\n background: hsl(var(--white));\r\n width: 300px;\r\n inset-inline-start: 100%;\r\n inset-block-start: 0px;\r\n @extend .box-shadow-lg;\r\n border-radius: 6px;\r\n visibility: hidden;\r\n opacity: 0;\r\n overflow: hidden;\r\n &__list {\r\n li {\r\n a {\r\n padding: 10px 16px;\r\n padding-inline-start: 32px;\r\n display: block;\r\n color: var(--gray-500);\r\n position: relative;\r\n &::before {\r\n position: absolute;\r\n content: \"\";\r\n width: 8px;\r\n height: 8px;\r\n inset-inline-start: 16px;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n background: var(--gray-300);\r\n border-radius: 80%;\r\n transition: 0.2s linear;\r\n }\r\n &:hover {\r\n background-color: var(--gray-50);\r\n color: var(--gray-800);\r\n font-weight: 600;\r\n &::before {\r\n background: var(--gray-600);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n@media (min-width: 991px) {\r\n .has-submenus-submenu {\r\n &:hover {\r\n > a {\r\n background-color: var(--gray-50);\r\n color: var(--gray-900) !important;\r\n font-weight: 600;\r\n }\r\n .submenus-submenu {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n }\r\n } \r\n}\r\n\r\n.category {\r\n .category__button {\r\n @include sm-screen {\r\n padding: 12px 3px !important;\r\n font-size: 12px !important;\r\n }\r\n @include msm-screen {\r\n padding-left: 10px !important;\r\n }\r\n }\r\n @media (min-width: 992px) {\r\n &:hover {\r\n .category__button {\r\n color: var(--main-600) !important;\r\n background-color: var(--gray-50) !important;\r\n .arrow-icon i::before {\r\n content: \"\\E13C\";\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* Style Two */\r\n.category-two {\r\n position: relative;\r\n @media (min-width: 992px) {\r\n width: 265px;\r\n }\r\n .category__button {\r\n width: 100%;\r\n @include msm-screen {\r\n font-size: 12px;\r\n padding: 8px 4px !important;\r\n }\r\n &.active .arrow-icon i::before {\r\n content: \"\\E13A\";\r\n }\r\n }\r\n}\r\n.responsive-dropdown.style-two {\r\n width: 100%;\r\n border-radius: 0 0 16px 16px; \r\n width: 265px;\r\n max-height: 900px;\r\n .responsive-dropdown__list {\r\n max-height: 900px;\r\n @include lg-screen {\r\n max-height: 438px;\r\n }\r\n }\r\n @media (min-width: 992px) {\r\n z-index: 1;\r\n }\r\n}\r\n\r\n/* Category Submenus Submenu Css End */\r\n\r\n\r\n\r\n/* ================================= Header Css End =========================== */\r\n","/* =========================== header Middle Css Start =============================== */\r\n.header-middle {\r\n padding: 30px 0;\r\n &.style-two {\r\n padding: 24px 0;\r\n }\r\n @include xl-screen {\r\n padding: 24px 0;\r\n }\r\n @include lg-screen {\r\n padding: 16px 0 !important;\r\n }\r\n @include md-screen {\r\n padding: 8px 0 !important;\r\n }\r\n\r\n .location-box {\r\n @include lg-screen {\r\n padding: 6px 8px !important;\r\n }\r\n @include sm-screen {\r\n padding-left: 14px !important;\r\n }\r\n }\r\n}\r\n\r\n.form-location-wrapper {\r\n gap: clampCal(8, 16, 1199, 1599);\r\n}\r\n\r\n/* Search Form Css Here */\r\n.search-form {\r\n @include md-screen {\r\n .select2-selection.select2-selection--single {\r\n border-radius: 50px !important;\r\n border-radius: 50px !important;\r\n background-color: hsl(var(--white)) !important;\r\n border: 1px solid var(--gray-100) !important;\r\n }\r\n }\r\n &__wrapper {\r\n @include md-screen {\r\n display: none;\r\n }\r\n }\r\n &__input {\r\n border-color: var(--gray-200) !important;\r\n width: 520px;\r\n @include xxl-screen {\r\n width: 400px;\r\n }\r\n @include xl-screen {\r\n width: 300px;\r\n }\r\n @include lg-screen {\r\n width: 200px;\r\n }\r\n }\r\n}\r\n\r\n/* Header Activities Css Start */\r\n.header-two-activities {\r\n @include xl-screen {\r\n gap: 24px !important;\r\n }\r\n @include md-screen {\r\n gap: 16px !important;\r\n }\r\n @include sm-screen {\r\n gap: 10px !important;\r\n }\r\n\r\n @include md-screen {\r\n .item-hover-two {\r\n > span {\r\n font-size: 18px !important;\r\n color: var(--neutral-600) !important;\r\n }\r\n }\r\n }\r\n}\r\n/* Header Activities Css End */\r\n\r\n\r\n/* Header Activities Css start */\r\n.search-category {\r\n &.style-two {\r\n background-color: hsl(var(--white));\r\n border-radius: 8px;\r\n overflow: hidden;\r\n .select2-container--default .select2-selection--single {\r\n border-radius: 0;\r\n border-left: 0 !important;\r\n border-top: 0 !important;\r\n border-bottom: 0 !important;\r\n }\r\n }\r\n}\r\n/* Header Activities Css End */\r\n\r\n\r\n/* Category Dropdown Responsive Css Start */\r\n@include md-screen {\r\n .responsive-dropdown {\r\n position: fixed;\r\n inset-inline-start: 0;\r\n inset-block-start: 0;\r\n visibility: visible;\r\n opacity: 1;\r\n margin-top: 0;\r\n border-radius: 0;\r\n width: unset !important;\r\n height: 100vh;\r\n overflow-y: auto;\r\n transform: translateX(-100%);\r\n padding-top: 8px !important;\r\n &.active {\r\n transform: translateX(0);\r\n }\r\n ul {\r\n max-height: 100% !important;\r\n li {\r\n &.active {\r\n > a {\r\n background: var(--gray-50);\r\n color: var(--gray-800) !important;\r\n font-weight: 600;\r\n .icon {\r\n transform: rotate(90deg);\r\n }\r\n }\r\n }\r\n a {\r\n border-bottom: 1px solid var(--gray-100);\r\n }\r\n }\r\n }\r\n .submenus-submenu{\r\n position: static;\r\n visibility: visible;\r\n opacity: 1;\r\n box-shadow: none;\r\n border-radius: 0;\r\n margin-left: 40px;\r\n width: unset;\r\n padding-top: 8px !important;\r\n display: none;\r\n padding-top: 0 !important;\r\n padding-bottom: 0 !important;\r\n &__title {\r\n display: none;\r\n }\r\n &__list {\r\n max-height: unset !important; \r\n li {\r\n a {\r\n padding-left: 16px;\r\n &::before {\r\n inset-inline-start: 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n/* Category Dropdown Responsive Css End */\r\n/* =========================== header Middle Css End =============================== */\r\n","\r\n\r\n/* Mobile Menu Sidebar Start */\r\n.mobile-menu {\r\n position: fixed;\r\n background-color: hsl(var(--white));\r\n width: 300px;\r\n height: 100vh;\r\n overflow-y: auto;\r\n padding: 24px;\r\n z-index: 991;\r\n transform: translateX(-100%);\r\n transition: .2s linear;\r\n padding-block-end: 68px;\r\n &.active {\r\n transform: translateX(0%);\r\n }\r\n}\r\n.close-button {\r\n position: absolute;\r\n inset-inline-end: 8px;\r\n inset-block-start: 8px;\r\n width: 28px;\r\n height: 28px;\r\n background-color: var(--gray-200);\r\n border-radius: 50%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n transition: .2s;\r\n &:hover {\r\n background-color: hsl(var(--black));\r\n color: hsl(var(--white));\r\n }\r\n}\r\n\r\n.nav-menu {\r\n &--mobile {\r\n display: block;\r\n margin-block-start: 16px;\r\n .nav-menu {\r\n &__item {\r\n > a {\r\n &::before {\r\n transform: translateY(-50%) rotate(0deg);\r\n }\r\n }\r\n }\r\n &__link {\r\n border-bottom: 1px solid var(--gray-100) !important;\r\n position: relative;\r\n padding: 12px 0;\r\n padding-inline-end: 16px;\r\n \r\n } \r\n }\r\n .nav-submenu {\r\n position: static;\r\n visibility: visible;\r\n opacity: 1;\r\n box-shadow: none;\r\n width: 100%;\r\n margin-block-start: 0;\r\n padding: 0;\r\n margin-inline-start: 16px;\r\n display: none;\r\n transition: 0s;\r\n &__link {\r\n width: 100%;\r\n padding: 10px 0;\r\n border-bottom: 1px solid var(--gray-100) !important;\r\n }\r\n &__item {\r\n &:hover {\r\n background-color: transparent;\r\n color: hsl(var(--main));\r\n }\r\n &::before {\r\n display: none;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n/* Mobile Menu Sidebar Start */","\r\n/* ============= Footer Start Here ======================= */\r\n.footer {\r\n margin-block-start: auto;\r\n &-item-wrapper {\r\n gap: clampCal(32, 44, 1199, 1899);\r\n }\r\n &-item-two-wrapper {\r\n gap: clampCal(32, 90, 1199, 1899);\r\n }\r\n &-item {\r\n &__logo {\r\n margin-block-end: 20px;\r\n a {\r\n img {\r\n width: 100%;\r\n height: 100%;\r\n max-width: 190px;\r\n max-height: 64px;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.body-bottom-bg {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n z-index: -1;\r\n}\r\n/* ============= Footer End Here ======================= */","\r\n/* ===================== Scroll to Top Start ================================= */\r\n .progress-wrap {\r\n position: fixed;\r\n inset-inline-end: 36px;\r\n inset-block-end: 36px;\r\n height: 46px;\r\n line-height: 46px;\r\n width: 46px;\r\n cursor: pointer;\r\n display: block;\r\n border-radius: 50px;\r\n box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.2);\r\n z-index: 10000;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateY(15px);\r\n -webkit-transition: all 200ms linear;\r\n transition: all 200ms linear;\r\n background-color: transparent;\r\n @include md-screen {\r\n inset-inline-end: 24px;\r\n inset-block-end: 24px;\r\n height: 40px;\r\n width: 40px;\r\n line-height: 40px;\r\n }\r\n &.active-progress {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(0);\r\n }\r\n &:hover {\r\n transform: scale(1.06);\r\n }\r\n &::after {\r\n position: absolute;\r\n font-family: 'Phosphor';\r\n font-weight: 900;\r\n content: '\\E08E';\r\n text-align: center;\r\n height: 46px;\r\n width: 46px;\r\n line-height: 46px;\r\n font-size: 18px;\r\n inset-inline-start: 0;\r\n inset-block-start: 0;\r\n cursor: pointer;\r\n display: block;\r\n z-index: 1;\r\n -webkit-transition: all 200ms linear;\r\n transition: all 200ms linear;\r\n color: hsl(var(--main)) !important;\r\n @include md-screen {\r\n height: 40px;\r\n width: 40px;\r\n line-height: 40px;\r\n }\r\n }\r\n }\r\n \r\n .progress-wrap svg path {\r\n fill: none;\r\n }\r\n .progress-wrap svg.progress-circle path {\r\n stroke: hsl(var(--main));\r\n stroke-width: 5;\r\n box-sizing: border-box;\r\n -webkit-transition: all 200ms linear;\r\n transition: all 200ms linear;\r\n }\r\n/* ===================== Scroll to Top End ================================= */\r\n",".search-box {\r\n position: fixed;\r\n width: 100%;\r\n height: 100%;;\r\n z-index: 9;\r\n background: hsl(var(--black));\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: .2s linear;\r\n transform: scale(.8);\r\n z-index: 9;\r\n &.active {\r\n visibility: visible;\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n}","/* ================= Slick Arrow & Dots css Start ================ */ \r\n.slick-initialized.slick-slider {\r\n .slick-track {\r\n display: flex;\r\n }\r\n .slick-slide {\r\n cursor: grab;\r\n height: auto;\r\n margin: 0 10px;\r\n > div {\r\n height: 100%;\r\n > div {\r\n height: 100%;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* Slick Slider Arrow */\r\n.slick-arrow {\r\n width: 48px;\r\n height: 48px;\r\n @include md-screen {\r\n width: 40px;\r\n height: 40px;\r\n }\r\n @include sm-screen {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n}\r\n\r\n\r\n/* Arrow Style Two */\r\n.arrow-center {\r\n position: relative;\r\n .slick-arrow {\r\n position: absolute;\r\n inset-block-start: 50%;\r\n transform: translateY(-50%);\r\n inset-inline-start: 16px;\r\n z-index: 2;\r\n &.slick-next {\r\n inset-inline-start: auto;\r\n inset-inline-end: 16px;\r\n }\r\n }\r\n}\r\n\r\n.slick-arrows-style-three {\r\n .slick-arrow {\r\n visibility: hidden;\r\n opacity: 0;\r\n }\r\n &:hover {\r\n .slick-arrow {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n }\r\n}\r\n\r\n/* Dots Css Start */ \r\n.slick-dots {\r\n text-align: center;\r\n position: absolute;\r\n inset-block-end: 60px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n z-index: 1;\r\n line-height: 1;\r\n li {\r\n display: inline-block;\r\n display: flex;\r\n button {\r\n border: none;\r\n background-color: hsl(var(--white)/.3 );\r\n color: hsl(var(--white));;\r\n margin: 0 3px;\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 1px;\r\n border-radius: 50px;\r\n text-indent: -9999px;\r\n transition: .3s linear;\r\n }\r\n &.slick-active button {\r\n width: 40px; \r\n background-color: hsl(var(--main-two));\r\n }\r\n }\r\n}\r\n/* Dots Css End */\r\n/* ================= Slick Arrow & Dots css Start ================ */ \r\n","/* ================== Section Heading Css Start ========================= */\r\n.section-heading {\r\n margin-bottom: 40px;\r\n @include lg-screen {\r\n margin-bottom: 24px;\r\n }\r\n}\r\n/* ================== Section Heading Css End ========================= */","/* ============================== Banner Css Start ========================== */\r\n.banner {\r\n margin-top: 32px;\r\n @include sm-screen {\r\n margin-bottom: 32px;\r\n }\r\n .slick-slider {\r\n position: unset;\r\n }\r\n .slick-initialized.slick-slider .slick-slide {\r\n margin: 0;\r\n }\r\n}\r\n\r\n.banner-item {\r\n position: relative;\r\n padding-block-start: clampCal(32, 100, 768, 1599);\r\n padding-block-end: clampCal(32, 220, 768, 1599);\r\n padding-inline-start: clampCal(16, 142, 992, 1599);\r\n padding-inline-end: clampCal(16, 76, 992, 1599);\r\n -webkit-mask-image: url(../images/bg/banner-bg2.png);\r\n mask-image: url(../images/bg/banner-bg2.png);\r\n -webkit-mask-repeat: no-repeat;\r\n mask-repeat: no-repeat;\r\n background: #D3EBC0;\r\n mask-position: top;\r\n mask-size: 100% 100%;\r\n gap: clampCal(24, 72);\r\n @include sm-screen {\r\n mask-image: none;\r\n overflow: unset !important;\r\n }\r\n \r\n &__title {\r\n margin-block-end: clampCal(16, 60);\r\n @include xxl-screen {\r\n font-size: rem(56px);\r\n }\r\n @include lg-screen {\r\n font-size: rem(46px);\r\n }\r\n @include md-screen {\r\n font-size: rem(28px);\r\n }\r\n @include sm-screen {\r\n font-size: rem(26px);\r\n }\r\n }\r\n &__content {\r\n max-width: 852px;\r\n @include xxl-screen {\r\n max-width: 750px; \r\n }\r\n }\r\n &__thumb {\r\n img {\r\n @include msm-screen {\r\n max-width: 350px;\r\n width: 100%;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.banner-slider__inner {\r\n @include msm-screen {\r\n flex-wrap: wrap;\r\n }\r\n}\r\n\r\n.scroll-down {\r\n width: 94px;\r\n height: 94px;\r\n position: relative;\r\n margin-bottom: 24px;\r\n z-index: 2;\r\n @include xl-screen {\r\n width: 74px;\r\n height: 74px;\r\n margin-bottom: 16px;\r\n }\r\n @include sm-screen {\r\n margin-bottom: -36px;\r\n }\r\n &::before {\r\n position: absolute;\r\n content: \"\";\r\n width: 2px;\r\n height: 32px;\r\n border: 2px dashed hsl(var(--white) / .4);\r\n top: 16px;\r\n animation: upDown 2s linear infinite;\r\n @include xl-screen {\r\n top: 8px;\r\n }\r\n }\r\n .icon {\r\n animation: upDown 2s linear infinite;\r\n font-size: rem(28px);\r\n margin-top: 16px;\r\n }\r\n}\r\n\r\n@keyframes upDown {\r\n 0% {\r\n transform: translateY(10px);\r\n }\r\n 50% {\r\n transform: translateY(0px);\r\n }\r\n 100% {\r\n transform: translateY(10px);\r\n }\r\n}\r\n/* ============================== Banner Css End ========================== */\r\n","/* ============================ Feature Section Css start =============================== */\r\n.feature {\r\n margin-top: 32px;\r\n .arrow-center {\r\n &:hover {\r\n .slick-arrow {\r\n visibility: visible;\r\n opacity: 1;\r\n }\r\n }\r\n .slick-arrow {\r\n transform: translateY(0);\r\n margin-left: -28px;\r\n border: 1px solid var(--gray-100);\r\n visibility: hidden;\r\n opacity: 0;\r\n top: 54px;\r\n &.slick-next {\r\n margin-right: -20px;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.feature-item {\r\n &-wrapper {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));\r\n gap: 16px;\r\n .feature-item {\r\n &:nth-child(10n + 1) {\r\n .feature-item__thumb {\r\n background: #E8F9E9;\r\n }\r\n }\r\n &:nth-child(10n + 2) {\r\n .feature-item__thumb {\r\n background: #FCEDED;\r\n }\r\n }\r\n &:nth-child(10n + 3) {\r\n .feature-item__thumb {\r\n background: #F6EBF3;\r\n }\r\n }\r\n &:nth-child(10n + 4) {\r\n .feature-item__thumb {\r\n background: #FCF2E7;\r\n }\r\n }\r\n &:nth-child(10n + 5) {\r\n .feature-item__thumb {\r\n background: #F5FBE3;\r\n }\r\n }\r\n &:nth-child(10n + 6) {\r\n .feature-item__thumb {\r\n background: #E3FBE9;\r\n }\r\n }\r\n &:nth-child(10n + 7) {\r\n .feature-item__thumb {\r\n background: #E9E3FB;\r\n }\r\n }\r\n &:nth-child(10n + 8) {\r\n .feature-item__thumb {\r\n background: #ECF8F2;\r\n }\r\n }\r\n &:nth-child(10n + 9) {\r\n .feature-item__thumb {\r\n background: #F8F5E5;\r\n }\r\n }\r\n &:nth-child(10n + 10) {\r\n .feature-item__thumb {\r\n background: #F0F8E5;\r\n }\r\n }\r\n &:nth-child(10n + 11) {\r\n .feature-item__thumb {\r\n background: #ddd;\r\n }\r\n }\r\n }\r\n }\r\n &__thumb {\r\n max-width: 153px;\r\n max-height: 153px;\r\n background-color: var(--main-50);\r\n aspect-ratio: 1;\r\n margin: 0 auto;\r\n }\r\n}\r\n\r\n.featured-products, .popular-products {\r\n .product-card {\r\n flex-direction: row;\r\n align-items: unset;\r\n }\r\n}\r\n.popular-products {\r\n .product-card__thumb {\r\n width: 120px !important;\r\n }\r\n}\r\n/* ============================ Feature Section Css End =============================== */","/* ======================== promotional banner Css Start ============================== */\r\n.promotional-banner-item {\r\n padding: clampCal(32, 84) 24px;\r\n @include msm-screen {\r\n padding: 24px 16px;\r\n }\r\n &__content {\r\n max-width: 200px;\r\n }\r\n &__title {\r\n @include xl-screen {\r\n font-size: rem(24px) !important;\r\n }\r\n }\r\n}\r\n/* ======================== promotional banner Css End ============================== */","/* ========================= flash sales Start ================================ */\r\n.flash-sales-item {\r\n padding: 40px 32px;\r\n}\r\n/* ========================= flash sales End ================================ */","/* ============================= Product Card Css Start ========================== */\r\n.product-card {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n align-items: start;\r\n &__cart { \r\n @include xxl-screen {\r\n font-size: 12px;\r\n padding: 9px 12px !important;\r\n }\r\n }\r\n &__badge {\r\n border-radius: 16px 0 16px 0;\r\n }\r\n &__thumb {\r\n height: 232px;\r\n width: 100%;\r\n transition: 0s !important;\r\n img {\r\n max-width: 160px;\r\n width: 100%;\r\n }\r\n }\r\n\r\n &.style-two {\r\n flex-direction: row;\r\n .product-card {\r\n &__thumb {\r\n width: 260px;\r\n height: 190px;\r\n @include md-screen {\r\n width: 190px;\r\n }\r\n @include msm-screen {\r\n width: 124px;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n@include lg-screen {\r\n .product-card {\r\n &__thumb {\r\n height: 160px;\r\n img {\r\n max-width: 120px;\r\n }\r\n }\r\n &__content {\r\n .product-card {\r\n &__price span {\r\n font-size: rem(12px) !important;\r\n }\r\n }\r\n .title .link {\r\n font-size: rem(14px);\r\n }\r\n .text-xs {\r\n font-size: rem(10px) !important;\r\n }\r\n }\r\n }\r\n}\r\n/* ============================= Product Card Css End ========================== */","/* ======================= Offer Css Start =========================== */\r\n.offer-card {\r\n &__thumb {\r\n img {\r\n @include xxl-screen {\r\n max-width: 246px;\r\n width: 100%;\r\n }\r\n @include lg-screen {\r\n max-width: 163px;\r\n }\r\n }\r\n }\r\n}\r\n/* ======================= Offer Css End =========================== */","/* ===================================== Vendor Css Start ================================== */\r\n.vendor-card {\r\n background-color: var(--main-100);\r\n -webkit-mask-image: url(../images/shape/box-shape2.png);\r\n mask-image: url(../images/shape/box-shape2.png);\r\n -webkit-mask-repeat: no-repeat;\r\n mask-repeat: no-repeat;\r\n background: #F4F6E6;\r\n mask-position: top;\r\n mask-size: 100% 100%;\r\n &__logo {\r\n max-width: 66px;\r\n }\r\n &__item {\r\n max-width: 64px;\r\n max-height: 64px;\r\n aspect-ratio: 1;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n .vendor-card__list {\r\n &.style-two {\r\n .vendor-card__item {\r\n max-width: 88px;\r\n max-height: 88px;\r\n border-radius: 8px !important;\r\n }\r\n .slick-slide {\r\n margin: 0 4px !important;\r\n }\r\n }\r\n }\r\n \r\n}\r\n.vendor-card-wrapper div[class*=\"col\"] {\r\n &:nth-child(8n + 1) {\r\n .vendor-card {\r\n background: #F4F6E6;\r\n }\r\n }\r\n &:nth-child(8n + 2) {\r\n .vendor-card {\r\n background: #E6F6F6;\r\n }\r\n }\r\n &:nth-child(8n + 3) {\r\n .vendor-card {\r\n background: #F6E6F6;\r\n }\r\n }\r\n &:nth-child(8n + 4) {\r\n .vendor-card {\r\n background: #F8EAE4;\r\n }\r\n }\r\n &:nth-child(8n + 5) {\r\n .vendor-card {\r\n background: #F8EAE4;\r\n }\r\n }\r\n &:nth-child(8n + 6) {\r\n .vendor-card {\r\n background: #DEE6F3;\r\n }\r\n }\r\n &:nth-child(8n + 7) {\r\n .vendor-card {\r\n background: #DAF2DB;\r\n }\r\n }\r\n &:nth-child(8n + 8) {\r\n .vendor-card {\r\n background: #EBF1DA;\r\n }\r\n }\r\n}\r\n/* ===================================== Vendor Css End ================================== */",".delivery {\r\n &-section {\r\n @media (min-width: 768px) {\r\n margin-bottom: 28px;\r\n }\r\n }\r\n &__man {\r\n margin-bottom: -56px;\r\n }\r\n}","/* ================================== short product Css Start ================================== */\r\n.underlined-line {\r\n &::before, &::after {\r\n position: absolute;\r\n content: \"\";\r\n width: 100%;\r\n height: 2px;\r\n left: 0;\r\n bottom: 0;\r\n background-color: hsl(var(--white));\r\n }\r\n &::after {\r\n width: 50%;\r\n background-color: var(--main-600);\r\n }\r\n}\r\n\r\n.short-product-list {\r\n &.arrow-style-two {\r\n .slick-arrow {\r\n inset-inline-end: 16px;\r\n inset-block-end: calc(100% + 52px);\r\n } \r\n .slick-prev {\r\n inset-inline-end: 50px;\r\n }\r\n }\r\n}\r\n/* ================================== short product Css End ================================== */","/* ========================= Brand Css Start ======================== */\r\n.brand-item {\r\n img {\r\n max-width: 152px !important;\r\n @include xl-screen {\r\n max-width: 132px !important;\r\n }\r\n @include md-screen {\r\n max-width: 86px !important;\r\n }\r\n }\r\n}\r\n/* ========================= Brand Css End ======================== */","/* Shipping Css Start */\r\n.shipping-item {\r\n padding: clampCal(24, 32) clampCal(24, 54, 1399, 1899);\r\n}\r\n/* Shipping Css End */","/* ======================= Newsletter Css Start =========================== */\r\n.newsletter-box {\r\n background-color: #121535;\r\n padding: 32px clampCal(24, 64, 1199, 1499);\r\n}\r\n\r\n.newsletter-two {\r\n &__form {\r\n @include md-screen {\r\n width: 100% !important;\r\n }\r\n }\r\n}\r\n/* ======================= Newsletter Css End =========================== */","/* Home Two Css Start */\r\n.color-two {\r\n &:root {\r\n --main-h: 24;\r\n --main-s: 100%;\r\n --main-l: 49%;\r\n }\r\n h1,\r\n h2,\r\n h3,\r\n h4,\r\n h5,\r\n h6 {\r\n font-family: var(--heading-font-two);\r\n }\r\n h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {\r\n font-family: var(--heading-font-two);\r\n }\r\n}\r\n/* Home Two Css End */\r\n","/* ================================= Banner Two Css Start ================================= */\r\n.banner-item-two {\r\n padding: 186px clamp(2rem, -10.739rem + 17vw, 6.25rem) 186px;\r\n position: relative;\r\n @include lg-screen {\r\n padding: 86px clampCal(32, 100, 1199, 1599) 86px;\r\n }\r\n @include md-screen {\r\n padding: 60px clampCal(32, 100, 1199, 1599) 60px;\r\n }\r\n @include sm-screen {\r\n padding: 40px clampCal(32, 100, 1199, 1599) 40px;\r\n }\r\n &-wrapper {\r\n margin: 32px;\r\n margin-inline-end: 0;\r\n @include md-screen {\r\n margin-inline-start: 0;\r\n }\r\n }\r\n &__content {\r\n max-width: 504px;\r\n @include md-screen {\r\n max-width: 362px;\r\n }\r\n @include msm-screen {\r\n max-width: 320px;\r\n }\r\n }\r\n &__title {\r\n @include msm-screen {\r\n font-size: 1.5rem;\r\n }\r\n }\r\n &__thumb {\r\n inset-inline-end: clampCal(24, 140, 1199, 1599);\r\n text-align: end;\r\n max-width: 41%;\r\n @include msm-screen {\r\n max-width: 50%;\r\n position: relative !important; \r\n margin-top: 32px;\r\n inset-inline-end: 0; \r\n }\r\n }\r\n}\r\n/* ================================= Banner Two Css End ================================= */","/* Week Deals Start */\r\n.deal-week-box {\r\n &__content {\r\n padding: clampCal(24, 60) 0;\r\n }\r\n}\r\n/* Week Deals End */","/* ============================ trending products css Start =========================== */\r\n.trending-products {\r\n &-box {\r\n background-color: #F3EDDE;\r\n &__title {\r\n max-width: 364px;\r\n margin: 0 auto;\r\n }\r\n &__content {\r\n\r\n }\r\n }\r\n}\r\n/* ============================ trending products css End =========================== */","/* =============================== Discount css Start ============================ */\r\n.discount-item {\r\n padding: clampCal(24, 48, 1199, 1599);\r\n &__content{\r\n max-width: 320px;\r\n }\r\n}\r\n/* =============================== Discount css End ============================ */","/* ====================== Popular Products Start ==================== */\r\n.popular-products {\r\n .product-card {\r\n @include sm-screen {\r\n flex-direction: column;\r\n }\r\n }\r\n}\r\n/* ====================== Popular Products End ==================== */","/* */\r\n.day-sale {\r\n &-box {\r\n &__content {\r\n max-width: 500px;\r\n }\r\n }\r\n}\r\n/* */","/* ========================== Top Brand Section Start ================================ */\r\n.top-brand {\r\n &__item {\r\n max-height: 84px;\r\n max-width: 160px;\r\n width: 100%;\r\n aspect-ratio: 1;\r\n }\r\n}\r\n/* ========================== Top Brand Section End ================================ */","/* ================================ Featured Products Css Start ============================ */\r\n.featured-products {\r\n .product-card {\r\n @include xsm-screen {\r\n flex-direction: column;\r\n }\r\n }\r\n}\r\n/* ================================ Featured Products Css End ============================ */","/* ============================ Product Details Css Start ============================= */\r\n.product-details {\r\n &__thumb {\r\n &-slider {\r\n padding: clampCal(48, 116);\r\n }\r\n }\r\n\r\n .slick-initialized.slick-slider .slick-slide > div > div {\r\n height: 100%;\r\n }\r\n}\r\n\r\n\r\n.product-dContent__box, .product-dContent__header {\r\n padding: 16px 40px;\r\n}\r\n.product-dContent {\r\n &__box {\r\n padding-top: 48px;\r\n padding-bottom: 48px;\r\n }\r\n}\r\n/* ============================ Product Details Css End ============================= */","/* ================================ Shop Page css Start =============================== */\r\n.list-grid-btns {\r\n @media (max-width: 479px) {\r\n display: none;\r\n }\r\n}\r\n.list-grid-wrapper {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));\r\n gap: 24px;\r\n}\r\n\r\n@media (min-width: 480px) {\r\n .list-view {\r\n grid-template-columns: repeat(auto-fit, minmax(430px, 1fr));\r\n .product-card {\r\n display: flex;\r\n align-items: center;\r\n &__thumb {\r\n max-width: 200px;\r\n height: 100% !important;\r\n }\r\n &__content {\r\n margin-top: 0 !important;\r\n margin-left: 20px;\r\n flex-grow: 1;\r\n }\r\n }\r\n }\r\n}\r\n\r\n@media (max-width: 1199px) {\r\n .shop-sidebar__box {\r\n padding: 16px !important;\r\n }\r\n}\r\n\r\n@media (max-width: 991px) {\r\n .shop-sidebar {\r\n position: fixed;\r\n top: 0;\r\n height: 100vh;\r\n background-color: #fff;\r\n z-index: 11;\r\n left: 0;\r\n border-radius: 0 !important;\r\n overflow-y: auto;\r\n width: 300px;\r\n border-right: 1px solid var(--gray-100);\r\n transform: translateX(-100%);\r\n transition: .2s linear;\r\n &.active {\r\n transform: translateX(0);\r\n }\r\n &__box {\r\n border-radius: 0 !important;\r\n border: 0 !important;\r\n }\r\n }\r\n}\r\n/* ================================ Shop Page css End =============================== */","/* ========================== Cart Page Css Start ============================ */\r\n.table-product {\r\n &__thumb {\r\n max-width: 150px;\r\n max-height: 150px;\r\n width: 100%;\r\n height: 100%;\r\n aspect-ratio: 1;\r\n img {\r\n max-width: 75px;\r\n }\r\n }\r\n &__content {\r\n\r\n }\r\n}\r\n/* ========================== Cart Page Css End ============================ */","/* ======================= Checkout Css Start ============================= */\r\n.payment-item {\r\n &__content {\r\n display: none;\r\n &::before {\r\n position: absolute;\r\n content: \"\";\r\n width: 20px;\r\n height: 14px;\r\n background-color: var(--main-50);\r\n left: 32px;\r\n bottom: calc(100% + -1px);\r\n clip-path: polygon(50% 0%, 0% 100%, 100% 100%);\r\n }\r\n }\r\n}\r\n/* ======================= Checkout Css End ============================= */","/* ========================= Blog Css Start ============================= */\r\n.blog-item {\r\n margin-bottom: 48px;\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n}\r\n/* ========================= Blog Css End ============================= */"]
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/select2.min.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/select2.min.css
new file mode 100644
index 0000000..f00f154
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/select2.min.css
@@ -0,0 +1 @@
+.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline;list-style:none;padding:0}.select2-container .select2-selection--multiple .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;margin-left:5px;padding:0;max-width:100%;resize:none;height:18px;vertical-align:bottom;font-family:sans-serif;overflow:hidden;word-break:keep-all}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option--selectable{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px;padding-right:0px}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;padding-bottom:5px;padding-right:5px;position:relative}.select2-container--default .select2-selection--multiple.select2-selection--clearable{padding-right:25px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;height:20px;margin-right:10px;margin-top:5px;position:absolute;right:0;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:inline-block;margin-left:5px;margin-top:5px;padding:0;padding-left:20px;position:relative;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap}.select2-container--default .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-right:1px solid #aaa;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#999;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px;position:absolute;left:0;top:0}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover,.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus{background-color:#f1f1f1;color:#333;outline:none}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-left:1px solid #aaa;border-right:none;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear{float:left;margin-left:10px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--group{padding:0}.select2-container--default .select2-results__option--disabled{color:#999}.select2-container--default .select2-results__option--selected{background-color:#ddd}.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;padding-bottom:5px;padding-right:5px}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;display:inline-block;margin-left:5px;margin-top:5px;padding:0}.select2-container--classic .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#888;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;outline:none}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option--group{padding:0}.select2-container--classic .select2-results__option--disabled{color:grey}.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/css/slick.css b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/slick.css
new file mode 100644
index 0000000..d8e4b11
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/css/slick.css
@@ -0,0 +1,119 @@
+/* Slider */
+.slick-slider
+{
+ position: relative;
+
+ display: block;
+ box-sizing: border-box;
+
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ -webkit-touch-callout: none;
+ -khtml-user-select: none;
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.slick-list
+{
+ position: relative;
+
+ display: block;
+ overflow: hidden;
+
+ margin: 0;
+ padding: 0;
+}
+.slick-list:focus
+{
+ outline: none;
+}
+.slick-list.dragging
+{
+ cursor: pointer;
+ cursor: hand;
+}
+
+.slick-slider .slick-track,
+.slick-slider .slick-list
+{
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+.slick-track
+{
+ position: relative;
+ top: 0;
+ left: 0;
+
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+.slick-track:before,
+.slick-track:after
+{
+ display: table;
+
+ content: '';
+}
+.slick-track:after
+{
+ clear: both;
+}
+.slick-loading .slick-track
+{
+ visibility: hidden;
+}
+
+.slick-slide
+{
+ display: none;
+ float: left;
+
+ height: 100%;
+ min-height: 1px;
+}
+[dir='rtl'] .slick-slide
+{
+ float: right;
+}
+.slick-slide img
+{
+ display: block;
+}
+.slick-slide.slick-loading img
+{
+ display: none;
+}
+.slick-slide.dragging img
+{
+ pointer-events: none;
+}
+.slick-initialized .slick-slide
+{
+ display: block;
+}
+.slick-loading .slick-slide
+{
+ visibility: hidden;
+}
+.slick-vertical .slick-slide
+{
+ display: block;
+
+ height: auto;
+
+ border: 1px solid transparent;
+}
+.slick-arrow.slick-hidden {
+ display: none;
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg.png
new file mode 100644
index 0000000..2ee09b2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg2.png
new file mode 100644
index 0000000..a4f55d0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-bg2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-two-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-two-bg.png
new file mode 100644
index 0000000..1390481
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/banner-two-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/big-deal-pattern.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/big-deal-pattern.png
new file mode 100644
index 0000000..3e88e34
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/big-deal-pattern.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/body-bottom-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/body-bottom-bg.png
new file mode 100644
index 0000000..016d23a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/body-bottom-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/day-sale-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/day-sale-bg.png
new file mode 100644
index 0000000..2a9162c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/day-sale-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/deal-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/deal-bg.png
new file mode 100644
index 0000000..b643b54
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/deal-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/delivery-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/delivery-bg.png
new file mode 100644
index 0000000..b35b626
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/delivery-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/details-offer-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/details-offer-bg.png
new file mode 100644
index 0000000..48e84d9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/details-offer-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg1.jpg b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg1.jpg
new file mode 100644
index 0000000..c35d1c6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg1.jpg differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg2.jpg b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg2.jpg
new file mode 100644
index 0000000..e2e0991
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/discount-bg2.jpg differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/expensive-offer-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/expensive-offer-bg.png
new file mode 100644
index 0000000..4f0a189
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/expensive-offer-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/featured-product-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/featured-product-bg.png
new file mode 100644
index 0000000..ae0c5d6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/featured-product-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg1.png
new file mode 100644
index 0000000..a5b2bf4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg2.png
new file mode 100644
index 0000000..6351bb1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/flash-sale-bg2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/newsletter-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/newsletter-bg.png
new file mode 100644
index 0000000..80f4a57
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/newsletter-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/pattern-two.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/pattern-two.png
new file mode 100644
index 0000000..a400fa4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/pattern-two.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img1.png
new file mode 100644
index 0000000..cfcd6e7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img2.png
new file mode 100644
index 0000000..ddcb2f6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img3.png
new file mode 100644
index 0000000..d9457be
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/promo-bg-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/recommended-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/recommended-bg.png
new file mode 100644
index 0000000..cd298f8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/recommended-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/special-snacks.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/special-snacks.png
new file mode 100644
index 0000000..6e73164
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/special-snacks.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/week-deal-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/week-deal-bg.png
new file mode 100644
index 0000000..e0ee0ed
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/bg/week-deal-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/envelop.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/envelop.png
new file mode 100644
index 0000000..dba42d1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/envelop.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/preloader.gif b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/preloader.gif
new file mode 100644
index 0000000..bfedbbf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/preloader.gif differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/satisfaction-icon.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/satisfaction-icon.png
new file mode 100644
index 0000000..360f013
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/satisfaction-icon.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/star-color.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/star-color.png
new file mode 100644
index 0000000..6410aa7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/icon/star-color.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/favicon.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/favicon.png
new file mode 100644
index 0000000..f453cbd
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/favicon.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two-black.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two-black.png
new file mode 100644
index 0000000..0fcfe62
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two-black.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two.png
new file mode 100644
index 0000000..672da89
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo-two.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo.png
new file mode 100644
index 0000000..751c334
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/logo/logo.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape2.png
new file mode 100644
index 0000000..73895cc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape3.png
new file mode 100644
index 0000000..a8961b2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/box-shape3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/curve-line-shape.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/curve-line-shape.png
new file mode 100644
index 0000000..f7092de
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/curve-line-shape.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-pattern.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-pattern.png
new file mode 100644
index 0000000..22459c2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-pattern.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-shape.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-shape.png
new file mode 100644
index 0000000..9c1c7dc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/line-shape.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/offer-shape.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/offer-shape.png
new file mode 100644
index 0000000..3b13d0d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/offer-shape.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/star-shape.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/star-shape.png
new file mode 100644
index 0000000..8e2eeab
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/shape/star-shape.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertise-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertise-img1.png
new file mode 100644
index 0000000..ef2543e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertise-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertiser-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertiser-img.png
new file mode 100644
index 0000000..efa3570
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/advertiser-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img1.png
new file mode 100644
index 0000000..c6d21d6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img2.png
new file mode 100644
index 0000000..c1489cc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img3.png
new file mode 100644
index 0000000..2ba579b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img4.png
new file mode 100644
index 0000000..3e39c4b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-bg.png
new file mode 100644
index 0000000..0ae0b64
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-img.png
new file mode 100644
index 0000000..aef5a2f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-inner-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img1.png
new file mode 100644
index 0000000..802e150
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img2.png
new file mode 100644
index 0000000..6549a2f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img3.png
new file mode 100644
index 0000000..7bf7e86
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-three-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img.png
new file mode 100644
index 0000000..805f03a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img2.png
new file mode 100644
index 0000000..8987e3a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/banner-two-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell1.png
new file mode 100644
index 0000000..0385f3c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell2.png
new file mode 100644
index 0000000..dc1ea54
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell3.png
new file mode 100644
index 0000000..fad8849
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell4.png
new file mode 100644
index 0000000..4121141
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-sell4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img1.png
new file mode 100644
index 0000000..bd5dd68
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img2.png
new file mode 100644
index 0000000..348dc7d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img3.png
new file mode 100644
index 0000000..0ebdacf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img4.png
new file mode 100644
index 0000000..9d30ba7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img5.png
new file mode 100644
index 0000000..30071cf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img6.png
new file mode 100644
index 0000000..17a29b1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/best-selling-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal1.png
new file mode 100644
index 0000000..84e74c3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal2.png
new file mode 100644
index 0000000..fe3d336
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/big-deal2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img1.png
new file mode 100644
index 0000000..11b72f4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img2.png
new file mode 100644
index 0000000..11b72f4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-details-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img1.png
new file mode 100644
index 0000000..4a39f3b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img2.png
new file mode 100644
index 0000000..4a39f3b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img3.png
new file mode 100644
index 0000000..4a39f3b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/blog-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img1.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img2.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img3.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img4.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img5.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img6.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img7.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img8.png
new file mode 100644
index 0000000..ca74537
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img1.png
new file mode 100644
index 0000000..44d1de8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img2.png
new file mode 100644
index 0000000..44d89cd
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img3.png
new file mode 100644
index 0000000..b35a45f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img4.png
new file mode 100644
index 0000000..44d89cd
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img5.png
new file mode 100644
index 0000000..9fcc96a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img6.png
new file mode 100644
index 0000000..e5ed3ce
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img7.png
new file mode 100644
index 0000000..44d89cd
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img8.png
new file mode 100644
index 0000000..9fcc96a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img9.png
new file mode 100644
index 0000000..b35a45f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/brand-three-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img1.png
new file mode 100644
index 0000000..ee9d042
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img2.png
new file mode 100644
index 0000000..ee9d042
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img3.png
new file mode 100644
index 0000000..4eaf96d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img4.png
new file mode 100644
index 0000000..4eaf96d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img5.png
new file mode 100644
index 0000000..4eaf96d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/comment-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img1.png
new file mode 100644
index 0000000..a4f33f5
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img2.png
new file mode 100644
index 0000000..8df5726
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/day-sale-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deal-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deal-img.png
new file mode 100644
index 0000000..49469c2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deal-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deals-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deals-img.png
new file mode 100644
index 0000000..84af6da
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/deals-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/delivery-man.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/delivery-man.png
new file mode 100644
index 0000000..43386cc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/delivery-man.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img1.png
new file mode 100644
index 0000000..2604337
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img2.png
new file mode 100644
index 0000000..f196291
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img1.png
new file mode 100644
index 0000000..2f99d74
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img2.png
new file mode 100644
index 0000000..2f99d74
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img3.png
new file mode 100644
index 0000000..2f99d74
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/discount-three-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer1.png
new file mode 100644
index 0000000..bfb7ce6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer2.png
new file mode 100644
index 0000000..bfb7ce6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/expensive-offer2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img1.png
new file mode 100644
index 0000000..b8e7c5c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img10.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img10.png
new file mode 100644
index 0000000..4216299
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img10.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img2.png
new file mode 100644
index 0000000..5d34e2b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img3.png
new file mode 100644
index 0000000..ffc56ac
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img4.png
new file mode 100644
index 0000000..1070a23
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img5.png
new file mode 100644
index 0000000..77a795c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img6.png
new file mode 100644
index 0000000..f2ebe1a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img7.png
new file mode 100644
index 0000000..7977b3a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img8.png
new file mode 100644
index 0000000..acdd195
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img9.png
new file mode 100644
index 0000000..bd9a824
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/feature-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/featured-product-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/featured-product-img.png
new file mode 100644
index 0000000..8ac5426
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/featured-product-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img1.png
new file mode 100644
index 0000000..0ec3ba2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img2.png
new file mode 100644
index 0000000..9024caa
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img3.png
new file mode 100644
index 0000000..6ba8606
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img4.png
new file mode 100644
index 0000000..70cddb2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img5.png
new file mode 100644
index 0000000..2637f52
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img6.png
new file mode 100644
index 0000000..59f3d21
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/features-three-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag1.png
new file mode 100644
index 0000000..77d7bcf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag2.png
new file mode 100644
index 0000000..77d7bcf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag3.png
new file mode 100644
index 0000000..77d7bcf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag4.png
new file mode 100644
index 0000000..77d7bcf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag5.png
new file mode 100644
index 0000000..01c1eb9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag6.png
new file mode 100644
index 0000000..83181ea
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flag6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img1.png
new file mode 100644
index 0000000..f73e948
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img2.png
new file mode 100644
index 0000000..891a720
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/flash-sale-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/gateway-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/gateway-img.png
new file mode 100644
index 0000000..4aa8a35
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/gateway-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/hot-deals-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/hot-deals-img.png
new file mode 100644
index 0000000..df27190
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/hot-deals-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/inner-banner-two-bg.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/inner-banner-two-bg.png
new file mode 100644
index 0000000..7cacdb7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/inner-banner-two-bg.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img1.png
new file mode 100644
index 0000000..9c208bc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img2.png
new file mode 100644
index 0000000..9c208bc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img3.png
new file mode 100644
index 0000000..9c208bc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img4.png
new file mode 100644
index 0000000..9c208bc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/instagram-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img1.png
new file mode 100644
index 0000000..1d9d24e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img2.png
new file mode 100644
index 0000000..1d9d24e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/new-arrival-promo-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/newsletter-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/newsletter-img.png
new file mode 100644
index 0000000..d86eec9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/newsletter-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img1.png
new file mode 100644
index 0000000..36f0ebc
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img2.png
new file mode 100644
index 0000000..4472580
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-logo.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-logo.png
new file mode 100644
index 0000000..7212d30
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/offer-logo.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/payment-method.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/payment-method.png
new file mode 100644
index 0000000..4aa8a35
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/payment-method.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img1.png
new file mode 100644
index 0000000..b7613d7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img2.png
new file mode 100644
index 0000000..0f66099
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img3.png
new file mode 100644
index 0000000..a6db3a2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img4.png
new file mode 100644
index 0000000..ccee21d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img5.png
new file mode 100644
index 0000000..132daf8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img6.png
new file mode 100644
index 0000000..d1c85b4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img7.png
new file mode 100644
index 0000000..956402f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img8.png
new file mode 100644
index 0000000..c8c8b46
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/popular-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img1.png
new file mode 100644
index 0000000..f5df182
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img2.png
new file mode 100644
index 0000000..f3fc893
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img3.png
new file mode 100644
index 0000000..19d3cf4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb1.png
new file mode 100644
index 0000000..059f16f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb2.png
new file mode 100644
index 0000000..f14aa5a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb3.png
new file mode 100644
index 0000000..a0078ef
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-thumb3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb1.png
new file mode 100644
index 0000000..564e123
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb2.png
new file mode 100644
index 0000000..a55f635
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb3.png
new file mode 100644
index 0000000..8817a7d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-details-two-thumb3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img1.png
new file mode 100644
index 0000000..14d38c1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img10.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img10.png
new file mode 100644
index 0000000..18143f0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img10.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img11.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img11.png
new file mode 100644
index 0000000..3453274
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img11.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img12.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img12.png
new file mode 100644
index 0000000..00dda1e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img12.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img13.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img13.png
new file mode 100644
index 0000000..1b791b9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img13.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img14.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img14.png
new file mode 100644
index 0000000..b1c91f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img14.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img15.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img15.png
new file mode 100644
index 0000000..ee11fdf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img15.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img16.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img16.png
new file mode 100644
index 0000000..c1d190c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img16.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img17.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img17.png
new file mode 100644
index 0000000..c1d190c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img17.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img18.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img18.png
new file mode 100644
index 0000000..00dda1e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img18.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img19.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img19.png
new file mode 100644
index 0000000..06ca935
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img19.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img2.png
new file mode 100644
index 0000000..9f0844f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img20.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img20.png
new file mode 100644
index 0000000..8736da9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img20.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img21.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img21.png
new file mode 100644
index 0000000..e2c7214
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img21.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img22.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img22.png
new file mode 100644
index 0000000..a05c3f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img22.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img23.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img23.png
new file mode 100644
index 0000000..0e2ba20
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img23.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img24.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img24.png
new file mode 100644
index 0000000..f0215de
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img24.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img25.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img25.png
new file mode 100644
index 0000000..258d78f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img25.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img3.png
new file mode 100644
index 0000000..258d78f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img5.png
new file mode 100644
index 0000000..e3f3718
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img6.png
new file mode 100644
index 0000000..400fb92
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img7.png
new file mode 100644
index 0000000..dd1ecd1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img8.png
new file mode 100644
index 0000000..e2c7214
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img9.png
new file mode 100644
index 0000000..881a380
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img1.png
new file mode 100644
index 0000000..27ab139
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img10.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img10.png
new file mode 100644
index 0000000..ab3885c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img10.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img11.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img11.png
new file mode 100644
index 0000000..f011553
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img11.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img12.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img12.png
new file mode 100644
index 0000000..8c913ae
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img12.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img13.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img13.png
new file mode 100644
index 0000000..d44dbf3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img13.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img14.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img14.png
new file mode 100644
index 0000000..5321693
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img14.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img15.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img15.png
new file mode 100644
index 0000000..ad4239e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img15.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img2.png
new file mode 100644
index 0000000..6ba8606
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img3.png
new file mode 100644
index 0000000..9ea6ba9
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img4.png
new file mode 100644
index 0000000..544fba3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img5.png
new file mode 100644
index 0000000..2608f02
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img6.png
new file mode 100644
index 0000000..a51f40b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img7.png
new file mode 100644
index 0000000..ab3885c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img8.png
new file mode 100644
index 0000000..4aa5182
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img9.png
new file mode 100644
index 0000000..d341319
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/product-two-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img1.png
new file mode 100644
index 0000000..2515ab5
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img2.png
new file mode 100644
index 0000000..554dfdf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img3.png
new file mode 100644
index 0000000..b6228b7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-1.png
new file mode 100644
index 0000000..63ba2ad
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-2.png
new file mode 100644
index 0000000..63ba2ad
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promo-three-img-2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img1.png
new file mode 100644
index 0000000..88757bf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img2.png
new file mode 100644
index 0000000..88757bf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img3.png
new file mode 100644
index 0000000..88757bf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img4.png
new file mode 100644
index 0000000..88757bf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/promotional-banner-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post1.png
new file mode 100644
index 0000000..98a79e8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post2.png
new file mode 100644
index 0000000..98a79e8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post3.png
new file mode 100644
index 0000000..98a79e8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post4.png
new file mode 100644
index 0000000..98a79e8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recent-post4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recommended-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recommended-img.png
new file mode 100644
index 0000000..178bb5d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/recommended-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img1.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img2.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img3.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img4.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img5.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img6.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img7.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img8.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img9.png
new file mode 100644
index 0000000..b9696f3
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/short-product-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/special-snacks-img.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/special-snacks-img.png
new file mode 100644
index 0000000..33c2393
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/special-snacks-img.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/steps.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/steps.png
new file mode 100644
index 0000000..455dfa8
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/steps.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img1.png
new file mode 100644
index 0000000..36c96ef
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img2.png
new file mode 100644
index 0000000..ad81bba
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/store-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img1.png
new file mode 100644
index 0000000..e996f93
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img2.png
new file mode 100644
index 0000000..b975e05
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img3.png
new file mode 100644
index 0000000..b975e05
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img4.png
new file mode 100644
index 0000000..5af251e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/testimonials-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img1.png
new file mode 100644
index 0000000..281ad69
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img2.png
new file mode 100644
index 0000000..89a4504
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img3.png
new file mode 100644
index 0000000..fef749c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img4.png
new file mode 100644
index 0000000..6b80e05
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img5.png
new file mode 100644
index 0000000..462c05a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img6.png
new file mode 100644
index 0000000..266b329
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img7.png
new file mode 100644
index 0000000..7781e17
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img8.png
new file mode 100644
index 0000000..5e1133a
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/top-brand-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img1.png
new file mode 100644
index 0000000..b398f9e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img2.png
new file mode 100644
index 0000000..c9eaec6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-products-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img1.png
new file mode 100644
index 0000000..99627b4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img10.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img10.png
new file mode 100644
index 0000000..dfe2d65
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img10.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img2.png
new file mode 100644
index 0000000..abac753
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img3.png
new file mode 100644
index 0000000..c108f4c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img4.png
new file mode 100644
index 0000000..af5cd13
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img5.png
new file mode 100644
index 0000000..a9c9fe0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img6.png
new file mode 100644
index 0000000..1ab8ced
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img7.png
new file mode 100644
index 0000000..7839192
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img8.png
new file mode 100644
index 0000000..41f3f16
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img9.png
new file mode 100644
index 0000000..8bae105
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/trending-three-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img1.png
new file mode 100644
index 0000000..bfafcf7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img2.png
new file mode 100644
index 0000000..2da6ccf
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img3.png
new file mode 100644
index 0000000..82763c7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img4.png
new file mode 100644
index 0000000..46d4025
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img5.png
new file mode 100644
index 0000000..82763c7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo1.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo2.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo3.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo4.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo5.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo6.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo7.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo8.png
new file mode 100644
index 0000000..a982cb6
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-logo8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img1.png
new file mode 100644
index 0000000..5f6504e
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img10.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img10.png
new file mode 100644
index 0000000..a81f9b5
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img10.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img11.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img11.png
new file mode 100644
index 0000000..571976f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img11.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img2.png
new file mode 100644
index 0000000..9cea8f4
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img3.png
new file mode 100644
index 0000000..6f707d0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img4.png
new file mode 100644
index 0000000..33d2ad7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img5.png
new file mode 100644
index 0000000..13cdd8f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img6.png
new file mode 100644
index 0000000..31f0806
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img7.png
new file mode 100644
index 0000000..a0c70f1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img8.png
new file mode 100644
index 0000000..13cdd8f
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img9.png
new file mode 100644
index 0000000..31f0806
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendor-two-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon1.png
new file mode 100644
index 0000000..faab3ee
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon2.png
new file mode 100644
index 0000000..5ecccac
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon3.png
new file mode 100644
index 0000000..dac5af0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon4.png
new file mode 100644
index 0000000..dac5af0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon5.png
new file mode 100644
index 0000000..21b3a33
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon6.png
new file mode 100644
index 0000000..dac5af0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon7.png
new file mode 100644
index 0000000..dac5af0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon8.png
new file mode 100644
index 0000000..dac5af0
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-icon8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img1.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img2.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img3.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img3.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img3.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img4.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img4.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img4.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img5.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img5.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img5.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img6.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img6.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img6.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img7.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img7.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img7.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img8.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img8.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img8.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img9.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img9.png
new file mode 100644
index 0000000..492596b
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/vendors-two-img9.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img1.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img1.png
new file mode 100644
index 0000000..edd5d50
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img1.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img2.png b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img2.png
new file mode 100644
index 0000000..54379c1
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/images/thumbs/week-deal-img2.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/_extra.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/_extra.scss
new file mode 100644
index 0000000..d3b12aa
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/_extra.scss
@@ -0,0 +1,798 @@
+.slick-arrow::before {
+ display: none;
+}
+
+.slick-arrow {
+ .ph {
+ color: #333;
+ }
+
+ &:hover {
+ .ph {
+ color: #fff;
+ }
+ }
+}
+
+.flash-sales {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .flash-sales__slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -60px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -60px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+ }
+ }
+}
+
+.hot-deals {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 5px;
+ }
+ }
+
+ .hot-deals-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -60px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -60px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+ }
+}
+
+.organic-food {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .organic-food__slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -60px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -60px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+ }
+}
+
+.short-product {
+ .mr-point {
+ margin-right: 124px;
+ }
+
+ .slick-arrow {
+ width: 38px;
+ height: 38px;
+ }
+
+ .short-product-list {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -70px;
+ left: auto;
+ right: 50px;
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -70px;
+ left: auto;
+ right: 5px;
+ }
+ }
+}
+
+.brand {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .brand-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -60px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -60px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+ }
+}
+
+.new-arrival {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .new-arrival__slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -60px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -60px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -58px;
+ }
+
+ @include lg-screen {
+ top: -40px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -37px;
+ }
+ }
+ }
+}
+
+.deals-weeek {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .deals-week-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -300px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -290px;
+ }
+
+ @include lg-screen {
+ top: -218px;
+ }
+
+ @include sm-screen {
+ top: -218px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -300px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -290px;
+ }
+
+ @include lg-screen {
+ top: -218px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -218px;
+ }
+ }
+ }
+}
+
+.top-selling-products {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 5px;
+ }
+ }
+
+ .top-selling-product-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -45px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -42px;
+ }
+
+ @include sm-screen {
+ top: -42px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -45px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -42px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -42px;
+ }
+ }
+ }
+}
+
+.featured-products {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .featured-product-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -45px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -38px;
+ }
+
+ @include sm-screen {
+ top: -38px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -45px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -38px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -38px;
+ }
+ }
+ }
+}
+
+.vendor-card {
+ .slick-arrow .ph {
+ color: #fff;
+ }
+}
+
+.recommended {
+ .mr-point {
+ margin-right: 124px;
+
+ @include sm-screen {
+ margin-right: 108px;
+ }
+ }
+
+ .recommended-slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -45px;
+ right: 60px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -42px;
+ }
+
+ @include sm-screen {
+ top: -42px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -45px;
+ right: 0px;
+ left: auto;
+
+ @include xl-screen {
+ top: -42px;
+ }
+
+ @include lg-screen {
+ top: -42px;
+ }
+
+ @include md-screen {
+ right: 14px;
+ }
+
+ @include sm-screen {
+ top: -42px;
+ }
+ }
+ }
+}
+
+.top-brand {
+ .mr-point {
+ margin-right: 124px;
+ }
+
+ .top-brand__slider {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ top: -45px;
+ right: 60px;
+ left: auto;
+
+ @include sm-screen {
+ right: 46px;
+ }
+ }
+
+ .slick-arrow.slick-next {
+ position: absolute;
+ top: -45px;
+ right: 0px;
+ left: auto;
+ }
+ }
+}
+
+.banner-item-two__slider {
+ .slick-dots {
+ display: flex !important;
+ gap: 4px;
+
+ li {
+ margin: 0;
+ }
+
+ .slick-active {
+ width: auto;
+ }
+ }
+}
+
+.banner-three-slider {
+ .slick-next {
+ right: -100px !important;
+ }
+ .slick-prev {
+ left: -100px !important;
+ }
+ .slick-arrow .ph {
+ color: #ddd;
+ }
+}
+
+.horizontal-slider {
+ .example-track.example-track-0,
+ .example-track.example-track-2 {
+ height: 8px;
+ border-radius: 5px;
+ background: #cccccc;
+ }
+
+ .example-track.example-track-1 {
+ height: 8px;
+ border-radius: 5px;
+ z-index: 9;
+
+ background-color: var(--main-600) !important;
+ }
+
+ .example-thumb {
+ left: 76.7775px;
+ top: 12px;
+ background-color: var(--main-600) !important;
+ border-radius: 5px;
+ width: 40px;
+ height: 35px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ color: #fff;
+ cursor: pointer;
+
+ &:focus-visible {
+ outline: none;
+ }
+ }
+}
+
+.product-details__thumb-slider {
+ padding: clamp(3rem, -2.173rem + 10.777vw, 7.25rem);
+ min-width: 400px;
+ height: 600px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.center {
+ display: flex !important;
+ justify-content: center;
+ align-items: center;
+}
+
+.product-details__images-slider .thum {
+ width: 60px;
+ object-fit: contain;
+}
+
+.mobile-menu .nav-submenu {
+ display: block !important;
+ max-height: 0;
+ overflow: hidden;
+ height: 0;
+ transition: all 0s linear !important;
+}
+
+.mobile-menu .nav-submenu.open {
+ max-height: 500px;
+ height: 100%;
+ transition: all 2s linear !important;
+ /* Adjust this value based on your content */
+}
+
+.submenus-submenu.open {
+ max-height: 500px;
+ height: 100%;
+ transition: all 2s linear !important;
+ /* Adjust this value based on your content */
+}
+
+@media screen and (max-width: 991px) {
+ .responsive-dropdown.cat .submenus-submenu {
+ display: block !important;
+ max-height: 0;
+ overflow: hidden;
+ height: 0;
+ transition: all 0s linear !important;
+ }
+
+ .responsive-dropdown.cat .submenus-submenu.open {
+ max-height: 500px;
+ height: 100%;
+ transition: all 0.5s linear !important;
+ }
+}
+
+.promotional-banner {
+ position: relative;
+ z-index: 0;
+}
+
+.scroll-to-top {
+ z-index: 9999;
+}
+
+.common-dropdown__item .common-dropdown__link.activePage {
+ color: hsl(var(--main)) !important;
+}
+
+.nav-menu__link.activePage {
+ color: hsl(var(--main));
+}
+
+.category-two {
+ @include md-screen {
+ display: block !important;
+ }
+}
+
+.category.main {
+ @include md-screen {
+ display: none !important;
+ }
+}
+
+.nav-menu--mobile .nav-submenu {
+ margin-inline-start: 10px;
+}
+
+.nav-menu--mobile .nav-submenu__link {
+ padding: 10px 8px;
+}
+
+.has-submenus-submenu:focus-within .submenus-submenu {
+ visibility: visible;
+ opacity: 1;
+}
+
+.Marquee_text-slider {
+ .rfm-child {
+ margin-right: 40px;
+ }
+}
+
+.countdown-list__item::before {
+ content: "";
+}
+
+.trending-products-three,
+.popular-products-three,
+.vendor-two-details,
+.new-arrival-three {
+ .group:hover .expand-icons {
+ display: flex !important;
+ }
+ .group:hover .expand-btn {
+ background-color: var(--main-two-600) !important;
+ .ph {
+ transform: rotate(45deg);
+ color: #fff;
+ }
+ }
+}
+
+.top-brand.three {
+ .slick-arrow {
+ transform: translateY(0);
+ }
+ .top-brand__slider .slick-arrow {
+ top: -68px;
+ }
+}
+
+.testimonials {
+ .slick-arrow.slick-prev {
+ position: absolute;
+ bottom: -100px;
+ top: auto;
+ transform: translateX(-50%);
+ left: 46%;
+ }
+ .slick-arrow.slick-next {
+ position: absolute;
+ bottom: -100px;
+ top: auto;
+ transform: translateX(-50%);
+ right: 46%;
+ }
+ .slick-arrow {
+ i {
+ color: #fff;
+ }
+ }
+}
+
+.instagram {
+ .slick-arrow {
+ z-index: 9999;
+ transform: translateY(0);
+ }
+ .instagram-slider .slick-arrow {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+}
+
+.vendor-two {
+ .list-grid-wrapper.list-view {
+ @include sm-screen {
+ display: grid;
+ }
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_css-index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_css-index.scss
new file mode 100644
index 0000000..01adaf6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_css-index.scss
@@ -0,0 +1,36 @@
+/*====================== CSS Index Here =======================*/
+/*
+01. Abstracts
+ 1.1. Classes
+ 1.2. Extend
+ 1.3. Functions
+ 1.4. Mixins
+ 1.5. Variable
+ 1.6. Wordpress Default
+
+02. Base
+ 2.1. Margin
+ 2.2. Padding
+ 2.3. Typography
+
+03. Components
+ 3.1. Accordion
+ 3.2. Button
+ 3.3. Form
+ 3.4. Pagination
+ 3.6. Tab
+
+04. Layout
+ 4.1. Blog Sidebar
+ 4.2. Breadcrumb
+ 4.3. Comment
+ 4.4. Footer
+ 4.5. Header Top
+ 4.6. Header
+ 4.7. Preloader
+ 4.8. Scroll Top
+ 4.9. Section Heading
+ 4.10. Slick
+ 4.11. Social Icon
+*/
+/*======================== CSS Index End ======================*/
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_functions.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_functions.scss
new file mode 100644
index 0000000..513ed3f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_functions.scss
@@ -0,0 +1,56 @@
+/* Convert to Rem start */
+$font-base: 16px;
+@function rem($target, $context: $font-base) {
+ @if ($target == 0) {
+ @return 0;
+ }
+ @return calc($target / $context * 1rem);
+}
+/* Convert to Rem End */
+
+
+/* ======================== Functions Css End ======================= */
+// Convert px to REM
+@function convertToRem($px) {
+ $val: calc($px / 16);
+ @return $val;
+}
+@function formatFloatingNumber($number) {
+ @return calc(round($number * 1000) / 1000);
+}
+@function clampCal($minSize, $maxSize, $minWidth: 768, $maxWidth: 1399) {
+ $minREMsize: convertToRem($minSize);
+ $maxREMsize: convertToRem($maxSize);
+ $minREMwidth: convertToRem($minWidth);
+ $maxREMwidth: convertToRem($maxWidth);
+
+ $slopFontCal: calc($maxREMsize - $minREMsize);
+ $slopWidthCal: calc($maxREMwidth - $minREMwidth);
+ $slop: calc($slopFontCal / $slopWidthCal);
+
+ $minusWidth: calc($minREMwidth * -1);
+ $xAxisIntersection: calc($minusWidth * $slop + $minREMsize);
+ $preferred: calc($slop * 100);
+
+ $xAxisMax: formatFloatingNumber($xAxisIntersection);
+ $preferredMax: formatFloatingNumber($preferred);
+
+ @return clamp(
+ #{$minREMsize}rem,
+ #{$xAxisMax}rem + #{$preferredMax}vw,
+ #{$maxREMsize}rem
+ );
+}
+
+
+// Use of this function, Please Uncomment this class and see how it works
+// .demoClass {
+// padding: clampCal(24, 40);
+// font-size: clampCal(20, 48);
+// }
+// ============ If You need all properties you can use like this way ============
+// .demoClass {
+// padding: clampCal(24, 40, 424, 991); // Here Properties are small device padding, Large device padding, small device width, Large device width
+// }
+/* ======================== Functions Css End ======================= */
+
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_index.scss
new file mode 100644
index 0000000..16ffd8a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_index.scss
@@ -0,0 +1,9 @@
+ // Css Index
+ @import "css-index";
+ // function
+ @import "functions";
+// Variable
+ @import "variable";
+// Mixin
+ @import "mixins";
+
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_mixins.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_mixins.scss
new file mode 100644
index 0000000..2a992bb
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_mixins.scss
@@ -0,0 +1,64 @@
+/* ============================ Mixins Css Start ============================ */
+/* Media Breakpoint for Each Device Start */
+@mixin xxsm-screen {
+ @media screen and (max-width: 374px) {
+ @content;
+ }
+}
+
+// Xtra Small
+@mixin xsm-screen {
+ @media screen and (max-width: 424px) {
+ @content;
+ }
+}
+// Medium Small Screen (max-width: 575)
+@mixin msm-screen {
+ @media screen and (max-width: 575px) {
+ @content;
+ }
+}
+
+//Small Screen (max-width: 767)
+@mixin sm-screen {
+ @media screen and (max-width: 767px) {
+ @content;
+ }
+}
+
+//Large Screen (max-width: 991)
+@mixin md-screen {
+ @media screen and (max-width: 991px) {
+ @content;
+ }
+}
+
+//Xtra Large Screen (max-width: 1199)
+@mixin lg-screen {
+ @media screen and (max-width: 1199px) {
+ @content;
+ }
+}
+
+//Xtra Large Screen i (max-width: 1399)
+@mixin xl-screen {
+ @media screen and (max-width: 1399px) {
+ @content;
+ }
+}
+
+//Xtra Large Screen ii (max-width: 1499)
+@mixin xxl-screen {
+ @media screen and (max-width: 1499px) {
+ @content;
+ }
+}
+//Xtra Large Screen ii (max-width: 1599)
+@mixin xxxl-screen {
+ @media screen and (max-width: 1599px) {
+ @content;
+ }
+}
+/* Media Breakpoint for Each Device End */
+
+/* ============================ Mixins Css End ============================ */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_variable.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_variable.scss
new file mode 100644
index 0000000..5ed3929
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/abstracts/_variable.scss
@@ -0,0 +1,275 @@
+/* Font Family*/
+@import url('https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400..700&family=Exo:ital,wght@0,100..900;1,100..900&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Outfit:wght@100..900&family=Quicksand:wght@300..700&display=swap');
+
+$colors: (
+ "main": (
+ "50": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.9)),
+ "100": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.8)),
+ "200": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.7)),
+ "300": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.6)),
+ "400": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.5)),
+ "500": hsl(var(--main-h), var(--main-s), calc(var(--main-l) + (100% - var(--main-l)) * 0.4)),
+ "600": hsl(var(--main-h), var(--main-s), var(--main-l)), // main theme color
+ "700": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.1)),
+ "800": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.2)),
+ "900": hsl(var(--main-h), var(--main-s), calc(var(--main-l) - var(--main-l) * 0.3))
+ ),
+ "main-two": (
+ "50": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.9)),
+ "100": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.8)),
+ "200": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.7)),
+ "300": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.6)),
+ "400": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.5)),
+ "500": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) + (100% - var(--main-two-l)) * 0.4)),
+ "600": hsl(var(--main-two-h), var(--main-two-s), var(--main-two-l)), // main-two theme secondary color
+ "700": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.1)),
+ "800": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.2)),
+ "900": hsl(var(--main-two-h), var(--main-two-s), calc(var(--main-two-l) - var(--main-two-l) * 0.3))
+ ),
+
+ "neutral": (
+ "50": #F7FBFE,
+ "100": #D3DDE7,
+ "200": #BCB5E7,
+ "300": #8B95A8,
+ "400": #5C6878,
+ "500": #3D4A56,
+ "600": #1A2026,
+ "700": #141A1F,
+ "800": #0F1318,
+ "900": #0A0D10,
+ ),
+
+ "gray": (
+ "50": #F1F1F1,
+ "100": #E6E6E6,
+ "200": #CCCCCC,
+ "300": #B3B3B3,
+ "400": #999999,
+ "500": #808080,
+ "600": #666666,
+ "700": #4D4D4D,
+ "800": #333333,
+ "900": #1A1A1A,
+ ),
+
+
+
+ "light": (
+ "50": #F7FBFE,
+ "100": #FFFDFA,
+ "600": #D3DDE7,
+ "700": #3D4A56,
+ "800": #1A2026,
+ ),
+
+ "primary": (
+ "50": #EEF1FF,
+ "100": #D4DBFF,
+ "200": #B8C3FF,
+ "300": #9BABFF,
+ "400": #8197FF,
+ "500": #6983FF,
+ "600": #5570E6,
+ "700": #415DCC,
+ "800": #30176E,
+ "900": #1A0E3D
+ ),
+
+ "danger": (
+ "50": #FDF2F4,
+ "100": #F9E0E5,
+ "200": #F0BCC5,
+ "300": #E0A2AF,
+ "400": #C46B7E,
+ "500": #9E3F55,
+ "600": #642637,
+ "700": #501E2C,
+ "800": #3C1621,
+ "900": #280F16
+ ),
+
+ "success": (
+ "50": #F0FDF4,
+ "100": #DCFCE7,
+ "200": #BBF7D0,
+ "300": #86EFAC,
+ "400": #4ADE80,
+ "500": #22C55E,
+ "600": #27AE60,
+ "700": #15803D,
+ "800": #166534,
+ "900": #14532D
+ ),
+
+ "warning": (
+ "50": #FEFCE8,
+ "100": #FEF9C3,
+ "200": #FEF08A,
+ "300": #FDE047,
+ "400": #FACC15,
+ "500": #EAB308,
+ "600": #FF9F29,
+ "700": #f39016,
+ "800": #e58209,
+ "900": #d77907
+ ),
+
+ "info": (
+ "50": #EFF6FF,
+ "100": #DBEAFE,
+ "200": #BFDBFE,
+ "300": #93C5FD,
+ "400": #60A5FA,
+ "500": #3B82F6,
+ "600": #2563EB,
+ "700": #1D4ED8,
+ "800": #1E40AF,
+ "900": #1E3A8A
+ ),
+
+ "tertiary": (
+ "50": #E8E5F7,
+ "100": #BCB5E7,
+ "600": #30176E,
+ ),
+);
+
+// Space
+$spaces: (
+ "2": #{rem(2px)},
+ "3": #{rem(3px)},
+ "4": #{rem(4px)},
+ "5": #{rem(5px)},
+ "6": #{rem(6px)},
+ "7": #{rem(7px)},
+ "8": #{rem(8px)},
+ "9": #{rem(9px)},
+ "10": #{rem(10px)},
+ "11": #{rem(11px)},
+ "12": #{rem(12px)},
+ "13": #{rem(13px)},
+ "14": #{rem(14px)},
+ "16": #{rem(16px)},
+ "18": #{rem(18px)},
+ "20": #{rem(20px)},
+ "22": #{rem(22px)},
+ "24": #{rem(24px)},
+ "26": #{rem(26px)},
+ "28": #{rem(28px)},
+ "30": #{rem(30px)},
+ "32": #{rem(32px)},
+ "36": #{rem(32px)},
+ "40": #{rem(40px)},
+ "44": #{rem(44px)},
+ "48": #{rem(48px)},
+ "52": #{rem(52px)},
+ "56": #{rem(56px)},
+ "60": #{rem(60px)},
+ "64": #{rem(64px)},
+ "68": #{rem(68px)},
+ "72": #{rem(72px)},
+ "76": #{rem(76px)},
+ "80": #{rem(80px)},
+ "90": #{rem(90px)},
+ "110": #{rem(110px)},
+ "120": #{rem(120px)},
+ "144": #{rem(144px)},
+ "160": #{rem(160px)},
+ "210": #{rem(210px)},
+);
+
+$font-sizes: (
+ "xs": #{rem(12px)},
+ "sm": #{rem(14px)},
+ "md": #{rem(16px)},
+ "lg": #{rem(18px)},
+ "xl": #{rem(20px)},
+ "2xl": #{rem(24px)},
+ "3xl": #{rem(30px)},
+ "4xl": #{rem(36px)},
+ "5xl": #{rem(48px)},
+ "6xl": #{rem(60px)},
+);
+
+/* ========================= Variable Css Start ======================== */
+:root {
+
+ /* Font Family Variable */
+ --heading-font: "Quicksand", sans-serif ;
+ --heading-font-two: "Exo", sans-serif;
+ --heading-font-three: "Outfit", sans-serif;;
+ --heading-font-four: "Dancing Script", cursive;;
+ --body-font: "Inter", sans-serif;
+
+ /* Font Size Variable Start */
+ --heading-one: clamp(2.25rem, -0.0733rem + 6.3692vw, 4.5rem); // Min:36px - Max:72px
+ --heading-two: clamp(2rem, 0.7133rem + 2.8846vw, 3.5rem); // Min: 32px - Max: 56px
+ --heading-three: clamp(1.75rem, 0.3353rem + 2.1661vw, 3rem); // Min: 28px - Max: 48px
+ --heading-four: clamp(1.5rem, 0.5569rem + 1.444vw, 2.5rem); // Min: 24px - Max: 40px
+ --heading-five: clamp(1.25rem, 1.2rem + 0.722vw, 2.25rem); // Min: 20px - Max: 36px
+ --heading-six: clamp(1.125rem, 0.769rem + 0.6813vw, 1.5rem); // Min: 18px - Max-24px
+
+ --display-200: clamp(3.75rem, -0.0733rem + 6.3692vw, 12.5rem); // Min:40px - Max:200px
+ --display-one: clamp(2.5rem, -0.0733rem + 6.3692vw, 7.5rem); // Min:40px - Max:120px
+ /* Font Size End */
+
+ /* template main color - ValkeyBlue #6983FF */
+ --main-h: 230;
+ --main-s: 100%;
+ --main-l: 71%;
+ --main: var(--main-h) var(--main-s) var(--main-l);
+
+ /* template secondary color - ValkeyPurple #30176E */
+ --main-two-h: 257;
+ --main-two-s: 65%;
+ --main-two-l: 26%;
+ --main-two: var(--main-two-h) var(--main-two-s) var(--main-two-l);
+
+ /* Valkey Brand Colors */
+ --valkey-blue: #6983FF;
+ --valkey-black: #1A2026;
+ --valkey-red: #642637;
+ --valkey-purple: #30176E;
+ --valkey-pink: #E0A2AF;
+ --valkey-lavender: #BCB5E7;
+ --valkey-white: #FFFDFA;
+ --valkey-white-2: #D3DDE7;
+ --valkey-white-3: #F7FBFE;
+
+ /* White Color */
+ --white: 0 0% 100%;
+ --black: 210 19% 13%;
+ --light: 0 0% 51%;
+
+ --heading-color: var(--black);
+ --body-color: var(--light);
+ --body-bg: var(--gray);
+ --border-color: 210 29% 87%;
+
+ --bg-color-one: #F7FBFE;
+ --bg-color-two: #FFFDFA;
+ --bg-color-three: #D3DDE7;
+ --neutral: #1A2026;
+
+ --translate-x-middle: translateX(-50%);
+ --translate-y-middle: translateY(-50%);
+
+ // spacing
+ @each $property, $value in $spaces {
+ --size-#{$property}: #{$value};
+ }
+
+ // Colors
+ @each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ --#{$color}-#{$shade}: #{$value};
+ }
+ }
+
+ // font sizes
+ @each $property, $value in $font-sizes {
+ --font-#{$property}: #{$value};
+ }
+}
+/* ========================= Variable Css End ======================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_accordion.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_accordion.scss
new file mode 100644
index 0000000..6a92e87
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_accordion.scss
@@ -0,0 +1,84 @@
+/* =========================== Accordion Css start ============================= */
+.common-accordion {
+ .accordion-item {
+ border: 1px solid var(--border-color);
+ background-color: hsl(var(--white)) !important;
+ border-radius: 8px;
+ overflow: hidden;
+ &:not(:last-child) {
+ margin-block-end:20px;
+ }
+ }
+ .accordion-header {
+ line-height: 1;
+ }
+ .accordion-body {
+ padding: 20px 30px;
+
+ padding-block-start: 0;
+ @include msm-screen {
+ padding: 12px 20px;
+ padding-block-start: 0;
+ }
+ }
+ &:first-of-type .accordion-button.collapsed {
+ border-radius: 5px;
+ }
+ &:last-of-type .accordion-button.collapsed {
+ border-radius: 5px;
+ }
+ .accordion-button{
+ color: var(--heading-color);
+
+ padding: 20px 30px;
+ padding-inline-end: 46px;
+ font-weight: 600;
+ font-size: clampCal(16, 20);
+ font-family: var(--heading-font);
+ @include msm-screen {
+ padding: 12px 20px;
+ padding-inline-end: 36px;
+ }
+ &::after {
+ background-image: none;
+ }
+ &:focus {
+ box-shadow: none;
+ }
+ &:not(.collapsed) {
+ background-color: transparent !important;
+ box-shadow: none;
+ color: hsl(var(--main));
+ &::after {
+ background-image: none;
+ color: hsl(var(--main)); ;
+ }
+ }
+ &[aria-expanded="true"], &[aria-expanded="false"] {
+ &::after {
+ font-family: "Phosphor";
+ font-weight: 900;
+ content: "\E136";
+ color: hsl(var(--main));
+ display: inline-block;
+ position: absolute;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-end: 30px;
+ height: unset;
+
+ text-align: center;
+ @include msm-screen {
+ inset-inline-end: 20px;
+ }
+ }
+ }
+ &[aria-expanded="false"] {
+ &::after {
+ content: "\f107";
+ color: hsl(var(--heading-color));
+ }
+ }
+ }
+}
+/* ================================= Accordion Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_badge.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_badge.scss
new file mode 100644
index 0000000..7b349dd
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_badge.scss
@@ -0,0 +1,38 @@
+.badge-notification {
+ margin-bottom: 6px;
+ position: absolute;
+ inset-block-start: -18px;
+ inset-inline-start: 0;
+ animation: notification .8s infinite;
+ &::before {
+ position: absolute;
+ content: "";
+ width: 11px;
+ height: 6px;
+ background-color: inherit;
+ top: calc(100% - 1px);
+ clip-path: polygon(0% 0%, 100% 0%, 0% 100%, 0% 100%);
+ }
+}
+
+.badge-style-two::before {
+ position: absolute;
+ content: "";
+ width: 12px;
+ height: 12px;
+ background: var(--main-two-600);
+ border-radius: 2px;
+ inset-inline-start: -4px;
+ transform: translateY(-50%) rotate(45deg);
+ top: 50%;
+}
+
+
+@keyframes notification {
+ 0%, 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: .3;
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_button.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_button.scss
new file mode 100644
index 0000000..d28923f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_button.scss
@@ -0,0 +1,106 @@
+/* ================================= Button Css Start =========================== */
+.btn-check:checked+.btn, .btn.active, .btn.show, .btn:first-child:active, :not(.btn-check)+.btn:active {
+ color: none;
+ background-color: none;
+ border-color: none;
+}
+
+.btn {
+ position: relative;
+ border-radius: 5px;
+ border: 1px solid transparent;
+ font-weight: 500;
+ font-family: var(--body-font);
+ color: hsl(var(--white)) !important;
+ z-index: 1;
+ line-height: 1;
+ padding: 13px 24px;
+ &:hover, &:focus, &:focus-visible {
+ box-shadow: none !important;
+ }
+ @include xl-screen {
+ padding: 10px 20px;
+ font-size: rem(14px);
+ }
+ &-sm {
+ padding: 10px 16px !important;
+ }
+ &:active {
+ transform: scale(1.01);
+ }
+ // ============= Different Color Button Start ==================
+ &-main {
+ background-color: hsl(var(--main)) !important;
+ border-color: hsl(var(--main)) !important;
+ &:hover {
+ background-color: var(--main-800) !important;
+ border-color: var(--main-800) !important;
+ }
+ }
+ &-outline-main {
+ background-color: transparent!important;
+ border-color: hsl(var(--main)) !important;
+ color: hsl(var(--main)) !important;
+ &:hover {
+ background-color: hsl(var(--main)/.15) !important;
+ border-color: hsl(var(--main)/.4) !important;
+ }
+ }
+ &-main-two {
+ background-color: hsl(var(--main-two)) !important;
+ border-color: hsl(var(--main-two)) !important;
+ color: hsl(var(--white)) !important;
+ &:hover {
+ background-color: var(--main-two-800) !important;
+ border-color: var(--main-two-800) !important;
+ }
+ }
+ &-outline-main-two {
+ background-color: transparent!important;
+ border-color: hsl(var(--main-two)) !important;
+ color: hsl(var(--main-two)) !important;
+ &:hover {
+ background-color: hsl(var(--main-two)/.15) !important;
+ border-color: hsl(var(--main-two)/.4) !important;
+ }
+ }
+ &-white {
+ background-color: hsl(var(--white)) !important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--heading-color)) !important;
+ &:hover {
+ background-color: hsl(var(--white)/.9) !important;
+ border-color: hsl(var(--white)/.9) !important;
+ }
+ }
+ &-outline-white {
+ background-color: transparent!important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--white)) !important;
+ &:hover {
+ background-color: hsl(var(--white)) !important;
+ border-color: hsl(var(--white)) !important;
+ color: hsl(var(--heading-color)) !important;
+ }
+ }
+ &-black {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--white)) !important;
+ &:hover {
+ background-color: hsl(var(--black)/.8) !important;
+ border-color: hsl(var(--black)/.8) !important;
+ }
+ }
+ &-outline-black {
+ background-color: transparent!important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--black)) !important;
+ &:hover {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+ color: hsl(var(--white)) !important;
+ }
+ }
+}
+/* ================================= Button Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_card.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_card.scss
new file mode 100644
index 0000000..6f2969b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_card.scss
@@ -0,0 +1,30 @@
+/* ================= Common Card Css Start ========================= */
+.common-card {
+ border: 0;
+ .card-header, .card-footer {
+ padding: 12px 24px;
+ background-color: transparent;
+ border-bottom: 1px solid var(--border-color);
+ @include xsm-screen {
+ padding: 12px 16px;
+ }
+ }
+ .card-header {
+ background-color: hsl(var(--black));
+ .title {
+ color: hsl(var(--white));
+ margin-block-end: 0;
+ }
+ }
+ .card-body {
+ padding: 24px;
+ @include xsm-screen {
+ padding: 16px;
+ }
+ }
+ .card-footer {
+ border-top: 1px solid var(--border-color);
+ border-bottom: 0;
+ }
+}
+/* ================= Common Card Css End ========================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_countdown.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_countdown.scss
new file mode 100644
index 0000000..2b0696b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_countdown.scss
@@ -0,0 +1,77 @@
+/* ========================== Count Down Css Start =============================== */
+.countdown-list {
+ gap: 20px;
+ @include xl-screen {
+ gap: 6px;
+ }
+ &__item {
+ background-color: hsl(var(--white));
+ padding: clampCal(6, 12, 1399, 1599) clampCal(8, 16, 1399, 1599);
+ border-radius: 8px;
+ position: relative;
+ @include xl-screen {
+ font-size: rem(12px) !important;
+ }
+ &:last-child {
+ &::before {
+ display: none;
+ }
+ }
+ &::before {
+ position: absolute;
+ content: ":";
+ inset-block-start: 50%;
+ inset-inline-end: -10px;
+ transform: translateY(-50%);
+ font-weight: 700;
+ @include xl-screen {
+ display: none;
+ }
+ }
+ &.colon-white {
+ &::before {
+ color: #fff;
+ }
+ }
+ }
+
+ &.style-two {
+ .countdown-list {
+ &__item {
+ background-color: var(--main-600);
+ color: #fff !important;
+ &::before {
+ color: var(--main-600) !important;
+ }
+ }
+ }
+ }
+
+ &.style-three {
+ gap: 12px;
+ .countdown-list {
+ &__item {
+ background-color: var(--main-50);
+ font-size: 11px !important;
+ padding: 6px;
+ color: #1A1A1A !important;
+ }
+ }
+ }
+
+ &.style-four {
+ .countdown-list {
+ &__item {
+ width: 64px;
+ height: 64px;
+ align-items: center;
+ padding: 2px;
+ justify-content: center;
+ &::before {
+ color: var(--neutral-600);
+ }
+ }
+ }
+ }
+}
+/* ========================== Count Down Css End =============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_form.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_form.scss
new file mode 100644
index 0000000..ee6ae94
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_form.scss
@@ -0,0 +1,404 @@
+/* ================================= Form Css Start =========================== */
+/* input Start */
+.common-input {
+ border-radius: 5px;
+ font-weight: 400;
+ outline: none;
+ width: 100%;
+ padding: 17px 24px;
+ background-color: transparent !important;
+ border: 1px solid var(--gray-100);
+ color: hsl(var(--black));
+ line-height: 1;
+ &.style-two {
+ background-color: hsl(var(--white)) !important;
+ color: hsl(var(--black));
+ }
+ @include md-screen {
+ padding: 12px 24px;
+ }
+ @include sm-screen {
+ padding: 10px 16px;
+
+ }
+ &::placeholder {
+ color: var(--gray-500);
+ transition: .2s linear;
+ font-size: rem(14px);
+ font-weight: 400;
+ }
+ &--md {
+ padding: 13px 16px;
+
+ }
+ &--lg {
+ padding: 23px 24px;
+ @include sm-screen {
+ padding: 18px 24px;
+ }
+ }
+ &:focus {
+ border-color: hsl(var(--main));
+ box-shadow: none;
+ &::placeholder {
+ visibility: hidden;
+ opacity: 0;
+ }
+ }
+ &:disabled, &[readonly] {
+ background-color: hsl(var(--black)/.2);
+ opacity: 1;
+ border: 0;
+ }
+ &[type="password"] {
+ color: hsl(var(--black)/.5);
+ &:focus {
+ color: hsl(var(--black));
+ }
+ }
+ &[type="file"] {
+ line-height: 50px;
+ padding: 0;
+ position: relative;
+ &::file-selector-button {
+ border: 1px solid hsl(var(--black) / .08);
+ padding: 4px 6px;
+ border-radius: .2em;
+ background-color: hsl(var(--main)) !important;
+ transition: .2s linear;
+ line-height: 25px;
+ position: relative;
+ margin-inline-start: 15px;
+ color: hsl(var(--body-color)) !important;
+ &:hover {
+ background-color: hsl(var(--main));
+ border: 1px solid hsl(var(--main));
+ color: hsl(var(--black));
+ }
+ }
+ }
+}
+.common-input {
+ &--withIcon {
+ padding-inline-end: 50px !important;
+ }
+ &--withLeftIcon {
+ padding-inline-start: 50px !important;
+ }
+}
+/* input End */
+
+/* input icon */
+.input-icon {
+ position: absolute;
+ inset-inline-end: 24px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ color: hsl(var(--heading-color));
+
+ &--left {
+ inset-inline-start: 20px;
+ inset-inline-end: auto;
+ }
+}
+textarea+.input-icon {
+ inset-block-start: 15px;
+ transform: translateY(0);
+}
+/* input icon */
+
+/* Label */
+.form-label {
+ margin-block-end: 6px;
+ color: hsl(var(--heading-color));
+ font-weight: 500;
+}
+
+/* Form Select */
+.select-has-icon {
+ position: relative;
+ &::before {
+ position: absolute;
+ content: "\f107";
+ inset-inline-end: 20px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ font-family: "Phosphor";
+ font-weight: 900;
+
+ color: hsl(var(--main));
+ transition: 0.2s linear;
+ pointer-events: none;
+ color: hsl(var(--black)) !important;
+ }
+ &.icon-black::before {
+ -webkit-text-fill-color: hsl(var(--black));
+ }
+ select {
+ background-image: none;
+ -webkit-appearance: none;
+ padding: 20px 24px;
+ font-size: 18px;
+ @include md-screen {
+ padding: 15px 24px;
+ }
+ @include sm-screen {
+ padding: 12px 16px;
+ }
+ }
+ .common-input {
+ padding-inline-end: 30px !important;
+ }
+}
+.select {
+ color: hsl(var(--black) / .6) !important;
+ padding: 16px 24px;
+ @include md-screen {
+ padding: 11px 24px;
+ }
+ @include sm-screen {
+ padding: 9px 24px;
+
+ }
+ &:focus {
+ border-color: hsl(var(--main));
+ color: hsl(var(--black)) !important;
+ outline: none;
+ }
+ option {
+ background-color: hsl(var(--white));
+ color: hsl(var(--heading-color));
+ }
+}
+/* Form Select End */
+
+// Message Field Css
+textarea {
+ &.common-input {
+ height: 140px;
+ @include sm-screen {
+ height: 110px;
+ }
+ }
+}
+/* Autofill Css */
+input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active,
+textarea:-webkit-autofill, textarea:-webkit-autofill:hover, textarea:-webkit-autofill:focus, textarea:-webkit-autofill:active {
+ -webkit-transition: background-color 5000s ease-in-out 0s;
+ transition: background-color 5000s ease-in-out 0s;
+}
+input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill, textarea:-webkit-autofill {
+ -webkit-box-shadow: 0 0 0px 1000px transparent inset;
+ -webkit-text-fill-color: hsl(var(--heading-color)) !important;
+ caret-color: hsl(var(--heading-color));
+}
+/* Autofill Css End */
+
+/* Show Hide Password */
+input#your-password, input#confirm-password {
+ padding-inline-end: 50px;
+}
+.password-show-hide {
+ position: absolute;
+ inset-inline-end: 20px;
+ z-index: 5;
+ cursor: pointer;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ color: hsl(var(--black)/.4);
+}
+
+/* Number Arrow None */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+}
+input[type=number]{
+ -moz-appearance: textfield;
+}
+
+/* Custom Checkbox & Radio Css Start */
+.common-check {
+ @extend .flex-align;
+ margin-block-end: 16px;
+ &:last-child {
+ margin-block-end: 0;
+ }
+ a {
+ display: inline;
+ }
+ &.common-radio {
+ .form-check-input {
+ border-radius: 50%;
+ &:checked {
+ background-color: transparent !important;
+ &::after {
+ visibility: visible;
+ opacity: 1;
+ -webkit-transform: translate(-50%, -50%) scale(1);
+ transform: translate(-50%, -50%) scale(1);
+ }
+ }
+ }
+ }
+
+ .form-check-input {
+ transition: .2s linear;
+ box-shadow: none;
+ background-color: transparent;
+ box-shadow: none !important;
+ border: 0;
+ position: relative;
+ border-radius: 3px;
+ width: 18px;
+ height: 18px;
+ border: 1px solid hsl(var(--black) / .4);
+ cursor: pointer;
+ transition: .2s linear;
+ margin-block-start: 0;
+ &::before {
+ position: absolute;
+ content: "\E182";
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--white));
+ font-size: 12px;
+ inset-block-start: 50%;
+ inset-inline-start: 50%;
+ transform: translate(-50%, -50%);
+ transition: .2s linear;
+ visibility: hidden;
+ opacity: 0;
+ }
+ &::after {
+ position: absolute;
+ content: "";
+ inset-block-start: 50%;
+ inset-inline-start: 50%;
+ -webkit-transform: translate(-50%, -50%) scale(.2);
+ transform: translate(-50%, -50%) scale(.2);
+ width: 10px;
+ height: 10px;
+ background-color: hsl(var(--main));
+ border-radius: 50%;
+ transition: .2s linear;
+ z-index: 1;
+ visibility: hidden;
+ opacity: 0;
+ }
+ &:checked {
+ background-color: hsl(var(--main)) !important;
+ border-color: hsl(var(--main)) !important;
+ box-shadow: none;
+ &[type=checkbox] {
+ background-image:none;
+ }
+ &::before {
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+ }
+ .form-check-label {
+ font-weight: 500;
+ width: calc(100% - 18px);
+ padding-inline-start: 12px;
+ cursor: pointer;
+
+ color: hsl(var(--heading-color));
+ font-family: var(--poppins-font)
+ }
+}
+
+.checked {
+ &-black {
+ .form-check-input {
+ border: 1px solid hsl(var(--black));
+ &::after {
+ background-color: hsl(var(--black));
+ }
+ &:checked {
+ background-color: hsl(var(--black)) !important;
+ border-color: hsl(var(--black)) !important;
+ }
+ }
+ }
+ &-primary {
+ .form-check-input {
+ border: 1px solid var(--primary-600);
+ &::after {
+ background-color: var(--primary-600);
+ }
+ &:checked {
+ background-color: var(--primary-600) !important;
+ border-color: var(--primary-600) !important;
+ }
+ }
+ }
+ &-gray {
+ .form-check-input {
+ border: 1px solid var(--gray-600);
+ &::after {
+ background-color: var(--gray-600);
+ }
+ &:checked {
+ background-color: var(--gray-600) !important;
+ border-color: var(--gray-600) !important;
+ }
+ }
+ }
+ &-success {
+ .form-check-input {
+ border: 1px solid var(--success-600);
+ &::after {
+ background-color: var(--success-600);
+ }
+ &:checked {
+ background-color: var(--success-600) !important;
+ border-color: var(--success-600) !important;
+ }
+ }
+ }
+ &-danger {
+ .form-check-input {
+ border: 1px solid var(--danger-600);
+ &::after {
+ background-color: var(--danger-600);
+ }
+ &:checked {
+ background-color: var(--danger-600) !important;
+ border-color: var(--danger-600) !important;
+ }
+ }
+ }
+ &-purple {
+ .form-check-input {
+ border: 1px solid var(--tertiary-600);
+ &::after {
+ background-color: var(--tertiary-600);
+ }
+ &:checked {
+ background-color: var(--tertiary-600) !important;
+ border-color: var(--tertiary-600) !important;
+ }
+ }
+ }
+ &-white {
+ .form-check-input {
+ border: 1px solid var(--gray-100);
+ &::after {
+ background-color: var(--gray-100);
+ }
+ &:checked {
+ background-color: var(--gray-100) !important;
+ border-color: var(--gray-100) !important;
+ }
+ }
+ }
+}
+/* Custom Checkbox & Radio Css End */
+
+.toggle-password.active::before {
+ content: "\e220" !important;
+}
+/* ================================= Form Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_index.scss
new file mode 100644
index 0000000..f5af396
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_index.scss
@@ -0,0 +1,23 @@
+
+// accordion
+@import "accordion";
+// button
+@import "button";
+// form
+@import "form";
+// pagination
+@import "pagination";
+// tab
+@import "tab";
+// table
+@import "table";
+// card
+@import "card";
+// select2
+@import "select2";
+// countdown
+@import "countdown";
+// badge
+@import "badge";
+// range slider
+@import "range-slider";
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_pagination.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_pagination.scss
new file mode 100644
index 0000000..ca0b199
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_pagination.scss
@@ -0,0 +1,32 @@
+/* ================================= Pagination Css Start =========================== */
+.pagination {
+ margin-block-start: 64px;
+ @include lg-screen {
+ margin-block-start: 48px;
+ }
+ @include md-screen {
+ margin-block-start: 40px;
+ }
+ @include sm-screen {
+ margin-block-start: 32px;
+ }
+ .page-item {
+ &.active {
+ .page-link {
+ background-color: var(--main-600) !important;
+ border-color: var(--main-600) !important;
+ color: hsl(var(--white)) !important;
+ }
+ }
+ .page-link {
+ box-shadow: none !important;
+ &:hover, &:active, &:focus {
+ color: var(--main-600) !important;
+ background-color: var(--main-100) !important;
+ border-color: var(--main-300) !important;
+
+ }
+ }
+ }
+}
+/* ================================= Pagination Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_range-slider.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_range-slider.scss
new file mode 100644
index 0000000..5d56525
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_range-slider.scss
@@ -0,0 +1,45 @@
+/* ================================= Range Slider Css Start =========================== */
+.custom--range {
+ #slider-range {
+ height: 4px;
+ border: 0;
+ background: var(--gray-200);
+ margin: 8px;
+ .ui-slider-handle {
+ width: 16px !important;
+ height: 16px !important;
+ background-color: var(--main-600) !important;
+ border-radius: 50%;
+ top: 50%;
+ transform: translateY(-50%);
+ border: 0 !important;
+ outline: 0 !important;
+ transition: .2s linear;
+ &:hover, &.ui-state-active {
+ transform: translateY(-50%) scale(1.3);
+ }
+ &.ui-state-active {
+ box-shadow: 0px 0px 12px 4px #95959541 !important;
+ }
+ }
+ .ui-widget-header {
+ background-color: var(--main-600);
+ transition: .2s linear;
+ }
+ span {
+ &:focus {
+ background-color: var(--main-600);
+ }
+ }
+ }
+ &__prices{
+ width: 58px;
+ }
+ input {
+ border: 0;
+ color: hsl(var(--body-color));
+ font-weight: 500;
+ outline: 0;
+ }
+}
+/* ================================= Range Slider Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_select2.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_select2.scss
new file mode 100644
index 0000000..efd6b53
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_select2.scss
@@ -0,0 +1,213 @@
+/* ======================= Select 2 Css Start =========================== */
+.select2-container--default .select2-selection--single {
+ border: 0;
+}
+
+.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border: 0;
+ position: relative;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
+ position: relative;
+ content: "\e136";
+ font-family: "Phosphor";
+ font-weight: 900;
+ color: hsl(var(--heading-color) / 0.4);
+ transition: 0.2s linear;
+}
+
+.select2-container--open.select2-container--default .select2-selection--single .select2-selection__arrow b::before {
+ content: "\E13C" !important;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b {
+ border: 0 !important;
+ margin: 0 !important;
+ inset-block-start: 0 !important;
+ inset-inline-start: 0 !important;
+ position: relative !important;
+}
+
+
+.select2-container {
+ height: inherit !important;
+ width: auto !important;
+}
+
+.select2-selection.select2-selection--single {
+ height: inherit !important;
+ border: 1px solid var(--gray-200) !important;
+ background-color: transparent !important;
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+}
+.radius-end-0 {
+ .select2-selection.select2-selection--single {
+ border-start-start-radius: 50px !important;
+ border-end-start-radius: 50px !important;
+ }
+}
+
+.select2-selection.select2-selection--single {
+ position: relative;
+}
+.select2-container .selection {
+ height: inherit;
+}
+
+.select2-selection__arrow {
+ right: 16px !important;
+ inset-block-start: 50% !important;
+ transform: translateY(-50%) !important;
+ width: unset !important;
+ @include lg-screen {
+ right: 6px !important;
+ }
+}
+
+.select2-container .select2-selection--single .select2-selection__rendered {
+ padding-inline-start: 24px !important;
+ padding-inline-end: 40px !important;
+ @include lg-screen {
+ padding-inline-start: 10px !important;
+ padding-inline-end: 24px !important;
+ }
+}
+
+.select-border-end-0 {
+ .select2-selection.select2-selection--single {
+ border-inline-end: 0 !important;
+ }
+}
+
+
+
+.select2-dropdown {
+ border: 1px solid var(--gray-100) !important;
+ padding: 10px !important;
+ border-radius: 6px !important;
+ min-width: 200px;
+ @include sm-screen {
+ min-width: 170px;
+ }
+ @include xsm-screen {
+ min-width: 150px;
+ }
+}
+
+.select2-search--dropdown {
+ padding: 0 !important;
+}
+
+.select2-container--default .select2-search--dropdown .select2-search__field {
+ border: 1px solid var(--gray-100) !important;
+ border-radius: 6px !important;
+ padding: 4px 10px;
+}
+.select2-container--default .select2-search--dropdown .select2-search__field:focus-visible {
+ outline: 1px solid var(--main-200);
+}
+
+.select2-results {
+ margin-block-start: 8px !important;
+}
+
+
+.select2-results__option.select2-results__option--selectable {
+ border-radius: 6px !important;
+ padding: 6px 12px !important;
+ color: var(--gray-500);
+ font-size: 14px !important;
+ @include sm-screen {
+ padding: 4px 10px !important;
+ font-size: 12px !important;
+ }
+}
+
+.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable {
+ background-color: var(--main-600) !important;
+ color: white !important;
+}
+.select2-results__option.select2-results__option--selectable:hover {
+ background-color: var(--main-100) !important;
+ color: var(--main-600) !important;
+}
+
+.select2-container--default .select2-results__option--selected, .select2-container--default .select2-results__option--selected:hover {
+ background-color: var(--main-600) !important;
+ color: #fff !important;
+}
+
+.select2-container--default .select2-results>.select2-results__options {
+ padding-inline-end: 8px;
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+ &::-webkit-scrollbar-track {
+ background: #e4e4e4;
+ }
+ &::-webkit-scrollbar-thumb {
+ background: #a2a2a2;
+ border-radius: 50px;
+ }
+ &::-webkit-scrollbar-thumb:hover {
+ background: #6d6d6d;
+ }
+}
+
+
+.select2-container--open {
+ &.select2-container--default .select2-selection--single {
+ .select2-selection__rendered {
+ color: var(--main-600) !important;
+ }
+ .select2-selection__arrow b::before {
+ color: var(--main-600) !important;
+ }
+ }
+}
+
+
+/* Location Box Css */
+.location-box {
+ .select2-container .select2-selection--single .select2-selection__rendered {
+ padding-inline-start: 0px !important;
+ padding-inline-end: 50px !important;
+ }
+ .select2-selection__arrow {
+ right: 0px !important;
+ inset-block-start: 10% !important;
+ }
+ .select2-selection.select2-selection--single {
+ border: 0 !important;
+ }
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
+ line-height: 14px;
+ color: var(--gray-900);
+ font-weight: 700;
+ font-family: var(--heading-font-two);
+ }
+}
+
+
+.select2-container--open .select2-dropdown {
+ @include md-screen {
+ left: -74px;
+ }
+ @include xsm-screen {
+ left: -40px;
+ }
+}
+
+
+@include md-screen {
+ .location-box, .search-category.h-48 {
+ height: 40px !important;
+ .select2-selection__rendered {
+ font-size: 12px;
+ }
+ }
+}
+/* ======================= Select 2 Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_tab.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_tab.scss
new file mode 100644
index 0000000..bb90a79
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_tab.scss
@@ -0,0 +1,47 @@
+/* ================================= Tab Css Start =========================== */
+.common-tab {
+ margin-block-end: 20px;
+ gap: 8px;
+ .nav-item {
+ border-bottom: 0;
+ .nav-link {
+ color: var(--gray-500);
+ padding: 9px 24px !important;
+ background-color: transparent;
+ transition: .2s linear;
+ border: 1px solid var(--border-color);
+ position: relative;
+ font-weight: 400;
+ overflow: hidden;
+ border-radius: 50px;
+ font-size: 16px;
+ @include xl-screen {
+ padding: 6px 16px !important;
+ font-size: rem(14px);
+ }
+ &.active {
+ color: hsl(var(--white)) !important;
+ border-color: var(--main-600) !important;
+ background-color: var(--main-600) !important;
+ }
+ &:hover {
+ color: var(--main-600);
+ }
+ }
+ }
+ &.style-two {
+ .nav-link {
+ border: 1px solid var(--gray-100);
+ color: var(--neutral-600);
+ &.active {
+ color: hsl(var(--white)) !important;
+ border-color: var(--main-two-600) !important;
+ background-color: var(--main-two-600) !important;
+ }
+ &:hover {
+ color: var(--main-two-600);
+ }
+ }
+ }
+}
+/* ================================= Tab Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_table.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_table.scss
new file mode 100644
index 0000000..fd4a020
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/components/_table.scss
@@ -0,0 +1,95 @@
+/* ======================= Common Table Css Start ======================= */
+.table-card {
+ border: 1px solid hsl(var(--white)/.2);
+ border-radius: 10px;
+ padding: clampCal(20, 36);
+}
+.table {
+ color: hsl(var(--white));
+ margin-block-end: 0;
+ min-width: max-content;
+ &>:not(caption)>*>* {
+ border-bottom: 0;
+ }
+ tr {
+ th {
+ padding-inline-start: 0;
+ padding: 32px;
+ &:first-child {
+ padding-inline-start: 0;
+ }
+ &:last-child {
+ padding-inline-end: 0;
+ }
+ }
+ th, td {
+ text-align: center;
+ vertical-align: middle;
+ &:first-child {
+ text-align: left;
+ }
+ &:last-child {
+ text-align: right;
+ padding-inline-end: 0;
+ }
+ }
+ }
+ thead {
+ tr {
+ border-bottom: 1px solid hsl(var(--white)/.2);
+ th {
+ padding-block-start: 0;
+ font-size: clampCal(16, 20);
+ font-weight: 400;
+ padding-block-end: clampCal(16, 30);
+ }
+ }
+ }
+ tbody {
+ tr {
+ border-bottom: 1px solid hsl(var(--white)/.2);
+ &:last-child {
+ border-bottom: 0;
+ td {
+ padding-block-end: 0;
+ }
+ }
+ td {
+ font-size: clampCal(14, 16);
+ font-weight: 400;
+ padding: clampCal(16, 30) 0;
+ }
+ }
+ }
+
+ &.style-two {
+ color: hsl(var(--heading-color));
+ thead tr, tbody tr {
+ border-bottom: 1px solid hsl(var(--black)/.1);
+ }
+ thead tr th {
+ padding-block-end: 16px;
+ font-size: 15px;
+ }
+ }
+ &.style-three {
+ tbody tr {
+ border-bottom: 1px solid var(--gray-100);
+ &:last-child {
+ border: 0;
+ }
+ td {
+ &:first-child {
+ padding-inline-start: 0;
+ }
+ &:last-child {
+ padding-inline-end: 0;
+ }
+ }
+ td {
+ padding: clampCal(24, 40) 24px;
+ }
+ }
+ }
+}
+/* ======================= Common Table Css End ======================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_footer.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_footer.scss
new file mode 100644
index 0000000..883536d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_footer.scss
@@ -0,0 +1,32 @@
+
+/* ============= Footer Start Here ======================= */
+.footer {
+ margin-block-start: auto;
+ &-item-wrapper {
+ gap: clampCal(32, 44, 1199, 1899);
+ }
+ &-item-two-wrapper {
+ gap: clampCal(32, 90, 1199, 1899);
+ }
+ &-item {
+ &__logo {
+ margin-block-end: 20px;
+ a {
+ img {
+ width: 100%;
+ height: 100%;
+ max-width: 190px;
+ max-height: 64px;
+ }
+ }
+ }
+ }
+}
+
+.body-bottom-bg {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ z-index: -1;
+}
+/* ============= Footer End Here ======================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-middle.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-middle.scss
new file mode 100644
index 0000000..aaf544b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-middle.scss
@@ -0,0 +1,168 @@
+/* =========================== header Middle Css Start =============================== */
+.header-middle {
+ padding: 30px 0;
+ &.style-two {
+ padding: 24px 0;
+ }
+ @include xl-screen {
+ padding: 24px 0;
+ }
+ @include lg-screen {
+ padding: 16px 0 !important;
+ }
+ @include md-screen {
+ padding: 8px 0 !important;
+ }
+
+ .location-box {
+ @include lg-screen {
+ padding: 6px 8px !important;
+ }
+ @include sm-screen {
+ padding-left: 14px !important;
+ }
+ }
+}
+
+.form-location-wrapper {
+ gap: clampCal(8, 16, 1199, 1599);
+}
+
+/* Search Form Css Here */
+.search-form {
+ @include md-screen {
+ .select2-selection.select2-selection--single {
+ border-radius: 50px !important;
+ border-radius: 50px !important;
+ background-color: hsl(var(--white)) !important;
+ border: 1px solid var(--gray-100) !important;
+ }
+ }
+ &__wrapper {
+ @include md-screen {
+ display: none;
+ }
+ }
+ &__input {
+ border-color: var(--gray-200) !important;
+ width: 520px;
+ @include xxl-screen {
+ width: 400px;
+ }
+ @include xl-screen {
+ width: 300px;
+ }
+ @include lg-screen {
+ width: 200px;
+ }
+ }
+}
+
+/* Header Activities Css Start */
+.header-two-activities {
+ @include xl-screen {
+ gap: 24px !important;
+ }
+ @include md-screen {
+ gap: 16px !important;
+ }
+ @include sm-screen {
+ gap: 10px !important;
+ }
+
+ @include md-screen {
+ .item-hover-two {
+ > span {
+ font-size: 18px !important;
+ color: var(--neutral-600) !important;
+ }
+ }
+ }
+}
+/* Header Activities Css End */
+
+
+/* Header Activities Css start */
+.search-category {
+ &.style-two {
+ background-color: hsl(var(--white));
+ border-radius: 8px;
+ overflow: hidden;
+ .select2-container--default .select2-selection--single {
+ border-radius: 0;
+ border-left: 0 !important;
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+ }
+ }
+}
+/* Header Activities Css End */
+
+
+/* Category Dropdown Responsive Css Start */
+@include md-screen {
+ .responsive-dropdown {
+ position: fixed;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ visibility: visible;
+ opacity: 1;
+ margin-top: 0;
+ border-radius: 0;
+ width: unset !important;
+ height: 100vh;
+ overflow-y: auto;
+ transform: translateX(-100%);
+ padding-top: 8px !important;
+ &.active {
+ transform: translateX(0);
+ }
+ ul {
+ max-height: 100% !important;
+ li {
+ &.active {
+ > a {
+ background: var(--gray-50);
+ color: var(--gray-800) !important;
+ font-weight: 600;
+ .icon {
+ transform: rotate(90deg);
+ }
+ }
+ }
+ a {
+ border-bottom: 1px solid var(--gray-100);
+ }
+ }
+ }
+ .submenus-submenu{
+ position: static;
+ visibility: visible;
+ opacity: 1;
+ box-shadow: none;
+ border-radius: 0;
+ margin-left: 40px;
+ width: unset;
+ padding-top: 8px !important;
+ display: none;
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ &__title {
+ display: none;
+ }
+ &__list {
+ max-height: unset !important;
+ li {
+ a {
+ padding-left: 16px;
+ &::before {
+ inset-inline-start: 0;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+/* Category Dropdown Responsive Css End */
+/* =========================== header Middle Css End =============================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-top.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-top.scss
new file mode 100644
index 0000000..f8c2c54
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header-top.scss
@@ -0,0 +1,104 @@
+/* =========================== header top Css Start =============================== */
+.header-top {
+ &__right {
+ @include sm-screen {
+ width: 100%;
+ li {
+ &:last-child {
+ margin-inline-start: auto;
+ }
+ &:nth-last-child(2) {
+ margin-inline-end: 0 !important;
+ padding-inline-end: 0 !important;
+ &::before {
+ display: none;
+ }
+ }
+
+ }
+ }
+ &.style-two {
+ > li {
+ padding-inline-end: 16px !important;
+ margin-inline-end: 0 !important;
+ &:last-child {
+ padding-inline-end: 0 !important;
+ }
+ &::before {
+ display: none !important;
+ }
+ a {
+ padding-inline-end: 20px;
+ @include md-screen {
+ color: #fff !important;
+ }
+ &::before {
+ color: var(--heading-color) !important;
+ font-size: 14px !important;
+ }
+ }
+ > ul {
+ inset-inline-end: auto !important;
+ inset-inline-start: calc(-100% + -24px) !important;
+ li a {
+ @include md-screen {
+ color: var(--neutral-600) !important;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+@include md-screen {
+ .border-right-item {
+ a {
+ font-size: 12px !important;
+ }
+ }
+}
+
+.border-right-item {
+ position: relative;
+ &:not(:last-child) {
+ margin-inline-end: 24px;
+ padding-inline-end: 24px;
+ @include xl-screen {
+ margin-inline-end: 16px !important;
+ padding-inline-end: 16px !important;
+ }
+ @include lg-screen {
+ margin-inline-end: 10px !important;
+ padding-inline-end: 10px !important;
+ }
+ &::before {
+ position: absolute;
+ content: "";
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-end: 0;
+ width: 1px;
+ height: 15px;
+ background-color: hsl(var(--white)/.3);
+ }
+ }
+ &-sm-space {
+ &:not(:last-child) {
+ margin-inline-end: 20px;
+ padding-inline-end: 20px;
+ }
+ }
+}
+/* Has Dropdown Css */
+.arrow-white {
+ > a {
+ padding-inline-end: 12px;
+ &::before {
+ color: hsl(var(--white)) !important;
+ font-size: 8px;
+ }
+ }
+}
+
+/* =========================== header top Css End =============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header.scss
new file mode 100644
index 0000000..9929dad
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_header.scss
@@ -0,0 +1,313 @@
+/* ============= Header Start Here ======================= */
+.header {
+ transition: .2s linear;
+ &.fixed-header {
+ position: fixed;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ inset-inline-end: 0;
+ width: 100%;
+ z-index: 8;
+ backdrop-filter: blur(24px);
+ animation: slideDown 0.35s ease-out;
+ box-shadow: 0 5px 16px rgba(0, 0, 0, 0.1);
+ @include md-screen {
+ inset-block-start: -1px;
+ }
+ }
+}
+
+@keyframes slideDown {
+ from {
+ transform: translateY(-100%);
+ }
+ to {
+ transform: translateY(0);
+ }
+}
+
+.logo {
+ img {
+ max-width: 200px;
+ @include xsm-screen {
+ max-width: 148px;
+ }
+ }
+}
+
+/* Header Menu and Submenu Css Start */
+.nav-menu {
+ gap: 32px;
+ @include xl-screen {
+ gap: 24px;
+ }
+ @include lg-screen {
+ gap: 16px;
+ }
+ &__item {
+ &.activePage {
+ > a {
+ color: hsl(var(--main));
+ &::before {
+ color: hsl(var(--main));
+ }
+ }
+ }
+ &:hover {
+ > a {
+ color: var(--gray-400);
+ @media (min-width: 992px) {
+ color: hsl(var(--main));
+ }
+ }
+ }
+ }
+ &__link {
+ color: var(--gray-400);
+ font-weight: 500;
+ width: 100%;
+ padding: 16px 0;
+ width: 100%;
+ @media (max-width: 1299px) {
+ font-size: rem(14px);
+ }
+ @include lg-screen {
+ font-size: rem(13px);
+ }
+ }
+
+ .common-dropdown__link {
+ @media (max-width: 1299px) {
+ font-size: rem(14px);
+ }
+ @include lg-screen {
+ font-size: rem(13px);
+ }
+ }
+}
+
+.has-submenu {
+ position: relative;
+ .nav-menu {
+ &__link {
+ padding-inline-end: 16px;
+ }
+ }
+
+ &.active {
+ > a, > a::before{
+ color: hsl(var(--main));
+ }
+ > a::before {
+ transform: translateY(-50%) rotate(180deg) !important;
+ }
+ }
+ > a {
+ position: relative;
+ &::before {
+ position: absolute;
+ content: "\E136";
+ inset-inline-end: 0;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ font-family: 'Phosphor';
+ font-weight: 900;
+ color: hsl(var(--heading-color)/.4);
+ transition: .2s linear;
+ }
+ }
+}
+
+/* Submenu Start */
+.common-dropdown {
+ position: absolute;
+ inset-inline-start: 0;
+ @extend .box-shadow-lg;
+ inset-block-start: 100%;
+ width: max-content;
+ background-color: hsl(var(--white));
+ border-radius: 6px;
+ min-width: 190px;
+ overflow: hidden;
+ padding: 8px;
+ transition: .2s linear;
+ z-index: 99;
+ @media (min-width: 992px) {
+ max-height: 400px;
+ overflow-y: auto;
+ }
+ &--sm {
+ width: 132px;
+ min-width: unset;
+ }
+ &__item {
+ display: block;
+ border-radius: 4px;
+ transition: .2s linear;
+ position: relative;
+ @include md-screen {
+ border-radius: 0;
+ }
+ &.activePage {
+ .common-dropdown {
+ &__link {
+ color: hsl(var(--main)) !important;
+ }
+ }
+ }
+ }
+ &__link {
+ color: var(--gray-400);
+ font-weight: 500;
+ width: 100%;
+ padding-inline-end: 16px;
+ width: 100%;
+ padding: 8px 14px;
+ border-radius: inherit;
+ &:hover {
+ color: var(--gray-600) !important;
+ }
+ &::before {
+ position: absolute;
+ }
+ }
+}
+/* Submenu End */
+/* Header Menu and Submenu Css End */
+
+
+/* Category Submenus Submenu Css Start */
+.menu-category-wrapper {
+ gap: clampCal(12, 72, 1199, 1699);
+}
+
+.submenus-submenu-wrapper {
+ overflow: unset;
+}
+
+.submenus-submenu {
+ position: absolute;
+ z-index: 99999999999;
+ background: hsl(var(--white));
+ width: 300px;
+ inset-inline-start: 100%;
+ inset-block-start: 0px;
+ @extend .box-shadow-lg;
+ border-radius: 6px;
+ visibility: hidden;
+ opacity: 0;
+ overflow: hidden;
+ &__list {
+ li {
+ a {
+ padding: 10px 16px;
+ padding-inline-start: 32px;
+ display: block;
+ color: var(--gray-500);
+ position: relative;
+ &::before {
+ position: absolute;
+ content: "";
+ width: 8px;
+ height: 8px;
+ inset-inline-start: 16px;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ background: var(--gray-300);
+ border-radius: 80%;
+ transition: 0.2s linear;
+ }
+ &:hover {
+ background-color: var(--gray-50);
+ color: var(--gray-800);
+ font-weight: 600;
+ &::before {
+ background: var(--gray-600);
+ }
+ }
+ }
+ }
+ }
+}
+
+@media (min-width: 991px) {
+ .has-submenus-submenu {
+ &:hover {
+ > a {
+ background-color: var(--gray-50);
+ color: var(--gray-900) !important;
+ font-weight: 600;
+ }
+ .submenus-submenu {
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+ }
+}
+
+.category {
+ .category__button {
+ @include sm-screen {
+ padding: 12px 3px !important;
+ font-size: 12px !important;
+ }
+ @include msm-screen {
+ padding-left: 10px !important;
+ }
+ }
+ @media (min-width: 992px) {
+ &:hover {
+ .category__button {
+ color: var(--main-600) !important;
+ background-color: var(--gray-50) !important;
+ .arrow-icon i::before {
+ content: "\E13C";
+ }
+ }
+ }
+ }
+}
+
+/* Style Two */
+.category-two {
+ position: relative;
+ @media (min-width: 992px) {
+ width: 265px;
+ }
+ .category__button {
+ width: 100%;
+ @include msm-screen {
+ font-size: 12px;
+ padding: 8px 4px !important;
+ }
+ &.active .arrow-icon i::before {
+ content: "\E13A";
+ }
+ }
+}
+.responsive-dropdown.style-two {
+ width: 100%;
+ border-radius: 0 0 16px 16px;
+ width: 265px;
+ max-height: 900px;
+ .responsive-dropdown__list {
+ max-height: 900px;
+ @include lg-screen {
+ max-height: 438px;
+ }
+ }
+ @media (min-width: 992px) {
+ z-index: 1;
+ }
+}
+
+/* Category Submenus Submenu Css End */
+
+.header-border-0 {
+ .header {
+ border-bottom: 0 !important;
+ }
+}
+
+/* ================================= Header Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_index.scss
new file mode 100644
index 0000000..329d36b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_index.scss
@@ -0,0 +1,20 @@
+// preloader
+@import "preloader";
+// header Top
+@import "header-top";
+// header
+@import "header";
+// header Middle
+@import "header-middle";
+// mobile menu
+@import "mobile-nav-menu";
+// footer
+@import "footer";
+// scroll top
+@import "scroll-top";
+// search form
+@import "search-form";
+// slick
+@import "slick";
+// section heading
+@import "section-heading";
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_mobile-nav-menu.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_mobile-nav-menu.scss
new file mode 100644
index 0000000..df55154
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_mobile-nav-menu.scss
@@ -0,0 +1,85 @@
+
+
+/* Mobile Menu Sidebar Start */
+.mobile-menu {
+ position: fixed;
+ background-color: hsl(var(--white));
+ width: 300px;
+ height: 100vh;
+ overflow-y: auto;
+ padding: 24px;
+ z-index: 991;
+ transform: translateX(-100%);
+ transition: .2s linear;
+ padding-block-end: 68px;
+ &.active {
+ transform: translateX(0%);
+ }
+}
+.close-button {
+ position: absolute;
+ inset-inline-end: 8px;
+ inset-block-start: 8px;
+ width: 28px;
+ height: 28px;
+ background-color: var(--gray-200);
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ transition: .2s;
+ &:hover {
+ background-color: hsl(var(--black));
+ color: hsl(var(--white));
+ }
+}
+
+.nav-menu {
+ &--mobile {
+ display: block;
+ margin-block-start: 16px;
+ .nav-menu {
+ &__item {
+ > a {
+ &::before {
+ transform: translateY(-50%) rotate(0deg);
+ }
+ }
+ }
+ &__link {
+ border-bottom: 1px solid var(--gray-100) !important;
+ position: relative;
+ padding: 12px 0;
+ padding-inline-end: 16px;
+
+ }
+ }
+ .nav-submenu {
+ position: static;
+ visibility: visible;
+ opacity: 1;
+ box-shadow: none;
+ width: 100%;
+ margin-block-start: 0;
+ padding: 0;
+ margin-inline-start: 16px;
+ display: none;
+ transition: 0s;
+ &__link {
+ width: 100%;
+ padding: 10px 0;
+ border-bottom: 1px solid var(--gray-100) !important;
+ }
+ &__item {
+ &:hover {
+ background-color: transparent;
+ color: hsl(var(--main));
+ }
+ &::before {
+ display: none;
+ }
+ }
+ }
+ }
+}
+/* Mobile Menu Sidebar Start */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_preloader.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_preloader.scss
new file mode 100644
index 0000000..bc3f15c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_preloader.scss
@@ -0,0 +1,14 @@
+/* ================================= preload Css Start =========================== */
+.preloader {
+ background-color: hsl(var(--white));
+ inset-block-end: 0;
+ inset-inline-start: 0;
+ position: fixed;
+ inset-inline-end: 0;
+ inset-block-start: 0;
+ z-index: 9999;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+/* ================================= preload Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_scroll-top.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_scroll-top.scss
new file mode 100644
index 0000000..9a56e96
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_scroll-top.scss
@@ -0,0 +1,72 @@
+
+/* ===================== Scroll to Top Start ================================= */
+ .progress-wrap {
+ position: fixed;
+ inset-inline-end: 36px;
+ inset-block-end: 36px;
+ height: 46px;
+ line-height: 46px;
+ width: 46px;
+ cursor: pointer;
+ display: block;
+ border-radius: 50px;
+ box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.2);
+ z-index: 10000;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(15px);
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+ background-color: transparent;
+ @include md-screen {
+ inset-inline-end: 24px;
+ inset-block-end: 24px;
+ height: 40px;
+ width: 40px;
+ line-height: 40px;
+ }
+ &.active-progress {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+ }
+ &:hover {
+ transform: scale(1.06);
+ }
+ &::after {
+ position: absolute;
+ font-family: 'Phosphor';
+ font-weight: 900;
+ content: '\E08E';
+ text-align: center;
+ height: 46px;
+ width: 46px;
+ line-height: 46px;
+ font-size: 18px;
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ cursor: pointer;
+ display: block;
+ z-index: 1;
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+ color: hsl(var(--main)) !important;
+ @include md-screen {
+ height: 40px;
+ width: 40px;
+ line-height: 40px;
+ }
+ }
+ }
+
+ .progress-wrap svg path {
+ fill: none;
+ }
+ .progress-wrap svg.progress-circle path {
+ stroke: hsl(var(--main));
+ stroke-width: 5;
+ box-sizing: border-box;
+ -webkit-transition: all 200ms linear;
+ transition: all 200ms linear;
+ }
+/* ===================== Scroll to Top End ================================= */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_search-form.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_search-form.scss
new file mode 100644
index 0000000..5432f7e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_search-form.scss
@@ -0,0 +1,20 @@
+.search-box {
+ position: fixed;
+ width: 100%;
+ height: 100%;;
+ z-index: 9;
+ background: hsl(var(--black));
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ visibility: hidden;
+ opacity: 0;
+ transition: .2s linear;
+ transform: scale(.8);
+ z-index: 9;
+ &.active {
+ visibility: visible;
+ opacity: 1;
+ transform: scale(1);
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_section-heading.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_section-heading.scss
new file mode 100644
index 0000000..8263596
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_section-heading.scss
@@ -0,0 +1,18 @@
+/* ================== Section Heading Css Start ========================= */
+.section-heading {
+ margin-bottom: 40px;
+ @include lg-screen {
+ margin-bottom: 24px;
+ }
+
+ &.writing-mode {
+ @media (min-width: 1200px) {
+ writing-mode: vertical-lr;
+ transform: rotate(180deg);
+ }
+ @media (max-width: 1199px) {
+ margin-bottom: 60px !important;
+ }
+ }
+}
+/* ================== Section Heading Css End ========================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_slick.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_slick.scss
new file mode 100644
index 0000000..5b6621f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/layout/_slick.scss
@@ -0,0 +1,99 @@
+/* ================= Slick Arrow & Dots css Start ================ */
+.slick-initialized.slick-slider {
+ .slick-track {
+ display: flex;
+ }
+ .slick-slide {
+ cursor: grab;
+ height: auto;
+ margin: 0 10px;
+ > div {
+ height: 100%;
+ > div {
+ height: 100%;
+ }
+ }
+ }
+}
+
+/* Slick Slider Arrow */
+.slick-arrow {
+ width: 48px;
+ height: 48px;
+ &:active {
+ transform: scale(1.02);
+ }
+ @include md-screen {
+ width: 40px;
+ height: 40px;
+ }
+ @include sm-screen {
+ width: 32px;
+ height: 32px;
+ }
+}
+
+
+/* Arrow Style Two */
+.arrow-center {
+ position: relative;
+ .slick-arrow {
+ position: absolute;
+ inset-block-start: 50%;
+ transform: translateY(-50%);
+ inset-inline-start: 16px;
+ z-index: 2;
+ &.slick-next {
+ inset-inline-start: auto;
+ inset-inline-end: 16px;
+ }
+ }
+}
+
+.slick-arrows-style-three {
+ .slick-arrow {
+ visibility: hidden;
+ opacity: 0;
+ }
+ &:hover {
+ .slick-arrow {
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+}
+
+/* Dots Css Start */
+.slick-dots {
+ text-align: center;
+ position: absolute;
+ inset-block-end: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ z-index: 1;
+ line-height: 1;
+ li {
+ display: inline-block;
+ display: flex;
+ button {
+ border: none;
+ background-color: hsl(var(--white)/.3 );
+ color: hsl(var(--white));;
+ margin: 0 3px;
+ width: 12px;
+ height: 12px;
+ border-radius: 1px;
+ border-radius: 50px;
+ text-indent: -9999px;
+ transition: .3s linear;
+ }
+ &.slick-active button {
+ width: 40px;
+ background-color: hsl(var(--main-two));
+ }
+ }
+}
+/* Dots Css End */
+/* ================= Slick Arrow & Dots css Start ================ */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/main.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/main.scss
new file mode 100644
index 0000000..b7e1814
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/main.scss
@@ -0,0 +1,12 @@
+// abstract
+@import "abstracts/index";
+// Component
+@import "components/index";
+// utilities
+@import "utilities/index";
+// Module
+@import "layout/index";
+// All partials
+@import "partials/index";
+
+@import "extra"
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/_index.scss
new file mode 100644
index 0000000..c89e504
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/_index.scss
@@ -0,0 +1,5 @@
+
+@import "home/index";
+@import "home-two/index";
+@import "homeThree/index";
+@import "othersPage/index";
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_banner-two.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_banner-two.scss
new file mode 100644
index 0000000..2939c8d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_banner-two.scss
@@ -0,0 +1,47 @@
+/* ================================= Banner Two Css Start ================================= */
+.banner-item-two {
+ padding: 186px clamp(2rem, -10.739rem + 17vw, 6.25rem) 186px;
+ position: relative;
+ @include lg-screen {
+ padding: 86px clampCal(32, 100, 1199, 1599) 86px;
+ }
+ @include md-screen {
+ padding: 60px clampCal(32, 100, 1199, 1599) 60px;
+ }
+ @include sm-screen {
+ padding: 40px clampCal(32, 100, 1199, 1599) 40px;
+ }
+ &-wrapper {
+ margin: 32px;
+ margin-inline-end: 0;
+ @include md-screen {
+ margin-inline-start: 0;
+ }
+ }
+ &__content {
+ max-width: 504px;
+ @include md-screen {
+ max-width: 362px;
+ }
+ @include msm-screen {
+ max-width: 320px;
+ }
+ }
+ &__title {
+ @include msm-screen {
+ font-size: 1.5rem;
+ }
+ }
+ &__thumb {
+ inset-inline-end: clampCal(24, 140, 1199, 1599);
+ text-align: end;
+ max-width: 41%;
+ @include msm-screen {
+ max-width: 50%;
+ position: relative !important;
+ margin-top: 32px;
+ inset-inline-end: 0;
+ }
+ }
+}
+/* ================================= Banner Two Css End ================================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_color-two.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_color-two.scss
new file mode 100644
index 0000000..94166ec
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_color-two.scss
@@ -0,0 +1,36 @@
+/* Home Two Css Start */
+.color-two {
+ &:root {
+ --main-h: 24;
+ --main-s: 100%;
+ --main-l: 49%;
+ }
+}
+
+.font-exo {
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ font-family: var(--heading-font-two);
+ }
+ h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
+ font-family: var(--heading-font-two);
+ }
+}
+.font-outfit {
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ font-family: var(--heading-font-three);
+ }
+ h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
+ font-family: var(--heading-font-three);
+ }
+}
+/* Home Two Css End */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_day-sale.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_day-sale.scss
new file mode 100644
index 0000000..4a418cf
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_day-sale.scss
@@ -0,0 +1,9 @@
+/* */
+.day-sale {
+ &-box {
+ &__content {
+ max-width: 500px;
+ }
+ }
+}
+/* */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_deals.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_deals.scss
new file mode 100644
index 0000000..29c1f81
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_deals.scss
@@ -0,0 +1,7 @@
+/* Week Deals Start */
+.deal-week-box {
+ &__content {
+ padding: clampCal(24, 60) 0;
+ }
+}
+/* Week Deals End */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_discount.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_discount.scss
new file mode 100644
index 0000000..ff66a79
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_discount.scss
@@ -0,0 +1,12 @@
+/* =============================== Discount css Start ============================ */
+.discount-item {
+ padding: clampCal(24, 48, 1199, 1599);
+ &__content{
+ max-width: 320px;
+ }
+}
+
+.discount-three-item {
+ padding: clampCal(32, 136) clampCal(24, 56);
+}
+/* =============================== Discount css End ============================ */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_featured-products.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_featured-products.scss
new file mode 100644
index 0000000..3213b6a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_featured-products.scss
@@ -0,0 +1,9 @@
+/* ================================ Featured Products Css Start ============================ */
+.featured-products {
+ .product-card {
+ @include xsm-screen {
+ flex-direction: column;
+ }
+ }
+}
+/* ================================ Featured Products Css End ============================ */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_index.scss
new file mode 100644
index 0000000..a1ca02e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_index.scss
@@ -0,0 +1,9 @@
+@import 'color-two';
+@import 'banner-two';
+@import 'deals';
+@import 'trending-products';
+@import 'discount';
+@import 'popular-products';
+@import 'day-sale';
+@import 'top-brand';
+@import 'featured-products';
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_popular-products.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_popular-products.scss
new file mode 100644
index 0000000..260e052
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_popular-products.scss
@@ -0,0 +1,9 @@
+/* ====================== Popular Products Start ==================== */
+.popular-products {
+ .product-card {
+ @include sm-screen {
+ flex-direction: column;
+ }
+ }
+}
+/* ====================== Popular Products End ==================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_top-brand.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_top-brand.scss
new file mode 100644
index 0000000..2e6d3e1
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_top-brand.scss
@@ -0,0 +1,10 @@
+/* ========================== Top Brand Section Start ================================ */
+.top-brand {
+ &__item {
+ max-height: 84px;
+ max-width: 160px;
+ width: 100%;
+ aspect-ratio: 1;
+ }
+}
+/* ========================== Top Brand Section End ================================ */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_trending-products.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_trending-products.scss
new file mode 100644
index 0000000..a3410ae
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home-two/_trending-products.scss
@@ -0,0 +1,25 @@
+/* ============================ trending products css Start =========================== */
+.trending-products-three {
+ .product-card__thumb {
+ height: 330px;
+ }
+}
+
+.trending-products {
+ &-box {
+ background-color: #F3EDDE;
+ &__title {
+ max-width: 364px;
+ margin: 0 auto;
+ }
+ }
+}
+
+.expand-btn {
+ color: var(--neutral-600);
+}
+.expand-icons {
+ display: none;
+ flex-direction: column;
+}
+/* ============================ trending products css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_banner.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_banner.scss
new file mode 100644
index 0000000..cb685f2
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_banner.scss
@@ -0,0 +1,115 @@
+/* ============================== Banner Css Start ========================== */
+.banner {
+ margin-top: 32px;
+ @include sm-screen {
+ margin-bottom: 32px;
+ }
+ .slick-slider {
+ position: unset;
+ }
+ .slick-initialized.slick-slider .slick-slide {
+ margin: 0;
+ }
+}
+
+.banner-item {
+ position: relative;
+ padding-block-start: clampCal(32, 100, 768, 1599);
+ padding-block-end: clampCal(32, 220, 768, 1599);
+ padding-inline-start: clampCal(16, 142, 992, 1599);
+ padding-inline-end: clampCal(16, 76, 992, 1599);
+ -webkit-mask-image: url("~/public/assets/images/bg/banner-bg2.png");
+ mask-image: url("~/public/assets/images/bg/banner-bg2.png");
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ background: #d3ebc0;
+ mask-position: top;
+ mask-size: 100% 100%;
+ gap: clampCal(24, 72);
+ @include sm-screen {
+ mask-image: none;
+ overflow: unset !important;
+ }
+
+ &__title {
+ margin-block-end: clampCal(16, 60);
+ @include xxl-screen {
+ font-size: rem(56px);
+ }
+ @include lg-screen {
+ font-size: rem(46px);
+ }
+ @include md-screen {
+ font-size: rem(28px);
+ }
+ @include sm-screen {
+ font-size: rem(26px);
+ }
+ }
+ &__content {
+ max-width: 852px;
+ @include xxl-screen {
+ max-width: 750px;
+ }
+ }
+ &__thumb {
+ img {
+ @include msm-screen {
+ max-width: 350px;
+ width: 100%;
+ }
+ }
+ }
+}
+
+.banner-slider__inner {
+ @include msm-screen {
+ flex-wrap: wrap;
+ }
+}
+
+.scroll-down {
+ width: 94px;
+ height: 94px;
+ position: relative;
+ margin-bottom: 24px;
+ z-index: 2;
+ @include xl-screen {
+ width: 74px;
+ height: 74px;
+ margin-bottom: 16px;
+ }
+ @include sm-screen {
+ margin-bottom: -36px;
+ }
+ &::before {
+ position: absolute;
+ content: "";
+ width: 2px;
+ height: 32px;
+ border: 2px dashed hsl(var(--white) / 0.4);
+ top: 16px;
+ animation: upDown 2s linear infinite;
+ @include xl-screen {
+ top: 8px;
+ }
+ }
+ .icon {
+ animation: upDown 2s linear infinite;
+ font-size: rem(28px);
+ margin-top: 16px;
+ }
+}
+
+@keyframes upDown {
+ 0% {
+ transform: translateY(10px);
+ }
+ 50% {
+ transform: translateY(0px);
+ }
+ 100% {
+ transform: translateY(10px);
+ }
+}
+/* ============================== Banner Css End ========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_brand.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_brand.scss
new file mode 100644
index 0000000..e086bde
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_brand.scss
@@ -0,0 +1,13 @@
+/* ========================= Brand Css Start ======================== */
+.brand-item {
+ img {
+ max-width: 152px !important;
+ @include xl-screen {
+ max-width: 132px !important;
+ }
+ @include md-screen {
+ max-width: 86px !important;
+ }
+ }
+}
+/* ========================= Brand Css End ======================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_delivery.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_delivery.scss
new file mode 100644
index 0000000..203a6f3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_delivery.scss
@@ -0,0 +1,10 @@
+.delivery {
+ &-section {
+ @media (min-width: 768px) {
+ margin-bottom: 28px;
+ }
+ }
+ &__man {
+ margin-bottom: -56px;
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_feature.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_feature.scss
new file mode 100644
index 0000000..89ab8f5
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_feature.scss
@@ -0,0 +1,123 @@
+/* ============================ Feature Section Css start =============================== */
+.feature {
+ margin-top: 32px;
+ .arrow-center {
+ &:hover {
+ .slick-arrow {
+ visibility: visible;
+ opacity: 1;
+ margin-left: -28px;
+ &.slick-next {
+ margin-right: -20px;
+ }
+ }
+ }
+ .slick-arrow {
+ transform: translateY(0);
+ margin-left: -40px;
+ border: 1px solid var(--gray-100);
+ visibility: hidden;
+ opacity: 0;
+ top: 54px;
+ &.slick-next {
+ margin-right: -30px;
+ }
+ }
+ }
+ &.feature-three .arrow-center .slick-arrow {
+ top: 110px;
+ }
+}
+
+.feature-item {
+ &-wrapper {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));
+ gap: 16px;
+ .feature-item {
+ &:nth-child(10n + 1) {
+ .feature-item__thumb {
+ background: #E8F9E9;
+ }
+ }
+ &:nth-child(10n + 2) {
+ .feature-item__thumb {
+ background: #FCEDED;
+ }
+ }
+ &:nth-child(10n + 3) {
+ .feature-item__thumb {
+ background: #F6EBF3;
+ }
+ }
+ &:nth-child(10n + 4) {
+ .feature-item__thumb {
+ background: #FCF2E7;
+ }
+ }
+ &:nth-child(10n + 5) {
+ .feature-item__thumb {
+ background: #F5FBE3;
+ }
+ }
+ &:nth-child(10n + 6) {
+ .feature-item__thumb {
+ background: #E3FBE9;
+ }
+ }
+ &:nth-child(10n + 7) {
+ .feature-item__thumb {
+ background: #E9E3FB;
+ }
+ }
+ &:nth-child(10n + 8) {
+ .feature-item__thumb {
+ background: #ECF8F2;
+ }
+ }
+ &:nth-child(10n + 9) {
+ .feature-item__thumb {
+ background: #F8F5E5;
+ }
+ }
+ &:nth-child(10n + 10) {
+ .feature-item__thumb {
+ background: #F0F8E5;
+ }
+ }
+ &:nth-child(10n + 11) {
+ .feature-item__thumb {
+ background: #ddd;
+ }
+ }
+ }
+ }
+ &__thumb {
+ max-width: 153px;
+ max-height: 153px;
+ background-color: var(--main-50);
+ aspect-ratio: 1;
+ margin: 0 auto;
+ img {
+ transition: .2s linear;
+ }
+ }
+ &:hover {
+ .feature-item__thumb img {
+ transform: scale(1.2);
+ }
+ }
+}
+
+.featured-products, .popular-products {
+ .product-card {
+ flex-direction: row;
+ align-items: unset;
+ }
+}
+.popular-products {
+ .product-card__thumb {
+ width: 120px !important;
+ }
+}
+/* ============================ Feature Section Css End =============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_flash-sales.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_flash-sales.scss
new file mode 100644
index 0000000..a401aa0
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_flash-sales.scss
@@ -0,0 +1,5 @@
+/* ========================= flash sales Start ================================ */
+.flash-sales-item {
+ padding: 40px 32px;
+}
+/* ========================= flash sales End ================================ */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_index.scss
new file mode 100644
index 0000000..25fcd6c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_index.scss
@@ -0,0 +1,13 @@
+
+@import 'banner';
+@import 'feature';
+@import 'promotional-banner';
+@import 'flash-sales';
+@import 'product-card';
+@import 'offer';
+@import 'vendor';
+@import 'delivery';
+@import 'short-product';
+@import 'brand';
+@import 'shipping';
+@import 'newsletter';
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_newsletter.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_newsletter.scss
new file mode 100644
index 0000000..9b43d54
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_newsletter.scss
@@ -0,0 +1,14 @@
+/* ======================= Newsletter Css Start =========================== */
+.newsletter-box {
+ background-color: #1A2026;
+ padding: 32px clampCal(24, 64, 1199, 1499);
+}
+
+.newsletter-two {
+ &__form {
+ @include md-screen {
+ width: 100% !important;
+ }
+ }
+}
+/* ======================= Newsletter Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_offer.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_offer.scss
new file mode 100644
index 0000000..a282d5e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_offer.scss
@@ -0,0 +1,15 @@
+/* ======================= Offer Css Start =========================== */
+.offer-card {
+ &__thumb {
+ img {
+ @include xxl-screen {
+ max-width: 246px;
+ width: 100%;
+ }
+ @include lg-screen {
+ max-width: 163px;
+ }
+ }
+ }
+}
+/* ======================= Offer Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_product-card.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_product-card.scss
new file mode 100644
index 0000000..44bcbce
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_product-card.scss
@@ -0,0 +1,72 @@
+/* ============================= Product Card Css Start ========================== */
+.product-card {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: start;
+ &:hover {
+ .product-card__thumb img {
+ transform: scale(1.2);
+ }
+ }
+ &__cart {
+ @include xxl-screen {
+ font-size: 12px;
+ padding: 9px 12px !important;
+ }
+ }
+ &__badge {
+ border-radius: 16px 0 16px 0;
+ }
+ &__thumb {
+ height: 232px;
+ width: 100%;
+ transition: 0s !important;
+ img {
+ max-width: 160px;
+ width: 100%;
+ transition: .2s linear;
+ }
+ }
+
+ &.style-two {
+ flex-direction: row;
+ .product-card {
+ &__thumb {
+ width: 260px;
+ height: 190px;
+ @include md-screen {
+ width: 190px;
+ }
+ @include msm-screen {
+ width: 124px;
+ }
+ }
+ }
+ }
+}
+
+@include lg-screen {
+ .product-card {
+ &__thumb {
+ min-height: 160px;
+ img {
+ max-width: 120px;
+ }
+ }
+ &__content {
+ .product-card {
+ &__price span {
+ font-size: rem(12px) !important;
+ }
+ }
+ .title .link {
+ font-size: rem(14px);
+ }
+ .text-xs {
+ font-size: rem(10px) !important;
+ }
+ }
+ }
+}
+/* ============================= Product Card Css End ========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_promotional-banner.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_promotional-banner.scss
new file mode 100644
index 0000000..0119961
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_promotional-banner.scss
@@ -0,0 +1,16 @@
+/* ======================== promotional banner Css Start ============================== */
+.promotional-banner-item {
+ padding: clampCal(32, 84) 24px;
+ @include msm-screen {
+ padding: 24px 16px;
+ }
+ &__content {
+ max-width: 200px;
+ }
+ &__title {
+ @include xl-screen {
+ font-size: rem(24px) !important;
+ }
+ }
+}
+/* ======================== promotional banner Css End ============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_shipping.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_shipping.scss
new file mode 100644
index 0000000..bc7dc2f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_shipping.scss
@@ -0,0 +1,5 @@
+/* Shipping Css Start */
+.shipping-item {
+ padding: clampCal(24, 32) clampCal(24, 54, 1399, 1899);
+}
+/* Shipping Css End */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_short-product.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_short-product.scss
new file mode 100644
index 0000000..d1a8456
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_short-product.scss
@@ -0,0 +1,29 @@
+/* ================================== short product Css Start ================================== */
+.underlined-line {
+ &::before, &::after {
+ position: absolute;
+ content: "";
+ width: 100%;
+ height: 2px;
+ left: 0;
+ bottom: 0;
+ background-color: hsl(var(--white));
+ }
+ &::after {
+ width: 50%;
+ background-color: var(--main-600);
+ }
+}
+
+.short-product-list {
+ &.arrow-style-two {
+ .slick-arrow {
+ inset-inline-end: 16px;
+ inset-block-end: calc(100% + 52px);
+ }
+ .slick-prev {
+ inset-inline-end: 50px;
+ }
+ }
+}
+/* ================================== short product Css End ================================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_vendor.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_vendor.scss
new file mode 100644
index 0000000..8f35c23
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/home/_vendor.scss
@@ -0,0 +1,80 @@
+/* ===================================== Vendor Css Start ================================== */
+.vendor-card {
+ background-color: var(--main-100);
+ -webkit-mask-image: url("~/public/assets/images/shape/box-shape2.png");
+ mask-image: url("~/public/assets/images/shape/box-shape2.png");
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ background: #f4f6e6;
+ mask-position: top;
+ mask-size: 100% 100%;
+ &.style-two {
+ -webkit-mask-image: url("~/public/assets/images/shape/box-shape3.png");
+ mask-image: url("~/public/assets/images/shape/box-shape3.png");
+ }
+ &__logo {
+ max-width: 66px;
+ }
+ &__item {
+ max-width: 64px;
+ max-height: 64px;
+ aspect-ratio: 1;
+ width: 100%;
+ height: 100%;
+ }
+ .vendor-card__list {
+ &.style-two {
+ .vendor-card__item {
+ max-width: 88px;
+ max-height: 88px;
+ border-radius: 8px !important;
+ }
+ .slick-slide {
+ margin: 0 4px !important;
+ }
+ }
+ }
+}
+.vendor-card-wrapper div[class*="col"] {
+ &:nth-child(8n + 1) {
+ .vendor-card {
+ background: #f4f6e6;
+ }
+ }
+ &:nth-child(8n + 2) {
+ .vendor-card {
+ background: #e6f6f6;
+ }
+ }
+ &:nth-child(8n + 3) {
+ .vendor-card {
+ background: #f6e6f6;
+ }
+ }
+ &:nth-child(8n + 4) {
+ .vendor-card {
+ background: #f8eae4;
+ }
+ }
+ &:nth-child(8n + 5) {
+ .vendor-card {
+ background: #f8eae4;
+ }
+ }
+ &:nth-child(8n + 6) {
+ .vendor-card {
+ background: #dee6f3;
+ }
+ }
+ &:nth-child(8n + 7) {
+ .vendor-card {
+ background: #daf2db;
+ }
+ }
+ &:nth-child(8n + 8) {
+ .vendor-card {
+ background: #ebf1da;
+ }
+ }
+}
+/* ===================================== Vendor Css End ================================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_banner-three.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_banner-three.scss
new file mode 100644
index 0000000..37cd6c8
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_banner-three.scss
@@ -0,0 +1,46 @@
+/* ============================= Banner Three Css Start ================================= */
+.banner-three {
+ background-color: var(--neutral-600);
+ padding: 80px 0;
+ @media (width: 991px) {
+ padding: 60px 0;
+ }
+}
+
+.animation {
+ position: absolute;
+ max-width: 10%;
+}
+
+.star-shape {
+ bottom: 4%;
+ inset-inline-start: 5%;
+ opacity: .3;
+ &.style-two {
+ inset-inline-start: auto;
+ bottom: auto;
+ top: 10%;
+ inset-inline-end: 8%;
+ }
+}
+.line-shape {
+ top: 14%;
+ left: 58%;
+}
+
+.animation-rotate {
+ animation: rotation 6s linear infinite;
+}
+
+@keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 50% {
+ transform: rotate(180deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+/* ============================= Banner Three Css End ================================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_deals.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_deals.scss
new file mode 100644
index 0000000..c012a9b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_deals.scss
@@ -0,0 +1,55 @@
+/* ============================== Deals Section Css Start ========================== */
+.deals {
+ &__img {
+ transform: translateY(12px);
+ }
+}
+
+.products-group {
+ &__list {
+ position: absolute;
+ left: 35%;
+ bottom: 30%;
+ z-index: 1;
+ &:nth-child(2) {
+ bottom: 48%;
+ left: 65%;
+ }
+ &:nth-child(3) {
+ bottom: 56%;
+ left: 80%;
+ }
+ &:hover {
+ .products-group {
+ &__card {
+ margin-bottom: 0;
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+ }
+ }
+ &__card {
+ transform: translateX(-68%) rotate(-10deg);
+ margin-bottom: -32px;
+ visibility: hidden;
+ opacity: 0;
+ }
+}
+
+
+
+// @media (min-width: 575px) {
+// .rotate-10 {
+// transform: rotate(-10deg);
+// }
+// .positioned {
+// position: absolute;
+// width: 100%;
+// inset-inline-start: 60px;
+// inset-block-start: 60px;
+// z-index: 1;
+// }
+// }
+
+/* ============================== Deals Section Css End ========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_index.scss
new file mode 100644
index 0000000..1f76fba
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_index.scss
@@ -0,0 +1,5 @@
+@import 'banner-three';
+@import 'promotional-banner-three';
+@import 'text-slider';
+@import 'deals';
+@import 'testimonials';
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_promotional-banner-three.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_promotional-banner-three.scss
new file mode 100644
index 0000000..beaac07
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_promotional-banner-three.scss
@@ -0,0 +1,5 @@
+/* ============================== Promotional Banner Three Start ========================== */
+.promo-three-item {
+ padding: clampCal(32, 118) clampCal(24, 64);
+}
+/* ============================== Promotional Banner Three End ========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_testimonials.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_testimonials.scss
new file mode 100644
index 0000000..0988464
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_testimonials.scss
@@ -0,0 +1,88 @@
+/* ================================= Testimonials Section Css Start ==================================== */
+.testimonials-item {
+ &__desc {
+ @media (min-width: 768px) {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+}
+
+.testimonials-slider {
+ @media (min-width: 768px) {
+ position: absolute;
+ top: 0;
+ left: 25.50%;
+ }
+ @media (max-width: 1299px) {
+ left: 34%;
+ }
+ @media (max-width: 767px) {
+ left: 0;
+ }
+}
+
+.testimonials-thumbs {
+ overflow: hidden;
+ &__img {
+ max-height: 350px;
+ height: 100%;
+ width: 100%;
+ transition: .6s linear;
+ position: relative;
+ img {
+ object-position: top;
+ }
+ &::before {
+ position: absolute;
+ content: "";
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: linear-gradient(2deg, #000000e8, transparent);
+ visibility: hidden;
+ opacity: 0;
+ transition: .2s linear;
+ }
+ }
+
+ &:hover {
+ .testimonials-thumbs__img::before, .testimonials-thumbs__content {
+ visibility: visible !important;
+ opacity: 1 !important;
+ }
+ }
+}
+
+.testimonials {
+ .slick-slider .slick-track {
+ display: flex;
+ align-items: end;
+ }
+ .slick-slide {
+ &.slick-active.slick-current .testimonials-thumbs {
+ overflow: unset !important;
+ &__img {
+ object-fit: cover;
+ max-height: 100%;
+ }
+ }
+ }
+}
+.testimonials-thumbs-slider {
+ .slick-slide {
+ height: 630px !important;
+ }
+}
+.testimonials-slider {
+ .slick-slide {
+ @media (min-width: 768px) {
+ height: 630px !important;
+ }
+ }
+}
+/* ================================= Testimonials Section Css End ==================================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_text-slider.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_text-slider.scss
new file mode 100644
index 0000000..2b74a73
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/homeThree/_text-slider.scss
@@ -0,0 +1,4 @@
+.js-marquee {
+ display: flex;
+ gap: 32px;
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_blog.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_blog.scss
new file mode 100644
index 0000000..e1cddf6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_blog.scss
@@ -0,0 +1,8 @@
+/* ========================= Blog Css Start ============================= */
+.blog-item {
+ margin-bottom: 48px;
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+/* ========================= Blog Css End ============================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_cart.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_cart.scss
new file mode 100644
index 0000000..f31f5a0
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_cart.scss
@@ -0,0 +1,17 @@
+/* ========================== Cart Page Css Start ============================ */
+.table-product {
+ &__thumb {
+ max-width: 150px;
+ max-height: 150px;
+ width: 100%;
+ height: 100%;
+ aspect-ratio: 1;
+ img {
+ max-width: 75px;
+ }
+ }
+ &__content {
+
+ }
+}
+/* ========================== Cart Page Css End ============================ */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_checkout.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_checkout.scss
new file mode 100644
index 0000000..c40b32e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_checkout.scss
@@ -0,0 +1,17 @@
+/* ======================= Checkout Css Start ============================= */
+.payment-item {
+ &__content {
+ display: none;
+ &::before {
+ position: absolute;
+ content: "";
+ width: 20px;
+ height: 14px;
+ background-color: var(--main-50);
+ left: 32px;
+ bottom: calc(100% + -1px);
+ clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
+ }
+ }
+}
+/* ======================= Checkout Css End ============================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_counter.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_counter.scss
new file mode 100644
index 0000000..2ab396b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_counter.scss
@@ -0,0 +1,22 @@
+.line-wrapper {
+ > div {
+ position: relative;
+ &:last-child {
+ &::before {
+ display: none;
+ }
+ }
+ &::before {
+ position: absolute;
+ content: "";
+ width: 1px;
+ height: 100%;
+ right: 0;
+ top: 0;
+ background: hsl(var(--white) / 0.1);
+ @media (max-width: 991px) {
+ display: none;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_index.scss
new file mode 100644
index 0000000..56691ab
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_index.scss
@@ -0,0 +1,8 @@
+@import 'product-details';
+@import 'shop';
+@import 'cart';
+@import 'checkout';
+@import 'blog';
+@import 'counter';
+@import 'vendors-two';
+@import 'vendor-two-details';
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_product-details.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_product-details.scss
new file mode 100644
index 0000000..8d1b2b0
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_product-details.scss
@@ -0,0 +1,24 @@
+/* ============================ Product Details Css Start ============================= */
+.product-details {
+ &__thumb {
+ &-slider {
+ padding: clampCal(48, 116);
+ }
+ }
+
+ .slick-initialized.slick-slider .slick-slide > div > div {
+ height: 100%;
+ }
+}
+
+
+.product-dContent__box, .product-dContent__header {
+ padding: 16px 40px;
+}
+.product-dContent {
+ &__box {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+}
+/* ============================ Product Details Css End ============================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_shop.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_shop.scss
new file mode 100644
index 0000000..985851e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_shop.scss
@@ -0,0 +1,62 @@
+/* ================================ Shop Page css Start =============================== */
+.list-grid-btns {
+ @media (max-width: 479px) {
+ display: none;
+ }
+}
+.list-grid-wrapper {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
+ gap: 24px;
+}
+
+@media (min-width: 480px) {
+ .list-view {
+ grid-template-columns: repeat(auto-fit, minmax(430px, 1fr));
+ .product-card {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ &__thumb {
+ max-width: 200px;
+ height: 100% !important;
+ }
+ &__content {
+ margin-top: 0 !important;
+ margin-left: 20px;
+ flex-grow: 1;
+ }
+ }
+ }
+}
+
+@media (max-width: 1199px) {
+ .shop-sidebar__box {
+ padding: 16px !important;
+ }
+}
+
+@media (max-width: 991px) {
+ .shop-sidebar {
+ position: fixed;
+ top: 0;
+ height: 100vh;
+ background-color: #fff;
+ z-index: 11;
+ left: 0;
+ border-radius: 0 !important;
+ overflow-y: auto;
+ width: 300px;
+ border-right: 1px solid var(--gray-100);
+ transform: translateX(-100%);
+ transition: .2s linear;
+ &.active {
+ transform: translateX(0);
+ }
+ &__box {
+ border-radius: 0 !important;
+ border: 0 !important;
+ }
+ }
+}
+/* ================================ Shop Page css End =============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendor-two-details.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendor-two-details.scss
new file mode 100644
index 0000000..aeefa80
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendor-two-details.scss
@@ -0,0 +1,33 @@
+/* ============================== Vendor Two Details Css Start =============================== */
+.grid-cols-4 {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr 1fr !important;
+ gap: 24px;
+ @include xl-screen {
+ grid-template-columns: 1fr 1fr 1fr !important;
+ }
+ @include lg-screen {
+ grid-template-columns: 1fr 1fr !important;
+ }
+ @include msm-screen {
+ grid-template-columns: 1fr !important;
+ }
+ &.list-view {
+ grid-template-columns: 1fr 1fr !important;
+ @include xl-screen {
+ grid-template-columns: 1fr !important;
+ }
+ }
+}
+
+
+.vendor-two-details {
+ .shop-sidebar {
+ width: 332px;
+ }
+ &__contents {
+ flex-grow: 1;
+ width: calc(100% - 356px);
+ }
+}
+/* ============================== Vendor Two Details Css End =============================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendors-two.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendors-two.scss
new file mode 100644
index 0000000..eaebfd4
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/partials/othersPage/_vendors-two.scss
@@ -0,0 +1,25 @@
+/* ======================== Vendors Two Page css Start ============================= */
+.grid-cols-3 {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr !important;
+ gap: 24px;
+ @include lg-screen {
+ grid-template-columns: 1fr 1fr !important;
+ }
+ @include msm-screen {
+ grid-template-columns: 1fr !important;
+ }
+ &.list-view {
+ grid-template-columns: 1fr 1fr !important;
+ @include xl-screen {
+ grid-template-columns: 1fr !important;
+ }
+ }
+}
+
+.list-view {
+ .vendors-two-item {
+ display: flex;
+ }
+}
+/* ======================== Vendors Two Page css End ============================= */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_bg.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_bg.scss
new file mode 100644
index 0000000..3623deb
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_bg.scss
@@ -0,0 +1,53 @@
+// background
+@each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .bg-#{$color}-#{$shade} {
+ background-color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+}
+
+// hover background
+@each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .hover-bg-#{$color}-#{$shade} {
+ &:hover {
+ background-color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+ }
+ }
+
+ .hover-bg {
+ &-white {
+ &:hover {
+ background-color: hsl(var(--white)) !important;
+ }
+ }
+ }
+
+
+.bg-light-purple {
+ background: #ECDBEC !important;
+}
+
+.bg {
+ &-yellow-light {
+ background-color: #FFFCE1 !important;
+ }
+ &-danger-light {
+ background-color: #FFEBEE !important;
+ }
+ &-purple-light {
+ background-color: #F5E7FC !important;
+ }
+ &-danger-light {
+ background-color: #FFE2F5 !important;
+ }
+ &-warning-light {
+ background-color: #FBEEDD !important;
+ }
+ &-success-light {
+ background-color: #F6F5DB !important;
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_border.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_border.scss
new file mode 100644
index 0000000..d9e3d6e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_border.scss
@@ -0,0 +1,28 @@
+// border
+@each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .border-#{$color}-#{$shade} {
+ border-color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+}
+
+// hover border
+@each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .hover-border-#{$color}-#{$shade} {
+ &:hover {
+ border-color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+ }
+}
+
+.border {
+ &-dashed {
+ border-style: dashed !important;
+ }
+ &-dotted {
+ border-style: dotted !important;
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_classes.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_classes.scss
new file mode 100644
index 0000000..b868f6e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_classes.scss
@@ -0,0 +1,213 @@
+
+/* ================================= Classes Css Start =========================== */
+/* Section Background */
+.bg-color {
+ &-one {
+ background-color: var(--bg-color-one) !important;
+ }
+ &-two {
+ background-color: var(--bg-color-two) !important;
+ }
+ &-three {
+ background-color: var(--bg-color-three) !important;
+ }
+ &-neutral {
+ background-color: var(--neutral) !important;
+ }
+}
+
+.container-lg {
+ max-width: 1680px;
+}
+
+/* Column Extra Small Screen */
+.col-xs-6 {
+ @media screen and (min-width: 425px) and (max-width: 575px) {
+ width: 50%;
+ }
+}
+
+@media (min-width: 424px) {
+ .d-xs-flex {
+ display: flex !important;
+ }
+}
+
+.opacity {
+ &-6 {
+ opacity: .06 !important;
+ }
+}
+
+/* Transition */
+.transition {
+ &-1 {
+ transition: .1s linear;
+ }
+ &-2 {
+ transition: .2s linear;
+ }
+ &-3 {
+ transition: .3s linear;
+ }
+}
+
+.display-200 {
+ font-size: var(--display-200);
+}
+.display-one {
+ font-size: var(--display-one);
+}
+
+.min-width-max-content {
+ min-width: max-content;
+}
+
+.inset {
+ &-inline-start-0 {
+ inset-inline-start: 0 !important;
+ }
+ &-inline-start-100 {
+ inset-inline-start: 100% !important;
+ }
+ &-inline-start-auto {
+ inset-inline-start: auto !important;
+ }
+ &-inline-end-0 {
+ inset-inline-end: 0 !important;
+ }
+ &-inline-end-auto {
+ inset-inline-end: auto !important;
+ }
+ &-block-start-0 {
+ inset-block-start: 0 !important;
+ }
+ &-block-end-0 {
+ inset-block-end: 0 !important;
+ }
+}
+
+.start {
+ &-auto {
+ inset-inline-start: auto !important;
+ }
+}
+
+.end {
+ &-auto {
+ inset-inline-end: auto !important;
+ }
+}
+
+.line-height {
+ &-0 {
+ line-height: 0;
+ }
+ &-1 {
+ line-height: 1;
+ }
+ &-73 {
+ line-height: .73;
+ }
+}
+
+/* Text Color */
+.hover-text {
+ &-decoration-underline {
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+ &-decoration-none {
+ &:hover {
+ text-decoration: none;
+ }
+ }
+}
+
+.font {
+ &-heading {
+ font-family: var(--heading-font);
+ }
+ &-heading-two {
+ font-family: var(--heading-font-two);
+ }
+ &-heading-four {
+ font-family: var(--heading-font-four);
+ }
+ &-body {
+ font-family: var(--body-font);
+ }
+}
+
+/* Bg Image Css */
+.bg-img {
+ background-size: cover !important;
+ background-repeat: no-repeat !important;
+ background-position: center center !important;
+ width: 100%;
+ height: 100%;
+}
+
+.list-inside {
+ list-style: inside !important;
+}
+.aspect-ratio-1 {
+ aspect-ratio: 1;
+}
+.cursor-pointer {
+ cursor: pointer;
+}
+
+
+.bg-blur {
+ backdrop-filter: blur(90px);
+ background-color: hsl(var(--white)/.3) !important;
+ transition: .2s linear;
+ &:hover {
+ transform: scale(1.2);
+ }
+}
+.rotate-10 {
+ transform: rotate(-10deg);
+}
+
+.bg-overlay {
+ &::before {
+ position: absolute;
+ content: "";
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ background: linear-gradient(0deg, rgba(18, 21, 53, 0.7) 0%, rgba(18, 21, 53, 0.7) 100%);
+ z-index: -1;
+ }
+ &.style-two {
+ &::before {
+ background: linear-gradient(180deg, rgb(18 21 53 / 47%) 34.18%, rgba(18, 21, 53, 0.5) 75.48%), linear-gradient(180deg, rgba(18, 21, 53, 0) 27.17%, rgba(18, 21, 53, 0.5) 79.35%);
+ z-index: 0;
+ }
+ }
+}
+
+.bg-start {
+ background-position: left !important;
+}
+
+.arrow-left-clip {
+ clip-path: polygon(10% 0, 100% 0, 100% 50%, 100% 100%, 10% 100%, 0% 50%);
+}
+
+.w-30-percent {
+ width: 30%;
+}
+
+.group {
+ &:hover {
+ .group-item-white {
+ color: hsl(var(--white)) !important;
+ }
+ }
+}
+/* ================================= Classes Css End =========================== */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_colors.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_colors.scss
new file mode 100644
index 0000000..ba895ef
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_colors.scss
@@ -0,0 +1,56 @@
+
+// // Colors
+@each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .text-#{$color}-#{$shade} {
+ color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+ }
+
+
+.text {
+ &-heading {
+ color: hsl(var(--heading-color)) !important;
+ }
+ &-body {
+ color: hsl(var(--body-color)) !important;
+ }
+ &-main {
+ color: hsl(var(--main)) !important;
+ }
+}
+
+ @each $color, $shades in $colors {
+ @each $shade, $value in $shades {
+ .hover-text-#{$color}-#{$shade} {
+ &:hover {
+ color: var(--#{$color}-#{$shade}) !important;
+ }
+ }
+ }
+ }
+
+/* Text Color */
+.hover-text {
+ &-white {
+ &:hover {
+ color: #fff !important;
+ }
+ }
+ &-heading {
+ &:hover {
+ color: hsl(var(--heading-color)) !important;
+ }
+ }
+ &-body {
+ &:hover {
+ color: hsl(var(--body-color)) !important;
+ }
+ }
+ &-main {
+ &:hover {
+ color: hsl(var(--main)) !important;
+ }
+ }
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_extend.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_extend.scss
new file mode 100644
index 0000000..89be59b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_extend.scss
@@ -0,0 +1,26 @@
+
+/* ============================ Extend Css Start ======================== */
+/* Cover image Css */
+ .cover-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+/* Display Flex Css Start */
+ .flex-align {
+ display: flex;
+ align-items: center;
+ }
+ .flex-center {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ .flex-between {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+/* Display Flex Css End */
+/* ============================ Extend Css End ======================== */
+
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_font-size.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_font-size.scss
new file mode 100644
index 0000000..eb9c354
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_font-size.scss
@@ -0,0 +1,19 @@
+/* Font Size Class Start */
+.text {
+ &-inherit {
+ font-size: inherit;
+ }
+}
+
+@each $property, $value in $font-sizes {
+ .text-#{$property} {
+ font-size: $value !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .text-#{$property} {
+ font-size: $value !important;
+ }
+}
+/* Font Size Class End */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gap.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gap.scss
new file mode 100644
index 0000000..ccdd810
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gap.scss
@@ -0,0 +1,6 @@
+// Gap Css
+@each $property, $value in $spaces {
+ .gap-#{$property} {
+ gap: var(--size-#{$property}) !important;
+ }
+ }
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gutter.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gutter.scss
new file mode 100644
index 0000000..f2a7614
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_gutter.scss
@@ -0,0 +1,14 @@
+.g-8, .gy-8 {
+ --bs-gutter-y: .5rem !important;
+}
+.g-12, .gy-12 {
+ --bs-gutter-y: .75rem !important;
+}
+
+
+.g-8, .gx-8 {
+ --bs-gutter-x: .5rem !important;
+}
+.g-12, .gx-12 {
+ --bs-gutter-x: .75rem !important;
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_hover.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_hover.scss
new file mode 100644
index 0000000..dfa7d68
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_hover.scss
@@ -0,0 +1,43 @@
+/* Hover Classes Start */
+.item-hover {
+ &:hover {
+ .item-hover__text {
+ color: var(--main-600) !important;
+ }
+ }
+}
+.item-hover-two {
+ &:hover {
+ .item-hover__text {
+ color: var(--main-two-600) !important;
+ }
+ }
+}
+
+
+
+.on-hover-dropdown {
+ visibility: hidden;
+ opacity: 0;
+ margin-block-start: 16px;
+}
+
+.on-hover-item {
+ position: relative;
+ &:hover {
+ .on-hover-dropdown {
+ visibility: visible;
+ opacity: 1;
+ margin-block-start: 0;
+ }
+ > a {
+ &::before {
+ @media (min-width: 992px) {
+ color: hsl(var(--main));
+ transform: translateY(-50%) rotate(180deg);
+ }
+ }
+ }
+ }
+}
+/* Hover Classes End */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_index.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_index.scss
new file mode 100644
index 0000000..8d6447e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_index.scss
@@ -0,0 +1,40 @@
+
+// Typography
+@import "typography";
+// margin
+@import "margin";
+// padding
+@import "padding";
+
+// Classes
+@import "classes";
+// extend
+ @import "extend";
+// size
+ @import "size";
+// colors
+ @import "colors";
+// border
+ @import "border";
+// bg
+ @import "bg";
+// font size
+ @import "font-size";
+// shadow
+ @import "shadow";
+// radius
+ @import "radius";
+// scroll hide
+ @import "scroll-hide";
+// overlay
+ @import "overlay";
+// line clamp
+ @import "line-clamp";
+// scrollbar
+ @import "scrollbar";
+// gap
+ @import "gap";
+// hover
+ @import "hover";
+// gutter
+ @import "gutter";
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_line-clamp.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_line-clamp.scss
new file mode 100644
index 0000000..ec30f50
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_line-clamp.scss
@@ -0,0 +1,26 @@
+
+// Line Clamp start
+.text-line-1 {
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.text-line-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.text-line-3 {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+ // Line Clamp End
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_margin.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_margin.scss
new file mode 100644
index 0000000..9fa5343
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_margin.scss
@@ -0,0 +1,120 @@
+/* ================================= Margin Css Start =========================== */
+@each $property, $value in $spaces {
+ .m-#{$property} {
+ margin: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .mx-#{$property} {
+ margin-inline: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .my-#{$property} {
+ margin-block: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .ms-#{$property} {
+ margin-inline-start: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .me-#{$property} {
+ margin-inline-end: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .mt-#{$property} {
+ margin-block-start: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .mb-#{$property} {
+ margin-block-end: var(--size-#{$property}) !important;
+ }
+}
+
+
+.mt-0 {
+ margin-block-start: 0!important;
+}
+
+.mb-0 {
+ margin-block-end: 0!important;
+}
+
+.ms-0 {
+ margin-inline-start: 0!important;
+}
+
+.me-0 {
+ margin-inline-end: 0!important;
+}
+
+.my-120 {
+ margin-block-start: 60px !important;
+ margin-block-end: 60px !important;
+ @media (min-width: 576px) {
+ margin-block-start: 80px !important;
+ margin-block-end: 80px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-start: 120px !important;
+ margin-block-end: 120px !important;
+ }
+}
+.mt-120 {
+ margin-block-start: 60px !important;
+ @media (min-width: 576px) {
+ margin-block-start: 80px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-start: 120px !important;
+ }
+}
+.mb-120 {
+ margin-block-end: 60px !important;
+ @media (min-width: 576px) {
+ margin-block-end: 80px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-end: 120px !important;
+ }
+}
+.my-60 {
+ margin-block-start: 30px !important;
+ margin-block-end: 30px !important;
+ @media (min-width: 576px) {
+ margin-block-start: 40px !important;
+ margin-block-end: 40px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-start: 60px !important;
+ margin-block-end: 60px !important;
+ }
+}
+.mt-60 {
+ margin-block-start: 30px !important;
+ @media (min-width: 576px) {
+ margin-block-start: 40px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-start: 60px !important;
+ }
+}
+ .mb-60 {
+ margin-block-end: 30px !important;
+ @media (min-width: 576px) {
+ margin-block-end: 40px !important;
+ }
+ @media (min-width: 992px) {
+ margin-block-end: 60px !important;
+ }
+}/* ================================= Margin Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_overlay.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_overlay.scss
new file mode 100644
index 0000000..432e5a2
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_overlay.scss
@@ -0,0 +1,40 @@
+
+/* Overlay Start */
+.overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ content: "";
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ background-color: hsl(var(--black) / .6);
+ z-index: 99;
+ transition: .2s linear;
+ visibility: hidden;
+ opacity: 0;
+ &.show-overlay {
+ visibility: visible;
+ opacity: 1;
+ }
+}
+
+.side-overlay {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ content: "";
+ inset-inline-start: 0;
+ inset-block-start: 0;
+ background-color: hsl(var(--black) / .6);
+ z-index: 8;
+ transition: .2s linear;
+ visibility: hidden;
+ opacity: 0;
+ @include md-screen {
+ &.show {
+ visibility: visible;
+ opacity: 1;
+ }
+ }
+}
+/* Overlay End */
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_padding.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_padding.scss
new file mode 100644
index 0000000..1d3ce8c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_padding.scss
@@ -0,0 +1,138 @@
+/* ================================= Padding Css Start =========================== */
+@each $property, $value in $spaces {
+ .p-#{$property} {
+ padding: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .px-#{$property} {
+ padding-inline: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .py-#{$property} {
+ padding-block: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .ps-#{$property} {
+ padding-inline-start: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .pe-#{$property} {
+ padding-inline-end: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .pt-#{$property} {
+ padding-block-start: var(--size-#{$property}) !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .pb-#{$property} {
+ padding-block-end: var(--size-#{$property}) !important;
+ }
+}
+
+.p--24 {
+ padding: 24px;
+}
+
+.p-56-px {
+ padding: clampCal(8, 56, 1299, 1699);
+}
+
+.pt-0 {
+ padding-block-start: 0!important;
+}
+
+.pb-0 {
+ padding-block-end: 0!important;
+}
+
+.ps-0 {
+ padding-inline-start: 0!important;
+}
+
+.pe-0 {
+ padding-inline-end: 0!important;
+}
+
+
+.py-100 {
+ padding-block-start: 40px !important;
+ padding-block-end: 40px !important;
+ @media (min-width: 992px) {
+ padding-block-start: 60px !important;
+ padding-block-end: 60px !important;
+ }
+ @media (min-width: 1200px) {
+ padding-block-start: 80px !important;
+ padding-block-end: 80px !important;
+ }
+ @media (min-width: 1400px) {
+ padding-block-start: 100px !important;
+ padding-block-end: 100px !important;
+ }
+}
+
+
+.py-80 {
+ padding-block-start: 60px !important;
+ padding-block-end: 60px !important;
+ @media (min-width: 992px) {
+ padding-block-start: 80px !important;
+ padding-block-end: 80px !important;
+ }
+}
+.pt-80 {
+ padding-block-start: 60px !important;
+ @media (min-width: 992px) {
+ padding-block-start: 80px !important;
+ }
+}
+.pb-80 {
+ padding-block-end: 60px !important;
+ @media (min-width: 992px) {
+ padding-block-end: 80px !important;
+ }
+}
+
+.py-60 {
+ padding-block-start: 30px !important;
+ padding-block-end: 30px !important;
+ @media (min-width: 576px) {
+ padding-block-start: 40px !important;
+ padding-block-end: 40px !important;
+ }
+ @media (min-width: 992px) {
+ padding-block-start: 60px !important;
+ padding-block-end: 60px !important;
+ }
+}
+.pt-60 {
+ padding-block-start: 30px !important;
+ @media (min-width: 576px) {
+ padding-block-start: 40px !important;
+ }
+ @media (min-width: 992px) {
+ padding-block-start: 60px !important;
+ }
+}
+ .pb-60 {
+ padding-block-end: 30px !important;
+ @media (min-width: 576px) {
+ padding-block-end: 40px !important;
+ }
+ @media (min-width: 992px) {
+ padding-block-end: 60px !important;
+ }
+}
+/* ================================= Padding Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_radius.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_radius.scss
new file mode 100644
index 0000000..b58c37f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_radius.scss
@@ -0,0 +1,11 @@
+/* Border Radius */
+@each $property, $value in $spaces {
+ .rounded-#{$property} {
+ border-radius: #{$value} !important;
+ }
+ }
+
+
+ .rounded-top-right-0 {
+ border-top-right-radius: 0 !important;
+ }
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scroll-hide.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scroll-hide.scss
new file mode 100644
index 0000000..168e74f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scroll-hide.scss
@@ -0,0 +1,23 @@
+
+/* Hide Scroll bar Css For Custom Modal */
+.scroll-hide {
+ position: absolute;
+ overflow-y: hidden;
+ padding-inline-end: 17px;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+ width: 100%;
+ @include md-screen {
+ padding-inline-end: 0;
+ }
+ &-sm {
+ @include md-screen {
+ position: absolute;
+ overflow-y: hidden;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+ width: calc(100% - 0px);
+ }
+ }
+}
+/* Hide Scroll bar Css For Custom Modal End */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scrollbar.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scrollbar.scss
new file mode 100644
index 0000000..afeed8a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_scrollbar.scss
@@ -0,0 +1,15 @@
+.scroll-sm {
+ &::-webkit-scrollbar {
+ width: 4px !important;
+ height: 4px !important;
+ }
+ &::-webkit-scrollbar-thumb {
+ background-color: #b1b3b8;
+ &:hover {
+ background-color: #7e7d7d;
+ }
+ }
+ &::-webkit-scrollbar-track {
+ background-color: #d6d9de;
+ }
+}
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_shadow.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_shadow.scss
new file mode 100644
index 0000000..38b099d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_shadow.scss
@@ -0,0 +1,23 @@
+
+/* Box shadow start */
+.box-shadow {
+ &-sm {
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ }
+ &-md {
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ }
+ &-lg {
+ box-shadow: 0px 7px 21px -5px rgb(0 0 0 / 10%), 0 4px 21px -4px rgb(0 0 0 / 10%);
+ }
+ &-xl {
+ box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ }
+ &-2xl {
+ box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+ }
+ &-inner {
+ box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
+ }
+}
+/* Box shadow End */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_size.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_size.scss
new file mode 100644
index 0000000..c5c637d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_size.scss
@@ -0,0 +1,102 @@
+// width height
+@each $property, $value in $spaces {
+ .w-#{$property} {
+ width: $value !important;
+ }
+}
+
+.w {
+ &-300 {
+ width: 300px !important;
+ }
+ &-265 {
+ width: 265px !important;
+ }
+ &-unset {
+ width: unset !important;
+ }
+}
+
+@each $property, $value in $spaces {
+ .h-#{$property} {
+ height: $value !important;
+ }
+}
+.h-unset {
+ height: unset !important;
+}
+
+.max-h {
+ &-unset {
+ max-height: unset !important;
+ }
+ &-120 {
+ max-height: 120px !important;
+ }
+ &-200 {
+ max-height: 200px !important;
+ }
+ &-260 {
+ max-height: 260px !important;
+ }
+ &-300 {
+ max-height: 300px !important;
+ }
+ &-326 {
+ max-height: 326px !important;
+ }
+ &-400 {
+ max-height: 400px !important;
+ }
+ &-540 {
+ max-height: 540px !important;
+ }
+}
+
+.max-w {
+ &-unset {
+ max-width: unset !important;
+ }
+ &-120 {
+ max-width: 120px;
+ }
+ &-260 {
+ max-width: 260px !important;
+ }
+ &-375 {
+ max-width: 375px;
+ }
+ &-340 {
+ max-width: 340px;
+ }
+ &-392 {
+ max-width: 392px;
+ }
+ &-275 {
+ max-width: 275px;
+ }
+ &-472 {
+ max-width: 472px;
+ }
+ &-418 {
+ max-width: 418px;
+ }
+ &-990 {
+ max-width: 990px;
+ }
+}
+
+
+.min-h {
+ &-485 {
+ min-height: 485px;
+ }
+}
+
+.top-n6 {
+ inset-block-start: -6px;
+}
+
+.end-n4 {
+ inset-inline-end: -6px;
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_typography.scss b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_typography.scss
new file mode 100644
index 0000000..1f63bcf
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/assets/sass/utilities/_typography.scss
@@ -0,0 +1,121 @@
+/* ================================= Typography Css Start =========================== */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: var(--body-font);
+ color: hsl(var(--body-color));
+ word-break: break-word;
+ background-color: hsl(var(--white));
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+
+html, body {
+ overflow-x: hidden;
+}
+
+p {
+ font-weight: 400;
+ margin: 0;
+ line-height: 1.6;
+}
+
+span {
+ display: inline-block;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 0 0 16px 0;
+ font-family: var(--heading-font);
+ color: hsl(var(--heading-color));
+ line-height: 1.2;
+ font-weight: 700;
+}
+h1, .h1 {
+ font-size: var(--heading-one);
+}
+h2, .h2 {
+ font-size: var(--heading-two);
+}
+h3, .h3 {
+ font-size: var(--heading-three);
+}
+h4, .h4 {
+ font-size: var(--heading-four);
+}
+h5, .h5 {
+ font-size: var(--heading-five);
+}
+h6, .h6 {
+ font-size: var(--heading-six);
+}
+
+h1 > a,
+h2 > a,
+h3 > a,
+h4 > a,
+h5 > a,
+h6 > a {
+ font-weight: inherit;
+ font-size: inherit;
+ color: inherit;
+ transition: 0.2s linear;
+ line-height: inherit;
+ &:hover {
+ color: hsl(var(--main));
+ }
+}
+
+a {
+ display: inline-block;
+ transition: 0.2s linear;
+ text-decoration: none;
+ color: #0661e9;
+}
+a:hover {
+ color: #1d72f2;
+}
+img {
+ max-width: 100%;
+ height: auto;
+}
+select {
+ cursor: pointer;
+}
+ul,
+ol {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+button {
+ border: 0;
+ background-color: transparent;
+ &:focus {
+ outline: none;
+ box-shadow: none;
+ }
+}
+.form-select:focus {
+ outline: 0;
+ box-shadow: none;
+}
+input:focus-visible {
+ outline: 0;
+}
+/* ================================= Typography Css End =========================== */
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.ttf b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000..227f022
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.woff2 b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000..73c5c12
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-brands-400.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.ttf b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000..c8ed46d
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.woff2 b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000..c9291c7
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-regular-400.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.ttf b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000..99b35ad
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.woff2 b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000..c7bd59c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-solid-900.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.ttf b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.ttf
new file mode 100644
index 0000000..be0afc2
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.ttf differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.woff2 b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.woff2
new file mode 100644
index 0000000..37a9b8c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/assets/webfonts/fa-v4compatibility.woff2 differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/favicon.png b/submissions/valkey-ecommerce-demo/frontend/public/favicon.png
new file mode 100644
index 0000000..356953c
Binary files /dev/null and b/submissions/valkey-ecommerce-demo/frontend/public/favicon.png differ
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/index.html b/submissions/valkey-ecommerce-demo/frontend/public/index.html
new file mode 100644
index 0000000..9e1725f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Valkey - E-commerce React JS Template
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/public/robots.txt b/submissions/valkey-ecommerce-demo/frontend/public/robots.txt
new file mode 100644
index 0000000..e9e57dc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/App.js b/submissions/valkey-ecommerce-demo/frontend/src/App.js
new file mode 100644
index 0000000..03b2197
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/App.js
@@ -0,0 +1,77 @@
+import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";
+import RouteScrollToTop from "./helper/RouteScrollToTop";
+import HomePageOne from "./pages/HomePageOne";
+import HomePageTwo from "./pages/HomePageTwo";
+import HomePageThree from "./pages/HomePageThree";
+import ShopPage from "./pages/ShopPage";
+import ProductDetailsPage from "./pages/ProductDetailsPage";
+import CartPage from "./pages/CartPage";
+import CheckoutPage from "./pages/CheckoutPage";
+import AccountPage from "./pages/AccountPage";
+import BlogPage from "./pages/BlogPage";
+import ContactPage from "./pages/ContactPage";
+import PhosphorIconInit from "./helper/PhosphorIconInit";
+import VendorPage from "./pages/VendorPage";
+import VendorDetailsPage from "./pages/VendorDetailsPage";
+import VendorTwoPage from "./pages/VendorTwoPage";
+import VendorTwoDetailsPage from "./pages/VendorTwoDetailsPage";
+import BecomeSellerPage from "./pages/BecomeSellerPage";
+import WishlistPage from "./pages/WishlistPage";
+import ComparisonPage from "./pages/ComparisonPage";
+
+import AdminPage from "./pages/AdminPage";
+import AnalyticsPage from "./pages/AnalyticsPage";
+
+// Valkey + Breeth integrations
+import { ValkeyProvider } from "./context/ValkeyContext";
+import ValkeyMonitor from "./components/ValkeyMonitor";
+import AIChatAssistant from "./components/AIChatAssistant";
+import ValkeyBanner from "./components/ValkeyBanner";
+
+function App() {
+ return (
+
+
+
+
+
+ {/* Valkey live feature banner (scrolling) */}
+
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ {/* Legacy routes → redirects */}
+ } />
+ } />
+ } />
+
+
+ {/* Valkey Live Monitor (floating panel, bottom-right) */}
+
+
+ {/* AI Shopping Assistant powered by Breeth + Valkey */}
+
+
+
+ );
+}
+
+export default App;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/App.test.js b/submissions/valkey-ecommerce-demo/frontend/src/App.test.js
new file mode 100644
index 0000000..1f03afe
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/App.test.js
@@ -0,0 +1,8 @@
+import { render, screen } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+ render( );
+ const linkElement = screen.getByText(/learn react/i);
+ expect(linkElement).toBeInTheDocument();
+});
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/AIChatAssistant.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/AIChatAssistant.jsx
new file mode 100644
index 0000000..3d107e6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/AIChatAssistant.jsx
@@ -0,0 +1,305 @@
+import React, { useState, useRef, useEffect } from "react";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const QUICK_PROMPTS = [
+ "Show me trending products",
+ "Best budget smartphones",
+ "Gift ideas under ₹5000",
+ "What's in stock right now?",
+ "Recommend earbuds",
+];
+
+export default function AIChatAssistant() {
+ const { userId } = useValkey();
+ const [open, setOpen] = useState(false);
+ const [messages, setMessages] = useState([
+ {
+ role: "assistant",
+ content: "Hi! I'm your AI shopping assistant powered by Breeth AI + Valkey. Ask me about products, deals, or anything in our store!",
+ meta: null,
+ },
+ ]);
+ const [input, setInput] = useState("");
+ const [sessionId, setSessionId] = useState(null);
+ const [loading, setLoading] = useState(false);
+ const bottomRef = useRef(null);
+
+ useEffect(() => {
+ bottomRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [messages]);
+
+ const send = async (text) => {
+ const msg = text || input.trim();
+ if (!msg || loading) return;
+ setInput("");
+ setLoading(true);
+
+ setMessages(prev => [...prev, { role: "user", content: msg }]);
+
+ try {
+ const res = await fetch(`${API}/api/ai/chat`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ sessionId, message: msg, userId }),
+ });
+ const data = await res.json();
+
+ if (data.sessionId) setSessionId(data.sessionId);
+
+ setMessages(prev => [
+ ...prev,
+ {
+ role: "assistant",
+ content: data.response || "Sorry, I encountered an issue.",
+ products: data.products || [],
+ followUp: data.followUp,
+ meta: {
+ intent: data.intent,
+ valkeyOp: data.valkeyOp,
+ storedIn: data.storedIn,
+ breethMemory: data.breethMemory,
+ },
+ },
+ ]);
+ } catch (err) {
+ setMessages(prev => [
+ ...prev,
+ { role: "assistant", content: "I'm having trouble connecting to the backend. Make sure the backend is running on port 5000." },
+ ]);
+ }
+ setLoading(false);
+ };
+
+ return (
+ <>
+ {/* Floating toggle button */}
+ setOpen(o => !o)}
+ style={{
+ position: "fixed",
+ bottom: 80,
+ right: 24,
+ zIndex: 9997,
+ background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
+ color: "#fff",
+ border: "none",
+ borderRadius: "50%",
+ width: 56,
+ height: 56,
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ boxShadow: "0 4px 20px rgba(102,126,234,0.6)",
+ transition: "all 0.2s",
+ fontSize: 24,
+ }}
+ title="AI Shopping Assistant (Breeth AI + Valkey)"
+ >
+
+
+
+ {/* Chat panel */}
+ {open && (
+
+ {/* Header */}
+
+
+
+
AI Shopping Assistant
+
Powered by Breeth AI + Valkey
+
+ {sessionId && (
+
+
Breeth Memory
+
● Active
+
+ )}
+
+
+ {/* Messages */}
+
+ {messages.map((m, i) => (
+
+
+
+ {/* Product cards */}
+ {m.products && m.products.length > 0 && (
+
+ {m.products.map((p) => (
+
+
+
+
+
+
{p.name}
+
+ ₹{p.price?.toLocaleString("en-IN")}
+ {p.rating > 0 && (
+ ★ {p.rating}
+ )}
+
+ {p.inStock ? "In Stock" : "Out of Stock"}
+
+
+
+
+ ))}
+
+ )}
+
+ {/* Follow-up question */}
+ {m.followUp && (
+
+ {m.followUp}
+
+ )}
+
+ {/* Valkey meta */}
+ {m.meta && (
+
+ Valkey: {m.meta.valkeyOp?.split(" ")[0]}
+ {m.meta.breethMemory === "personalized" && (
+
+ Breeth: personalized
+
+ )}
+
+ )}
+
+ ))}
+
+ {loading && (
+
+ {[0, 1, 2].map(i => (
+
+ ))}
+
+ )}
+
+
+
+ {/* Quick prompts */}
+
+ {QUICK_PROMPTS.map(p => (
+ send(p)} style={{
+ background: "#EDF2F7",
+ border: "none",
+ borderRadius: 20,
+ padding: "4px 10px",
+ fontSize: 10,
+ color: "#4A5568",
+ cursor: "pointer",
+ whiteSpace: "nowrap",
+ flexShrink: 0,
+ }}>
+ {p}
+
+ ))}
+
+
+ {/* Input */}
+
+ setInput(e.target.value)}
+ onKeyDown={e => e.key === "Enter" && send()}
+ placeholder="Ask about products, deals, gifts…"
+ style={{
+ flex: 1,
+ border: "1px solid #E2E8F0",
+ borderRadius: 20,
+ padding: "8px 14px",
+ fontSize: 13,
+ outline: "none",
+ }}
+ />
+ send()}
+ disabled={loading || !input.trim()}
+ style={{
+ background: "linear-gradient(135deg, #667eea, #764ba2)",
+ color: "#fff",
+ border: "none",
+ borderRadius: "50%",
+ width: 36,
+ height: 36,
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ flexShrink: 0,
+ opacity: loading || !input.trim() ? 0.5 : 1,
+ }}
+ >
+
+
+
+
+ )}
+
+
+ >
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/Account.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/Account.jsx
new file mode 100644
index 0000000..aa057fc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/Account.jsx
@@ -0,0 +1,270 @@
+import React, { useState } from "react";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+function VBadge({ cmd }) {
+ return (
+
+ ⚡ {cmd}
+
+ );
+}
+
+const Account = () => {
+ const { login, session, userId, logout } = useValkey();
+
+ // Login state
+ const [loginEmail, setLoginEmail] = useState("");
+ const [loginPassword, setLoginPassword] = useState("");
+ const [loginError, setLoginError] = useState(null);
+ const [loginLoading, setLoginLoading] = useState(false);
+ const [showLoginPw, setShowLoginPw] = useState(false);
+
+ // Register state
+ const [regName, setRegName] = useState("");
+ const [regEmail, setRegEmail] = useState("");
+ const [regPassword, setRegPassword] = useState("");
+ const [regError, setRegError] = useState(null);
+ const [regSuccess, setRegSuccess] = useState(null);
+ const [regLoading, setRegLoading] = useState(false);
+ const [showRegPw, setShowRegPw] = useState(false);
+
+ const handleLogin = async (e) => {
+ e.preventDefault();
+ setLoginError(null);
+ setLoginLoading(true);
+ const result = await login(loginEmail, loginPassword);
+ setLoginLoading(false);
+ if (!result?.token) {
+ setLoginError(result?.message || result?.error || "Invalid email or password");
+ }
+ };
+
+ const handleRegister = async (e) => {
+ e.preventDefault();
+ setRegError(null);
+ setRegSuccess(null);
+ setRegLoading(true);
+ try {
+ const res = await fetch(`${API}/api/auth/register`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ name: regName, email: regEmail, password: regPassword }),
+ });
+ const data = await res.json();
+ if (data.error || data.message?.toLowerCase().includes("exist")) {
+ setRegError(data.message || data.error || "Registration failed");
+ } else {
+ setRegSuccess("Account created! You can now log in.");
+ setRegName(""); setRegEmail(""); setRegPassword("");
+ }
+ } catch (err) {
+ setRegError("Network error. Is the backend running?");
+ }
+ setRegLoading(false);
+ };
+
+ // If already logged in
+ if (session?.token) {
+ return (
+
+
+
+
+
+
+
+
+
Welcome back!
+
{session.email || session.name || userId}
+
+
+
Session stored in Valkey String · 24h TTL · auto-refreshed
+
+
+
+ User ID: {userId}
+
+
+ Sign Out
+
+
+
+
⚡ Session stored in Valkey
+
+ Key: session:{session.token?.slice(0, 16)}…
+ Command: SET session:{"{token}"} {"{userId}"} EX 86400
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ {/* ── Login ── */}
+
+
+
+
Login
+
+
+
+
+
+
+
Demo Credentials:
+
+ {[
+ { email: "demo@valkey.io", pass: "demo1234", role: "User" },
+ { email: "admin@valkey.io", pass: "admin1234", role: "Admin" },
+ { email: "user1@demo.com", pass: "user1234", role: "Arjun Sharma" },
+ ].map(c => (
+ { setLoginEmail(c.email); setLoginPassword(c.pass); }} className="text-start border-0 bg-transparent p-0 text-xs text-main-600 hover-text-main-700" style={{ cursor: "pointer", textDecoration: "underline" }}>
+ {c.role}: {c.email} / {c.pass}
+
+ ))}
+
+
+
+
+
+ {/* ── Register ── */}
+
+
+
+
Register
+
+
+
+
+
+
+
⚡ Registration stores data in Valkey JSON
+
+ JSON.SET user:{"{uuid}"} $ {"{profile}"}
+ SET email:{"{email}"} {"{userId}"}
+ Password hashed with bcrypt (12 rounds)
+
+
+
+
+
+
+
+ );
+};
+
+export default Account;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/AdBanner.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/AdBanner.jsx
new file mode 100644
index 0000000..4e3aaa8
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/AdBanner.jsx
@@ -0,0 +1,114 @@
+import React, { useEffect, useState } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=100&h=100&fit=crop",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=100&h=100&fit=crop",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=100&h=100&fit=crop",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=100&h=100&fit=crop",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=100&h=100&fit=crop",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=100&h=100&fit=crop",
+ "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d": "https://images.unsplash.com/photo-1694819488591-a43907d1c5cc?w=100&h=100&fit=crop",
+ "product:0192d5a1-2222-7b2c-9d2e-2f3a4b5c6d7e": "https://images.unsplash.com/photo-1517336714731-489689fd1ca8?w=100&h=100&fit=crop",
+ "product:0192d5a1-3333-7c3d-0e3f-3a4b5c6d7e8f": "https://images.unsplash.com/photo-1598327105666-5b89351aff97?w=100&h=100&fit=crop",
+ "product:0192d5a1-4444-7d4e-1f4a-4b5c6d7e8f9a": "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=100&h=100&fit=crop",
+ "product:0192d5a1-5555-7e5f-2a5b-5c6d7e8f9a0b": "https://images.unsplash.com/photo-1551816230-ef5deaed4a26?w=100&h=100&fit=crop",
+ "product:0192d5a1-9999-7c9d-6e9f-9a0b1c2d3e4f": "https://images.unsplash.com/photo-1608043152269-423dbba4e7e1?w=100&h=100&fit=crop",
+};
+
+const GRADIENT_ADS = [
+ { gradient: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)", icon: "ph-percent", label: "VALKEY10", text: "10% OFF orders over ₹5,000", sub: "Use code VALKEY10 at checkout" },
+ { gradient: "linear-gradient(135deg, #f093fb 0%, #f5576c 100%)", icon: "ph-lightning", label: "NEW", text: "New Arrivals — Just Dropped", sub: "18 products now in stock" },
+ { gradient: "linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)", icon: "ph-trend-up", label: "HOT", text: "Trending Right Now", sub: "Powered by Valkey Sorted Set" },
+];
+
+export default function AdBanner({ variant = "horizontal" }) {
+ const { userId } = useValkey();
+ const [ads, setAds] = useState([]);
+ const [banners, setBanners] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [dismissed, setDismissed] = useState(false);
+
+ useEffect(() => {
+ const load = async () => {
+ try {
+ const [tRes, bRes] = await Promise.all([
+ fetch(`${API}/api/ads/targeted?userId=${encodeURIComponent(userId)}`),
+ fetch(`${API}/api/ads/banner`),
+ ]);
+ const tData = await tRes.json();
+ const bData = await bRes.json();
+ setAds(tData.ads || []);
+ setBanners(bData.banners || []);
+ } catch (e) { console.error("[AdBanner]", e); }
+ setLoading(false);
+ };
+ load();
+ }, [userId]);
+
+ if (dismissed || loading) return null;
+
+ if (variant === "targeted" && ads.length > 0) {
+ return (
+
+
+
+
+ Recommended for You
+
+ ⚡ ZREVRANGE user_affinity
+
+
+
setDismissed(true)} style={{ background: "none", border: "none", color: "#a0aec0", cursor: "pointer", fontSize: 18 }}>×
+
+
+ {ads.slice(0, 4).map((ad, i) => {
+ const img = PRODUCT_IMAGES[ad.productId] || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=100&h=100&fit=crop";
+ return (
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=60&h=60&fit=crop"; }} />
+
+
{ad.name}
+
₹{Number(ad.price || 0).toLocaleString("en-IN")}
+
{ad.targetReason}
+
+
+
+ );
+ })}
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ {GRADIENT_ADS.map((ad, i) => (
+
+
+
+
+
+
{ad.label}
+
{ad.text}
+
{ad.sub}
+
+
+
+
+ ))}
+
+
+ Ads powered by Valkey user_affinity · ZINCRBY
+
+
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BannerOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerOne.jsx
new file mode 100644
index 0000000..2c53855
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerOne.jsx
@@ -0,0 +1,118 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from "react-slick";
+const BannerOne = () => {
+
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1500,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ nextArrow: ,
+ prevArrow: ,
+
+
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Daily Grocery Order and Get Express Delivery
+
+
+ Explore Shop{" "}
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+ Daily Grocery Order and Get Express Delivery
+
+
+ Explore Shop{" "}
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default BannerOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BannerThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerThree.jsx
new file mode 100644
index 0000000..b798cab
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerThree.jsx
@@ -0,0 +1,267 @@
+import React, { useEffect } from "react";
+import Slider from "react-slick";
+import { WOW } from "wowjs";
+import "animate.css";
+import { Link } from "react-router-dom";
+const BannerThree = () => {
+ useEffect(() => {
+ const wow = new WOW({
+ live: false,
+ });
+ wow.init();
+ }, []);
+
+ let itItWow = () => {
+ const wow = new WOW({
+ live: false,
+ });
+ wow.init();
+ };
+ const NextArrow = ({ onClick }) => (
+ {
+ onClick();
+ itItWow();
+ }}
+ type='button'
+ id='banner-three-next'
+ className='slick-next slick-arrow flex-center rounded-circle border border-white hover-border-main-600 text-white text-2xl hover-bg-main-600 hover-text-white transition-1 position-absolute top-50 translate-middle-y inset-inline-end-0 me-lg-5 me-32'
+ >
+
+
+ );
+
+ const PrevArrow = ({ onClick }) => (
+ {
+ onClick();
+ itItWow();
+ }}
+ type='button'
+ id='banner-three-prev'
+ className='slick-prev slick-arrow flex-center rounded-circle border border-white hover-border-main-600 text-white text-2xl hover-bg-main-600 hover-text-white transition-1 position-absolute top-50 translate-middle-y inset-inline-start-0 ms-lg-5 ms-32'
+ >
+
+
+ );
+
+ const settings = {
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ autoplay: false,
+ autoplaySpeed: 2000,
+ speed: 1500,
+ dots: false,
+ pauseOnHover: true,
+ arrows: true,
+ nextArrow: ,
+ prevArrow: ,
+ infinite: true,
+ };
+
+ return (
+
+
+
+
+
+
+ Fashion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UP TO 50% OFF
+
+
+ New
+
+ Style
+ {" "}
+ Just For You.
+
+
+ You appear ordinary if you dress simply. We are able to
+ help you.
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UP TO 50% OFF
+
+
+ New
+
+ Style
+
+ Just For You.
+
+
+ You appear ordinary if you dress simply. We are able to
+ help you.
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UP TO 50% OFF
+
+
+ New
+
+ Style
+ {" "}
+ Just For You.
+
+
+ You appear ordinary if you dress simply. We are able to
+ help you.
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default BannerThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BannerTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerTwo.jsx
new file mode 100644
index 0000000..6d9f4d0
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BannerTwo.jsx
@@ -0,0 +1,597 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const BannerTwo = () => {
+ const settings = {
+ dots: true,
+
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ initialSlide: 0,
+
+
+ };
+ return (
+
+
+
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+ Cell Phone
+
+
+
+
+
+
+ Cell Phone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Wear
+
+
+
+
+
+
Wear
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Computer
+
+
+
+
+
+
+ Computer
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Smart Home
+
+
+
+
+
+
+ Smart Home
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Digital Accessories
+
+
+
+
+
+
+ Digital Accessories
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Value Added Services
+
+
+
+
+
+
+ {" "}
+ Value Added Services
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Car Products
+
+
+
+
+
+
+ Car Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Ecological Products
+
+
+
+
+
+
+ Ecological Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Flat
+
+
+
+
+
+
Flat
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Commercial Terminal
+
+
+
+
+
+
+ Commercial Terminal
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Starting at only $250
+
+ Get The Sound You Love For Less
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ Starting at only $250
+
+ Get The Sound You Love For Less
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default BannerTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BestSellsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BestSellsOne.jsx
new file mode 100644
index 0000000..b796cdb
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BestSellsOne.jsx
@@ -0,0 +1,255 @@
+import React, { useEffect, useState } from 'react'
+import { Link } from 'react-router-dom'
+import { getCountdown } from '../helper/Countdown';
+import { useValkey } from '../context/ValkeyContext';
+
+const BEST_SELL_PRODUCTS = [
+ {
+ id: "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d",
+ name: "Sony WF-1000XM5 Earbuds",
+ brand: "Sony",
+ price: { amount: 24999, currency: "INR", compareAt: 29999 },
+ images: [{ url: "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=300&h=300&fit=crop&auto=format" }],
+ ratings: { average: 4.9, count: 1876 },
+ inventory: { quantity: 95, reserved: 20 },
+ },
+ {
+ id: "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f",
+ name: "Galaxy Ultra Pro 256GB",
+ brand: "Samsung",
+ price: { amount: 89999, currency: "INR", compareAt: 99999 },
+ images: [{ url: "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=300&h=300&fit=crop&auto=format" }],
+ ratings: { average: 4.6, count: 2341 },
+ inventory: { quantity: 150, reserved: 12 },
+ },
+ {
+ id: "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b",
+ name: "Nike Air Max Sneakers",
+ brand: "Nike",
+ price: { amount: 12999, currency: "INR", compareAt: 15999 },
+ images: [{ url: "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=300&h=300&fit=crop&auto=format" }],
+ ratings: { average: 4.5, count: 3210 },
+ inventory: { quantity: 200, reserved: 15 },
+ },
+ {
+ id: "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a",
+ name: "Dell XPS 15 Laptop",
+ brand: "Dell",
+ price: { amount: 149999, currency: "INR", compareAt: 179999 },
+ images: [{ url: "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=300&h=300&fit=crop&auto=format" }],
+ ratings: { average: 4.8, count: 892 },
+ inventory: { quantity: 45, reserved: 5 },
+ },
+];
+
+const BestSellsOne = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+ const { addToCart } = useValkey();
+ const [adding, setAdding] = useState(null);
+ const [toast, setToast] = useState(null);
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+
+ const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+ useEffect(() => {
+ const fetchBestSells = async () => {
+ try {
+ const res = await fetch(`${API}/api/products?category=category:grocery&limit=4`);
+ const data = await res.json();
+ setProducts(data.products || data || []);
+ } catch (err) {
+ console.error("[BestSellsOne] fetch error:", err);
+ } finally {
+ setLoading(false);
+ }
+ };
+ fetchBestSells();
+ }, [API]);
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+ return () => clearInterval(interval);
+ }, []);
+
+ useEffect(() => {
+ if (toast) {
+ const t = setTimeout(() => setToast(null), 2500);
+ return () => clearTimeout(t);
+ }
+ }, [toast]);
+
+ const handleAddToCart = async (product) => {
+ setAdding(product.id);
+ const result = await addToCart(product);
+ setAdding(null);
+ if (result) setToast(`${product.name} added to cart!`);
+ };
+
+ const fmtPrice = (amt) => `₹${Number(amt).toLocaleString("en-IN")}`;
+
+ return (
+
+ {toast && (
+
+
+ {toast}
+
+ )}
+
+
+
+
+ {loading ? (
+
+
+
Loading best sells…
+
+ ) : (
+
+ {products.slice(0, 4).map((product) => {
+ const qty = product.inventory?.quantity || 0;
+ const res = product.inventory?.reserved || 0;
+ const inStock = (qty - res) > 0;
+ const isAdding = adding === product.id;
+ const img = product.images?.[0]?.url || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop";
+ return (
+
+
+
+
+ Sale{" "}
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop"; }}
+ />
+
+
+
+
+ {timeLeft.hours} Hours
+
+
+ {timeLeft.minutes} Min
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+
+
+ {product.price?.compareAt && (
+
+ {fmtPrice(product.price.compareAt)}
+
+ )}
+
+ {fmtPrice(product.price?.amount || product.price)}
+
+
+
+ {product.ratings?.average || 4.5}
+
+
+
+ ({(product.ratings?.count || 0).toLocaleString()})
+
+
+
+ {product.name}
+
+
+
+
+
+
+ By {product.brand}
+
+
inStock && handleAddToCart(product)}
+ disabled={!inStock || isAdding}
+ className="product-card__cart btn bg-main-50 text-main-600 hover-bg-main-600 hover-text-white py-11 px-24 rounded-pill flex-align gap-8 mt-8 w-100 justify-content-center"
+ style={{ border: "none", cursor: inStock ? "pointer" : "not-allowed", opacity: !inStock ? 0.5 : 1 }}
+ >
+ {isAdding ? "Adding…" : "Add To Cart"}
+
+
+ ⚡ HSET cart:{"{userId}"}
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
Special Offers
+
+
+
+ {timeLeft.hours} Hours
+
+
+ {timeLeft.minutes} Min
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BestSellsOne
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BigDealOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BigDealOne.jsx
new file mode 100644
index 0000000..27214fe
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BigDealOne.jsx
@@ -0,0 +1,34 @@
+import React from 'react'
+
+const BigDealOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
WATCHES BIG DEAL
+
+ Wonlex KT07 4G positioning watches
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default BigDealOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/Blog.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/Blog.jsx
new file mode 100644
index 0000000..a417d46
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/Blog.jsx
@@ -0,0 +1,509 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const Blog = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Gadget
+
+
+
+ Legal structure, can make profit buisness
+
+
+
+ Re-engagement — objectives. As developers, we rightfully obsess
+ about the customer experience, relentlessly working to squeeze
+ every millisecond out of the critical rendering path, optimize
+ input latency, and eliminate...
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+ 0 Comments
+
+
+
+
+
+
+
+
+
+
+
+
+ Gadget
+
+
+
+ Legal structure, can make profit buisness
+
+
+
+ Re-engagement — objectives. As developers, we rightfully obsess
+ about the customer experience, relentlessly working to squeeze
+ every millisecond out of the critical rendering path, optimize
+ input latency, and eliminate...
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+ 0 Comments
+
+
+
+
+
+
+
+
+
+
+
+
+ Gadget
+
+
+
+ Legal structure, can make profit buisness
+
+
+
+ Re-engagement — objectives. As developers, we rightfully obsess
+ about the customer experience, relentlessly working to squeeze
+ every millisecond out of the critical rendering path, optimize
+ input latency, and eliminate...
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+ 0 Comments
+
+
+
+
+
+
+
+ {/* Pagination Start */}
+
+
+
+
+
+
+
+
+ 01
+
+
+
+
+ 02
+
+
+
+
+ 03
+
+
+
+
+ 04
+
+
+
+
+ 05
+
+
+
+
+ 06
+
+
+
+
+ 07
+
+
+
+
+
+
+
+
+ {/* Pagination End */}
+
+
+ {/* Search Start */}
+
+ {/* Search End */}
+ {/* Recent Post Start */}
+
+
+ Recent Posts
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+ {/* Recent Post End */}
+ {/* Tags Start */}
+
+
+ Recent Posts
+
+
+
+
+ Gaming (12)
+
+
+
+
+
+
+
+ Smart Gadget (05)
+
+
+
+
+
+
+
+ Software (29)
+
+
+
+
+
+
+
+ Electronics (24)
+
+
+
+
+
+
+
+ Laptop (08)
+
+
+
+
+
+
+
+ Mobile & Accessories (16)
+
+
+
+
+
+
+
+ Apliance (24)
+
+
+
+
+
+
+
+ {/* Tags End */}
+
+
+
+
+
+ )
+}
+
+export default Blog
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BlogDetails.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BlogDetails.jsx
new file mode 100644
index 0000000..ffced7c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BlogDetails.jsx
@@ -0,0 +1,693 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const BlogDetails = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ Gadget
+
+
+ Nice decoration make be distilled to a single house
+
+
+ A great commerce experience cannot be distilled to a single
+ number. It's not a Lighthouse score, or a set of Core Web Vitals
+ figures, although both are important inputs. A great commerce
+ experience is a trilemma that carefully balances competing needs
+ of delivering great customer experience, dynamic storefront
+ capabilities, and long-term business — conversion, retention,
+ re-engagement — objectives. As developers, we rightfully obsess
+ about the customer experience, relentlessly working to squeeze
+ every millisecond out of the critical rendering path, optimize
+ input latency, and eliminate jank. At the limit, statically
+ generated, edge delivered, and HTML-first pages look like the
+ optimal strategy. That is until you are confronted with the
+ realization that the next step function in improving conversion
+ rates and business.
+
+
+ Re-engagement — objectives. As developers, we rightfully obsess
+ about the customer experience, relentlessly working to squeeze
+ every millisecond out of the critical rendering path, optimize
+ input latency, and eliminate...
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+ 0 Comments
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single number.
+ It’s not a Lighthouse score, or a set of Core Web Vitals figures,
+ although both are important inputs. A great commerce experience is a
+ trilemma that carefully balances competing needs of delivering great
+ customer experience, dynamic storefront capabilities, and long-term
+ business.
+
+
+
+
+ The following are the four main market segments in which e-commerce
+ is present. These are the following:
+
+
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+
+
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number. It’s not a Lighthouse score, or a set of Core Web Vitals
+ figures, although both are important inputs. A great commerce
+ experience is a trilemma that carefully balances competing needs
+ of delivering great customer experience, dynamic storefront
+ capabilities, and long-term business.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tag:
+
+ Mobile
+
+
+ Laptop
+
+
+ Gadget
+
+
+
+
+
+
+
+
+
+ Previous Post
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+ Next
+
+
+
+ A great commerce experience cannot be distilled to a single
+ number.{" "}
+
+
+
+
+
+
+
+
+
+
+ Comments
+
+
+
+
+
Marvin McKinney
+
+
+ 26 Apr, 2026
+
+
+
+ In a nisi commodo, porttitor ligula consequat, tincidunt dui.
+ Nulla volutpat, metus eu aliquam malesuada, elit libero
+ venenatis urna, consequat maximus arcu diam non diam.
+
+
+
+
+
+
+
+
Kristin Watson
+
+
+ 24 Apr, 2026
+
+
+
+ Quisque eget tortor lobortis, facilisis metus eu, elementum
+ est. Nunc sit amet erat quis ex convallis suscipit. Nam
+ hendrerit, velit ut aliquam euismod, nibh tortor rutrum nisi,
+ ac sodales nunc eros porta nisi. Sed scelerisque, est eget
+ aliquam venenatis, est sem tempor eros.
+
+
+
+
+
+
+
+
Jenny Wilson
+
+
+ 20 Apr, 2026
+
+
+
+ Vestibulum ante ipsum primis in faucibus orci luctus et
+ ultrices posuere cubilia curae.
+
+
+
+
+
+
+
+
Robert Fox
+
+
+ 18 Apr, 2026
+
+
+
+ Pellentesque feugiat, nibh vel vehicula pretium, nibh nibh
+ bibendum elit, a volutpat arcu dui nec orci. Aenean dui odio,
+ ullamcorper quis turpis ac, volutpat imperdiet ex.
+
+
+
+
+
+
+
+
Eleanor Pena
+
+
+ 7 Apr, 2026
+
+
+
+ Nulla molestie interdum ultricies.{" "}
+
+
+
+
+
+ Load More
+
+
+
+
+
+
+ {/* Search Start */}
+
+
+ Search Here
+
+
+
+
+
+
+
+
+
+
+ {/* Search End */}
+ {/* Recent Post Start */}
+
+
+ Recent Posts
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+
+
+
+
+
+
+ Once determined you need to come up with a name
+
+
+
+
+
+
+
+
+ July 12, 2025
+
+
+
+
+
+
+ {/* Recent Post End */}
+ {/* Tags Start */}
+
+
+ Recent Posts
+
+
+
+
+ Gaming (12)
+
+
+
+
+
+
+
+ Smart Gadget (05)
+
+
+
+
+
+
+
+ Software (29)
+
+
+
+
+
+
+
+ Electronics (24)
+
+
+
+
+
+
+
+ Laptop (08)
+
+
+
+
+
+
+
+ Mobile & Accessories (16)
+
+
+
+
+
+
+
+ Apliance (24)
+
+
+
+
+
+
+
+ {/* Tags End */}
+
+
+
+
+
+ )
+}
+
+export default BlogDetails
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BottomFooter.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BottomFooter.jsx
new file mode 100644
index 0000000..d9a27a2
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BottomFooter.jsx
@@ -0,0 +1,22 @@
+import React from 'react'
+
+const BottomFooter = () => {
+ return (
+
+
+
+
+ Valkey eCommerce © 2026. All Rights Reserved{" "}
+
+
+
We Are Acepting
+
+
+
+
+
+
+ )
+}
+
+export default BottomFooter
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BrandOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandOne.jsx
new file mode 100644
index 0000000..b86eef7
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandOne.jsx
@@ -0,0 +1,135 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const BrandOne = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 8,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 7,
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 6,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 5,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 4,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 359,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ ],
+ };
+ return (
+
+
+
+
+
+
Shop by Brands
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default BrandOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BrandThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandThree.jsx
new file mode 100644
index 0000000..9c3bef6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandThree.jsx
@@ -0,0 +1,128 @@
+import React from "react";
+import Slider from "react-slick";
+
+const BrandThree = () => {
+ const NextArrow = ({ onClick }) => (
+
+
+
+ );
+
+ const PrevArrow = ({ onClick }) => (
+
+
+
+ );
+ const settings = {
+ slidesToShow: 8,
+ slidesToScroll: 1,
+ autoplay: false,
+ autoplaySpeed: 2000,
+ dots: false,
+ arrows: true,
+ speed: 900,
+ infinite: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 7,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 6,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 5,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 4,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 3,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 359,
+ settings: {
+ slidesToShow: 2,
+ arrows: false,
+ },
+ },
+ ],
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default BrandThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BrandTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandTwo.jsx
new file mode 100644
index 0000000..3ab1696
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BrandTwo.jsx
@@ -0,0 +1,153 @@
+import React from 'react'
+import Slider from 'react-slick';
+
+const BrandTwo = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 8,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 7,
+
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 6,
+
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 5,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 4,
+
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 359,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default BrandTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/Breadcrumb.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/Breadcrumb.jsx
new file mode 100644
index 0000000..f48c9c0
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/Breadcrumb.jsx
@@ -0,0 +1,31 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const Breadcrumb = ({ title }) => {
+ return (
+
+
+
+
{title}
+
+
+
+
+ Home
+
+
+
+
+
+ {title}
+
+
+
+
+ );
+};
+
+export default Breadcrumb;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbImage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbImage.jsx
new file mode 100644
index 0000000..69fa328
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbImage.jsx
@@ -0,0 +1,37 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const BreadcrumbImage = () => {
+ return (
+
+
+
+
+
+
+
+ Become A Valkey Seller
+
+
+ More than half the units sold in our stores from independent
+ sellers.
+
+
+ Create An Account
+
+
+
+
+ );
+};
+
+export default BreadcrumbImage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbThree.jsx
new file mode 100644
index 0000000..54a7053
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbThree.jsx
@@ -0,0 +1,31 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const BreadcrumbThree = ({ title }) => {
+ return (
+
+
+
+
{title}
+
+
+
+
+ Home
+
+
+
+
+
+ {title}
+
+
+
+
+ );
+};
+
+export default BreadcrumbThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbTwo.jsx
new file mode 100644
index 0000000..2eb00ee
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/BreadcrumbTwo.jsx
@@ -0,0 +1,46 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const BreadcrumbTwo = () => {
+ return (
+
+
+
+
Shop Details
+
+
+
+
+ Home
+
+
+
+
+
+
+
+
+ Shop
+
+
+
+
+
+
+
+ Shop Grid
+
+
+
+
+
+ Lay's Potato Chips
+
+
+
+
+
+ )
+}
+
+export default BreadcrumbTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/CartSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/CartSection.jsx
new file mode 100644
index 0000000..486bb56
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/CartSection.jsx
@@ -0,0 +1,388 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+import QuantityControl from '../helper/QuantityControl'
+
+const CartSection = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ Delete
+ Product Name
+ Price
+ Quantity
+ Subtotal
+
+
+
+
+
+
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ |
+
+
+ 128 Reviews
+
+
+
+
+ Camera
+
+
+ Videos
+
+
+
+
+
+
+ $125.00
+
+
+
+
+
+ $125.00
+
+
+
+
+
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ |
+
+
+ 128 Reviews
+
+
+
+
+ Camera
+
+
+ Videos
+
+
+
+
+
+
+ $125.00
+
+
+
+
+
+ $125.00
+
+
+
+
+
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ |
+
+
+ 128 Reviews
+
+
+
+
+ Camera
+
+
+ Videos
+
+
+
+
+
+
+ $125.00
+
+
+
+
+
+ $125.00
+
+
+
+
+
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ |
+
+
+ 128 Reviews
+
+
+
+
+ Camera
+
+
+ Videos
+
+
+
+
+
+
+ $125.00
+
+
+
+
+
+ $125.00
+
+
+
+
+
+
+
+
+
+ Apply Coupon
+
+
+
+ Update Cart
+
+
+
+
+
+
+
Cart Totals
+
+
+ Subtotal
+ $250.00
+
+
+
+ Extimated Delivery
+
+ Free
+
+
+
+ Extimated Taxs
+
+ USD 10.00
+
+
+
+
+ Proceed to checkout
+
+
+
+
+
+
+
+ )
+}
+
+export default CartSection
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/Checkout.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/Checkout.jsx
new file mode 100644
index 0000000..31cdfdc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/Checkout.jsx
@@ -0,0 +1,321 @@
+import React, { useState } from 'react'
+import { Link } from 'react-router-dom';
+
+const Checkout = () => {
+ const [selectedPayment, setSelectedPayment] = useState("payment1");
+
+ const handlePaymentChange = (event) => {
+ setSelectedPayment(event.target.id);
+ };
+ return (
+
+
+
+
+ Have a coupon?{" "}
+
+ Click here to enter your code
+ {" "}
+
+
+
+
+
+
+
+
+ Your Orders
+
+
+
+
+
+ Product
+
+
+ Subtotal
+
+
+
+
+
+ HP Chromebook With Intel Celeron
+
+
+
+
+
+ 1
+
+
+
+ $250.00
+
+
+
+
+
+ HP Chromebook With Intel Celeron
+
+
+
+
+
+ 1
+
+
+
+ $250.00
+
+
+
+
+
+ HP Chromebook With Intel Celeron
+
+
+
+
+
+ 1
+
+
+
+ $250.00
+
+
+
+
+
+ HP Chromebook With Intel Celeron
+
+
+
+
+
+ 1
+
+
+
+ $250.00
+
+
+
+
+
+ Subtotal
+
+
+ $859.00
+
+
+
+
+ Total
+
+
+ $859.00
+
+
+
+
+
+
+
+
+
+ Direct Bank transfer
+
+
+ {selectedPayment === 'payment1' && (
+
+
+ Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.
+
+
+ )}
+
+
+
+
+
+ Check payments
+
+
+ {selectedPayment === 'payment2' && (
+
+
+ Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.
+
+
+ )}
+
+
+
+
+
+ Cash on delivery
+
+
+ {selectedPayment === 'payment3' && (
+
+
+ Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order will not be shipped until the funds have cleared in our account.
+
+
+ )}
+
+
+
+
+ Your personal data will be used to process your order, support
+ your experience throughout this website, and for other purposes
+ described in our{" "}
+
+ {" "}
+ privacy policy
+ {" "}
+ .
+
+
+
+ Place Order
+
+
+
+
+
+
+
+ )
+}
+
+export default Checkout
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ComparisonSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ComparisonSection.jsx
new file mode 100644
index 0000000..6eb44d3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ComparisonSection.jsx
@@ -0,0 +1,364 @@
+import React, { useState, useEffect, useCallback } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=200&h=200&fit=crop",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=200&h=200&fit=crop",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=200&h=200&fit=crop",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=200&h=200&fit=crop",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=200&h=200&fit=crop",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=200&h=200&fit=crop",
+ "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d": "https://images.unsplash.com/photo-1694819488591-a43907d1c5cc?w=200&h=200&fit=crop",
+ "product:0192d5a1-2222-7b2c-9d2e-2f3a4b5c6d7e": "https://images.unsplash.com/photo-1517336714731-489689fd1ca8?w=200&h=200&fit=crop",
+ "product:0192d5a1-3333-7c3d-0e3f-3a4b5c6d7e8f": "https://images.unsplash.com/photo-1598327105666-5b89351aff97?w=200&h=200&fit=crop",
+ "product:0192d5a1-4444-7d4e-1f4a-4b5c6d7e8f9a": "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=200&h=200&fit=crop",
+ "product:0192d5a1-5555-7e5f-2a5b-5c6d7e8f9a0b": "https://images.unsplash.com/photo-1551816230-ef5deaed4a26?w=200&h=200&fit=crop",
+ "product:0192d5a1-9999-7c9d-6e9f-9a0b1c2d3e4f": "https://images.unsplash.com/photo-1608043152269-423dbba4e7e1?w=200&h=200&fit=crop",
+};
+
+function VBadge({ cmd }) {
+ return (
+
+ ⚡ {cmd}
+
+ );
+}
+
+const COMPARE_ROWS = [
+ { label: "Brand", key: "brand" },
+ { label: "Price", key: "price", render: p => `₹${Number(p?.amount || p || 0).toLocaleString("en-IN")}` },
+ { label: "Rating", key: "ratings", render: r => r ? `${r.average} ★ (${r.count?.toLocaleString()})` : "—" },
+ { label: "Category", key: "categoryId", render: c => c?.split(":")[0] || c },
+ { label: "Stock", key: "inventory", render: inv => inv ? `${inv.quantity - inv.reserved} available` : "—" },
+ { label: "Description", key: "shortDescription" },
+];
+
+export default function ComparisonSection() {
+ const {
+ userId,
+ addToCart,
+ compare,
+ addToCompare,
+ removeFromCompare,
+ clearCompare,
+ refreshCompare
+ } = useValkey();
+
+ const products = compare.items || [];
+ const [loading, setLoading] = useState(false);
+ const [allProducts, setAllProducts] = useState([]);
+ const [showPicker, setShowPicker] = useState(false);
+ const [toast, setToast] = useState(null);
+
+ // AI comparison state
+ const [aiResponse, setAiResponse] = useState(null);
+ const [aiLoading, setAiLoading] = useState(false);
+ const [aiError, setAiError] = useState(null);
+ const [aiPoweredBy, setAiPoweredBy] = useState(null);
+
+ const fetchAllProducts = useCallback(async () => {
+ try {
+ const res = await fetch(`${API}/api/products`);
+ const data = await res.json();
+ setAllProducts(data.products || data || []);
+ } catch (e) { console.error(e); }
+ }, []);
+
+ useEffect(() => {
+ refreshCompare();
+ fetchAllProducts();
+ }, [refreshCompare, fetchAllProducts]);
+
+ const handleAdd = async (productId) => {
+ const prod = allProducts.find(p => p.id === productId);
+ if (prod) {
+ const res = await addToCompare(prod);
+ if (res && res.error === "comparison_limit_reached") {
+ setToast(res.message || "Comparison list full!");
+ setTimeout(() => setToast(null), 2500);
+ }
+ }
+ setShowPicker(false);
+ };
+
+ const handleRemove = async (productId) => {
+ await removeFromCompare(productId);
+ };
+
+ const handleClear = async () => {
+ await clearCompare();
+ };
+
+ const handleAddToCart = async (product) => {
+ await addToCart(product);
+ setToast(`${product.name} added to cart!`);
+ setTimeout(() => setToast(null), 2500);
+ };
+
+ const handleAICompare = async () => {
+ setAiLoading(true);
+ setAiError(null);
+ setAiResponse(null);
+ setAiPoweredBy(null);
+ try {
+ const res = await fetch(`${API}/api/comparison/ai-compare`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ userId }),
+ });
+ const data = await res.json();
+ if (data && data.success) {
+ setAiResponse(data.comparison);
+ setAiPoweredBy(data.poweredBy || "Smart Analysis Engine");
+ } else {
+ setAiError(data?.error || "Failed to generate AI comparison");
+ }
+ } catch (e) {
+ setAiError(e.message);
+ } finally {
+ setAiLoading(false);
+ }
+ };
+
+ const getImg = (p) => PRODUCT_IMAGES[p.id] || p.images?.[0]?.url || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=200&h=200&fit=crop";
+
+ const notInComparison = allProducts.filter(p => !products.some(cp => cp.id === p.id));
+
+ return (
+
+ {toast && (
+
+ {toast}
+
+ )}
+
+
+
+
+
Product Comparison
+
+ — stored in Valkey SET (max 4 products)
+
+
+ {products.length < 4 && (
+ setShowPicker(!showPicker)} className="btn btn-main rounded-pill px-20 py-10 d-flex align-items-center gap-8">
+ Add Product
+
+ )}
+ {products.length > 0 && (
+
+ Clear All
+
+ )}
+
+
+
+ {/* Product picker dropdown */}
+ {showPicker && (
+
+
Select a product to compare:
+
+ {notInComparison.map(p => (
+
+
handleAdd(p.id)} className="w-100 border border-gray-100 rounded-12 p-12 bg-white hover-border-main-600 text-start transition-2" style={{ cursor: "pointer" }}>
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=60&h=60&fit=crop"; }} />
+
+
{p.name}
+
₹{Number(p.price?.amount || 0).toLocaleString("en-IN")}
+
+
+
+
+ ))}
+
+
+ )}
+
+ {loading ? (
+
+ ) : products.length === 0 ? (
+
+
+
No products to compare
+
Add up to 4 products to compare their specs side by side.
+
Browse Products
+
+ ) : (
+
+
+
+
+ Feature
+ {products.map(p => (
+
+
+
handleRemove(p.id)} style={{ position: "absolute", top: -8, right: -8, background: "#e53e3e", color: "#fff", border: "none", borderRadius: "50%", width: 20, height: 20, fontSize: 11, cursor: "pointer", display: "flex", alignItems: "center", justifyContent: "center" }}>×
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=80&h=80&fit=crop"; }} />
+
{p.name}
+
+
+ ))}
+
+
+
+ {COMPARE_ROWS.map(row => (
+
+ {row.label}
+ {products.map(p => {
+ const val = p[row.key];
+ const display = row.render ? row.render(val) : (val || "—");
+ return (
+
+ {display}
+
+ );
+ })}
+
+ ))}
+
+ Action
+ {products.map(p => (
+
+ handleAddToCart(p)} className="btn btn-main rounded-pill px-16 py-8 text-xs d-inline-flex align-items-center gap-6">
+ Add to Cart
+
+
+ ))}
+
+
+
+
+ )}
+
+ {products.length >= 2 && (
+
+
+ {aiLoading ? (
+ <>
+
+ Analyzing with Breeth AI...
+ >
+ ) : (
+ <>
+
+ Compare with Breeth AI
+ >
+ )}
+
+
+ )}
+
+ {/* AI Comparison Results Section */}
+ {(aiLoading || aiResponse || aiError) && (
+
+
+
+
+
+
+ {aiPoweredBy === "Breeth AI" ? "Breeth AI — Side-by-Side Analysis" : "Smart Analysis — Powered by Valkey Data"}
+
+ {aiPoweredBy && (
+
+ {aiPoweredBy}
+
+ )}
+
+
+ {aiLoading && (
+
+
+
Evaluating price points, consumer ratings, and feature lists...
+
+ )}
+
+ {aiError && (
+
+
+ {aiError}
+
+ )}
+
+ {aiResponse && (
+
+ {aiResponse.split("\n").map((line, i) => {
+ // ## Heading
+ if (line.startsWith("## ")) {
+ return (
+
+ {line.replace(/^## /, "")}
+
+ );
+ }
+ // Bullet point
+ if (line.startsWith("- ")) {
+ const content = line.replace(/^- /, "");
+ return (
+
+ •
+ $1") }} />
+
+ );
+ }
+ // 🥇 / 💡 recommendation lines
+ if (line.startsWith("🥇") || line.startsWith("💡")) {
+ return (
+
$1") }} />
+ );
+ }
+ // Empty line → spacer
+ if (line.trim() === "") return
;
+ // Regular paragraph
+ return (
+
$1") }} />
+ );
+ })}
+
+ )}
+
+ )}
+
+ {/* Valkey info */}
+
+
⚡ Comparison stored in Valkey SET
+
+ Key: compare:{userId} · SADD (add) · SREM (remove) · SMEMBERS (list) · Max 4 items enforced by SCARD
+
+
+
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/Contact.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/Contact.jsx
new file mode 100644
index 0000000..1f6ece6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/Contact.jsx
@@ -0,0 +1,167 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const Contact = () => {
+ return (
+
+
+
+
+
+
+ Make Custom Request
+
+
+
+ Full Name{" "}
+ * {" "}
+
+
+
+
+
+ Email Address{" "}
+ * {" "}
+
+
+
+
+
+ Phone Number
+ * {" "}
+
+
+
+
+
+ Subject
+
+ *
+ {" "}
+
+
+
+
+
+ Message
+
+ *
+ {" "}
+
+
+
+
+
+ Get a Quote
+
+
+
+
+
+
+
+
+
Get In Touch
+
+
+
+
+
+ +00 123 456 789
+
+
+
+
+
+
+
+ support24@valkey.com
+
+
+
+
+
+
+
+ 789 Inner Lane, California, USA
+
+
+
+
+
+ Get Support On Call
+
+
+
+
+
+ Get Direction
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Contact
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/CounterSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/CounterSection.jsx
new file mode 100644
index 0000000..9e3ef60
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/CounterSection.jsx
@@ -0,0 +1,60 @@
+import React from "react";
+
+const CounterSection = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ 185+
+
+
+ Store around the world
+
+
+
+
+
+
+ 152K
+
+
+ Product Sold
+
+
+
+
+
+
+ 15K+
+
+
+ Registered Users
+
+
+
+
+
+
+ 2K+
+
+
+ Top Brands Available in store
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default CounterSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DaySaleOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DaySaleOne.jsx
new file mode 100644
index 0000000..32bb72f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DaySaleOne.jsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const DaySaleOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
CYBER MONDAY SALE
+ UP TO 30% OFF
+
+ COMPUTER & MOBILE ACCESSORIES
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DaySaleOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DealsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DealsOne.jsx
new file mode 100644
index 0000000..1d7a20d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DealsOne.jsx
@@ -0,0 +1,684 @@
+import React, { memo, useEffect, useState } from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+import { getCountdown } from '../helper/Countdown';
+
+
+const SampleNextArrow = memo(function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+const SamplePrevArrow = memo(function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+const DealsOne = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 5,
+
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 1199,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
Deal of The Week
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
Apple AirPods Max, Over Ear Headphones
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hour
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sold
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best seller
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Seller{" "}
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best seller
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DealsOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DealsSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DealsSection.jsx
new file mode 100644
index 0000000..d4d27cf
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DealsSection.jsx
@@ -0,0 +1,266 @@
+import React, { useEffect, useState } from "react";
+import { getCountdown } from "../helper/Countdown";
+import { Link } from "react-router-dom";
+
+const DealsSection = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Women's fashion Bag
+
+
+
+
+ $24.00 USD
+
+
+ $25.00 USD
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+ $24.00 USD
+
+
+ $25.00 USD
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ivory Lace Peplum Top
+
+
+
+
+ $24.00 USD
+
+
+ $25.00 USD
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Only For Today
+
+
+ Deal of The Day
+
+
+ Deal of the day for deals on consumer fashion cloths for
+ many other great daily offers
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+
+ Days
+
+
+
+
+ {timeLeft.hours}
+
+
+ Hour
+
+
+
+
+ {timeLeft.minutes}
+
+
+ Min
+
+
+
+
+ {timeLeft.seconds}
+
+
+ Sec
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DealsSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DeliveryOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DeliveryOne.jsx
new file mode 100644
index 0000000..27ad57f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DeliveryOne.jsx
@@ -0,0 +1,49 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const DeliveryOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ We Delivery on Next Day from 10:00 AM to 08:00 PM
+
+
For Orders starts from $100
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DeliveryOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountOne.jsx
new file mode 100644
index 0000000..1c19f33
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountOne.jsx
@@ -0,0 +1,78 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const DiscountOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ UP TO 30% OFF
+
+
+ 57" Odyssey Neo G9 Dual 4K UHD Quantum Mini-LED
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ UP TO 30% OFF
+
+
+ 57" Odyssey Neo G9 Dual 4K UHD Quantum Mini-LED
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DiscountOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountThree.jsx
new file mode 100644
index 0000000..9badb83
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/DiscountThree.jsx
@@ -0,0 +1,97 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const DiscountThree = () => {
+ return (
+
+
+
+
+
+
+
+ 35% off the all order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ 35% off the all order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ Get 25% off the all order
+
+
Black Friday
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DiscountThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureOne.jsx
new file mode 100644
index 0000000..1e6d4fc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureOne.jsx
@@ -0,0 +1,290 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const FeatureOne = () => {
+
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 10,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1699,
+ settings: {
+ slidesToShow: 9,
+ },
+ },
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 8,
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 6,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 5,
+ },
+ },
+ {
+ breakpoint: 768,
+ settings: {
+ slidesToShow: 4,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 359,
+ settings: {
+ slidesToShow: 1,
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vegetables
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Fish & Meats
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Desserts
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Drinks & Juice
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Animals Food
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Fresh Fruits
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Yummy Candy
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Fish & Meats
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Dairy & Eggs
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Snacks
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+
+
+
+ Frozen Foods
+
+
+ 125+ Products
+
+
+
+
+
+
+
+
+ )
+}
+
+export default FeatureOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureThree.jsx
new file mode 100644
index 0000000..d328c53
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FeatureThree.jsx
@@ -0,0 +1,231 @@
+import React from "react";
+import { Link } from "react-router-dom";
+import Slider from "react-slick";
+
+const FeatureThree = () => {
+ const NextArrow = ({ onClick }) => (
+
+
+
+ );
+
+ const PrevArrow = ({ onClick }) => (
+
+
+
+ );
+ const settings = {
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ autoplay: true,
+ autoplaySpeed: 2000,
+ speed: 900,
+ dots: false,
+ pauseOnHover: true,
+ arrows: true,
+ draggable: true,
+ infinite: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 5,
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 4,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 768,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 359,
+ settings: {
+ slidesToShow: 1,
+ },
+ },
+ ],
+ };
+ return (
+
+
+
+
Popular Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Men's Fashion
+
+
+ 180 Items
+
+
+
+
+
+
+
+
+
+
+
+ Women's Fashion
+
+
+ 220 Items
+
+
+
+
+
+
+
+
+
+
+
+ Kid’s Fashion
+
+
+ 205 Items
+
+
+
+
+
+
+
+
+
+
+
+ Fashion Glass
+
+
+ 68 Items
+
+
+
+
+
+
+
+
+
+
+
+ Shoes Collection
+
+
+ 190 Items
+
+
+
+
+
+
+
+
+
+
+
+ Bag Collection
+
+
+ 128 Items
+
+
+
+
+
+
+
+
+
+
+
+ Men's Fashion
+
+
+ 180 Items
+
+
+
+
+
+
+
+ );
+};
+
+export default FeatureThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FeaturedOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FeaturedOne.jsx
new file mode 100644
index 0000000..ecd4ae1
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FeaturedOne.jsx
@@ -0,0 +1,517 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const FeaturedOne = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 2,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 991,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
+
+
Featured Products
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best seller
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ Best Sale
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best seller
+
+
+
+
+
+
+ iPhone 15 Pro Warp Charge 30W Power Adapter
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ iPhone Smart Phone - Red
+
+
+ FROM
+
$890
+
+ 20% off
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default FeaturedOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FlashSalesOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FlashSalesOne.jsx
new file mode 100644
index 0000000..88e4603
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FlashSalesOne.jsx
@@ -0,0 +1,227 @@
+import React, { memo, useEffect, useState } from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+import { getCountdown } from '../helper/Countdown';
+
+
+const SampleNextArrow = memo(function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+const SamplePrevArrow = memo(function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+const FlashSalesOne = () => {
+
+
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 2,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 991,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+ return (
+
+
+
+
+
Flash Sales Today
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fresh Vegetables
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hours
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Daily Snacks
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hours
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Daily Snacks
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hours
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default FlashSalesOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FooterOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterOne.jsx
new file mode 100644
index 0000000..acc5fda
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterOne.jsx
@@ -0,0 +1,260 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const FooterOne = () => {
+ return (
+
+
+
+
+
+
+
+ {" "}
+
+
+
+
+ We're Grocery Shop, an innovative team of food supliers.
+
+
+
+
+
+
+ 789 Inner Lane, Biyes park, California, USA
+
+
+
+
+
+
+
+
+ +00 123 456 789
+
+ or
+
+ +00 987 654 012
+
+
+
+
+
+
+
+
+ support24@valkey.com
+
+
+
+
+
Information
+
+
+
+ Become a Vendor
+
+
+
+
+ Affiliate Program
+
+
+
+
+ Privacy Policy
+
+
+
+
+ Our Suppliers
+
+
+
+
+ Extended Plan
+
+
+
+
+ Community
+
+
+
+
+
+
Customer Support
+
+
+
+ Help Center
+
+
+
+
+ Contact Us
+
+
+
+
+ Report Abuse
+
+
+
+
+ Submit and Dispute
+
+
+
+
+ Policies & Rules
+
+
+
+
+ Online Shopping
+
+
+
+
+
+
My Account
+
+
+
+ My Account
+
+
+
+
+ Order History
+
+
+
+
+ Shoping Cart
+
+
+
+
+ Compare
+
+
+
+
+ Help Ticket
+
+
+
+
+ Wishlist
+
+
+
+
+
+
Daily Groceries
+
+
+
+ Dairy & Eggs
+
+
+
+
+ Meat & Seafood
+
+
+
+
+ Breakfast Food
+
+
+
+
+ Household Supplies
+
+
+
+
+ Bread & Bakery
+
+
+
+
+ Pantry Staples
+
+
+
+
+
+
Shop on The Go
+
Valkey App is available. Get it now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default FooterOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FooterThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterThree.jsx
new file mode 100644
index 0000000..a863ab7
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterThree.jsx
@@ -0,0 +1,400 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const FooterThree = () => {
+ return (
+ <>
+ {/* ==================== Footer Two Start Here ==================== */}
+
+
+
+
+
+
+ {" "}
+
+
+
+
+ Valkey become the largest computer parts, gaming pc parts,
+ and other IT related products.
+
+
+
+
+
+
+
+
+ 789 Inner Lane, California, USA
+
+
+
+
+
About us
+
+
+
+ Company Profile
+
+
+
+
+ All Retail Store
+
+
+
+
+ Merchant Center
+
+
+
+
+ Affiliate
+
+
+
+
+ Contact Us
+
+
+
+
+ Feedback
+
+
+
+
+ Huawei Group
+
+
+
+
+ Rules & Policy
+
+
+
+
+
+
Customer Support
+
+
+
+ Help Center
+
+
+
+
+ Contact Us
+
+
+
+
+ Gift Card
+
+
+
+
+ Report Abuse
+
+
+
+
+ Submit and Dispute
+
+
+
+
+ Policies & Rules
+
+
+
+
+ Online Shopping
+
+
+
+
+ Redeem Voucher
+
+
+
+
+
+
My Account
+
+
+
+ My Account
+
+
+
+
+ Order History
+
+
+
+
+ Shoping Cart
+
+
+
+
+ Compare
+
+
+
+
+ Help Ticket
+
+
+
+
+ Wishlist
+
+
+
+
+ Order History
+
+
+
+
+ Product Support
+
+
+
+
+
+
Information
+
+
+
+ Become a Vendor
+
+
+
+
+ Affiliate Program
+
+
+
+
+ Privacy Policy
+
+
+
+
+ Our Suppliers
+
+
+
+
+ Extended Plan
+
+
+
+
+ Extended Plan
+
+
+
+
+ Community
+
+
+
+
+ Community
+
+
+
+
+
+
Shop on The Go
+
Valkey App is available. Get it now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* bottom Footer */}
+
+
+
+
+ Valkey eCommerce © 2026. All Rights Reserved
+
+
+
We Are Accepting
+
+
+
+
+
+ {/* ==================== Footer Two End Here ==================== */}
+ >
+ );
+};
+
+export default FooterThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/FooterTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterTwo.jsx
new file mode 100644
index 0000000..ff69fd6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/FooterTwo.jsx
@@ -0,0 +1,287 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const FooterTwo = () => {
+ return (
+
+
+
+
+
+
+ {" "}
+
+
+
+
+ Valkey become the largest computer parts, gaming pc parts, and
+ other IT related products.
+
+
+
+
+
+
+ +00 123 456 789
+
+
+
+
+
+
+
+ support24@valkey.com
+
+
+
+
+
+
+
+ 789 Inner Lane, California, USA
+
+
+
+
+
About us
+
+
+
+ Company Profile
+
+
+
+
+ All Retail Store
+
+
+
+
+ Merchant Center
+
+
+
+
+ Affiliate
+
+
+
+
+ Contact Us
+
+
+
+
+ Feedback
+
+
+
+
+ Huawei Group
+
+
+
+
+ Rules & Policy
+
+
+
+
+
+
Customer Support
+
+
+
+ Help Center
+
+
+
+
+ Contact Us
+
+
+
+
+ Gift Card
+
+
+
+
+ Report Abuse
+
+
+
+
+ Submit and Dispute
+
+
+
+
+ Policies & Rules
+
+
+
+
+ Online Shopping
+
+
+
+
+ Redeem Voucher
+
+
+
+
+
+
My Account
+
+
+
+ My Account
+
+
+
+
+ Order History
+
+
+
+
+ Shoping Cart
+
+
+
+
+ Compare
+
+
+
+
+ Help Ticket
+
+
+
+
+ Wishlist
+
+
+
+
+ Order History
+
+
+
+
+ Product Support
+
+
+
+
+
+
Information
+
+
+
+ Become a Vendor
+
+
+
+
+ Affiliate Program
+
+
+
+
+ Privacy Policy
+
+
+
+
+ Our Suppliers
+
+
+
+
+ Extended Plan
+
+
+
+
+ Extended Plan
+
+
+
+
+ Community
+
+
+
+
+ Community
+
+
+
+
+
+
Shop on The Go
+
Valkey App is available. Get it now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default FooterTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderOne.jsx
new file mode 100644
index 0000000..4c6b3c3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderOne.jsx
@@ -0,0 +1,1529 @@
+import React, { useEffect, useState } from "react";
+import query from "jquery";
+import { Link, NavLink, useNavigate } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const HeaderOne = () => {
+ const navigate = useNavigate();
+ const { cart, wishlist } = useValkey();
+ const [searchQuery, setSearchQuery] = useState("");
+ const [scroll, setScroll] = useState(false);
+ useEffect(() => {
+ window.onscroll = () => {
+ if (window.pageYOffset < 150) {
+ setScroll(false);
+ } else if (window.pageYOffset > 150) {
+ setScroll(true);
+ }
+ return () => (window.onscroll = null);
+ };
+ const selectElement = query(".js-example-basic-single");
+ selectElement.select2();
+
+ return () => {
+ if (selectElement.data("select2")) {
+ selectElement.select2("destroy");
+ }
+ };
+ }, []);
+
+ // Set the default language
+ const [selectedLanguage, setSelectedLanguage] = useState("Eng");
+ const handleLanguageChange = (language) => {
+ setSelectedLanguage(language);
+ };
+
+ // Set the default currency
+ const [selectedCurrency, setSelectedCurrency] = useState("USD");
+ const handleCurrencyChange = (currency) => {
+ setSelectedCurrency(currency);
+ };
+
+ // Mobile menu support
+ const [menuActive, setMenuActive] = useState(false);
+ const [activeIndex, setActiveIndex] = useState(null);
+ const handleMenuClick = (index) => {
+ setActiveIndex(activeIndex === index ? null : index);
+ };
+ const handleMenuToggle = () => {
+ setMenuActive(!menuActive);
+ };
+
+ // Search control support
+ const [activeSearch, setActiveSearch] = useState(false);
+ const handleSearchToggle = () => {
+ setActiveSearch(!activeSearch);
+ };
+ const handleSearchSubmit = (e) => {
+ e.preventDefault();
+ if (searchQuery.trim()) {
+ navigate(`/shop?q=${encodeURIComponent(searchQuery.trim())}`);
+ setActiveSearch(false);
+ }
+ };
+
+ // category control support
+ const [activeCategory, setActiveCategory] = useState(false);
+ const handleCategoryToggle = () => {
+ setActiveCategory(!activeCategory);
+ };
+ const [activeIndexCat, setActiveIndexCat] = useState(null);
+ const handleCatClick = (index) => {
+ setActiveIndexCat(activeIndexCat === index ? null : index);
+ };
+
+ return (
+ <>
+
+
+ {/* ==================== Search Box Start Here ==================== */}
+
+
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className='form-control py-16 px-24 text-xl rounded-pill pe-64'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+ {/* ==================== Search Box End Here ==================== */}
+ {/* ==================== Mobile Menu Start Here ==================== */}
+
+
{
+ handleMenuToggle();
+ setActiveIndex(null);
+ }}
+ type='button'
+ className='close-button'
+ >
+ {" "}
+
+
+
+
+
+
+ {/* Nav Menu Start */}
+
+ {/* Home Menu */}
+ handleMenuClick(0)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 0 ? "d-block" : ""
+ }`}
+ >
+
+ Home
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Home Grocery
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Home Electronics
+
+
+
+ setActiveIndex(null)}
+ >
+ Home Fashion
+
+
+
+
+
+ {/* Shop Menu */}
+ handleMenuClick(1)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 1 ? "d-block" : ""
+ }`}
+ >
+
+ Shop
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Shop
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Shop Details
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+
+ {/* Pages Menu */}
+ handleMenuClick(2)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 2 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Pages
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Cart
+
+
+
+ setActiveIndex(null)}
+ >
+ Wishlist
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Checkout{" "}
+
+
+
+ setActiveIndex(null)}
+ >
+ Become Seller
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Account
+
+
+
+
+
+ {/* Vendors Menu */}
+ handleMenuClick(3)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 3 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Vendors
+
+
+
+ setActiveIndex(null)}
+ >
+ Vendors
+
+
+
+ setActiveIndex(null)}
+ >
+ Vendor Details
+
+
+
+ setActiveIndex(null)}
+ >
+ Vendors Two
+
+
+
+ setActiveIndex(null)}
+ >
+ Vendors Two Details
+
+
+
+
+
+ {/* Blog Menu */}
+ handleMenuClick(4)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 4 ? "d-block" : ""
+ }`}
+ >
+
+ Blog
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Blog
+
+
+
+ setActiveIndex(null)}
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+ {/* Contact Us Menu */}
+
+ setActiveIndex(null)}
+ >
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+
+
+ {/* ==================== Mobile Menu End Here ==================== */}
+ {/* ======================= Middle Top Start ========================= */}
+
+ {/* ======================= Middle Top End ========================= */}
+ {/* ======================= Middle Header Start ========================= */}
+
+
+
+ {/* Logo Start */}
+
+
+
+
+
+ {/* Logo End */}
+ {/* form location Start */}
+
+
+
+ All Categories
+ Grocery
+ Breakfast & Dairy
+ Vegetables
+ Milks and Dairies
+ Pet Foods & Toy
+ Breads & Bakery
+ Fresh Seafood
+ Fronzen Foods
+ Noodles & Rice
+ Ice Cream
+
+
+ setSearchQuery(e.target.value)}
+ className='search-form__input common-input py-13 ps-16 pe-18 rounded-end-pill pe-44'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+
+
+
+
+
Your Location
+
+
+ Alabama
+ Alaska
+ Arizona
+ Delaware
+ Florida
+ Georgia
+ Hawaii
+ Indiana
+ Marzland
+ Nevada
+ New Jersey
+ New Mexico
+ New York
+
+
+
+
+
+ {/* form location start */}
+ {/* Header Middle Right start */}
+
+
+
+
+
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+ {/* Header Middle Right End */}
+
+
+
+ {/* ======================= Middle Header End ========================= */}
+ {/* ==================== Header Start Here ==================== */}
+
+
+
+
+ {/* Category Dropdown Start */}
+
+
+
+
+
+ All Categories
+
+
+
+
+
+
{
+ handleCategoryToggle();
+ setActiveIndexCat(null);
+ }}
+ type='button'
+ className='close-responsive-dropdown rounded-circle text-xl position-absolute inset-inline-end-0 inset-block-start-0 mt-4 me-8 d-lg-none d-flex'
+ >
+ {" "}
+ {" "}
+
+ {/* Logo Start */}
+
+
+
+
+
+ {/* Logo End */}
+
+ handleCatClick(0)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 0 ? "active" : ""
+ }`}
+ >
+ setActiveIndexCat(null)}
+ to='/shop?category=category:vegetables-fruit'
+ className='text-gray-500 text-15 py-12 px-16 flex-align gap-8 rounded-0'
+ >
+
+
+
+ Vegetables & Fruit
+
+
+
+
+
+
+ Vegetables & Fruit
+
+
+
+ Potato & Tomato 000
+
+
+ Cucumber & Capsicum
+
+
+ Leafy Vegetables
+
+
+ Root Vegetables
+
+
+ Beans & Okra
+
+
+ Cabbage & Cauliflower
+
+
+ Gourd & Drumstick
+
+
+ Specialty
+
+
+
+
+ handleCatClick(1)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 1 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Beverages
+
+
+
+
+
+
+ Beverages
+
+
+
+ Soda & Cocktail Mix
+
+
+ Sports & Energy Drinks
+
+
+ Non Alcoholic Drinks
+
+
+ Packaged Water
+
+
+ Spring Water
+
+
+ Flavoured Water
+
+
+
+
+ handleCatClick(2)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 2 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Meats & Seafood
+
+
+
+
+
+
+ Meats & Seafood
+
+
+
+ Fresh Meat
+
+
+ Frozen Meat
+
+
+ Marinated Meat
+
+
+ Fresh & Frozen Meat
+
+
+
+
+ handleCatClick(3)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 3 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Breakfast & Dairy
+
+
+
+
+
+
+ Breakfast & Dairy
+
+
+
+ Oats & Porridge
+
+
+ Kids Cereal
+
+
+ Muesli
+
+
+ Flakes
+
+
+ Granola & Cereal Bars
+
+
+ Instant Noodles
+
+
+
+
+ handleCatClick(4)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 4 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Frozen Foods
+
+
+
+
+
+
+ Frozen Foods
+
+
+
+ Instant Noodles
+
+
+ Hakka Noodles
+
+
+ Cup Noodles
+
+
+ Vermicelli
+
+
+ Instant Pasta
+
+
+
+
+ handleCatClick(5)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 5 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Biscuits & Snacks
+
+
+
+
+
+
+ Biscuits & Snacks
+
+
+
+ Salted Biscuits
+
+
+ Marie, Health, Digestive
+
+
+
+ {" "}
+ Cream Biscuits & Wafers{" "}
+
+
+
+ Glucose & Milk biscuits
+
+
+ Cookies
+
+
+
+
+ handleCatClick(6)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 6 ? "active" : ""
+ }`}
+ >
+
+
+
+
+ Grocery & Staples
+
+
+
+
+
+
+ Grocery & Staples
+
+
+
+ Lemon, Ginger & Garlic
+
+
+ Indian & Exotic Herbs
+
+
+ Orangic Vegetables
+
+
+ Orangic Fruits
+
+
+ Orangic Dry Fruits
+
+
+ Orangic Dals & pulses
+
+
+ Orangic Millet & Flours
+
+
+
+
+
+
+
+ {/* Category Dropdown End */}
+ {/* Menu Start */}
+
+ {/* Nav Menu Start */}
+
+
+
+ Home
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Home Grocery
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Electronics
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Home Fashion
+
+
+
+
+
+
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+
+
+ New
+
+
+ Pages
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Cart
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Wishlist
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Checkout{" "}
+
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Become Seller
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Account
+
+
+
+
+
+
+ New
+
+
+ Vendors
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendor Details
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors Two
+
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors Two Details
+
+
+
+
+
+
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+
+ navData.isActive
+ ? "nav-menu__link activePage"
+ : "nav-menu__link"
+ }
+ >
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+ {/* Menu End */}
+
+ {/* Header Right start */}
+
+
+
+
+
+ 01- 234 567 890
+
+
+
+
+
+
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+
+ {" "}
+ {" "}
+
+
+ {/* Header Right End */}
+
+
+
+ {/* ==================== Header End Here ==================== */}
+ >
+ );
+};
+
+export default HeaderOne;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderThree.jsx
new file mode 100644
index 0000000..3cf5100
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderThree.jsx
@@ -0,0 +1,2245 @@
+import React, { useEffect, useState } from "react";
+import query from "jquery";
+import { Link, NavLink, useNavigate } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const HeaderThree = ({ category }) => {
+ const navigate = useNavigate();
+ const { cart, wishlist, compare } = useValkey();
+ const [searchQuery, setSearchQuery] = useState("");
+ const [scroll, setScroll] = useState(false);
+ useEffect(() => {
+ window.onscroll = () => {
+ if (window.pageYOffset < 150) {
+ setScroll(false);
+ } else if (window.pageYOffset > 150) {
+ setScroll(true);
+ }
+ return () => (window.onscroll = null);
+ };
+ const selectElement = query(".js-example-basic-single");
+ selectElement.select2();
+
+ return () => {
+ if (selectElement.data("select2")) {
+ selectElement.select2("destroy");
+ }
+ };
+ }, []);
+
+ // Set the default language
+ const [selectedLanguage, setSelectedLanguage] = useState("EngLish");
+ const handleLanguageChange = (language) => {
+ setSelectedLanguage(language);
+ };
+
+ // Set the default currency
+ const [selectedCurrency, setSelectedCurrency] = useState("USD");
+ const handleCurrencyChange = (currency) => {
+ setSelectedCurrency(currency);
+ };
+
+ // Mobile menu support
+ const [menuActive, setMenuActive] = useState(false);
+ const [activeIndex, setActiveIndex] = useState(null);
+ const handleMenuClick = (index) => {
+ setActiveIndex(activeIndex === index ? null : index);
+ };
+ const handleMenuToggle = () => {
+ setMenuActive(!menuActive);
+ };
+
+ // Search control support
+ const [activeSearch, setActiveSearch] = useState(false);
+ const handleSearchToggle = () => {
+ setActiveSearch(!activeSearch);
+ };
+ const handleSearchSubmit = (e) => {
+ e.preventDefault();
+ if (searchQuery.trim()) {
+ navigate(`/shop?q=${encodeURIComponent(searchQuery.trim())}`);
+ setActiveSearch(false);
+ }
+ };
+
+ // category control support
+ const [activeCategory, setActiveCategory] = useState(false);
+ const handleCategoryToggle = () => {
+ setActiveCategory(!activeCategory);
+ };
+ const [activeIndexCat, setActiveIndexCat] = useState(null);
+ const handleCatClick = (index) => {
+ setActiveIndexCat(activeIndexCat === index ? null : index);
+ };
+
+ return (
+ <>
+ {/*==================== Overlay Start ====================*/}
+
+ {/*==================== Overlay End ====================*/}
+ {/*==================== Sidebar Overlay End ====================*/}
+
+ {/*==================== Sidebar Overlay End ====================*/}
+
+ {/* ==================== Search Box Start Here ==================== */}
+
+
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className='form-control py-16 px-24 text-xl rounded-pill pe-64'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+ {/* ==================== Search Box End Here ==================== */}
+ {/* ==================== Mobile Menu Start Here ==================== done */}
+
+
{
+ handleMenuToggle();
+ setActiveIndex(null);
+ }}
+ type='button'
+ className='close-button'
+ >
+ {" "}
+
+
+
+
+
+
+ {/* Nav Menu Start */}
+
+ handleMenuClick(0)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 0 ? "d-block" : ""
+ }`}
+ >
+
+ Home
+
+
+
+ setActiveIndex(null)}
+ to='/'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Home Grocery
+
+
+
+ setActiveIndex(null)}
+ to='/index-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Home Electronics
+
+
+
+ setActiveIndex(null)}
+ to='/index-three'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Home Fashion
+
+
+
+
+ handleMenuClick(1)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 1 ? "d-block" : ""
+ }`}
+ >
+
+ Shop
+
+
+
+ setActiveIndex(null)}
+ to='/shop'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop
+
+
+
+ setActiveIndex(null)}
+ to='/product-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop Details
+
+
+
+ setActiveIndex(null)}
+ to='/product-details-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+ handleMenuClick(2)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 2 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Pages
+
+
+
+ setActiveIndex(null)}
+ to='/cart'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Cart
+
+
+
+ setActiveIndex(null)}
+ to='/wishlist'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Wishlist
+
+
+
+ setActiveIndex(null)}
+ to='/checkout'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Checkout
+
+
+
+ setActiveIndex(null)}
+ to='/become-seller'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Become Seller
+
+
+
+ setActiveIndex(null)}
+ to='/account'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Account
+
+
+
+
+ handleMenuClick(3)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 3 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Vendors
+
+
+
+ setActiveIndex(null)}
+ to='/vendor'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendor
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendor Details
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendors Two
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-two-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendors Two Details
+
+
+
+
+ handleMenuClick(4)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 4 ? "d-block" : ""
+ }`}
+ >
+
+ Blog
+
+
+
+ setActiveIndex(null)}
+ to='/blog'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Blog
+
+
+
+ setActiveIndex(null)}
+ to='/blog-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+
+
+ {/* ==================== Mobile Menu End Here ==================== */}
+ {/* ======================= Middle Header Two Start ========================= */}
+
+
+
+ {/* Logo Start */}
+
+
+
+
+
+ {/* Logo End */}
+ {/* form Category Start */}
+
+
+
+
+
+
+ All Categories
+
+ Grocery
+ Breakfast & Dairy
+ Vegetables
+ Milks and Dairies
+ Pet Foods & Toy
+ Breads & Bakery
+ Fresh Seafood
+ Fronzen Foods
+ Noodles & Rice
+ Ice Cream
+
+
+ setSearchQuery(e.target.value)}
+ className='search-form__input common-input py-13 ps-16 pe-18 rounded-0 border-0'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+
+ {/* form Category start */}
+ {/* Header Middle Right start */}
+
+
+
+
+
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {compare.items?.length || 0}
+
+
+
+ Compare
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+ {/* Header Middle Right End */}
+
+
+
+ {/* ======================= Middle Header Two End ========================= */}
+ {/* ==================== Header Two Start Here ==================== */}
+
+
+
+
+ {/* Category Dropdown Start */}
+
+
+
+
+
+ All Categories
+
+
+
+
+
+
{
+ handleCategoryToggle();
+ setActiveIndexCat(null);
+ }}
+ type='button'
+ className='close-responsive-dropdown rounded-circle text-xl position-absolute inset-inline-end-0 inset-block-start-0 mt-4 me-8 d-lg-none d-flex'
+ >
+ {" "}
+
+
+
+
+
+
+
+ handleCatClick(0)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 0 ? "active" : ""
+ }`}
+ >
+ setActiveIndexCat(null)}
+ to='#'
+ className='text-gray-500 text-15 py-12 px-16 flex-align gap-8 rounded-0'
+ >
+ Cell Phone
+
+
+
+
+
+
+ Cell Phone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(1)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 1 ? "active" : ""
+ }`}
+ >
+
+ Wear
+
+
+
+
+
+
+ Wear
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(2)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 2 ? "active" : ""
+ }`}
+ >
+
+ Computer
+
+
+
+
+
+
+ Computer
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(3)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 3 ? "active" : ""
+ }`}
+ >
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(4)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 4 ? "active" : ""
+ }`}
+ >
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(5)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 5 ? "active" : ""
+ }`}
+ >
+
+ Smart Home
+
+
+
+
+
+
+ Smart Home
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(6)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 6 ? "active" : ""
+ }`}
+ >
+
+ Digital Accessories
+
+
+
+
+
+
+ Digital Accessories
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(7)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 7 ? "active" : ""
+ }`}
+ >
+
+ Value Added Services
+
+
+
+
+
+
+ {" "}
+ Value Added Services
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(8)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 8 ? "active" : ""
+ }`}
+ >
+
+ Car Products
+
+
+
+
+
+
+ Car Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(9)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 9 ? "active" : ""
+ }`}
+ >
+
+ Ecological Products
+
+
+
+
+
+
+ Ecological Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(10)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 10 ? "active" : ""
+ }`}
+ >
+
+ Flat
+
+
+
+
+
+
+ Flat
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(11)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 11 ? "active" : ""
+ }`}
+ >
+
+ Commercial Terminal
+
+
+
+
+
+
+ Commercial Terminal
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(12)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 12 ? "active" : ""
+ }`}
+ >
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(13)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 13 ? "active" : ""
+ }`}
+ >
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+
+
+
+
+
+
+ All Categories
+
+
+
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+ Vegetables & Fruit
+
+
+
+
+
+
+ Vegetables & Fruit
+
+
+
+ Potato & Tomato
+
+
+ Cucumber & Capsicum
+
+
+ Leafy Vegetables
+
+
+ Root Vegetables
+
+
+ Beans & Okra
+
+
+ Cabbage & Cauliflower
+
+
+ Gourd & Drumstick
+
+
+ Specialty
+
+
+
+
+
+
+
+
+
+ Beverages
+
+
+
+
+
+
+ Beverages
+
+
+
+ Soda & Cocktail Mix
+
+
+ Sports & Energy Drinks
+
+
+ Non Alcoholic Drinks
+
+
+ Packaged Water
+
+
+ Spring Water
+
+
+ Flavoured Water
+
+
+
+
+
+
+
+
+
+ Meats & Seafood
+
+
+
+
+
+
+ Meats & Seafood
+
+
+
+ Fresh Meat
+
+
+ Frozen Meat
+
+
+ Marinated Meat
+
+
+ Fresh & Frozen Meat
+
+
+
+
+
+
+
+
+
+ Breakfast & Dairy
+
+
+
+
+
+
+ Breakfast & Dairy
+
+
+
+ Oats & Porridge
+
+
+ Kids Cereal
+
+
+ Muesli
+
+
+ Flakes
+
+
+ Granola & Cereal Bars
+
+
+ Instant Noodles
+
+
+
+
+
+
+
+
+
+ Frozen Foods
+
+
+
+
+
+
+ Frozen Foods
+
+
+
+ Instant Noodles
+
+
+ Hakka Noodles
+
+
+ Cup Noodles
+
+
+ Vermicelli
+
+
+ Instant Pasta
+
+
+
+
+
+
+
+
+
+ Biscuits & Snacks
+
+
+
+
+
+
+ Biscuits & Snacks
+
+
+
+ Salted Biscuits
+
+
+ Marie, Health, Digestive
+
+
+
+ {" "}
+ Cream Biscuits & Wafers{" "}
+
+
+
+ Glucose & Milk biscuits
+
+
+ Cookies
+
+
+
+
+
+
+
+
+
+ Grocery & Staples
+
+
+
+
+
+
+ Grocery & Staples
+
+
+
+ Lemon, Ginger & Garlic
+
+
+ Indian & Exotic Herbs
+
+
+ Orangic Vegetables
+
+
+ Orangic Fruits
+
+
+ Orangic Dry Fruits
+
+
+ Orangic Dals & pulses
+
+
+ Orangic Millet & Flours
+
+
+
+
+
+
+
+ {/* Category Dropdown End */}
+ {/* Menu Start */}
+
+ {/* Nav Menu Start */}
+
+
+
+ Home
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Grocery
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Electronics
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Fashion
+
+
+
+
+
+
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+
+
+ New
+
+
+ Pages
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Cart
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Wishlist
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Checkout{" "}
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Become Seller
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Account
+
+
+
+
+
+
+ New
+
+
+ Vendors
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors{" "}
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Vendor Details{" "}
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors Two
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendors Two Details
+
+
+
+
+
+
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+ {/* Menu End */}
+
+ {/* Header Right start */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {compare.items?.length || 0}
+
+
+
+ Compare
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+
+ {" "}
+ {" "}
+
+
+ {/* Header Right End */}
+
+
+
+ {/* ==================== Header End Here ==================== */}
+ >
+ );
+};
+
+export default HeaderThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderTwo.jsx
new file mode 100644
index 0000000..0d4d8a9
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/HeaderTwo.jsx
@@ -0,0 +1,2258 @@
+import React, { useEffect, useState } from "react";
+import query from "jquery";
+import { Link, NavLink, useNavigate } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const HeaderTwo = ({ category }) => {
+ const navigate = useNavigate();
+ const { cart, wishlist, compare } = useValkey();
+ const [searchQuery, setSearchQuery] = useState("");
+ const [scroll, setScroll] = useState(false);
+ useEffect(() => {
+ window.onscroll = () => {
+ if (window.pageYOffset < 150) {
+ setScroll(false);
+ } else if (window.pageYOffset > 150) {
+ setScroll(true);
+ }
+ return () => (window.onscroll = null);
+ };
+ const selectElement = query(".js-example-basic-single");
+ selectElement.select2();
+
+ return () => {
+ if (selectElement.data("select2")) {
+ selectElement.select2("destroy");
+ }
+ };
+ }, []);
+
+ // Set the default language
+ const [selectedLanguage, setSelectedLanguage] = useState("Eng");
+ const handleLanguageChange = (language) => {
+ setSelectedLanguage(language);
+ };
+
+ // Set the default currency
+ const [selectedCurrency, setSelectedCurrency] = useState("USD");
+ const handleCurrencyChange = (currency) => {
+ setSelectedCurrency(currency);
+ };
+
+ // Mobile menu support
+ const [menuActive, setMenuActive] = useState(false);
+ const [activeIndex, setActiveIndex] = useState(null);
+ const handleMenuClick = (index) => {
+ setActiveIndex(activeIndex === index ? null : index);
+ };
+ const handleMenuToggle = () => {
+ setMenuActive(!menuActive);
+ };
+
+ // Search control support
+ const [activeSearch, setActiveSearch] = useState(false);
+ const handleSearchToggle = () => {
+ setActiveSearch(!activeSearch);
+ };
+ const handleSearchSubmit = (e) => {
+ e.preventDefault();
+ if (searchQuery.trim()) {
+ navigate(`/shop?q=${encodeURIComponent(searchQuery.trim())}`);
+ setActiveSearch(false);
+ }
+ };
+
+ // category control support
+ const [activeCategory, setActiveCategory] = useState(false);
+ const handleCategoryToggle = () => {
+ setActiveCategory(!activeCategory);
+ };
+ const [activeIndexCat, setActiveIndexCat] = useState(null);
+ const handleCatClick = (index) => {
+ setActiveIndexCat(activeIndexCat === index ? null : index);
+ };
+
+ return (
+ <>
+
+
+ {/* ==================== Search Box Start Here ==================== */}
+
+
+
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className='form-control py-16 px-24 text-xl rounded-pill pe-64'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+ {/* ==================== Search Box End Here ==================== */}
+ {/* ==================== Mobile Menu Start Here ==================== */}
+
+
{
+ handleMenuToggle();
+ setActiveIndex(null);
+ }}
+ type='button'
+ className='close-button'
+ >
+ {" "}
+
+
+
+
+
+
+ {/* Nav Menu Start */}
+
+ handleMenuClick(0)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 0 ? "d-block" : ""
+ }`}
+ >
+
+ Home
+
+
+
+ setActiveIndex(null)}
+ to='/'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Home Grocery
+
+
+
+ setActiveIndex(null)}
+ to='/index-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Home Electronics
+
+
+
+ setActiveIndex(null)}
+ to='/index-three'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Home Fashion
+
+
+
+
+ handleMenuClick(1)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 1 ? "d-block" : ""
+ }`}
+ >
+
+ Shop
+
+
+
+ setActiveIndex(null)}
+ to='/shop'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop
+
+
+
+ setActiveIndex(null)}
+ to='/product-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop Details
+
+
+
+ setActiveIndex(null)}
+ to='/product-details-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+ handleMenuClick(2)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 2 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Pages
+
+
+
+ setActiveIndex(null)}
+ to='/cart'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Cart
+
+
+
+ setActiveIndex(null)}
+ to='/wishlist'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Wishlist
+
+
+
+ setActiveIndex(null)}
+ to='/checkout'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Checkout
+
+
+
+ setActiveIndex(null)}
+ to='/become-seller'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Become Seller
+
+
+
+ setActiveIndex(null)}
+ to='/account'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Account
+
+
+
+
+ handleMenuClick(3)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 3 ? "d-block" : ""
+ }`}
+ >
+
+ New
+
+
+ Vendors
+
+
+
+ setActiveIndex(null)}
+ to='/vendor'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendors
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendor Details
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-two'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendors Two
+
+
+
+ setActiveIndex(null)}
+ to='/vendor-two-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ Vendors Two Details
+
+
+
+
+ handleMenuClick(4)}
+ className={`on-hover-item nav-menu__item has-submenu ${
+ activeIndex === 4 ? "d-block" : ""
+ }`}
+ >
+
+ Blog
+
+
+
+ setActiveIndex(null)}
+ to='/blog'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Blog
+
+
+
+ setActiveIndex(null)}
+ to='/blog-details'
+ className='common-dropdown__link nav-submenu__link hover-bg-neutral-100'
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+
+
+ {/* ==================== Mobile Menu End Here ==================== */}
+ {/* ======================= Middle Header Two Start ========================= */}
+
+
+
+ {/* Logo Start */}
+
+
+
+
+
+ {/* Logo End */}
+ {/* form Category Start */}
+
+
+
+
+
+ All Categories
+ Grocery
+ Breakfast & Dairy
+ Vegetables
+ Milks and Dairies
+ Pet Foods & Toy
+ Breads & Bakery
+ Fresh Seafood
+ Fronzen Foods
+ Noodles & Rice
+ Ice Cream
+
+
+ setSearchQuery(e.target.value)}
+ className='search-form__input common-input py-13 ps-16 pe-18 rounded-0 border-0'
+ placeholder='Search for a product or brand'
+ />
+
+
+
+
+
+
+
+ {/* form Category start */}
+ {/* Header Middle Right start */}
+
+
+
+
+
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {compare.items?.length || 0}
+
+
+
+ Compare
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+ {/* Header Middle Right End */}
+
+
+
+ {/* ======================= Middle Header Two End ========================= */}
+ {/* ==================== Header Two Start Here ==================== */}
+
+
+
+
+ {/* Category Dropdown Start */}
+
+
+
+
+
+ All Categories
+
+
+
+
+
+
{
+ handleCategoryToggle();
+ setActiveIndexCat(null);
+ }}
+ type='button'
+ className='close-responsive-dropdown rounded-circle text-xl position-absolute inset-inline-end-0 inset-block-start-0 mt-4 me-8 d-lg-none d-flex'
+ >
+ {" "}
+
+
+
+
+
+
+
+ handleCatClick(0)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 0 ? "active" : ""
+ }`}
+ >
+ setActiveIndexCat(null)}
+ to='#'
+ className='text-gray-500 text-15 py-12 px-16 flex-align gap-8 rounded-0'
+ >
+ Cell Phone
+
+
+
+
+
+
+ Cell Phone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(1)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 1 ? "active" : ""
+ }`}
+ >
+
+ Wear
+
+
+
+
+
+
+ Wear
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(2)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 2 ? "active" : ""
+ }`}
+ >
+
+ Computer
+
+
+
+
+
+
+ Computer
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(3)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 3 ? "active" : ""
+ }`}
+ >
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(4)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 4 ? "active" : ""
+ }`}
+ >
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(5)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 5 ? "active" : ""
+ }`}
+ >
+
+ Smart Home
+
+
+
+
+
+
+ Smart Home
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(6)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 6 ? "active" : ""
+ }`}
+ >
+
+ Digital Accessories
+
+
+
+
+
+
+ Digital Accessories
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(7)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 7 ? "active" : ""
+ }`}
+ >
+
+ Value Added Services
+
+
+
+
+
+
+ {" "}
+ Value Added Services
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(8)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 8 ? "active" : ""
+ }`}
+ >
+
+ Car Products
+
+
+
+
+
+
+ Car Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(9)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 9 ? "active" : ""
+ }`}
+ >
+
+ Ecological Products
+
+
+
+
+
+
+ Ecological Products
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(10)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 10 ? "active" : ""
+ }`}
+ >
+
+ Flat
+
+
+
+
+
+
+ Flat
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(11)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 11 ? "active" : ""
+ }`}
+ >
+
+ Commercial Terminal
+
+
+
+
+
+
+ Commercial Terminal
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(12)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 12 ? "active" : ""
+ }`}
+ >
+
+ Headphone
+
+
+
+
+
+
+ Headphone
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+ handleCatClick(13)}
+ className={`has-submenus-submenu ${
+ activeIndexCat === 13 ? "active" : ""
+ }`}
+ >
+
+ Smart Screen
+
+
+
+
+
+
+ Smart Screen
+
+
+
+ Samsung
+
+
+ Iphone
+
+
+ Vivo
+
+
+ Oppo
+
+
+ Itel
+
+
+ Realme
+
+
+
+
+
+
+
+
+
+
+
+
+ All Categories
+
+
+
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+ Vegetables & Fruit
+
+
+
+
+
+
+ Vegetables & Fruit
+
+
+
+ Potato & Tomato
+
+
+ Cucumber & Capsicum
+
+
+ Leafy Vegetables
+
+
+ Root Vegetables
+
+
+ Beans & Okra
+
+
+ Cabbage & Cauliflower
+
+
+ Gourd & Drumstick
+
+
+ Specialty
+
+
+
+
+
+
+
+
+
+ Beverages
+
+
+
+
+
+
+ Beverages
+
+
+
+ Soda & Cocktail Mix
+
+
+ Sports & Energy Drinks
+
+
+ Non Alcoholic Drinks
+
+
+ Packaged Water
+
+
+ Spring Water
+
+
+ Flavoured Water
+
+
+
+
+
+
+
+
+
+ Meats & Seafood
+
+
+
+
+
+
+ Meats & Seafood
+
+
+
+ Fresh Meat
+
+
+ Frozen Meat
+
+
+ Marinated Meat
+
+
+ Fresh & Frozen Meat
+
+
+
+
+
+
+
+
+
+ Breakfast & Dairy
+
+
+
+
+
+
+ Breakfast & Dairy
+
+
+
+ Oats & Porridge
+
+
+ Kids Cereal
+
+
+ Muesli
+
+
+ Flakes
+
+
+ Granola & Cereal Bars
+
+
+ Instant Noodles
+
+
+
+
+
+
+
+
+
+ Frozen Foods
+
+
+
+
+
+
+ Frozen Foods
+
+
+
+ Instant Noodles
+
+
+ Hakka Noodles
+
+
+ Cup Noodles
+
+
+ Vermicelli
+
+
+ Instant Pasta
+
+
+
+
+
+
+
+
+
+ Biscuits & Snacks
+
+
+
+
+
+
+ Biscuits & Snacks
+
+
+
+ Salted Biscuits
+
+
+ Marie, Health, Digestive
+
+
+
+ {" "}
+ Cream Biscuits & Wafers{" "}
+
+
+
+ Glucose & Milk biscuits
+
+
+ Cookies
+
+
+
+
+
+
+
+
+
+ Grocery & Staples
+
+
+
+
+
+
+ Grocery & Staples
+
+
+
+ Lemon, Ginger & Garlic
+
+
+ Indian & Exotic Herbs
+
+
+ Orangic Vegetables
+
+
+ Orangic Fruits
+
+
+ Orangic Dry Fruits
+
+
+ Orangic Dals & pulses
+
+
+ Orangic Millet & Flours
+
+
+
+
+
+
+
+ {/* Category Dropdown End */}
+ {/* Menu Start */}
+
+ {/* Nav Menu Start */}
+
+
+
+ Home
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Grocery
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Electronics
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Home Fashion
+
+
+
+
+
+
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Shop
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Shop Details Two
+
+
+
+
+
+
+ New
+
+
+ Pages
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Cart
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Wishlist
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Checkout
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Become Seller
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Account
+
+
+
+
+
+
+ New
+
+
+ Vendors
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendor
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendor Details
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendor Two
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Vendor Two Details
+
+
+
+
+
+
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ Blog
+
+
+
+
+ navData.isActive
+ ? "common-dropdown__link nav-submenu__link hover-bg-neutral-100 activePage"
+ : "common-dropdown__link nav-submenu__link hover-bg-neutral-100"
+ }
+ >
+ {" "}
+ Blog Details
+
+
+
+
+
+
+ navData.isActive
+ ? "nav-menu__link activePage"
+ : "nav-menu__link"
+ }
+ >
+ Contact Us
+
+
+
+ {/* Nav Menu End */}
+
+ {/* Menu End */}
+
+ {/* Header Right start */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+
+
+ {wishlist.items?.length || 0}
+
+
+
+ Wishlist
+
+
+
+
+
+
+ {compare.items?.length || 0}
+
+
+
+ Compare
+
+
+
+
+
+
+ {cart.items?.length || 0}
+
+
+
+ Cart
+
+
+
+
+
+ {" "}
+ {" "}
+
+
+ {/* Header Right End */}
+
+
+
+ {/* ==================== Header End Here ==================== */}
+ >
+ );
+};
+
+export default HeaderTwo;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/HotDealsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/HotDealsOne.jsx
new file mode 100644
index 0000000..4824524
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/HotDealsOne.jsx
@@ -0,0 +1,413 @@
+import React, { memo, useEffect, useState } from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+import { getCountdown } from '../helper/Countdown';
+
+
+
+const SampleNextArrow = memo((props) => {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+const SamplePrevArrow = memo((props) => {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+});
+
+
+const HotDealsOne = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 1199,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 1,
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
Hot Deals Todays
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
+
+
Fresh Vegetables
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hours
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Marcel's Modern Pantry Almond Unsweetened
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ O Organics Milk, Whole, Vitamin D
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Sale
+
+
+
+
+
+
+
+ Whole Grains and Seeds Organic Bread
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+
+ Tropicana 100% Juice, Orange, No Pulp
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ O Organics Milk, Whole, Vitamin D
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default HotDealsOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/InstagramSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/InstagramSection.jsx
new file mode 100644
index 0000000..e5fa972
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/InstagramSection.jsx
@@ -0,0 +1,157 @@
+import React from "react";
+import { Link } from "react-router-dom";
+import Slider from "react-slick";
+
+const InstagramSection = () => {
+ const NextArrow = ({ onClick }) => (
+
+
+
+ );
+
+ const PrevArrow = ({ onClick }) => (
+
+
+
+ );
+ const settings = {
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ autoplay: true,
+ autoplaySpeed: 2000,
+ speed: 1500,
+ dots: false,
+ pauseOnHover: true,
+ arrows: true,
+ draggable: true,
+ infinite: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1299,
+ settings: {
+ slidesToShow: 3,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 3,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 768,
+ settings: {
+ slidesToShow: 2,
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 1,
+ arrows: false,
+ },
+ },
+ ],
+ };
+ return (
+
+
+
+
+
+
Instagram
+
+ Get inspired by Carina fans from all around the world
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default InstagramSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalOne.jsx
new file mode 100644
index 0000000..0854e23
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalOne.jsx
@@ -0,0 +1,443 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const NewArrivalOne = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 6,
+
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 4,
+
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
New Arrivals
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default NewArrivalOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalThree.jsx
new file mode 100644
index 0000000..37fa8fd
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalThree.jsx
@@ -0,0 +1,5317 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const NewArrivalThree = () => {
+ return (
+
+
+
+
New Arrivals
+
+
+
+
+ All
+
+
+
+
+ Jacket
+
+
+
+
+ Shoes
+
+
+
+
+ Hats
+
+
+
+
+ Goggles
+
+
+
+
+ Bags
+
+
+
+
+ Jeans
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Summer offer
+
+
Get 85% Off
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oasis Linen Jumpsuit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Rose Clutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Echoes of Elegance Trench Coat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+
+ /Qty
+ {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+ Get extra discount on first order
+
+
+ Spring Collection
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default NewArrivalThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalTwo.jsx
new file mode 100644
index 0000000..bd17cf1
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewArrivalTwo.jsx
@@ -0,0 +1,458 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const NewArrivalTwo = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 6,
+
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 4,
+
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
You Might Also Like
+
+
+ All Products
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+
+ Marcel's Modern Pantry Almond Unsweetened
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+
+ O Organics Milk, Whole, Vitamin D
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Sale{" "}
+
+
+
+
+
+
+
+ Whole Grains and Seeds Organic Bread
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lucerne Yogurt, Lowfat, Strawberry
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+
+ Nature Valley Whole Grain Oats and Honey Protein
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Sale{" "}
+
+
+
+
+
+
+
+ Whole Grains and Seeds Organic Bread
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99 /Qty {" "}
+
+
+ $28.99
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default NewArrivalTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterOne.jsx
new file mode 100644
index 0000000..34461ff
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterOne.jsx
@@ -0,0 +1,48 @@
+import React from 'react'
+
+const NewsletterOne = () => {
+ return (
+
+
+
+
+
+
+
+
+ Don't Miss Out on Grocery Deals
+
+
+ SING UP FOR THE UPDATE NEWSLETTER
+
+
+
+
+ Subscribe
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default NewsletterOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterThree.jsx
new file mode 100644
index 0000000..14a0750
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterThree.jsx
@@ -0,0 +1,43 @@
+import React from "react";
+
+const NewsletterThree = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ Join Our Newsletter, Get 10% Off
+
+
+ Get all latest information on events, sales and offer
+
+
+
+
+
+
+
+ {" "}
+ Subscribe
+
+
+
+
+
+
+ );
+};
+
+export default NewsletterThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterTwo.jsx
new file mode 100644
index 0000000..9a4db2a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/NewsletterTwo.jsx
@@ -0,0 +1,44 @@
+import React from 'react'
+
+const NewsletterTwo = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ Join Our Newsletter, Get 10% Off
+
+
+ Get all latest information on events, sales and offer
+
+
+
+
+
+
+
+ {" "}
+ Subscribe
+
+
+
+
+
+
+
+ )
+}
+
+export default NewsletterTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/OfferOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/OfferOne.jsx
new file mode 100644
index 0000000..d4ed874
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/OfferOne.jsx
@@ -0,0 +1,80 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const OfferOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$5 off your first order
+
+ Delivery by 6:15am
+ expired Aug 5
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
$5 off your first order
+
+ Delivery by 6:15am
+ expired Aug 5
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default OfferOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/OrganicOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/OrganicOne.jsx
new file mode 100644
index 0000000..357882e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/OrganicOne.jsx
@@ -0,0 +1,438 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const OrganicOne = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 6,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1599,
+ settings: {
+ slidesToShow: 6,
+ },
+ },
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 4,
+ },
+ },
+ {
+ breakpoint: 992,
+ settings: {
+ slidesToShow: 3,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 424,
+ settings: {
+ slidesToShow: 1,
+ },
+ },
+ ],
+ };
+ return (
+
+
+
+
+
Organic Food
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default OrganicOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsOne.jsx
new file mode 100644
index 0000000..fb24dbc
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsOne.jsx
@@ -0,0 +1,440 @@
+import React, { useEffect, useState } from 'react'
+import { Link } from 'react-router-dom'
+import { getCountdown } from '../helper/Countdown';
+
+const PopularProductsOne = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+ return (
+
+
+
+
+
+
Popular Products
+
+
+ View All Products
+
+
+
+
+
+
+
+
+
+
+
+
Exclusive Offer
+ 45% OFF
+
+
+
+
+
+ {timeLeft.days} Days
+
+
+
+ {timeLeft.hours} Hour
+
+
+
+ {timeLeft.minutes} Min
+
+
+
+ {timeLeft.seconds} Sec
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Headphone & Earphone
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TV & Smart Home
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Video Games
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Computer & Tablets
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Car & GPS
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Camera & Video
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kitchen Appliance
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Phone & Accessories
+
+
+
+ Wired Headphones
+
+
+ Over-Ear Headphone
+
+
+ Sports Headphone
+
+
+ Earbud Headphone
+
+
+ All Categories
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default PopularProductsOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsThree.jsx
new file mode 100644
index 0000000..476c944
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/PopularProductsThree.jsx
@@ -0,0 +1,834 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const PopularProductsThree = () => {
+ return (
+
+
+
+
Popular Products
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+ );
+};
+
+export default PopularProductsThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsOne.jsx
new file mode 100644
index 0000000..72c8852
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsOne.jsx
@@ -0,0 +1,997 @@
+import React, { useEffect, useState } from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+import { getCountdown } from '../helper/Countdown';
+
+const ProductDetailsOne = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+ const productImages = [
+ "assets/images/thumbs/product-details-thumb1.png",
+ "assets/images/thumbs/product-details-thumb2.png",
+ "assets/images/thumbs/product-details-thumb3.png",
+ "assets/images/thumbs/product-details-thumb2.png",
+ ];
+
+ // increment & decrement
+ const [quantity, setQuantity] = useState(1);
+ const incrementQuantity = () => setQuantity(quantity + 1);
+ const decrementQuantity = () => setQuantity(quantity > 1 ? quantity - 1 : quantity);
+
+
+ const [mainImage, setMainImage] = useState(productImages[0]);
+
+ const settingsThumbs = {
+ dots: false,
+ infinite: true,
+ speed: 500,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ focusOnSelect: true,
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {productImages.map((image, index) => (
+ setMainImage(image)}>
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
Lay's Potato Chips Onion Flavored
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.7 Star Rating
+
+
+ (21,671)
+
+
+
|
+
+ {" "}
+ SKU: EB4DRP{" "}
+
+
+
+
+ Vivamus adipiscing nisl ut dolor dignissim semper. Nulla luctus
+ malesuada tincidunt. Class aptent taciti sociosqu ad litora
+ torquent
+
+
+
+
$25.00
+ $38.00
+
+
+ Order on What'sApp
+
+
+
+
+
+ Special Offer:
+
+
+
+
+ {timeLeft.days}
+
+
+ {timeLeft.hours}
+
+
+ {timeLeft.minutes}
+
+
+ {timeLeft.seconds}
+
+
+
+
+ Remains untill the end of the offer
+
+
+
+
+
+
+
+
+ Products are almost sold out
+
+
+
+
+ Available only:45
+
+
+
Quantity:
+
+
+
+
+
+
+
+
+
+
+
+
+ {" "}
+
Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mfr. coupon. $3.00 off 5
+
+
+
+ View Details
+
+
+
+
+ Buy 1, Get 1 FREE
+
+
+ Buy 1, Get 1 FREE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ by Valkey
+
+
+ View Store
+
+
+
+
+
+
+
+
+
Fast Delivery
+
+ Lightning-fast shipping, guaranteed.
+
+
+
+
+
+
+
+
+
Free 90-day returns
+
Shop risk-free with easy returns.
+
+
+
+
+
+
+
+
+ Pickup available at Shop location
+
+
Usually ready in 24 hours
+
+
+
+
+
+
+
+
Payment
+
+ Payment upon receipt of goods, Payment by card in the
+ department, Google Pay, Online card.
+
+
+
+
+
+
+
+
+
Warranty
+
+ The Consumer Protection Act does not provide for the return of
+ this product of proper quality.
+
+
+
+
+
+
+
+
+
Packaging
+
+ Research & development value proposition graphical user
+ interface investor.
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
+
+ Reviews
+
+
+
+
+
+ 100% Satisfaction Guaranteed
+
+
+
+
+
+
+
Product Description
+
+ Wherever celebrations and good times happen, the LAY'S brand
+ will be there just as it has been for more than 75 years. With
+ flavors almost as rich as our history, we have a chip or crisp
+ flavor guaranteed to bring a smile on your face.{" "}
+
+
+ Morbi ut sapien vitae odio accumsan gravida. Morbi vitae erat
+ auctor, eleifend nunc a, lobortis neque. Praesent aliquam
+ dignissim viverra. Maecenas lacus odio, feugiat eu nunc sit
+ amet, maximus sagittis dolor. Vivamus nisi sapien, elementum
+ sit amet eros sit amet, ultricies cursus ipsum. Sed consequat
+ luctus ligula. Curabitur laoreet rhoncus blandit. Aenean vel
+ diam ut arcu pharetra dignissim ut sed leo. Vivamus faucibus,
+ ipsum in vestibulum vulputate, lorem orci convallis quam, sit
+ amet consequat nulla felis pharetra lacus. Duis semper erat
+ mauris, sed egestas purus commodo vel.
+
+
+
+ 8.0 oz. bag of LAY'S Classic Potato Chips
+
+
+ Tasty LAY's potato chips are a great snack
+
+
+ Includes three ingredients: potatoes, oil, and salt
+
+ Gluten free product
+
+
+ Made in USA
+ Ready To Eat.
+
+
+
+
Product Specifications
+
+
+
+
+
+
+ Product Type:
+ Chips & Dips
+
+
+
+
+
+
+
+ Product Name:
+
+ {" "}
+ Potato Chips Classic{" "}
+
+
+
+
+
+
+
+
+ Brand:
+ Lay's
+
+
+
+
+
+
+
+ FSA Eligible:
+ No
+
+
+
+
+
+
+
+ Size/Count:
+ 8.0oz
+
+
+
+
+
+
+
+ Item Code:
+ 331539
+
+
+
+
+
+
+
+ Ingredients:
+
+ {" "}
+ Potatoes, Vegetable Oil, and Salt.
+
+
+
+
+
+
+
Nutrition Facts
+
+
+
+
+
+
+ {" "}
+ Total Fat 10g 13%
+
+
+
+
+
+
+
+ {" "}
+ Saturated Fat 1.5g 7%
+
+
+
+
+
+
+
+ {" "}
+ Cholesterol 0mg 0%
+
+
+
+
+
+
+
+ {" "}
+ Sodium 170mg 7%
+
+
+
+
+
+
+
+ {" "}
+ Potassium 350mg 6%
+
+
+
+
+
+
More Details
+
+
+
+
+
+
+ {" "}
+ Lunarlon midsole delivers ultra-plush responsiveness
+
+
+
+
+
+
+
+ {" "}
+ Encapsulated Air-Sole heel unit for lightweight cushioning
+
+
+
+
+
+
+
+ {" "}
+ Colour Shown: Ale Brown/Black/Goldtone/Ale Brown
+
+
+
+
+
+
+ Style: 805899-202
+
+
+
+
+
+
+
+
Product Description
+
+
+
+
+
+
Nicolas cage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3 Days ago
+
+
+
Greate Product
+
+ There are many variations of passages of Lorem Ipsum
+ available, but the majority have suffered alteration in
+ some form, by injected humour
+
+
+
+
+ Like
+
+
+
+ Replay
+
+
+
+
+
+
+
+
+
+
Nicolas cage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3 Days ago
+
+
+
Greate Product
+
+ There are many variations of passages of Lorem Ipsum
+ available, but the majority have suffered alteration in
+ some form, by injected humour
+
+
+
+
+ Like
+
+
+
+ Replay
+
+
+
+
+
+
+
Write a Review
+
+ What is it like to Product?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review Title
+
+
+
+
+
+ Review Content
+
+
+
+
+ Submit Review
+
+
+
+
+
+
+
+
Customers Feedback
+
+
+
4.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Average Product Rating
+
+
+
+
+
5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 124
+
+
+
+
4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 52
+
+
+
+
3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
+
+
+
1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ProductDetailsOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsTwo.jsx
new file mode 100644
index 0000000..575a728
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductDetailsTwo.jsx
@@ -0,0 +1,1070 @@
+import React, { useEffect, useState } from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+import { getCountdown } from '../helper/Countdown';
+
+const ProductDetailsTwo = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+ const productImages = [
+ "assets/images/thumbs/product-details-two-thumb1.png",
+ "assets/images/thumbs/product-details-two-thumb2.png",
+ "assets/images/thumbs/product-details-two-thumb3.png",
+ "assets/images/thumbs/product-details-two-thumb1.png",
+ "assets/images/thumbs/product-details-two-thumb2.png",
+ ];
+
+
+ // increment & decrement
+ const [quantity, setQuantity] = useState(1);
+ const incrementQuantity = () => setQuantity(quantity + 1);
+ const decrementQuantity = () => setQuantity(quantity > 1 ? quantity - 1 : quantity);
+
+
+ const [mainImage, setMainImage] = useState(productImages[0]);
+
+ const settingsThumbs = {
+ dots: false,
+ infinite: true,
+ speed: 500,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ focusOnSelect: true,
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {productImages.map((image, index) => (
+ setMainImage(image)}>
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ Special Offer:
+
+
+
+
+ {timeLeft.days}
+
+
+ {timeLeft.hours}
+
+
+ {timeLeft.minutes}
+
+
+ {timeLeft.seconds}
+
+
+
+
+ Remains untill the end of the offer
+
+
+
+ HP Chromebook With Intel Celeron, 4GB Memory & 64GB eMMC -
+ Modern Gray
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.7 Star Rating
+
+
+ (21,671)
+
+
+
|
+
+ {" "}
+ SKU: EB4DRP{" "}
+
+
+
+
+ Geared up and ready to roll: Get the responsive performance
+ you're looking for with an Intel processor and 64 GB eMMC
+ storage. Stay productive with compatible apps like Microsoft
+ Office, Google Workspace, and more. The Chrome OS gives you a
+ fast, simple, and secure online experience with built-in virus
+ protection.
+
+
+
+
+
+ -10%
+
+
USD 320.99
+
+
+ Regular Price
+
+ USD 452.99
+
+
+
+
+
+ Monthyly EMI USD 15.00
+
+
+
+ Shipping Charge
+
+
+
+ Security & Privacy
+
+
+
+
+
+
Quick Overview
+
+
+
+ Color:
+ Mineral Silver
+
+
+
+
+
+
+
+
+
+
+
+ Pattern Name:
+ with offer
+
+
+
+ with offer{" "}
+
+
+ 12th Gen Laptop
+
+
+ without offer
+
+
+
+
+
+
+
+
+ Request More Information
+
+
+
+ 100% Guarantee Safe Checkout
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Delivery
+
+
+
+
+
+
+ Maymansign
+ Khulna
+ Rajshahi
+ Rangpur
+
+
+
+
+
+ Total Stock: 21
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Price
+
$150.00
+
+
+ Shipping
+
From $10.00
+
+
+
+
+ Add To Cart
+
+
+ Buy Now
+
+
+
+
+
+
+
+ Ship from Valkey {" "}
+
+
+
+
+
+
+
+ Sold by:{" "}
+ MR Distribution LLC {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
+
+ Reviews
+
+
+
+
+
+ 100% Satisfaction Guaranteed
+
+
+
+
+
+
+
Product Description
+
+ Wherever celebrations and good times happen, the LAY'S brand
+ will be there just as it has been for more than 75 years. With
+ flavors almost as rich as our history, we have a chip or crisp
+ flavor guaranteed to bring a smile on your face.{" "}
+
+
+ Morbi ut sapien vitae odio accumsan gravida. Morbi vitae erat
+ auctor, eleifend nunc a, lobortis neque. Praesent aliquam
+ dignissim viverra. Maecenas lacus odio, feugiat eu nunc sit
+ amet, maximus sagittis dolor. Vivamus nisi sapien, elementum
+ sit amet eros sit amet, ultricies cursus ipsum. Sed consequat
+ luctus ligula. Curabitur laoreet rhoncus blandit. Aenean vel
+ diam ut arcu pharetra dignissim ut sed leo. Vivamus faucibus,
+ ipsum in vestibulum vulputate, lorem orci convallis quam, sit
+ amet consequat nulla felis pharetra lacus. Duis semper erat
+ mauris, sed egestas purus commodo vel.
+
+
+
+ 8.0 oz. bag of LAY'S Classic Potato Chips
+
+
+ Tasty LAY's potato chips are a great snack
+
+
+ Includes three ingredients: potatoes, oil, and salt
+
+ Gluten free product
+
+
+ Made in USA
+ Ready To Eat.
+
+
+
+
Product Specifications
+
+
+
+
+
+
+ Product Type:
+ Chips & Dips
+
+
+
+
+
+
+
+ Product Name:
+
+ {" "}
+ Potato Chips Classic{" "}
+
+
+
+
+
+
+
+
+ Brand:
+ Lay's
+
+
+
+
+
+
+
+ FSA Eligible:
+ No
+
+
+
+
+
+
+
+ Size/Count:
+ 8.0oz
+
+
+
+
+
+
+
+ Item Code:
+ 331539
+
+
+
+
+
+
+
+ Ingredients:
+
+ {" "}
+ Potatoes, Vegetable Oil, and Salt.
+
+
+
+
+
+
+
Nutrition Facts
+
+
+
+
+
+
+ {" "}
+ Total Fat 10g 13%
+
+
+
+
+
+
+
+ {" "}
+ Saturated Fat 1.5g 7%
+
+
+
+
+
+
+
+ {" "}
+ Cholesterol 0mg 0%
+
+
+
+
+
+
+
+ {" "}
+ Sodium 170mg 7%
+
+
+
+
+
+
+
+ {" "}
+ Potassium 350mg 6%
+
+
+
+
+
+
More Details
+
+
+
+
+
+
+ {" "}
+ Lunarlon midsole delivers ultra-plush responsiveness
+
+
+
+
+
+
+
+ {" "}
+ Encapsulated Air-Sole heel unit for lightweight cushioning
+
+
+
+
+
+
+
+ {" "}
+ Colour Shown: Ale Brown/Black/Goldtone/Ale Brown
+
+
+
+
+
+
+ Style: 805899-202
+
+
+
+
+
+
+
+
Product Description
+
+
+
+
+
+
Nicolas cage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3 Days ago
+
+
+
Greate Product
+
+ There are many variations of passages of Lorem Ipsum
+ available, but the majority have suffered alteration in
+ some form, by injected humour
+
+
+
+
+ Like
+
+
+
+ Replay
+
+
+
+
+
+
+
+
+
+
Nicolas cage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3 Days ago
+
+
+
Greate Product
+
+ There are many variations of passages of Lorem Ipsum
+ available, but the majority have suffered alteration in
+ some form, by injected humour
+
+
+
+
+ Like
+
+
+
+ Replay
+
+
+
+
+
+
+
Write a Review
+
+ What is it like to Product?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review Title
+
+
+
+
+
+ Review Content
+
+
+
+
+ Submit Review
+
+
+
+
+
+
+
+
Customers Feedback
+
+
+
4.8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Average Product Rating
+
+
+
+
+
5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 124
+
+
+
+
4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 52
+
+
+
+
3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12
+
+
+
+
2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
+
+
+
1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ProductDetailsTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ProductListOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductListOne.jsx
new file mode 100644
index 0000000..a2ecbc4
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ProductListOne.jsx
@@ -0,0 +1,400 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const ProductListOne = () => {
+ return (
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+ Add
+
+
+
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ProductListOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalOne.jsx
new file mode 100644
index 0000000..6e97420
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalOne.jsx
@@ -0,0 +1,108 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const PromotionalOne = () => {
+ return (
+
+
+
+
+
+
+
+
+ Everyday Fresh Meat
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ Daily Fresh Vegetables
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ Everyday Fresh Milk
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+ Everyday Fresh Fruits
+
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default PromotionalOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalThree.jsx
new file mode 100644
index 0000000..11e5cc5
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalThree.jsx
@@ -0,0 +1,70 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const PromotionalThree = () => {
+ return (
+
+
+
+
+
+
+
+ Free Shipping Over Order $150
+
+
+ Woman{" "}
+
+ Spring
+ {" "}
+ Collection
+
+
+ Explore Now
+
+
+
+
+
+
+
+ Men Fashion Discover
+
+ New{" "}
+
+ Style
+ {" "}
+ Sale 35% Off
+
+
+ Explore Now
+
+
+
+
+
+
+
+ );
+};
+
+export default PromotionalThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalTwo.jsx
new file mode 100644
index 0000000..f8078e2
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/PromotionalTwo.jsx
@@ -0,0 +1,97 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const PromotionalTwo = () => {
+ return (
+
+
+
+
+
+
+
+
+ Latest Deal
+
iPhone 15 Pro Max
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Get 60% Off
+
Instax Mini 11 Camera
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Start From $250
+
Airpod Headphone
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default PromotionalTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/RecentlyViewedOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/RecentlyViewedOne.jsx
new file mode 100644
index 0000000..faf8bf3
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/RecentlyViewedOne.jsx
@@ -0,0 +1,427 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const RecentlyViewedOne = () => {
+ return (
+
+
+
+
+
+
Recently Viewed Products
+
+
+ View All Products
+
+
+
+
+
+
+
+
+
+ Best Seller{" "}
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ Sold
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ Best Seller{" "}
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default RecentlyViewedOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendationsSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendationsSection.jsx
new file mode 100644
index 0000000..c6c4efb
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendationsSection.jsx
@@ -0,0 +1,140 @@
+import React, { useEffect, useState, useCallback } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=200&h=200&fit=crop",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=200&h=200&fit=crop",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=200&h=200&fit=crop",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=200&h=200&fit=crop",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=200&h=200&fit=crop",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=200&h=200&fit=crop",
+ "product:0192d5a1-1111-7a1b-8c1d-1e2f3a4b5c6d": "https://images.unsplash.com/photo-1694819488591-a43907d1c5cc?w=200&h=200&fit=crop",
+ "product:0192d5a1-2222-7b2c-9d2e-2f3a4b5c6d7e": "https://images.unsplash.com/photo-1517336714731-489689fd1ca8?w=200&h=200&fit=crop",
+ "product:0192d5a1-3333-7c3d-0e3f-3a4b5c6d7e8f": "https://images.unsplash.com/photo-1598327105666-5b89351aff97?w=200&h=200&fit=crop",
+ "product:0192d5a1-4444-7d4e-1f4a-4b5c6d7e8f9a": "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=200&h=200&fit=crop",
+ "product:0192d5a1-5555-7e5f-2a5b-5c6d7e8f9a0b": "https://images.unsplash.com/photo-1551816230-ef5deaed4a26?w=200&h=200&fit=crop",
+ "product:0192d5a1-9999-7c9d-6e9f-9a0b1c2d3e4f": "https://images.unsplash.com/photo-1608043152269-423dbba4e7e1?w=200&h=200&fit=crop",
+};
+
+export default function RecommendationsSection() {
+ const { userId, addToCart } = useValkey();
+ const [recs, setRecs] = useState([]);
+ const [trending, setTrending] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [activeTab, setActiveTab] = useState("foryou");
+ const [toast, setToast] = useState(null);
+
+ const fetchData = useCallback(async () => {
+ setLoading(true);
+ try {
+ const [recRes, trendRes] = await Promise.all([
+ fetch(`${API}/api/ai/recommendations/${encodeURIComponent(userId)}`),
+ fetch(`${API}/api/ai/trending`),
+ ]);
+ const recData = await recRes.json();
+ const trendData = await trendRes.json();
+ setRecs(recData.recommendations || []);
+ setTrending(trendData.trending || []);
+ } catch (e) { console.error("[Recs]", e); }
+ setLoading(false);
+ }, [userId]);
+
+ useEffect(() => { fetchData(); }, [fetchData]);
+
+ // Real-time: refresh every 30s
+ useEffect(() => {
+ const t = setInterval(fetchData, 30000);
+ return () => clearInterval(t);
+ }, [fetchData]);
+
+ const handleCart = async (product) => {
+ await addToCart({ id: product.id || product.productId, name: product.name, price: product.price });
+ setToast(`${product.name} added!`);
+ setTimeout(() => setToast(null), 2000);
+ };
+
+ const getImg = (p) => PRODUCT_IMAGES[p.id || p.productId] || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=200&h=200&fit=crop";
+ const fmtPrice = (p) => `₹${Number(typeof p === "object" ? p?.amount : p || 0).toLocaleString("en-IN")}`;
+
+ const displayProducts = activeTab === "foryou" ? recs : trending;
+
+ return (
+
+ {toast && (
+
+ {toast}
+
+ )}
+
+
+
+
+
+ {activeTab === "foryou" ? "Recommended For You" : "🔥 Trending Now"}
+
+
+ ⚡ {activeTab === "foryou" ? "ZREVRANGE user_affinity:" + userId.slice(0, 12) + "…" : "ZREVRANGE trending:global:24h"}
+
+
+
+ {[
+ { key: "foryou", label: "For You", icon: "ph-user" },
+ { key: "trending", label: "Trending", icon: "ph-trend-up" },
+ ].map(tab => (
+ setActiveTab(tab.key)}
+ className={`btn rounded-pill px-16 py-8 text-sm d-flex align-items-center gap-6 ${activeTab === tab.key ? "btn-main" : "btn-outline-secondary"}`}
+ >
+ {tab.label}
+
+ ))}
+
+
+
+ {loading ? (
+
+ {[...Array(5)].map((_, i) => (
+
+ ))}
+
+ ) : displayProducts.length === 0 ? (
+
+
+
Browse products to get personalized recommendations.
+
Browse Shop
+
+ ) : (
+
+ {displayProducts.map((product, i) => {
+ const img = getImg(product);
+ const score = product.score;
+ return (
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=200&h=200&fit=crop"; }} />
+
+
{product.name}
+
{fmtPrice(product.price)}
+ {score && (
+
+
+ score: {Number(score).toFixed(0)}
+
+
+ )}
+
handleCart(product)} className="btn btn-main rounded-pill w-100 py-8 text-xs d-flex align-items-center justify-content-center gap-6">
+ Add to Cart
+
+
+ );
+ })}
+
+ )}
+
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendedOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendedOne.jsx
new file mode 100644
index 0000000..9580537
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/RecommendedOne.jsx
@@ -0,0 +1,183 @@
+import React, { useState, useEffect } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const TABS = [
+ { id: "all", label: "All", categoryId: "category:grocery" },
+ { id: "grocery", label: "Grocery", categoryId: "category:grocery" },
+ { id: "fruits", label: "Fruits", categoryId: "category:vegetables-fruit" },
+ { id: "juices", label: "Juices", categoryId: "category:beverages" },
+ { id: "vegetables", label: "Vegetables", categoryId: "category:vegetables-fruit" },
+ { id: "snacks", label: "Snacks", categoryId: "category:biscuits-snacks" },
+ { id: "organic", label: "Organic Foods", categoryId: "category:grocery-staples" }
+];
+
+const RecommendedOne = () => {
+ const { addToCart } = useValkey();
+ const [activeTab, setActiveTab] = useState(TABS[0]);
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [adding, setAdding] = useState(null);
+ const [toast, setToast] = useState(null);
+
+ const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+ useEffect(() => {
+ const fetchTabProducts = async () => {
+ setLoading(true);
+ try {
+ const res = await fetch(`${API}/api/products?category=${activeTab.categoryId}&limit=12`);
+ const data = await res.json();
+ setProducts(data.products || data || []);
+ } catch (err) {
+ console.error("[RecommendedOne] fetch error:", err);
+ } finally {
+ setLoading(false);
+ }
+ };
+ fetchTabProducts();
+ }, [activeTab, API]);
+
+ useEffect(() => {
+ if (toast) {
+ const t = setTimeout(() => setToast(null), 2500);
+ return () => clearTimeout(t);
+ }
+ }, [toast]);
+
+ const handleAddToCart = async (product) => {
+ setAdding(product.id);
+ const result = await addToCart(product);
+ setAdding(null);
+ if (result) setToast(`${product.name} added to cart!`);
+ };
+
+ const fmtPrice = (price) => {
+ if (!price) return "₹0";
+ const amt = typeof price === "object" ? price.amount : price;
+ return `₹${Number(amt).toLocaleString("en-IN")}`;
+ };
+
+ return (
+
+ {toast && (
+
+
+ {toast}
+
+ )}
+
+
+
+
Recommended for you
+
+ {TABS.map((tab) => (
+
+ setActiveTab(tab)}
+ className={`nav-link ${activeTab.id === tab.id ? "active" : ""}`}
+ type="button"
+ role="tab"
+ >
+ {tab.label}
+
+
+ ))}
+
+
+
+
+ {loading ? (
+
+ ) : products.length === 0 ? (
+
+
+
No products found in this category
+
+ ) : (
+
+ {products.map((product) => {
+ const qty = product.inventory?.quantity || 0;
+ const res = product.inventory?.reserved || 0;
+ const inStock = (qty - res) > 0;
+ const isAdding = adding === product.id;
+ const img = product.images?.[0]?.url || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop";
+
+ return (
+
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop"; }}
+ />
+
+
+
+
+ {product.name}
+
+
+
+
+
+
+
+ By {product.brand}
+
+
+
+
+
+ {fmtPrice(product.price)}
+
+ {product.price?.compareAt && (
+
+ {fmtPrice(product.price.compareAt)}
+
+ )}
+
+
+ {product.ratings?.average || 4.5}
+
+
+
+ ({(product.ratings?.count || 0).toLocaleString()})
+
+
inStock && handleAddToCart(product)}
+ disabled={!inStock || isAdding}
+ className="product-card__cart btn bg-main-50 text-main-600 hover-bg-main-600 hover-text-white py-11 px-24 rounded-pill flex-align gap-8 mt-24 w-100 justify-content-center"
+ style={{ border: "none", cursor: inStock ? "pointer" : "not-allowed", opacity: !inStock ? 0.5 : 1, fontSize: 12 }}
+ >
+ {isAdding ? "Adding…" : "Add To Cart"}
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+
+ );
+};
+
+export default RecommendedOne;
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingOne.jsx
new file mode 100644
index 0000000..a0916da
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingOne.jsx
@@ -0,0 +1,67 @@
+import React from 'react'
+
+const ShippingOne = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
Free Shipping
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
100% Satisfaction
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
Secure Payments
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
24/7 Support
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ShippingOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingThree.jsx
new file mode 100644
index 0000000..f3dc566
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingThree.jsx
@@ -0,0 +1,66 @@
+import React from "react";
+
+const ShippingThree = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
Free Shipping
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
100% Satisfaction
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
Secure Payments
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
24/7 Support
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+ );
+};
+
+export default ShippingThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingTwo.jsx
new file mode 100644
index 0000000..feda048
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ShippingTwo.jsx
@@ -0,0 +1,68 @@
+import React from 'react'
+
+const ShippingTwo = () => {
+
+ return (
+
+
+
+
+
+
+
+
+
+
Free Shipping
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
100% Satisfaction
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
Secure Payments
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+
+
+
24/7 Support
+
+ Free shipping all over the US
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ShippingTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ShopSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ShopSection.jsx
new file mode 100644
index 0000000..4998f3b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ShopSection.jsx
@@ -0,0 +1,2031 @@
+import React, { useState } from 'react'
+import { Link } from 'react-router-dom'
+import ReactSlider from 'react-slider'
+
+const ShopSection = () => {
+
+ let [grid, setGrid] = useState(false)
+
+ let [active, setActive] = useState(false)
+ let sidebarController = () => {
+ setActive(!active)
+ }
+
+
+
+
+ return (
+
+
+
+
+ {/* Sidebar Start */}
+
+
+
+
+
+
+
+ Product Category
+
+
+
+
+ Mobile & Accessories (12)
+
+
+
+
+ Laptop (12)
+
+
+
+
+ Electronics (12)
+
+
+
+
+ Smart Watch (12)
+
+
+
+
+ Storage (12)
+
+
+
+
+ Portable Devices (12)
+
+
+
+
+ Action Camera (12)
+
+
+
+
+ Smart Gadget (12)
+
+
+
+
+ Monitor (12)
+
+
+
+
+ Smart TV (12)
+
+
+
+
+ Camera (12)
+
+
+
+
+ Monitor Stand (12)
+
+
+
+
+ Headphone (12)
+
+
+
+
+
+
+ Filter by Price
+
+
+
`Thumb value ${state.valueNow}`}
+ renderThumb={(props, state) => {
+ const { key, ...restProps } = props;
+ return {state.valueNow}
;
+ }}
+ pearling
+ minDistance={10}
+ />
+
+
+
+
+
+ Filter{" "}
+
+
+
+
+
+
+
+
+ Filter by Rating
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
124
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
52
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
12
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2
+
+
+
+
+ Filter by Color
+
+
+
+
+
+ Filter by Brand
+
+
+
+
+
+
+
+
+ {/* Sidebar End */}
+ {/* Content Start */}
+
+ {/* Top Start */}
+
+
Showing 1-20 of 85 result
+
+
+ setGrid(true)}
+ type="button"
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl list-btn border-gray-100 ${grid === true && "border-main-600 text-white bg-main-600"}`}
+ >
+
+
+ setGrid(false)}
+ type="button"
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl grid-btn border-gray-100 ${grid === false && "border-main-600 text-white bg-main-600"}`}
+ >
+
+
+
+
+
+ Sort by:{" "}
+
+
+
+ Popular
+
+ Latest
+ Trending
+ Matches
+
+
+
+
+
+
+
+ {/* Top End */}
+
+
+
+
+
+ Best Sale{" "}
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ Best Sale{" "}
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+ Best Sale{" "}
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+
+ $28.99
+
+
+ $14.99 /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+ {/* Pagination Start */}
+
+
+
+
+
+
+
+
+ 01
+
+
+
+
+ 02
+
+
+
+
+ 03
+
+
+
+
+ 04
+
+
+
+
+ 05
+
+
+
+
+ 06
+
+
+
+
+ 07
+
+
+
+
+
+
+
+
+ {/* Pagination End */}
+
+ {/* Content End */}
+
+
+
+
+ )
+}
+
+export default ShopSection
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ShortProductOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ShortProductOne.jsx
new file mode 100644
index 0000000..ed7de78
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ShortProductOne.jsx
@@ -0,0 +1,1164 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const ShortProductOne = () => {
+
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1500,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 768,
+ settings: {
+ arrows: false,
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ arrows: true,
+ },
+ },
+
+ ],
+
+ };
+ return (
+
+
+
+
+
+
+
+ Featured Products
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Top Selling Products
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+ On-sale Products
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Top Rated Products
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+
+ (17k)
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+ $1500.00
+
+
+ $1500.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ShortProductOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/StepsSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/StepsSection.jsx
new file mode 100644
index 0000000..7c39a0b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/StepsSection.jsx
@@ -0,0 +1,80 @@
+import React from "react";
+
+const StepsSection = () => {
+ return (
+
+
+
+
+
+
+
+
+
Over $200k in potential benefits
+
+ Ready to sell? Launch your brand today with a powerful for
+ new sellers and over $200k in potential benefits
+
+
+
+
+
+
Step 01
+
+ Create an account on our website. It is fast and free.
+
+
+
+
+ 01
+
+
+
+
+
+
Step 02
+
+ {" "}
+ Upload your products and the display in your shop.
+
+
+
+
+ 02
+
+
+
+
+
+
Step 03
+
+ We'll verify your account and then you can start
+ selling!
+
+
+
+
+ 03
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default StepsSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TestimonialOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TestimonialOne.jsx
new file mode 100644
index 0000000..924fc2b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TestimonialOne.jsx
@@ -0,0 +1,174 @@
+import React, { useRef } from "react";
+import Slider from "react-slick";
+
+const TestimonialOne = () => {
+ const mainSliderRef = useRef(null);
+ const thumbSliderRef = useRef(null);
+
+ const NextArrow = ({ onClick }) => (
+
+
+
+ );
+
+ const PrevArrow = ({ onClick }) => (
+
+
+
+ );
+
+ const mainSliderSettings = {
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ asNavFor: thumbSliderRef.current,
+ dots: false,
+ arrows: false,
+ fade: true,
+ cssEase: "linear",
+ };
+
+ const thumbSliderSettings = {
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ asNavFor: mainSliderRef.current,
+ dots: false,
+ arrows: true,
+ infinite: true,
+ focusOnSelect: true,
+ speed: 900,
+ nextArrow: ,
+ prevArrow: ,
+ };
+
+ const testimonialsData = [
+ {
+ name: "ROBIUL HASAN",
+ role: "Business Owner",
+ rating: 5,
+ desc: "Customers expressed that shopping at Asiana Fashion was a delightful experience, highlighting the vibrant colors and unique designs that made them feel special atevents",
+ img: "assets/images/thumbs/testimonials-img1.png",
+ },
+ {
+ name: "SAMIYA AKTER",
+ role: "Front End Developer",
+ rating: 5,
+ desc: "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia",
+ img: "assets/images/thumbs/testimonials-img2.png",
+ },
+ {
+ name: "JOHN DOE",
+ role: "Max Model",
+ rating: 5,
+ desc: "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here",
+ img: "assets/images/thumbs/testimonials-img3.png",
+ },
+ {
+ name: "MICHEL SMITH",
+ role: "Former Model",
+ rating: 5,
+ desc: "Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy.",
+ img: "assets/images/thumbs/testimonials-img4.png",
+ },
+ {
+ name: "ALEX",
+ role: "Back End Developer",
+ rating: 5,
+ desc: "There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text",
+ img: "assets/images/thumbs/testimonials-img2.png",
+ },
+ ];
+ return (
+
+
+
+
+
+
+ Share information about your brand with your customers.
+
+
+ Customers Feedback
+
+
+
+
+
+
+ {testimonialsData.map((testimonial, index) => (
+
+
+ {testimonial.name}
+
+
+ {testimonial.role}
+
+
+ {[...Array(testimonial.rating)].map((_, i) => (
+
+
+
+ ))}
+
+
+ {testimonial.desc}
+
+
+ ))}
+
+
+
+ {testimonialsData.map((testimonial, index) => (
+
+
+
+
+
+
+ {testimonial.name}
+
+
+ {testimonial.role}
+
+
+
+ ))}
+
+
+
+
+
+ );
+};
+
+export default TestimonialOne;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TextSlider.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TextSlider.jsx
new file mode 100644
index 0000000..448e069
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TextSlider.jsx
@@ -0,0 +1,67 @@
+import React from "react";
+import Marquee from "react-fast-marquee";
+const TextSlider = () => {
+ return (
+
+
+
+
+
+
+
+
+ T-Shirt Offer
+
+
+
+
+
+
+
+ Best Selling Offer
+
+
+
+
+
+
+
+ Limited Offer Sales
+
+
+
+
+
+
+
+ Spring Collection
+
+
+
+
+
+
+
+ Hot Deal Products
+
+
+
+
+
+
+
+ {" "}
+ Our Services
+
+
+
+
+
+ );
+};
+
+export default TextSlider;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingOne.jsx
new file mode 100644
index 0000000..e65ff57
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingOne.jsx
@@ -0,0 +1,518 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const TopSellingOne = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 1199,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
Top Selling Products
+
+
+ View All Deals
+
+
+
+
+
+
+
+
+
+
+
Polaroid Now+ Gen 2 - White
+ Fresh Vegetables
+
+ Shop Now
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sold
+
+
+
+
+
+ 4.8
+
+
+
+
+ (17k)
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%{" "}
+
+
+
+
+
+ 4.8
+
+
+
+
+ (17k)
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 4.8
+
+
+
+
+ (17k)
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best seller
+
+
+
+
+
+ 4.8
+
+
+
+
+ (17k)
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Seller{" "}
+
+
+
+
+
+ 4.8
+
+
+
+
+ (17k)
+
+
+
+
+ Taylor Farms Broccoli Florets Vegetables
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default TopSellingOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingTwo.jsx
new file mode 100644
index 0000000..a5b3597
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TopSellingTwo.jsx
@@ -0,0 +1,471 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const TopSellingTwo = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1000,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 1399,
+ settings: {
+ slidesToShow: 3,
+
+ },
+ },
+ {
+ breakpoint: 1199,
+ settings: {
+ slidesToShow: 2,
+
+ },
+ },
+ {
+ breakpoint: 575,
+ settings: {
+ slidesToShow: 1,
+
+ },
+ },
+
+ ],
+ };
+ return (
+
+
+
+
+
+
+
+
+ Insta360 GO 3S Action Camera - White
+
+
+ FROM
+
$430
+
+ 20% off
+
+
+
+
+
+
+
+
+
+
+
Recommended For You
+
+
+ View All
+
+
+
+
+
+
+
+
+
+
+
+ Best Seller{" "}
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ Sold
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+ 19%OFF
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Delivered by Aug 02
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default TopSellingTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsOne.jsx
new file mode 100644
index 0000000..fc9fcbd
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsOne.jsx
@@ -0,0 +1,331 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+const TopVendorsOne = () => {
+ return (
+
+
+
+
+
Weekly Top Vendors
+
+ All Vendors
+
+
+
+
+
+
+
+
+
Organic Market
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Safeway
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Food Max
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
HRmart
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Lucky Supermarket
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Arico Farmer
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Farmer Market
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Foodsco
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default TopVendorsOne
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsTwo.jsx
new file mode 100644
index 0000000..d43ea9f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TopVendorsTwo.jsx
@@ -0,0 +1,363 @@
+import React from 'react'
+import { Link } from 'react-router-dom';
+import Slider from 'react-slick';
+
+const TopVendorsTwo = () => {
+ function SampleNextArrow(props) {
+ const { className, onClick } = props;
+ return (
+
+
+
+ );
+ }
+ function SamplePrevArrow(props) {
+ const { className, onClick } = props;
+
+ return (
+
+
+
+
+ );
+ }
+ const settings = {
+ dots: false,
+ arrows: true,
+ infinite: true,
+ speed: 1500,
+ slidesToShow: 4,
+ slidesToScroll: 1,
+ initialSlide: 0,
+ autoplay: true,
+ nextArrow: ,
+ prevArrow: ,
+
+ };
+ return (
+
+
+
+
+
+
Popular Products
+
+
+ View All Products
+
+
+
+
+
+
+
+
+
+
Organic Market
+
+
+
+
+ 4.8
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Best Buy
+
+
+
+
+ 4.8
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Organic Market
+
+
+
+
+ 4.8
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Best Buy
+
+
+
+
+ 4.8
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default TopVendorsTwo
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingOne.jsx
new file mode 100644
index 0000000..883f794
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingOne.jsx
@@ -0,0 +1,213 @@
+import React, { useState, useEffect } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const TABS = [
+ { id: "all", label: "All", categoryId: "category:0192d4e2-1f5a-7c3d-9b2e-8a4f6d0c1e3b" },
+ { id: "mobile", label: "Smartphones", categoryId: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c" },
+ { id: "headphone", label: "Headphones", categoryId: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a" },
+ { id: "laptop", label: "Laptops", categoryId: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f" }
+];
+
+const TrendingOne = () => {
+ const { addToCart, addToCompare, removeFromCompare, isInCompare } = useValkey();
+ const [activeTab, setActiveTab] = useState(TABS[0]);
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [adding, setAdding] = useState(null);
+ const [toast, setToast] = useState(null);
+
+ const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+ useEffect(() => {
+ const fetchTabProducts = async () => {
+ setLoading(true);
+ try {
+ const res = await fetch(`${API}/api/products?category=${activeTab.categoryId}&limit=12`);
+ const data = await res.json();
+ setProducts(data.products || data || []);
+ } catch (err) {
+ console.error("[TrendingOne] fetch error:", err);
+ } finally {
+ setLoading(false);
+ }
+ };
+ fetchTabProducts();
+ }, [activeTab, API]);
+
+ useEffect(() => {
+ if (toast) {
+ const t = setTimeout(() => setToast(null), 2500);
+ return () => clearTimeout(t);
+ }
+ }, [toast]);
+
+ const handleAddToCart = async (product) => {
+ setAdding(product.id);
+ const result = await addToCart(product);
+ setAdding(null);
+ if (result) setToast(`${product.name} added to cart!`);
+ };
+
+ const fmtPrice = (price) => {
+ if (!price) return "₹0";
+ const amt = typeof price === "object" ? price.amount : price;
+ return `₹${Number(amt).toLocaleString("en-IN")}`;
+ };
+
+ return (
+
+ {toast && (
+
+
+ {toast}
+
+ )}
+
+
+
+
+
+
Trending Products
+
+ {TABS.map((tab) => (
+
+ setActiveTab(tab)}
+ className={`nav-link ${activeTab.id === tab.id ? "active" : ""}`}
+ type="button"
+ role="tab"
+ >
+ {tab.label}
+
+
+ ))}
+
+
+
+
+
+ {loading ? (
+
+ ) : products.length === 0 ? (
+
+
+
No products found in this category
+
+ ) : (
+
+ {products.map((product) => {
+ const qty = product.inventory?.quantity || 0;
+ const res = product.inventory?.reserved || 0;
+ const inStock = (qty - res) > 0;
+ const isAdding = adding === product.id;
+ const img = product.images?.[0]?.url || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop";
+ const inComp = isInCompare(product.id);
+
+ return (
+
+
+ {/* Compare shuffle button */}
+
{
+ e.preventDefault();
+ e.stopPropagation();
+ if (inComp) {
+ await removeFromCompare(product.id);
+ setToast("Removed from comparison list");
+ } else {
+ const resCompare = await addToCompare(product);
+ if (resCompare && resCompare.error === "comparison_limit_reached") {
+ setToast(resCompare.message || "Comparison list full!");
+ } else {
+ setToast("Added to comparison list!");
+ }
+ }
+ }}
+ style={{
+ position: "absolute", top: 16, left: 16, zIndex: 2,
+ background: inComp ? "#e6f9f1" : "#f8f9fa",
+ border: `1px solid ${inComp ? "#00a86b" : "#e2e8f0"}`,
+ borderRadius: "50%", width: 32, height: 32,
+ display: "flex", alignItems: "center", justifyContent: "center",
+ cursor: "pointer", transition: "all 0.2s",
+ }}
+ title="Add to Compare"
+ >
+
+
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=300&h=300&fit=crop"; }}
+ />
+
+
+ {product.price?.compareAt && (
+
+ Sale Active
+
+ )}
+
+
+ {product.name}
+
+
+
+ {product.ratings?.average || 4.5}
+
+
+
+ ({(product.ratings?.count || 0).toLocaleString()})
+
+
+ Fulfilled by Valkey
+
+
+ {product.price?.compareAt && (
+
+ {fmtPrice(product.price.compareAt)}
+
+ )}
+
+ {fmtPrice(product.price)}
+
+
+
inStock && handleAddToCart(product)}
+ disabled={!inStock || isAdding}
+ className="product-card__cart btn bg-main-50 text-main-600 hover-bg-main-600 hover-text-white py-11 px-24 rounded-pill flex-align gap-8 w-100 justify-content-center"
+ style={{ border: "none", cursor: inStock ? "pointer" : "not-allowed", opacity: !inStock ? 0.5 : 1, fontSize: 12 }}
+ >
+ {isAdding ? "Adding…" : "Add To Cart"}
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+
+
+ );
+};
+
+export default TrendingOne;
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingThree.jsx
new file mode 100644
index 0000000..a26d06a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/TrendingThree.jsx
@@ -0,0 +1,1777 @@
+import React, { useEffect, useState } from "react";
+import { getCountdown } from "../helper/Countdown";
+import { Link } from "react-router-dom";
+
+const TrendingThree = () => {
+ const [timeLeft, setTimeLeft] = useState(getCountdown());
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setTimeLeft(getCountdown());
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ return (
+
+
+
+
+
Trending Products
+
+
+
+ On Sale
+
+
+
+
+ Featured Products
+
+
+
+
+ Best Rated
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timeLeft.days}
+
+ Days
+
+
+
+ {timeLeft.hours}
+
+ Hour
+
+
+
+ {timeLeft.minutes}
+
+ Min
+
+
+
+ {timeLeft.seconds}
+
+ Sec
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default TrendingThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyBanner.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyBanner.jsx
new file mode 100644
index 0000000..a2e8532
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyBanner.jsx
@@ -0,0 +1,87 @@
+/**
+ * ValkeyBanner – shows a real-time strip at the top of the page
+ * displaying which Valkey features are active right now.
+ */
+import React, { useState } from "react";
+import { useValkey } from "../context/ValkeyContext";
+
+const FEATURES = [
+ { label: "Cart → Valkey Hash", icon: "ph-shopping-cart-simple", color: "#48BB78" },
+ { label: "Sessions → Valkey String TTL", icon: "ph-lock-key", color: "#4299E1" },
+ { label: "Products → Valkey JSON", icon: "ph-database", color: "#ED8936" },
+ { label: "Inventory → Lua Atomic", icon: "ph-package", color: "#9F7AEA" },
+ { label: "Search → FT.SEARCH", icon: "ph-magnifying-glass", color: "#48BB78" },
+ { label: "AI Memory → Breeth + Valkey", icon: "ph-robot", color: "#F6AD55" },
+ { label: "Trending → Valkey Sorted Set", icon: "ph-trend-up", color: "#FC8181" },
+];
+
+export default function ValkeyBanner() {
+ const { valkeyStats } = useValkey();
+ const [visible, setVisible] = useState(true);
+
+ if (!visible) return null;
+
+ return (
+
+
+ {[...FEATURES, ...FEATURES].map((f, i) => (
+
+
+ {f.label}
+
+ ))}
+
+
+
+
+ VALKEY LIVE
+ {valkeyStats && (
+ {valkeyStats.usedMemory}
+ )}
+ setVisible(false)} style={{ background: "none", border: "none", color: "#718096", cursor: "pointer", fontSize: 14, lineHeight: 1, padding: 0 }}>×
+
+
+
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyCartSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyCartSection.jsx
new file mode 100644
index 0000000..c826846
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyCartSection.jsx
@@ -0,0 +1,278 @@
+import React, { useState } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const VALKEY_BADGE_STYLE = {
+ display: "inline-flex",
+ alignItems: "center",
+ gap: 4,
+ background: "#EBF8FF",
+ color: "#2C7A7B",
+ borderRadius: 4,
+ padding: "2px 7px",
+ fontSize: 10,
+ fontWeight: 600,
+ fontFamily: "monospace",
+ border: "1px solid #B2F5EA",
+};
+
+function ValkeyBadge({ op }) {
+ return (
+
+
+ {op}
+
+ );
+}
+
+export default function ValkeyCartSection() {
+ const { cart, removeFromCart, updateQuantity, clearCart, applyCoupon, loading } = useValkey();
+ const [couponCode, setCouponCode] = useState("");
+ const [couponResult, setCouponResult] = useState(null);
+ const [couponError, setCouponError] = useState(null);
+ const [applyingCoupon, setApplyingCoupon] = useState(false);
+
+ const handleCoupon = async (e) => {
+ e.preventDefault();
+ if (!couponCode.trim()) return;
+ setApplyingCoupon(true);
+ setCouponError(null);
+ setCouponResult(null);
+ const result = await applyCoupon(couponCode.trim());
+ if (result?.success) {
+ setCouponResult(result);
+ } else {
+ setCouponError(result?.error || result?.message || "Invalid coupon");
+ }
+ setApplyingCoupon(false);
+ };
+
+ const finalTotal = couponResult
+ ? couponResult.finalTotal
+ : cart.subtotal;
+
+ return (
+
+
+ {/* Valkey header badge */}
+
+ Cart powered by
+
+ Valkey Hash · 7-day TTL
+
+
+
+
+
+ {cart.items.length === 0 ? (
+
+
+
+ Your cart is empty.{" "}
+ Continue Shopping
+
+
+
+
+
+ ) : (
+ <>
+
+
+
+
+ Remove
+ Product
+ Price
+ Quantity
+ Subtotal
+
+
+
+ {cart.items.map((item) => (
+
+
+ removeFromCart(item.productId)}
+ className="remove-tr-btn flex-align gap-12 hover-text-danger-600"
+ disabled={loading}
+ >
+
+ Remove
+
+
+
+
+
+
+
+
+
+
+ {item.name}
+
+
+
+
+
+
+
+
+
+
+ ₹{(item.price || 0).toLocaleString("en-IN")}
+
+
+
+
+ updateQuantity(item.productId, item.quantity - 1)}
+ style={{
+ width: 28, height: 28, border: "1px solid #E2E8F0",
+ borderRadius: 4, background: "#F7FAFC", cursor: "pointer", fontSize: 16,
+ }}
+ disabled={loading}
+ >−
+ {item.quantity}
+ updateQuantity(item.productId, item.quantity + 1)}
+ style={{
+ width: 28, height: 28, border: "1px solid #E2E8F0",
+ borderRadius: 4, background: "#F7FAFC", cursor: "pointer", fontSize: 16,
+ }}
+ disabled={loading}
+ >+
+
+
+
+
+ ₹{((item.price || 0) * item.quantity).toLocaleString("en-IN")}
+
+
+
+ ))}
+
+
+
+
+
+
+ setCouponCode(e.target.value)}
+ style={{ maxWidth: 200 }}
+ />
+
+ {applyingCoupon ? "Applying…" : "Apply Coupon"}
+
+
+
+ Clear Cart
+
+
+
+ {couponResult && (
+
+
{" "}
+ Coupon
{couponResult.coupon?.code} applied!
+ You save ₹{couponResult.discount?.toLocaleString("en-IN")}
+
+
+ )}
+ {couponError && (
+
+ {couponError}
+
+ )}
+ >
+ )}
+
+
+
+
+
+
Cart Totals
+
+ {/* Valkey storage info */}
+
+
+ Stored in Valkey Hash
+
+
+ HGETALL cart:{"{userId}"}
+
+
+ TTL: 7 days · Auto-expires on abandon
+
+
+
+
+
+ Subtotal
+
+ ₹{cart.subtotal?.toLocaleString("en-IN") || "0"}
+
+
+ {couponResult && (
+
+ Discount
+
+ −₹{couponResult.discount?.toLocaleString("en-IN")}
+
+
+ )}
+
+ Delivery
+ Free
+
+
+ Tax (18% GST)
+
+ ₹{Math.round(finalTotal * 0.18).toLocaleString("en-IN")}
+
+
+
+
+
+
+ Total
+
+ ₹{Math.round(finalTotal * 1.18).toLocaleString("en-IN")}
+
+
+
+
+
+ Proceed to Checkout
+
+
+ {/* Try coupons hint */}
+
+ Try coupons: VALKEY10 , FLAT500 , BREETH20
+
+
+
+
+
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyInventoryBadge.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyInventoryBadge.jsx
new file mode 100644
index 0000000..51404ff
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyInventoryBadge.jsx
@@ -0,0 +1,50 @@
+/**
+ * ValkeyInventoryBadge – shows real-time stock from Valkey JSON
+ * Drop it on any product card or product detail page.
+ */
+import React, { useEffect, useState } from "react";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+export default function ValkeyInventoryBadge({ productId }) {
+ const [inv, setInv] = useState(null);
+
+ useEffect(() => {
+ if (!productId) return;
+ const id = productId.startsWith("product:") ? productId : `product:${productId}`;
+ fetch(`${API}/api/inventory/${encodeURIComponent(id)}`)
+ .then(r => r.json())
+ .then(d => setInv(d))
+ .catch(() => {});
+ }, [productId]);
+
+ if (!inv) return null;
+
+ const { available, stockLevel } = inv;
+ const colors = {
+ high: { bg: "#C6F6D5", color: "#276749", label: `${available} in stock` },
+ low: { bg: "#FEFCBF", color: "#744210", label: `Only ${available} left!` },
+ critical: { bg: "#FED7D7", color: "#9B2C2C", label: `Last ${available}!` },
+ out: { bg: "#E2E8F0", color: "#718096", label: "Out of stock" },
+ };
+
+ const s = colors[stockLevel] || colors.out;
+
+ return (
+
+
+ {s.label}
+ · JSON.GET
+
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyMonitor.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyMonitor.jsx
new file mode 100644
index 0000000..f0c8291
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyMonitor.jsx
@@ -0,0 +1,228 @@
+import React, { useState } from "react";
+import { useValkey } from "../context/ValkeyContext";
+
+const FEATURE_ICONS = {
+ ShoppingCart: "ph-shopping-cart-simple",
+ Lock: "ph-lock-key",
+ Database: "ph-database",
+ Package: "ph-package",
+ Robot: "ph-robot",
+ MagnifyingGlass: "ph-magnifying-glass",
+ ChartBar: "ph-chart-bar",
+ TrendUp: "ph-trend-up",
+};
+
+const FEATURE_COLORS = {
+ "Cart Management": "#48BB78",
+ "Session Storage": "#4299E1",
+ "Product Catalog Cache": "#ED8936",
+ "Real-time Inventory": "#9F7AEA",
+ "AI Conversation Cache": "#F6AD55",
+ "Product Search": "#48BB78",
+ "User Affinity": "#4299E1",
+ "Trending Products": "#FC8181",
+};
+
+export default function ValkeyMonitor() {
+ const { valkeyStats, lastValkeyOp, cart } = useValkey();
+ const [open, setOpen] = useState(false);
+
+ if (!valkeyStats) return null;
+
+ const { activeFeatures, featureStats, usageCounters, usedMemory } = valkeyStats;
+
+ return (
+ <>
+ {/* Floating toggle button */}
+ setOpen(o => !o)}
+ style={{
+ position: "fixed",
+ bottom: 24,
+ right: 24,
+ zIndex: 9999,
+ background: "#38B2AC",
+ color: "#fff",
+ border: "none",
+ borderRadius: "50px",
+ padding: "12px 20px",
+ fontSize: 14,
+ fontWeight: 700,
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ gap: 8,
+ boxShadow: "0 4px 20px rgba(56,178,172,0.5)",
+ transition: "all 0.2s",
+ }}
+ title="Valkey Live Monitor"
+ >
+
+
+
+ Valkey Live
+
+
+
+ {/* Panel */}
+ {open && (
+
+ {/* Header */}
+
+
+
+
+
+ Valkey Live Monitor
+
+
+ Real-time view of Valkey operations
+
+
+
+
● CONNECTED
+
{usedMemory || "—"} used
+
+
+
+
+
+ {/* Last operation */}
+ {lastValkeyOp && (
+
+
+ Last Valkey Operation
+
+
{lastValkeyOp.op}
+
{lastValkeyOp.store}
+
+ )}
+
+ {/* Key counts */}
+
+ Active Keys by Domain
+
+
+ {[
+ { label: "Carts", value: featureStats.activeCarts, icon: "ph-shopping-cart-simple", color: "#48BB78" },
+ { label: "Sessions", value: featureStats.activeSessions, icon: "ph-lock-key", color: "#4299E1" },
+ { label: "Products", value: featureStats.cachedProducts, icon: "ph-database", color: "#ED8936" },
+ { label: "Coupons", value: featureStats.coupons, icon: "ph-tag", color: "#9F7AEA" },
+ { label: "AI Chats", value: featureStats.aiConversations, icon: "ph-robot", color: "#F6AD55" },
+ { label: "Trending", value: featureStats.trendingSets, icon: "ph-trend-up", color: "#FC8181" },
+ ].map(({ label, value, icon, color }) => (
+
+ ))}
+
+
+ {/* Current cart summary */}
+ {cart.itemCount > 0 && (
+
+
+ Your Cart (Valkey Hash)
+
+
+
+ {cart.itemCount} item{cart.itemCount !== 1 ? "s" : ""}
+
+
+ ₹{cart.subtotal?.toLocaleString("en-IN")}
+
+
+
+ HGETALL cart:{cart.userId?.slice(0, 20)}...
+
+
+ )}
+
+ {/* Active features */}
+
+ Valkey Features in Use
+
+
+ {(activeFeatures || []).map((f) => (
+
+
+
+
+ {f.name}
+
+ {f.active ? "● ACTIVE" : "○ idle"}
+
+
+
+ {f.key}
+
+
{f.description}
+
+
+ ))}
+
+
+ {/* Usage counters */}
+ {usageCounters && (
+
+
+ API Call Counters
+
+
+ {Object.entries(usageCounters).map(([key, val]) => (
+
+ {key.replace(/([A-Z])/g, ' $1').trim()}
+ {val}
+
+ ))}
+
+
+ )}
+
+
+ Valkey Bundle 9 · JSON · Search · Sorted Sets · Hashes · Strings
+
+
+
+ )}
+
+
+ >
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyProductGrid.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyProductGrid.jsx
new file mode 100644
index 0000000..a7d6b97
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyProductGrid.jsx
@@ -0,0 +1,282 @@
+import React, { useEffect, useState, useCallback } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=400&h=400&fit=crop&auto=format",
+};
+
+const FALLBACK_IMAGES = [
+ "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop&auto=format",
+ "https://images.unsplash.com/photo-1526170375885-4d8ecf77b99f?w=400&h=400&fit=crop&auto=format",
+ "https://images.unsplash.com/photo-1491553895911-0055eca6402d?w=400&h=400&fit=crop&auto=format",
+];
+
+function Toast({ message, onClose }) {
+ useEffect(() => {
+ const t = setTimeout(onClose, 2500);
+ return () => clearTimeout(t);
+ }, [onClose]);
+ return (
+
+
+ {message}
+
+ );
+}
+
+const ValkeyProductGrid = ({ categoryId }) => {
+ const { addToCart, loading, addToCompare, removeFromCompare, isInCompare } = useValkey();
+ const [products, setProducts] = useState([]);
+ const [fetching, setFetching] = useState(true);
+ const [toast, setToast] = useState(null);
+ const [adding, setAdding] = useState(null);
+
+ const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+ const fetchProducts = useCallback(async () => {
+ try {
+ const endpoint = categoryId ? `/api/products?category=${categoryId}` : "/api/products";
+ const res = await fetch(`${API}${endpoint}`);
+ const data = await res.json();
+ setProducts(data.products || data || []);
+ } catch (err) {
+ console.error("[ValkeyProductGrid] fetch error:", err);
+ } finally {
+ setFetching(false);
+ }
+ }, [API, categoryId]);
+
+ useEffect(() => { fetchProducts(); }, [fetchProducts]);
+
+ const handleAddToCart = async (product) => {
+ setAdding(product.id);
+ const result = await addToCart({
+ id: product.id,
+ name: product.name,
+ price: product.price,
+ images: product.images,
+ });
+ setAdding(null);
+ if (result) {
+ setToast(`${product.name} added to cart!`);
+ }
+ };
+
+ const getImage = (product) =>
+ PRODUCT_IMAGES[product.id] ||
+ product.images?.[0]?.url ||
+ FALLBACK_IMAGES[0];
+
+ const formatPrice = (price) => {
+ if (!price) return "₹0";
+ const amt = typeof price === "object" ? price.amount : price;
+ return `₹${Number(amt).toLocaleString("en-IN")}`;
+ };
+
+ const getStars = (rating) => {
+ const r = parseFloat(rating) || 4.5;
+ return Array.from({ length: 5 }, (_, i) => (
+
+ ));
+ };
+
+ if (fetching) {
+ return (
+
+
+
+
+ ⚡ Products from Valkey
+ JSON.GET · live data
+
+
+
+ {[...Array(6)].map((_, i) => (
+
+ ))}
+
+
+
+ );
+ }
+
+ return (
+ <>
+ {toast && setToast(null)} />}
+
+
+
+
+
+
+ ⚡ Products from Valkey
+
+ JSON.GET · live
+
+
+ View All →
+
+
+
+
+ {products.map((product, idx) => {
+ const img = getImage(product);
+ const price = formatPrice(product.price);
+ const oldPrice = product.price?.compareAt
+ ? formatPrice({ amount: product.price.compareAt })
+ : null;
+ const rating = product.ratings?.average || 4.5;
+ const ratingCount = product.ratings?.count || 0;
+ const inStock = (product.inventory?.quantity || 0) - (product.inventory?.reserved || 0) > 0;
+ const isAdding = adding === product.id;
+
+ return (
+
+
+ {/* Compare shuffle button */}
+
{
+ e.preventDefault();
+ e.stopPropagation();
+ const inComp = isInCompare(product.id);
+ if (inComp) {
+ await removeFromCompare(product.id);
+ setToast("Removed from comparison list");
+ } else {
+ const res = await addToCompare(product);
+ if (res && res.error === "comparison_limit_reached") {
+ setToast(res.message || "Comparison list full!");
+ } else {
+ setToast("Added to comparison list!");
+ }
+ }
+ }}
+ style={{
+ position: "absolute", top: 16, left: 16, zIndex: 2,
+ background: isInCompare(product.id) ? "#e6f9f1" : "#f8f9fa",
+ border: `1px solid ${isInCompare(product.id) ? "#00a86b" : "#e2e8f0"}`,
+ borderRadius: "50%", width: 32, height: 32,
+ display: "flex", alignItems: "center", justifyContent: "center",
+ cursor: "pointer", transition: "all 0.2s",
+ }}
+ title="Add to Compare"
+ >
+
+
+
+ {/* Add to Cart button */}
+
inStock && handleAddToCart(product)}
+ disabled={!inStock || isAdding || loading}
+ className="product-card__cart btn bg-main-50 text-main-600 hover-bg-main-600 hover-text-white py-11 px-24 rounded-pill flex-align gap-8 position-absolute inset-block-start-0 inset-inline-end-0 me-16 mt-16"
+ style={{
+ border: "none", cursor: inStock ? "pointer" : "not-allowed",
+ opacity: !inStock ? 0.5 : 1,
+ fontSize: 12,
+ }}
+ >
+ {isAdding ? (
+ <>Adding… >
+ ) : inStock ? (
+ <>Add >
+ ) : (
+ "Out of Stock"
+ )}
+
+
+ {/* Product image */}
+
+
{
+ e.target.src = FALLBACK_IMAGES[idx % FALLBACK_IMAGES.length];
+ }}
+ />
+
+
+
+ {/* Price */}
+
+ {oldPrice && (
+
+ {oldPrice}
+
+ )}
+
+ {price}
+
+
+
+ {/* Rating */}
+
+ {rating}
+
+ {getStars(rating)}
+
+ ({ratingCount.toLocaleString()})
+
+
+ {/* Name */}
+
+
+ {product.name}
+
+
+
+ {/* Brand */}
+
+
+
+
+ By {product.brand}
+
+
+ {/* Valkey badge */}
+
+ ⚡ HSET cart:{"{userId}"}
+
+
+
+
+ );
+ })}
+
+
+
+
+
+ >
+ );
+};
+
+export default ValkeyProductGrid;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyShopSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyShopSection.jsx
new file mode 100644
index 0000000..4b62595
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/ValkeyShopSection.jsx
@@ -0,0 +1,425 @@
+import React, { useState, useEffect, useCallback } from "react";
+import { Link, useSearchParams, useNavigate } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=400&h=400&fit=crop&auto=format",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=400&h=400&fit=crop&auto=format",
+};
+
+const CATEGORIES = [
+ { label: "All Products", value: "" },
+ { label: "Smartphones", value: "category:0192d4e2-3a7b-7e1f-8c4d-2b6a9f0e5d7c" },
+ { label: "Laptops", value: "category:0192d4e2-4c8d-7a2e-9f1b-3d5c7e8a0b4f" },
+ { label: "Audio", value: "category:0192d4e2-5d9e-7b3f-8a2c-4e6d1f9b0c5a" },
+ { label: "Footwear", value: "category:0192d4e3-8c2d-7e5f-9b3a-0d4c6e7f1a2b" },
+ { label: "Appliances", value: "category:0192d4e4-2b3c-7d4e-9f5a-6b7c8d9e0f1a" },
+ { label: "Fitness", value: "category:0192d4e5-6f7a-7b8c-9d9e-0f1a2b3c4d5e" },
+ { label: "Vegetables & Fruit", value: "category:vegetables-fruit" },
+ { label: "Beverages", value: "category:beverages" },
+ { label: "Meats & Seafood", value: "category:meats-seafood" },
+ { label: "Breakfast & Dairy", value: "category:breakfast-dairy" },
+ { label: "Frozen Foods", value: "category:frozen-foods" },
+ { label: "Biscuits & Snacks", value: "category:biscuits-snacks" },
+ { label: "Grocery & Staples", value: "category:grocery-staples" },
+];
+
+function ValkeyBadge({ cmd }) {
+ return (
+
+ ⚡ {cmd}
+
+ );
+}
+
+function Toast({ message, onClose }) {
+ useEffect(() => {
+ const t = setTimeout(onClose, 2500);
+ return () => clearTimeout(t);
+ }, [onClose]);
+ return (
+
+
+ {message}
+
+ );
+}
+
+const ValkeyShopSection = () => {
+ const [searchParams, setSearchParams] = useSearchParams();
+ const navigate = useNavigate();
+ const {
+ addToCart,
+ addToWishlist,
+ removeFromWishlist,
+ isInWishlist,
+ addToCompare,
+ removeFromCompare,
+ isInCompare,
+ } = useValkey();
+
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [searchInput, setSearchInput] = useState(searchParams.get("q") || "");
+ const [selectedCategory, setSelectedCategory] = useState(searchParams.get("category") || "");
+ const [sort, setSort] = useState("relevance");
+ const [valkeyOp, setValkeyOp] = useState(null);
+ const [total, setTotal] = useState(0);
+ const [toast, setToast] = useState(null);
+ const [suggestions, setSuggestions] = useState([]);
+ const [showSuggestions, setShowSuggestions] = useState(false);
+
+ const q = searchParams.get("q") || "";
+ const category = searchParams.get("category") || "";
+
+ useEffect(() => {
+ setSelectedCategory(searchParams.get("category") || "");
+ setSearchInput(searchParams.get("q") || "");
+ }, [searchParams]);
+
+ const fetchProducts = useCallback(async () => {
+ setLoading(true);
+ try {
+ const params = new URLSearchParams();
+ if (q) params.set("q", q);
+ if (category) params.set("category", category);
+ if (sort !== "relevance") params.set("sort", sort);
+
+ const endpoint = q ? `/api/search?${params}` : `/api/products?${params}`;
+ const res = await fetch(`${API}${endpoint}`);
+ const data = await res.json();
+
+ if (q) {
+ // FT.SEARCH results
+ const results = data.results || [];
+ const enriched = await Promise.all(results.map(async (r) => {
+ // results from search are partial; fetch full product for price/inventory
+ try {
+ const pr = await fetch(`${API}/api/products/${encodeURIComponent(r.id)}`);
+ const pd = await pr.json();
+ return pd.product || pd;
+ } catch {
+ return { id: r.id, name: r.name, brand: r.brand, price: { amount: parseFloat(r.price) || 0 } };
+ }
+ }));
+ setProducts(enriched);
+ setTotal(data.total || enriched.length);
+ setValkeyOp(data.valkeyOp || `FT.SEARCH idx:products "${q}"`);
+ } else {
+ setProducts(data.products || data || []);
+ setTotal((data.products || data || []).length);
+ setValkeyOp(data.valkeyOp || "JSON.GET (all products)");
+ }
+ } catch (err) {
+ console.error("[ValkeyShopSection]", err);
+ } finally {
+ setLoading(false);
+ }
+ }, [q, category, sort]);
+
+ useEffect(() => { fetchProducts(); }, [fetchProducts]);
+
+ // Autocomplete
+ useEffect(() => {
+ if (!searchInput || searchInput.length < 2) { setSuggestions([]); return; }
+ const t = setTimeout(async () => {
+ try {
+ const res = await fetch(`${API}/api/search/suggest?q=${encodeURIComponent(searchInput)}`);
+ const data = await res.json();
+ setSuggestions(data.suggestions || []);
+ } catch { setSuggestions([]); }
+ }, 300);
+ return () => clearTimeout(t);
+ }, [searchInput]);
+
+ const handleSearch = (e) => {
+ e.preventDefault();
+ const params = new URLSearchParams();
+ if (searchInput.trim()) params.set("q", searchInput.trim());
+ if (selectedCategory) params.set("category", selectedCategory);
+ setSearchParams(params);
+ setShowSuggestions(false);
+ };
+
+ const handleCartAdd = async (product) => {
+ const result = await addToCart(product);
+ if (result) setToast(`${product.name} added to cart!`);
+ };
+
+ const handleWishlist = async (product) => {
+ const inWl = isInWishlist(product.id);
+ if (inWl) {
+ await removeFromWishlist(product.id);
+ setToast("Removed from wishlist");
+ } else {
+ await addToWishlist(product);
+ setToast("Added to wishlist!");
+ }
+ };
+
+ const getImg = (product) =>
+ PRODUCT_IMAGES[product.id] || product.images?.[0]?.url || "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop";
+
+ const fmtPrice = (p) => {
+ const amt = typeof p === "object" ? p?.amount : p;
+ return `₹${Number(amt || 0).toLocaleString("en-IN")}`;
+ };
+
+ return (
+
+ {toast && setToast(null)} />}
+
+
+ {/* Search bar */}
+
+
+
+
+ Search Products
+ {valkeyOp && }
+
+
+
+
{ setSearchInput(e.target.value); setShowSuggestions(true); }}
+ onBlur={() => setTimeout(() => setShowSuggestions(false), 200)}
+ placeholder="Search by name, brand, or category…"
+ className="common-input py-12 ps-16 pe-44 rounded-pill w-100"
+ style={{ border: "1.5px solid #e2e8f0" }}
+ />
+ {showSuggestions && suggestions.length > 0 && (
+
+ {suggestions.map((s, i) => (
+
{
+ setSearchInput(s);
+ setShowSuggestions(false);
+ const params = new URLSearchParams();
+ params.set("q", s);
+ setSearchParams(params);
+ }}
+ >
+ {s}
+
+ ))}
+
+ )}
+
+ setSelectedCategory(e.target.value)}
+ className="common-input py-12 px-16 rounded-pill"
+ style={{ border: "1.5px solid #e2e8f0", minWidth: 160 }}
+ >
+ {CATEGORIES.map(c => (
+ {c.label}
+ ))}
+
+ setSort(e.target.value)}
+ className="common-input py-12 px-16 rounded-pill"
+ style={{ border: "1.5px solid #e2e8f0", minWidth: 140 }}
+ >
+ Relevance
+ Price: Low to High
+ Price: High to Low
+ Top Rated
+
+
+ Search
+
+ {(q || category) && (
+ { setSearchInput(""); setSelectedCategory(""); setSearchParams({}); }}
+ className="btn btn-outline-secondary rounded-pill px-16 py-12"
+ >
+ Clear
+
+ )}
+
+
+
+
+
+ {/* Results header */}
+
+
+
+ {loading ? "Searching Valkey…" : `${total} product${total !== 1 ? "s" : ""} found`}
+ {q && for "{q}" }
+
+ {valkeyOp && !loading && (
+
+ )}
+
+
+
+ {/* Products grid */}
+ {loading ? (
+
+ ) : products.length === 0 ? (
+
+
+
No products found{q ? ` for "${q}"` : ""}
+ { setSearchInput(""); setSearchParams({}); }} className="btn btn-main mt-16 rounded-pill px-24">
+ Show All Products
+
+
+ ) : (
+
+ {products.map((product, idx) => {
+ const img = getImg(product);
+ const available = (product.inventory?.quantity || 0) - (product.inventory?.reserved || 0);
+ const inWl = isInWishlist(product.id);
+
+ return (
+
+
+ {/* Wishlist heart */}
+
handleWishlist(product)}
+ style={{
+ position: "absolute", top: 12, right: 12, zIndex: 2,
+ background: inWl ? "#fff0f0" : "#f8f9fa",
+ border: `1px solid ${inWl ? "#fc8181" : "#e2e8f0"}`,
+ borderRadius: "50%", width: 36, height: 36,
+ display: "flex", alignItems: "center", justifyContent: "center",
+ cursor: "pointer", transition: "all 0.2s",
+ }}
+ >
+
+
+
+ {/* Compare shuffle button */}
+
{
+ const inComp = isInCompare(product.id);
+ if (inComp) {
+ await removeFromCompare(product.id);
+ setToast("Removed from comparison list");
+ } else {
+ const res = await addToCompare(product);
+ if (res && res.error === "comparison_limit_reached") {
+ setToast(res.message || "Comparison list full!");
+ } else {
+ setToast("Added to comparison list!");
+ }
+ }
+ }}
+ style={{
+ position: "absolute", top: 54, right: 12, zIndex: 2,
+ background: isInCompare(product.id) ? "#e6f9f1" : "#f8f9fa",
+ border: `1px solid ${isInCompare(product.id) ? "#00a86b" : "#e2e8f0"}`,
+ borderRadius: "50%", width: 36, height: 36,
+ display: "flex", alignItems: "center", justifyContent: "center",
+ cursor: "pointer", transition: "all 0.2s",
+ }}
+ title="Add to Compare"
+ >
+
+
+
+ {/* Product image — clicking goes to details */}
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop"; }}
+ />
+
+
+
+ {/* Price */}
+
+ {fmtPrice(product.price)}
+ {product.price?.compareAt && (
+ {fmtPrice({ amount: product.price.compareAt })}
+ )}
+
+
+ {/* Rating */}
+ {product.ratings && (
+
+ {product.ratings.average}
+
+ ({(product.ratings.count || 0).toLocaleString()})
+
+ )}
+
+ {/* Name */}
+
+
+ {product.name}
+
+
+
+ {/* Brand */}
+
By {product.brand}
+
+ {/* Stock badge */}
+
+
+ {available <= 0 ? "Out of stock" : available <= 10 ? `Only ${available} left` : "In stock"}
+
+
+
+ {/* Add to Cart */}
+
available > 0 && handleCartAdd(product)}
+ disabled={available <= 0}
+ className="btn bg-main-50 text-main-600 hover-bg-main-600 hover-text-white py-10 px-16 rounded-pill w-100 d-flex align-items-center justify-content-center gap-8"
+ style={{ border: "none", fontSize: 13, fontWeight: 600, opacity: available <= 0 ? 0.5 : 1 }}
+ >
+
+ Add to Cart
+
+
+
+
+
+ );
+ })}
+
+ )}
+
+
+ );
+};
+
+export default ValkeyShopSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwo.jsx
new file mode 100644
index 0000000..4550b05
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwo.jsx
@@ -0,0 +1,1494 @@
+import React, { useState } from "react";
+import { Link } from "react-router-dom";
+
+const VendorTwo = () => {
+ let [grid, setGrid] = useState(false);
+
+ let [active, setActive] = useState(false);
+ let sidebarController = () => {
+ setActive(!active);
+ };
+ return (
+
+
+
+ {/* Top Search */}
+
+
+
+
+
+
+
+
+
+ {" "}
+ 52 Results
+ Found
+
+
+ setGrid(false)}
+ type='button'
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl grid-btn border-gray-100 ${
+ grid === false && "border-main-600 text-white bg-main-600"
+ }`}
+ >
+
+
+ setGrid(true)}
+ type='button'
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl list-btn border-gray-100 ${
+ grid === true && "border-main-600 text-white bg-main-600"
+ }`}
+ >
+
+
+
+
+
+
+
+
+ {/* Top Search End */}
+
+
+
+
+
+
+
+
+
+ Product Category
+
+
+
+
+ Mobile & Accessories (12)
+
+
+
+
+ Laptop (12)
+
+
+
+
+ Electronics (12)
+
+
+
+
+ Smart Watch (12)
+
+
+
+
+ Storage (12)
+
+
+
+
+ Portable Devices (12)
+
+
+
+
+ Action Camera (12)
+
+
+
+
+ Smart Gadget (12)
+
+
+
+
+ Monitor (12)
+
+
+
+
+ Smart TV (12)
+
+
+
+
+ Camera (12)
+
+
+
+
+ Monitor Stand (12)
+
+
+
+
+ Headphone (12)
+
+
+
+
+
+
+ Filter by Rating
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
124
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
52
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
12
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2
+
+
+
+
+ Filter by Location
+
+
+
+ Country
+ Bangladesh
+ Pakistan
+ Vutan
+ Nepal
+
+
+
+ State
+
+ California
+ Washington
+ Florida
+ Texas
+
+
+ City
+ New York
+ San Francisco
+ Oklahoma City
+ Chicago
+
+
+
+
+
+
+
+
+ {/* Vendors Start */}
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ e-Mart Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ Baishakhi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ e-zone Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ Cloth & Fashion Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ New Market Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ Zeilla Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ Ever Green Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ Maple Shop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+
+
+
+
+ New Mart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
+
+
+
+
+
+
+
+
+
+ 6391 Elgin St. Celina, Delaware 10299
+
+
+
+
+
+
+ Visit Store
+
+ {" "}
+
+
+
+
+
+
+ {/* Vendors End */}
+ {/* Pagination Start */}
+
+
+
+
+
+
+
+
+ 01
+
+
+
+
+ 02
+
+
+
+
+ 03
+
+
+
+
+ 04
+
+
+
+
+ 05
+
+
+
+
+ 06
+
+
+
+
+ 07
+
+
+
+
+
+
+
+
+ {/* Pagination End */}
+
+
+
+
+ );
+};
+
+export default VendorTwo;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwoDetails.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwoDetails.jsx
new file mode 100644
index 0000000..c499818
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorTwoDetails.jsx
@@ -0,0 +1,1849 @@
+import React, { useState } from "react";
+import { Link } from "react-router-dom";
+
+const VendorTwoDetails = () => {
+ let [grid, setGrid] = useState(false);
+
+ let [active, setActive] = useState(false);
+ let sidebarController = () => {
+ setActive(!active);
+ };
+
+ return (
+
+
+
+
+ {/* Shop Sidebar Start */}
+
+
+
+
+
+
+
+
+
+
+
+
+ FOLLOW
+
+ {" "}
+
+
+
+
+ Chat Now
+
+ {" "}
+
+
+
+
+
+
+
+
+ Baishakhi Plus
+
+
+
+ 480589 Followers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
(12K)
+
+
+
+
+ About Store
+
+
+ Products
+
+
+ Return Policy
+
+
+ Shipping Policy
+
+
+ Contact Seller
+
+
+
+
+
+ Product Category
+
+
+
+
+ Mobile & Accessories (12)
+
+
+
+
+ Laptop (12)
+
+
+
+
+ Electronics (12)
+
+
+
+
+ Smart Watch (12)
+
+
+
+
+ Storage (12)
+
+
+
+
+ Portable Devices (12)
+
+
+
+
+ Action Camera (12)
+
+
+
+
+ Smart Gadget (12)
+
+
+
+
+ Monitor (12)
+
+
+
+
+ Smart TV (12)
+
+
+
+
+ Camera (12)
+
+
+
+
+ Monitor Stand (12)
+
+
+
+
+ Headphone (12)
+
+
+
+
+
+
+ Best Sell Products
+
+
+
+
+
+
+
+
+
+ Man Fashion Shoe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+
+
+
+ Woman Fashion Bag
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+
+
+
+ Woman Fashion Tops
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+
+
+
+ Woman Fashion Hat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+
+
+
+ Woman Fashion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+
+
+
+ Woman Fashion Bag
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.8
+
+
+ (12K)
+
+
+
$25
+
+
+
+
+
+
+ {/* Shop Sidebar End */}
+
+ {/* Inner Banner Start */}
+
+
+
+
+
+
Daily Offer
+ SALE 48% OFF
+
+ Shop Now
+
+
+
+
+
+
+
+
+ {/* Inner Banner End */}
+ {/* Search Filter Start */}
+
+
+
+
+
+
+
+
+
Showing 1-20 of 85 result
+
+ setGrid(true)}
+ type='button'
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl list-btn border-gray-100 ${
+ grid === true && "border-main-600 text-white bg-main-600"
+ }`}
+ >
+
+
+ setGrid(false)}
+ type='button'
+ className={`w-44 h-44 flex-center border rounded-6 text-2xl grid-btn border-gray-100 ${
+ grid === false && "border-main-600 text-white bg-main-600"
+ }`}
+ >
+
+
+
+
+
+ Sort by:
+
+
+ Latest
+ Old
+
+
+
+
+
+
+
+ {/* Search Filter End */}
+ {/* Products Start */}
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instax Mini 12 Instant Film Camera - Green
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Midnight Noir Leather Jacket
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Urban Rebel Combat Boots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+ -29%
+
+
+ HOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Velvet Blossom Dress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.8
+
+ (12K)
+
+
+
+ Fulfilled by Valkey
+
+
+
+ $28.99
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+
+ Add To Cart
+
+
+
+
+ {/* Products End */}
+
+
+
+
+ );
+};
+
+export default VendorTwoDetails;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsList.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsList.jsx
new file mode 100644
index 0000000..d26867f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsList.jsx
@@ -0,0 +1,623 @@
+import React from "react";
+import { Link } from "react-router-dom";
+
+const VendorsList = () => {
+ return (
+
+
+
+
+ Showing 1-20 of 85 results
+
+
+
+
+
+
+
+
+
+ Sort by:
+
+ Latest
+ Old
+
+
+
+
+
+
+
+
+
+
+
+ Organic Market
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Safeway
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Food Max
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HRmart
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lucky Supermarket
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Arico Farmer
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Farmer Market
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Foodsco
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Organic Market
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Safeway
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Food Max
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HRmart
+
+
+
+ Delivery by 6:15am
+
+
+ $5 off Snack & Candy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 01
+
+
+
+
+ 02
+
+
+
+
+ 03
+
+
+
+
+ 04
+
+
+
+
+ 05
+
+
+
+
+ 06
+
+
+
+
+ 07
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default VendorsList;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsListTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsListTwo.jsx
new file mode 100644
index 0000000..b7a40c6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/VendorsListTwo.jsx
@@ -0,0 +1,1646 @@
+import React, { useState } from "react";
+import { Link } from "react-router-dom";
+import ReactSlider from "react-slider";
+
+const VendorsListTwo = () => {
+ let [active, setActive] = useState(false);
+ let sidebarController = () => {
+ setActive(!active);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
Safeway
+
+ New Street, 520, New York
+
+
+ Since 2009
+
+
+ It's easy and free to link or sign up for our loyalty
+ program, and it only takes a few seconds.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contact Seller
+
+
+
+
+ Product Category
+
+
+
+
+ Mobile & Accessories (12)
+
+
+
+
+ Laptop (12)
+
+
+
+
+ Electronics (12)
+
+
+
+
+ Smart Watch (12)
+
+
+
+
+ Storage (12)
+
+
+
+
+ Portable Devices (12)
+
+
+
+
+ Action Camera (12)
+
+
+
+
+ Smart Gadget (12)
+
+
+
+
+ Monitor (12)
+
+
+
+
+ Smart TV (12)
+
+
+
+
+ Camera (12)
+
+
+
+
+ Monitor Stand (12)
+
+
+
+
+ Headphone (12)
+
+
+
+
+
+
+ Filter by Price
+
+
+
`Thumb value ${state.valueNow}`}
+ renderThumb={(props, state) => {
+ const { key, ...restProps } = props;
+ return (
+
+ {state.valueNow}
+
+ );
+ }}
+ pearling
+ minDistance={10}
+ />
+
+
+
+
+
+ Filter{" "}
+
+
+
+
+
+
+ Filter by Rating
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
124
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
52
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
12
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
+
+
+
+ {" "}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2
+
+
+
+
+ Fresh Vegetables
+
+
Up to 25% Off
+
+
+
+
+
+
+
+
+ {/* Top Search */}
+
+
+
+
+
+
+
+
+
+ Showing 1-20 of 85 results
+
+
+ Sort by:
+
+ Latest
+ Old
+
+
+
+
+
+
+
+ {/* Top Search End */}
+ {/* Products Start */}
+
+
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Marcel's Modern Pantry Almond Unsweetened
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ O Organics Milk, Whole, Vitamin D
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Sale
+
+
+
+
+
+
+
+ Whole Grains and Seeds Organic Bread
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lucerne Yogurt, Lowfat, Strawberry
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Good & Gather Farmed Atlantic Salmon
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Market Pantry 41/50 Raw Tail-Off Large Raw Shrimp
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Marcel's Modern Pantry Almond Unsweetened
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ O Organics Milk, Whole, Vitamin D
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Best Sale
+
+
+
+
+
+
+
+ Whole Grains and Seeds Organic Bread
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lucerne Yogurt, Lowfat, Strawberry
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+
+ C-500 Antioxidant Protect Dietary Supplement
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Good & Gather Farmed Atlantic Salmon
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+
+
+ Sale 50%
+
+
+
+
+
+
+
+ Market Pantry 41/50 Raw Tail-Off Large Raw Shrimp
+
+
+
+
+
+
+
+ By Lucky Supermarket
+
+
+
+
+
+ $14.99{" "}
+ /Qty {" "}
+
+
+ $28.99
+
+
+
+
+ 4.8
+
+
+
+
+
+ (17k)
+
+
+
+ Add To Cart
+
+
+
+
+
+
+ {/* Products End */}
+ {/* Pagination Start */}
+
+
+
+
+
+
+
+
+ 01
+
+
+
+
+ 02
+
+
+
+
+ 03
+
+
+
+
+ 04
+
+
+
+
+ 05
+
+
+
+
+ 06
+
+
+
+
+ 07
+
+
+
+
+
+
+
+
+ {/* Pagination End */}
+
+
+
+
+ );
+};
+
+export default VendorsListTwo;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/WhyBecomeSeller.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/WhyBecomeSeller.jsx
new file mode 100644
index 0000000..ac9461c
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/WhyBecomeSeller.jsx
@@ -0,0 +1,57 @@
+import React from "react";
+
+const WhyBecomeSeller = () => {
+ return (
+
+
+
+
Why become a seller on Valkey?
+
+ More than half the units sold in our stores from independent
+ sellers.
+
+
+
+
+
+
+
+
+
Free Shipping
+
+ Explore insightful content that keeps you ahead of the curve and
+ connected to the pulse of what'shappening.
+
+
+
+
+
+
+
+
+
Flexible Payment
+
+ Explore insightful content that keeps you ahead of the curve and
+ connected to the pulse of what'shappening.
+
+
+
+
+
+
+
+
+
Online Support
+
+ Explore insightful content that keeps you ahead of the curve and
+ connected to the pulse of what'shappening.
+
+
+
+
+
+
+ );
+};
+
+export default WhyBecomeSeller;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/components/WishListSection.jsx b/submissions/valkey-ecommerce-demo/frontend/src/components/WishListSection.jsx
new file mode 100644
index 0000000..74fcbdb
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/components/WishListSection.jsx
@@ -0,0 +1,201 @@
+import React, { useState, useEffect } from "react";
+import { Link } from "react-router-dom";
+import { useValkey } from "../context/ValkeyContext";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=200&h=200&fit=crop&auto=format",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=200&h=200&fit=crop&auto=format",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=200&h=200&fit=crop&auto=format",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=200&h=200&fit=crop&auto=format",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=200&h=200&fit=crop&auto=format",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=200&h=200&fit=crop&auto=format",
+};
+
+const WishListSection = () => {
+ const { wishlist, removeFromWishlist, addToCart, userId } = useValkey();
+ const [removing, setRemoving] = useState(null);
+ const [addingCart, setAddingCart] = useState(null);
+ const [toast, setToast] = useState(null);
+
+ useEffect(() => {
+ if (toast) {
+ const t = setTimeout(() => setToast(null), 2500);
+ return () => clearTimeout(t);
+ }
+ }, [toast]);
+
+ const handleRemove = async (productId) => {
+ setRemoving(productId);
+ await removeFromWishlist(productId);
+ setRemoving(null);
+ setToast("Removed from wishlist");
+ };
+
+ const handleAddToCart = async (item) => {
+ setAddingCart(item.productId);
+ await addToCart({
+ id: item.productId,
+ name: item.name,
+ price: { amount: item.price },
+ image: item.image,
+ });
+ setAddingCart(null);
+ setToast(`${item.name} added to cart!`);
+ };
+
+ const fmtPrice = (p) => `₹${Number(p || 0).toLocaleString("en-IN")}`;
+
+ const items = wishlist.items || [];
+
+ return (
+
+ {toast && (
+
+
+ {toast}
+
+ )}
+
+
+ {/* Valkey header */}
+
+
+ My Wishlist
+ ({items.length} items)
+
+
+ ⚡ HGETALL wishlist:{userId}
+
+
+
+ {items.length === 0 ? (
+
+
+
Your wishlist is empty
+
Browse products and click the heart icon to save them here.
+
+ Browse Products
+
+
+ ) : (
+
+
+
+
+
+
+
+ Remove
+ Product
+ Price
+ Valkey Op
+ Action
+
+
+
+ {items.map((item) => {
+ const img = PRODUCT_IMAGES[item.productId] || item.image;
+ return (
+
+ {/* Remove */}
+
+ handleRemove(item.productId)}
+ disabled={removing === item.productId}
+ className="d-flex align-items-center gap-8 text-gray-500 hover-text-danger-600"
+ style={{ background: "none", border: "none", cursor: "pointer", padding: 0 }}
+ >
+
+ {removing === item.productId ? "Removing…" : "Remove"}
+
+
+
+ {/* Product */}
+
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=200&h=200&fit=crop"; }}
+ />
+
+
+
+ {item.name}
+
+
Added {new Date(item.addedAt).toLocaleDateString()}
+
+
+
+
+ {/* Price */}
+
+ {fmtPrice(item.price)}
+
+
+ {/* Valkey Op */}
+
+
+ ⚡ HDEL wishlist:{userId}
+
+
+
+ {/* Add to cart */}
+
+ handleAddToCart(item)}
+ disabled={addingCart === item.productId}
+ className="btn btn-main rounded-pill px-16 py-8 text-sm d-flex align-items-center gap-8"
+ style={{ whiteSpace: "nowrap" }}
+ >
+
+ {addingCart === item.productId ? "Adding…" : "Add to Cart"}
+
+
+
+ );
+ })}
+
+
+
+
+
+
+ {/* Valkey info */}
+
+
+
⚡ Wishlist stored in Valkey Hash
+
+ Key: wishlist:{userId} · Commands: HSET (add) · HDEL (remove) · HGETALL (list)
+
+
+
+
+ )}
+
+
+ );
+};
+
+export default WishListSection;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/context/ValkeyContext.jsx b/submissions/valkey-ecommerce-demo/frontend/src/context/ValkeyContext.jsx
new file mode 100644
index 0000000..cc1650b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/context/ValkeyContext.jsx
@@ -0,0 +1,243 @@
+import React, { createContext, useContext, useState, useEffect, useCallback } from "react";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const ValkeyContext = createContext(null);
+
+export function ValkeyProvider({ children }) {
+ const [cart, setCart] = useState({ items: [], subtotal: 0, itemCount: 0 });
+ const [wishlist, setWishlist] = useState({ items: [], itemCount: 0 });
+ const [compare, setCompare] = useState({ items: [], itemCount: 0 });
+ const [session, setSession] = useState(null);
+ const [userId, setUserId] = useState("guest:demo");
+ const [valkeyStats, setValkeyStats] = useState(null);
+ const [lastValkeyOp, setLastValkeyOp] = useState(null);
+ const [loading, setLoading] = useState(false);
+
+ const apiFetch = useCallback(async (path, options = {}) => {
+ try {
+ const res = await fetch(`${API}${path}`, {
+ headers: {
+ "Content-Type": "application/json",
+ "X-User-Id": userId,
+ ...(session?.token ? { Authorization: `Bearer ${session.token}` } : {}),
+ ...(options.headers || {}),
+ },
+ ...options,
+ });
+ return await res.json();
+ } catch (err) {
+ console.error("[Valkey API]", path, err.message);
+ return null;
+ }
+ }, [userId, session]);
+
+ const refreshCart = useCallback(async () => {
+ const data = await apiFetch(`/api/cart?userId=${encodeURIComponent(userId)}`);
+ if (data) {
+ setCart(data);
+ if (data.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ }
+ }, [userId, apiFetch]);
+
+ const refreshWishlist = useCallback(async () => {
+ const data = await apiFetch(`/api/wishlist?userId=${encodeURIComponent(userId)}`);
+ if (data) {
+ setWishlist(data);
+ if (data.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ }
+ }, [userId, apiFetch]);
+
+ const refreshCompare = useCallback(async () => {
+ const data = await apiFetch(`/api/comparison?userId=${encodeURIComponent(userId)}`);
+ if (data) {
+ setCompare({ items: data.products || [], itemCount: data.count || 0 });
+ if (data.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ }
+ }, [userId, apiFetch]);
+
+ useEffect(() => { refreshCart(); }, [refreshCart]);
+ useEffect(() => { refreshWishlist(); }, [refreshWishlist]);
+ useEffect(() => { refreshCompare(); }, [refreshCompare]);
+
+ // Poll Valkey stats every 5s
+ useEffect(() => {
+ const fetchStats = async () => {
+ const data = await apiFetch("/api/valkey-stats");
+ if (data) setValkeyStats(data);
+ };
+ fetchStats();
+ const interval = setInterval(fetchStats, 5000);
+ return () => clearInterval(interval);
+ }, [apiFetch]);
+
+ const addToCart = async (product) => {
+ setLoading(true);
+ const data = await apiFetch("/api/cart/items", {
+ method: "POST",
+ body: JSON.stringify({
+ userId,
+ productId: product.id || product.productId,
+ name: product.name,
+ price: product.price?.amount || product.price,
+ image: product.images?.[0]?.url || product.image,
+ quantity: 1,
+ }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCart();
+ setLoading(false);
+ return data;
+ };
+
+ const removeFromCart = async (productId) => {
+ setLoading(true);
+ const data = await apiFetch(`/api/cart/items/${encodeURIComponent(productId)}?userId=${encodeURIComponent(userId)}`, {
+ method: "DELETE",
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCart();
+ setLoading(false);
+ };
+
+ const updateQuantity = async (productId, quantity) => {
+ if (quantity < 1) return removeFromCart(productId);
+ setLoading(true);
+ const data = await apiFetch(`/api/cart/items/${encodeURIComponent(productId)}`, {
+ method: "PATCH",
+ body: JSON.stringify({ userId, quantity }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCart();
+ setLoading(false);
+ };
+
+ const clearCart = async () => {
+ await apiFetch(`/api/cart?userId=${encodeURIComponent(userId)}`, { method: "DELETE" });
+ await refreshCart();
+ };
+
+ const applyCoupon = async (couponCode) => {
+ const data = await apiFetch("/api/cart/coupon", {
+ method: "POST",
+ body: JSON.stringify({ userId, couponCode, subtotal: cart.subtotal }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ return data;
+ };
+
+ const addToWishlist = async (product) => {
+ const data = await apiFetch("/api/wishlist/items", {
+ method: "POST",
+ body: JSON.stringify({
+ userId,
+ productId: product.id || product.productId,
+ name: product.name,
+ price: product.price?.amount || product.price,
+ image: product.images?.[0]?.url || product.image,
+ }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshWishlist();
+ return data;
+ };
+
+ const removeFromWishlist = async (productId) => {
+ const data = await apiFetch(`/api/wishlist/items/${encodeURIComponent(productId)}?userId=${encodeURIComponent(userId)}`, {
+ method: "DELETE",
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshWishlist();
+ };
+
+ const isInWishlist = (productId) => {
+ return wishlist.items?.some(item => item.productId === productId);
+ };
+
+ const addToCompare = async (product) => {
+ setLoading(true);
+ const productId = product.id || product.productId;
+ const data = await apiFetch("/api/comparison/add", {
+ method: "POST",
+ body: JSON.stringify({ userId, productId }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCompare();
+ setLoading(false);
+ return data;
+ };
+
+ const removeFromCompare = async (productId) => {
+ setLoading(true);
+ const data = await apiFetch("/api/comparison/remove", {
+ method: "DELETE",
+ body: JSON.stringify({ userId, productId }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCompare();
+ setLoading(false);
+ return data;
+ };
+
+ const clearCompare = async () => {
+ setLoading(true);
+ const data = await apiFetch("/api/comparison", {
+ method: "DELETE",
+ body: JSON.stringify({ userId }),
+ });
+ if (data?.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ await refreshCompare();
+ setLoading(false);
+ };
+
+ const isInCompare = (productId) => {
+ const pid = productId?.id || productId;
+ return compare.items?.some(item => (item.id === pid || item.productId === pid));
+ };
+
+ const login = async (email, password) => {
+ const data = await apiFetch("/api/auth/login", {
+ method: "POST",
+ body: JSON.stringify({ email, password }),
+ });
+ if (data?.token) {
+ setSession(data);
+ setUserId(data.userId);
+ if (data.valkeyOp) setLastValkeyOp({ op: data.valkeyOp, store: data.storedIn });
+ }
+ return data;
+ };
+
+ const logout = async () => {
+ if (session?.token) {
+ await apiFetch("/api/auth/logout", { method: "POST" });
+ }
+ setSession(null);
+ setUserId("guest:demo");
+ };
+
+ const trackView = async (productId, categoryId) => {
+ apiFetch("/api/ai/track-view", {
+ method: "POST",
+ body: JSON.stringify({ userId, productId, categoryId }),
+ });
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useValkey() {
+ const ctx = useContext(ValkeyContext);
+ if (!ctx) throw new Error("useValkey must be used inside ValkeyProvider");
+ return ctx;
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/Animation.jsx b/submissions/valkey-ecommerce-demo/frontend/src/helper/Animation.jsx
new file mode 100644
index 0000000..0d30f4a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/Animation.jsx
@@ -0,0 +1,23 @@
+
+import Aos from "aos";
+import { useEffect } from "react";
+import ScrollToTop from "react-scroll-to-top";
+
+const Animation = () => {
+ useEffect(() => {
+ Aos.init({
+ offset: 0,
+ easing: "ease",
+ once: true,
+ duration: 1200,
+ });
+ Aos.refresh();
+ }, []);
+ return (
+ <>
+
+ >
+ );
+};
+
+export default Animation;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/ColorInit.jsx b/submissions/valkey-ecommerce-demo/frontend/src/helper/ColorInit.jsx
new file mode 100644
index 0000000..5e623b6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/ColorInit.jsx
@@ -0,0 +1,17 @@
+import { useEffect } from 'react'
+
+const ColorInit = ({ color }) => {
+ useEffect(() => {
+ if (color === true) {
+ // localStorage.setItem('theme', 'color-two');
+ document.documentElement.classList.add('color-two');
+ } else {
+ document.documentElement.classList.remove('color-two');
+ }
+ }, [color]);
+ return (
+ null
+ )
+}
+
+export default ColorInit
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/Countdown.js b/submissions/valkey-ecommerce-demo/frontend/src/helper/Countdown.js
new file mode 100644
index 0000000..13a5633
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/Countdown.js
@@ -0,0 +1,29 @@
+// Countdown Timer Function
+function countdown(targetDate) {
+ const now = new Date().getTime(); // Get current time in milliseconds
+ const timeLeft = targetDate.getTime() - now; // Calculate time difference
+
+ if (timeLeft > 0) {
+ // Calculate time components
+ const days = Math.floor(timeLeft / (1000 * 60 * 60 * 24));
+ const hours = Math.floor(
+ (timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
+ );
+ const minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));
+ const seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);
+
+ // Return countdown values
+ return { days, hours, minutes, seconds };
+ } else {
+ // If countdown ends, return zeroes
+ return { days: 0, hours: 0, minutes: 0, seconds: 0 };
+ }
+}
+
+// Target date
+const targetDate = new Date("2025-12-31T00:00:00"); // Set your target date here
+
+// Export the function to get the current countdown
+export function getCountdown() {
+ return countdown(targetDate);
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/PhosphorIconInit.js b/submissions/valkey-ecommerce-demo/frontend/src/helper/PhosphorIconInit.js
new file mode 100644
index 0000000..7eabb35
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/PhosphorIconInit.js
@@ -0,0 +1,19 @@
+
+import { useEffect } from "react";
+export default function PhosphorIconInit() {
+
+ useEffect(() => {
+ var head = document.getElementsByTagName("head")[0];
+
+ for (const weight of ["regular", "thin", "light", "bold", "fill", "duotone"]) {
+ var link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.type = "text/css";
+ link.href =
+ "https://unpkg.com/@phosphor-icons/web@2.1.1/src/" + weight + "/style.css";
+ head.appendChild(link);
+ }
+ }, [])
+
+ return null
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/Preloader.jsx b/submissions/valkey-ecommerce-demo/frontend/src/helper/Preloader.jsx
new file mode 100644
index 0000000..6733049
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/Preloader.jsx
@@ -0,0 +1,23 @@
+import { useEffect, useState } from "react";
+
+const Preloader = () => {
+ let [active, setActive] = useState(true);
+ useEffect(() => {
+ setTimeout(function () {
+ setActive(false);
+ }, 500);
+ }, []);
+
+ return (
+ <>
+ {active ? (
+
+
+
+
+ ) : (
)}
+ >
+ );
+};
+
+export default Preloader;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/QuantityControl.jsx b/submissions/valkey-ecommerce-demo/frontend/src/helper/QuantityControl.jsx
new file mode 100644
index 0000000..3532785
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/QuantityControl.jsx
@@ -0,0 +1,36 @@
+import React, { useState } from 'react';
+
+const QuantityControl = ({ initialQuantity = 1 }) => {
+ const [quantity, setQuantity] = useState(initialQuantity);
+
+ const incrementQuantity = () => setQuantity(quantity + 1);
+ const decrementQuantity = () => setQuantity(quantity > 1 ? quantity - 1 : quantity);
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default QuantityControl;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/helper/RouteScrollToTop.jsx b/submissions/valkey-ecommerce-demo/frontend/src/helper/RouteScrollToTop.jsx
new file mode 100644
index 0000000..ac1c849
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/helper/RouteScrollToTop.jsx
@@ -0,0 +1,16 @@
+
+import { useEffect } from 'react';
+import { useLocation } from 'react-router-dom';
+
+
+const RouteScrollToTop = () => {
+ const pathname = useLocation()
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ }, [pathname]);
+
+ return null;
+};
+
+export default RouteScrollToTop;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/index.js b/submissions/valkey-ecommerce-demo/frontend/src/index.js
new file mode 100644
index 0000000..7ee60ba
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/index.js
@@ -0,0 +1,16 @@
+import React from "react";
+import ReactDOM from "react-dom/client";
+import "bootstrap/dist/js/bootstrap.bundle.min";
+import 'select2/dist/js/select2.min.js';
+import App from "./App";
+import reportWebVitals from "./reportWebVitals";
+import "./index.scss";
+
+const root = ReactDOM.createRoot(document.getElementById("root"));
+root.render(
+ <>
+
+ >
+);
+
+reportWebVitals();
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/index.scss b/submissions/valkey-ecommerce-demo/frontend/src/index.scss
new file mode 100644
index 0000000..7791010
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/index.scss
@@ -0,0 +1,6 @@
+// Plugin CSS
+@import "~animate.css";
+@import "slick-carousel/slick/slick.css";
+@import "slick-carousel/slick/slick-theme.css";
+@import 'select2/dist/css/select2.min.css';
+@import "/public/assets/sass/main.scss";
\ No newline at end of file
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/AccountPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/AccountPage.jsx
new file mode 100644
index 0000000..df3ca06
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/AccountPage.jsx
@@ -0,0 +1,52 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ShippingOne from "../components/ShippingOne";
+import Account from "../components/Account";
+import ScrollToTop from "react-scroll-to-top";
+import ColorInit from "../helper/ColorInit";
+
+
+const AccountPage = () => {
+
+
+
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* Account */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default AccountPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/AdminPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/AdminPage.jsx
new file mode 100644
index 0000000..8913a44
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/AdminPage.jsx
@@ -0,0 +1,1075 @@
+import React, { useState, useEffect, useCallback } from "react";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+const ADMIN_TOKEN = "admin-valkey-demo";
+
+const PRODUCT_IMAGES = {
+ "Galaxy Ultra Pro": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=60&h=60&fit=crop",
+ "Dell XPS 15": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=60&h=60&fit=crop",
+ "Nike Air Max": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=60&h=60&fit=crop",
+ "Instant Pot": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=60&h=60&fit=crop",
+ "Sony WF-1000XM5": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=60&h=60&fit=crop",
+ "Adidas Yoga Mat": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=60&h=60&fit=crop",
+ "iPhone 15 Pro": "https://images.unsplash.com/photo-1694819488591-a43907d1c5cc?w=60&h=60&fit=crop",
+ "MacBook Air M3": "https://images.unsplash.com/photo-1517336714731-489689fd1ca8?w=60&h=60&fit=crop",
+ "OnePlus 12": "https://images.unsplash.com/photo-1598327105666-5b89351aff97?w=60&h=60&fit=crop",
+ "Bose QC45": "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=60&h=60&fit=crop",
+ "Apple Watch": "https://images.unsplash.com/photo-1551816230-ef5deaed4a26?w=60&h=60&fit=crop",
+ "Dyson V11": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=60&h=60&fit=crop",
+ "Levi's Jeans": "https://images.unsplash.com/photo-1542272604-787c3835535d?w=60&h=60&fit=crop",
+ "Ray-Ban": "https://images.unsplash.com/photo-1511499767150-a48a237f0083?w=60&h=60&fit=crop",
+ "JBL Charge 5": "https://images.unsplash.com/photo-1608043152269-423dbba4e7e1?w=60&h=60&fit=crop",
+ "HP Spectre": "https://images.unsplash.com/photo-1496181133206-80ce9b88a853?w=60&h=60&fit=crop",
+ "Fitbit": "https://images.unsplash.com/photo-1575311373937-040b8e1fd5b6?w=60&h=60&fit=crop",
+ "iRobot Roomba": "https://images.unsplash.com/photo-1558618047-3c8c76ca7d13?w=60&h=60&fit=crop",
+};
+
+const FALLBACK_IMAGE = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=60&h=60&fit=crop";
+
+function getProductImage(name) {
+ if (!name) return FALLBACK_IMAGE;
+ for (const key of Object.keys(PRODUCT_IMAGES)) {
+ if (name.toLowerCase().includes(key.toLowerCase()) || key.toLowerCase().includes(name.toLowerCase())) {
+ return PRODUCT_IMAGES[key];
+ }
+ }
+ return FALLBACK_IMAGE;
+}
+
+// ── Styles ──────────────────────────────────────────────────────────────────
+
+const SIDEBAR_W = 240;
+const TEAL = "#38b2ac";
+const DARK = "#1a202c";
+const VALKEY_GREEN = "#00a86b";
+const VALKEY_GREEN_BG = "#e6f9f1";
+
+const styles = {
+ layout: { display: "flex", minHeight: "100vh", fontFamily: "'Inter', 'Segoe UI', sans-serif", background: "#f7fafc" },
+ sidebar: {
+ width: SIDEBAR_W, minWidth: SIDEBAR_W, background: DARK, color: "#fff",
+ display: "flex", flexDirection: "column", position: "fixed", top: 0, left: 0,
+ height: "100vh", overflowY: "auto", zIndex: 100,
+ },
+ sidebarLogo: {
+ padding: "24px 20px 16px", borderBottom: "1px solid rgba(255,255,255,0.08)",
+ fontSize: 20, fontWeight: 700, letterSpacing: -0.5, color: TEAL,
+ },
+ sidebarNav: { padding: "12px 0", flex: 1 },
+ navItem: (active) => ({
+ display: "flex", alignItems: "center", gap: 10, padding: "10px 20px",
+ cursor: "pointer", color: active ? "#fff" : "rgba(255,255,255,0.6)",
+ background: active ? TEAL : "transparent",
+ borderLeft: active ? `3px solid #fff` : "3px solid transparent",
+ fontSize: 14, fontWeight: active ? 600 : 400,
+ transition: "all 0.15s",
+ userSelect: "none",
+ }),
+ sidebarFooter: {
+ padding: "16px 20px", borderTop: "1px solid rgba(255,255,255,0.08)",
+ fontSize: 11, color: "rgba(255,255,255,0.35)", lineHeight: 1.5,
+ },
+ main: { marginLeft: SIDEBAR_W, flex: 1, display: "flex", flexDirection: "column", minHeight: "100vh" },
+ header: {
+ background: "#fff", borderBottom: "1px solid #e2e8f0", padding: "16px 28px",
+ display: "flex", alignItems: "center", justifyContent: "space-between",
+ position: "sticky", top: 0, zIndex: 50, boxShadow: "0 1px 4px rgba(0,0,0,0.05)",
+ },
+ headerTitle: { fontSize: 20, fontWeight: 700, color: "#1a202c", margin: 0 },
+ headerSub: { fontSize: 12, color: "#718096", marginTop: 2 },
+ content: { padding: "28px", flex: 1 },
+ card: {
+ background: "#fff", border: "1px solid #e2e8f0", borderRadius: 10,
+ boxShadow: "0 1px 6px rgba(0,0,0,0.05)", padding: "20px",
+ },
+ statCard: {
+ background: "#fff", border: "1px solid #e2e8f0", borderRadius: 10,
+ boxShadow: "0 1px 6px rgba(0,0,0,0.05)", padding: "20px 24px",
+ display: "flex", flexDirection: "column", gap: 8,
+ },
+ statValue: { fontSize: 32, fontWeight: 700, color: "#1a202c", lineHeight: 1 },
+ statLabel: { fontSize: 13, color: "#718096", fontWeight: 500 },
+ valkeyBadge: {
+ display: "inline-block", fontFamily: "monospace", fontSize: 10, fontWeight: 600,
+ color: VALKEY_GREEN, background: VALKEY_GREEN_BG, borderRadius: 4,
+ padding: "2px 6px", marginTop: 4,
+ },
+ badge: (color, bg) => ({
+ display: "inline-block", fontSize: 11, fontWeight: 600, borderRadius: 4,
+ padding: "2px 8px", color, background: bg,
+ }),
+ table: { width: "100%", borderCollapse: "collapse", fontSize: 13 },
+ th: {
+ textAlign: "left", padding: "10px 14px", background: "#f7fafc",
+ color: "#4a5568", fontWeight: 600, fontSize: 12, textTransform: "uppercase",
+ letterSpacing: 0.4, borderBottom: "2px solid #e2e8f0",
+ },
+ td: { padding: "10px 14px", borderBottom: "1px solid #f0f4f8", color: "#2d3748", verticalAlign: "middle" },
+ btn: (color = TEAL, outline = false) => ({
+ background: outline ? "transparent" : color, color: outline ? color : "#fff",
+ border: `1px solid ${color}`, borderRadius: 6, padding: "5px 14px",
+ fontSize: 12, fontWeight: 600, cursor: "pointer",
+ display: "inline-flex", alignItems: "center", gap: 5,
+ transition: "all 0.15s",
+ }),
+ input: {
+ border: "1px solid #e2e8f0", borderRadius: 6, padding: "5px 10px",
+ fontSize: 13, color: "#2d3748", outline: "none", width: "80px",
+ },
+ spinner: {
+ display: "inline-block", width: 18, height: 18, border: "2px solid #e2e8f0",
+ borderTopColor: TEAL, borderRadius: "50%", animation: "spin 0.7s linear infinite",
+ },
+ alertBanner: {
+ background: "#fff5f5", border: "1px solid #fed7d7", borderRadius: 8,
+ padding: "12px 16px", marginBottom: 16, display: "flex", alignItems: "center", gap: 10,
+ color: "#c53030", fontSize: 13, fontWeight: 500,
+ },
+ modalOverlay: {
+ position: "fixed", inset: 0, background: "rgba(0,0,0,0.5)", zIndex: 200,
+ display: "flex", alignItems: "center", justifyContent: "center",
+ },
+ modal: {
+ background: "#fff", borderRadius: 12, padding: "28px 32px", width: 480,
+ maxWidth: "95vw", boxShadow: "0 20px 60px rgba(0,0,0,0.2)",
+ },
+};
+
+// ── Helpers ──────────────────────────────────────────────────────────────────
+
+function Spinner() {
+ return
;
+}
+
+function ValkeyBadge({ cmd }) {
+ return {cmd} ;
+}
+
+function adminFetch(path, options = {}) {
+ return fetch(`${API}${path}`, {
+ headers: {
+ "Content-Type": "application/json",
+ "X-Admin-Token": ADMIN_TOKEN,
+ ...(options.headers || {}),
+ },
+ ...options,
+ }).then(r => r.json()).catch(err => { console.error(err); return null; });
+}
+
+// ── Tab: Dashboard ────────────────────────────────────────────────────────────
+
+const STAT_DEFS = [
+ { key: "totalProducts", label: "Total Products", icon: "ph-package", color: "#4299e1", cmd: "KEYS product:*" },
+ { key: "activeUsers", label: "Active Users", icon: "ph-users", color: "#48bb78", cmd: "SMEMBERS active_users" },
+ { key: "activeCarts", label: "Active Carts", icon: "ph-shopping-cart", color: "#ed8936", cmd: "KEYS cart:*" },
+ { key: "estimatedRevenue", label: "Est. Revenue", icon: "ph-currency-dollar", color: "#9f7aea", cmd: "ZRANGE trending 0 -1 WITHSCORES", format: v => `$${Number(v || 0).toFixed(2)}` },
+ { key: "lowStockItems", label: "Low Stock Items", icon: "ph-warning", color: "#f56565", cmd: "JSON.GET product:* $.inventory" },
+ { key: "activeSessions", label: "Active Sessions", icon: "ph-lightning", color: "#38b2ac", cmd: "KEYS session:*" },
+];
+
+function DashboardTab() {
+ const [stats, setStats] = useState(null);
+ const [analytics, setAnalytics] = useState(null);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ setLoading(true);
+ Promise.all([
+ adminFetch("/api/admin/stats"),
+ adminFetch("/api/analytics"),
+ ]).then(([s, a]) => {
+ setStats(s);
+ setAnalytics(a);
+ setLoading(false);
+ });
+ }, []);
+
+ const merged = {
+ totalProducts: stats?.totalProducts ?? analytics?.totalProducts ?? "—",
+ activeUsers: stats?.activeUsers ?? analytics?.activeUsers ?? "—",
+ activeCarts: stats?.activeCarts ?? analytics?.activeCarts ?? "—",
+ estimatedRevenue: stats?.estimatedRevenue ?? analytics?.estimatedRevenue ?? 0,
+ lowStockItems: stats?.lowStockItems ?? analytics?.lowStockItems ?? "—",
+ activeSessions: stats?.activeSessions ?? analytics?.activeSessions ?? "—",
+ };
+
+ return (
+
+
Dashboard Overview
+ {loading ? (
+
Loading stats…
+ ) : (
+
+ {STAT_DEFS.map(def => {
+ const raw = merged[def.key];
+ const value = def.format ? def.format(raw) : (raw ?? "—");
+ return (
+
+
+ {def.label}
+
+
+
{value}
+
+
+ );
+ })}
+
+ )}
+
+ {analytics?.trendingProducts?.length > 0 && (
+
+
+
+ Trending Products
+
+
+
+ {analytics.trendingProducts.slice(0, 5).map((p, i) => {
+ const maxScore = analytics.trendingProducts[0]?.score || 1;
+ const pct = Math.round(((p.score || 1) / maxScore) * 100);
+ return (
+
+
#{i + 1}
+
{p.name}
+
+
{p.score}
+
+ );
+ })}
+
+
+ )}
+
+ );
+}
+
+// ── Tab: Products ─────────────────────────────────────────────────────────────
+
+function ProductsTab() {
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [editRow, setEditRow] = useState(null);
+ const [editVals, setEditVals] = useState({});
+ const [showModal, setShowModal] = useState(false);
+ const [newProduct, setNewProduct] = useState({ name: "", brand: "", price: "", description: "", category: "electronics", stock: "" });
+ const [saving, setSaving] = useState(false);
+ const [toast, setToast] = useState(null);
+
+ const fetchProducts = useCallback(async () => {
+ setLoading(true);
+ const data = await adminFetch("/api/products");
+ setProducts(Array.isArray(data) ? data : (data?.products || []));
+ setLoading(false);
+ }, []);
+
+ useEffect(() => { fetchProducts(); }, [fetchProducts]);
+
+ function showToast(msg, ok = true) {
+ setToast({ msg, ok });
+ setTimeout(() => setToast(null), 2500);
+ }
+
+ async function saveEdit(p) {
+ setSaving(true);
+ const productId = p.productId || p.id;
+ await adminFetch(`/api/admin/inventory/${productId}`, {
+ method: "PATCH",
+ body: JSON.stringify({
+ price: Number(editVals.price),
+ quantity: Number(editVals.stock),
+ }),
+ });
+ setSaving(false);
+ setEditRow(null);
+ showToast("Product updated");
+ fetchProducts();
+ }
+
+ async function addProduct() {
+ setSaving(true);
+ await adminFetch("/api/products", {
+ method: "POST",
+ body: JSON.stringify({
+ name: newProduct.name,
+ brand: newProduct.brand,
+ price: { amount: Number(newProduct.price), currency: "USD" },
+ description: newProduct.description,
+ category: newProduct.category,
+ inventory: { quantity: Number(newProduct.stock), reserved: 0, warehouse: "WH-001" },
+ }),
+ });
+ setSaving(false);
+ setShowModal(false);
+ setNewProduct({ name: "", brand: "", price: "", description: "", category: "electronics", stock: "" });
+ showToast("Product added");
+ fetchProducts();
+ }
+
+ const getPrice = (p) => {
+ if (typeof p.price === "object") return p.price?.amount ?? 0;
+ return p.price ?? 0;
+ };
+ const getStock = (p) => p.inventory?.quantity ?? p.stock ?? 0;
+ const getStatus = (p) => getStock(p) > 20 ? "In Stock" : getStock(p) > 0 ? "Low Stock" : "Out of Stock";
+ const getStatusColor = (p) => {
+ const s = getStatus(p);
+ if (s === "In Stock") return ["#276749", "#c6f6d5"];
+ if (s === "Low Stock") return ["#744210", "#fefcbf"];
+ return ["#742a2a", "#fff5f5"];
+ };
+
+ return (
+
+
+
Products
+ setShowModal(true)}>
+ Add Product
+
+
+
+ {toast && (
+
+ {toast.msg}
+
+ )}
+
+ {loading ? (
+
Loading products…
+ ) : (
+
+
+
+
+ {["Image", "Name / ID", "Brand", "Category", "Price", "Stock", "Status", "Actions"].map(h => (
+ {h}
+ ))}
+
+
+
+ {products.map((p, i) => {
+ const productId = p.productId || p.id;
+ const isEditing = editRow === productId;
+ const [sc, sbg] = getStatusColor(p);
+ return (
+
+
+ { e.target.src = FALLBACK_IMAGE; }} />
+
+
+ {p.name}
+ {productId}
+
+ {p.brand || "—"}
+ {p.category || "—"}
+
+ {isEditing ? (
+ setEditVals(v => ({ ...v, price: e.target.value }))} />
+ ) : (
+ ${Number(getPrice(p)).toFixed(2)}
+ )}
+
+
+ {isEditing ? (
+ setEditVals(v => ({ ...v, stock: e.target.value }))} />
+ ) : (
+ {getStock(p)}
+ )}
+
+
+ {getStatus(p)}
+
+
+ {isEditing ? (
+
+ saveEdit(p)} disabled={saving}>
+ {saving ? : <> Save>}
+
+ setEditRow(null)}>Cancel
+
+ ) : (
+ {
+ setEditRow(productId);
+ setEditVals({ price: getPrice(p), stock: getStock(p) });
+ }}>
+ Edit
+
+ )}
+
+
+ );
+ })}
+
+
+ {products.length === 0 && (
+
No products found.
+ )}
+
+ )}
+
+ {/* Add Product Modal */}
+ {showModal && (
+
setShowModal(false)}>
+
e.stopPropagation()}>
+
Add New Product
+ {[
+ { label: "Name", key: "name", type: "text" },
+ { label: "Brand", key: "brand", type: "text" },
+ { label: "Price (USD)", key: "price", type: "number" },
+ { label: "Initial Stock", key: "stock", type: "number" },
+ ].map(f => (
+
+ {f.label}
+ setNewProduct(v => ({ ...v, [f.key]: e.target.value }))} />
+
+ ))}
+
+ Category
+ setNewProduct(v => ({ ...v, category: e.target.value }))}>
+ {["electronics", "shoes", "kitchen", "audio", "fitness", "clothing", "appliances"].map(c => (
+ {c.charAt(0).toUpperCase() + c.slice(1)}
+ ))}
+
+
+
+ Description
+ setNewProduct(v => ({ ...v, description: e.target.value }))} />
+
+
+ setShowModal(false)}>Cancel
+
+ {saving ? : "Add Product"}
+
+
+
+
+ )}
+
+ );
+}
+
+// ── Tab: Inventory ────────────────────────────────────────────────────────────
+
+function InventoryTab() {
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [stockEdits, setStockEdits] = useState({});
+ const [saving, setSaving] = useState(null);
+ const [toast, setToast] = useState(null);
+
+ const fetchProducts = useCallback(async () => {
+ setLoading(true);
+ const data = await adminFetch("/api/products");
+ setProducts(Array.isArray(data) ? data : (data?.products || []));
+ setLoading(false);
+ }, []);
+
+ useEffect(() => { fetchProducts(); }, [fetchProducts]);
+
+ function showToast(msg) { setToast(msg); setTimeout(() => setToast(null), 2500); }
+
+ async function updateStock(p) {
+ const productId = p.productId || p.id;
+ const qty = Number(stockEdits[productId]);
+ if (isNaN(qty)) return;
+ setSaving(productId);
+ await adminFetch(`/api/admin/inventory/${productId}`, {
+ method: "PATCH",
+ body: JSON.stringify({ quantity: qty }),
+ });
+ setSaving(null);
+ showToast(`Stock updated for ${p.name}`);
+ fetchProducts();
+ }
+
+ const getQty = (p) => p.inventory?.quantity ?? p.stock ?? 0;
+ const getReserved = (p) => p.inventory?.reserved ?? 0;
+ const getAvailable = (p) => getQty(p) - getReserved(p);
+ const getWarehouse = (p) => p.inventory?.warehouse ?? "WH-001";
+
+ const availColor = (avail) => {
+ if (avail > 20) return ["#276749", "#c6f6d5"];
+ if (avail >= 5) return ["#744210", "#fefcbf"];
+ return ["#742a2a", "#fff5f5"];
+ };
+
+ const lowStockItems = products.filter(p => getAvailable(p) < 10);
+
+ return (
+
+
Inventory Management
+
+ {lowStockItems.length > 0 && (
+
+
+ {lowStockItems.length} item{lowStockItems.length > 1 ? "s" : ""} with low stock
+ ({lowStockItems.map(p => p.name).join(", ")}) — restock soon!
+
+ )}
+
+ {toast && (
+
+ {toast}
+
+ )}
+
+ {loading ? (
+
Loading inventory…
+ ) : (
+
+
+
+
+ {["Product", "Stock (Total)", "Reserved", "Available", "Warehouse", "Valkey Key", "Update Stock"].map(h => (
+ {h}
+ ))}
+
+
+
+ {products.map((p, i) => {
+ const productId = p.productId || p.id;
+ const avail = getAvailable(p);
+ const [ac, abg] = availColor(avail);
+ return (
+
+
+ {p.name}
+ {productId}
+
+ {getQty(p)}
+ {getReserved(p)}
+
+ {avail}
+
+ {getWarehouse(p)}
+
+ {`JSON.GET ${productId || "product:?"}`}
+
+ {`JSON.NUMINCRBY ${productId || "product:?"} $.inventory.quantity`}
+
+
+
+
+ setStockEdits(v => ({ ...v, [productId]: e.target.value }))} />
+ updateStock(p)} disabled={saving === productId}>
+ {saving === productId ? : <> Save>}
+
+
+
+
+ );
+ })}
+
+
+
+ )}
+
+ );
+}
+
+// ── Tab: Users ────────────────────────────────────────────────────────────────
+
+function UsersTab() {
+ const [users, setUsers] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [deleting, setDeleting] = useState(null);
+ const [toast, setToast] = useState(null);
+
+ const fetchUsers = useCallback(async () => {
+ setLoading(true);
+ const data = await adminFetch("/api/admin/users");
+ setUsers(Array.isArray(data) ? data : (data?.users || []));
+ setLoading(false);
+ }, []);
+
+ useEffect(() => { fetchUsers(); }, [fetchUsers]);
+
+ function showToast(msg, ok = true) { setToast({ msg, ok }); setTimeout(() => setToast(null), 2500); }
+
+ async function deleteUser(userId) {
+ if (!window.confirm(`Delete user ${userId}? This cannot be undone.`)) return;
+ setDeleting(userId);
+ await adminFetch(`/api/admin/users/${encodeURIComponent(userId)}`, { method: "DELETE" });
+ setDeleting(null);
+ showToast(`User ${userId} deleted`);
+ fetchUsers();
+ }
+
+ const getStatus = (u) => u.sessionActive ? "active" : (u.lastSeen ? "idle" : "unknown");
+
+ return (
+
+
Users
+
+ {toast && (
+
+ {toast.msg}
+
+ )}
+
+ {loading ? (
+
Loading users…
+ ) : (
+
+
+
+
+ {["Name", "Email / ID", "Role", "Joined", "Session", "Valkey Key", "Actions"].map(h => (
+ {h}
+ ))}
+
+
+
+ {users.length === 0 && (
+ No users found.
+ )}
+ {users.map((u, i) => {
+ const status = getStatus(u);
+ const [sc, sbg] = status === "active" ? ["#276749", "#c6f6d5"] : ["#718096", "#edf2f7"];
+ const joined = u.createdAt ? new Date(u.createdAt).toLocaleDateString() : "—";
+ return (
+
+ {u.name || u.displayName || "—"}
+
+ {u.email || "—"}
+ {u.userId || u.id}
+
+ {u.role || "user"}
+ {joined}
+ {status}
+
+ {`JSON.GET ${u.userId || u.id || "user:?"}`}
+
+
+ deleteUser(u.userId || u.id)} disabled={deleting === (u.userId || u.id)}>
+ {deleting === (u.userId || u.id) ? : <> Delete>}
+
+
+
+ );
+ })}
+
+
+
+ )}
+
+ );
+}
+
+// ── Tab: Orders/Carts ─────────────────────────────────────────────────────────
+
+function OrdersTab() {
+ const [carts, setCarts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [expanded, setExpanded] = useState(null);
+
+ useEffect(() => {
+ setLoading(true);
+ adminFetch("/api/admin/orders").then(data => {
+ setCarts(Array.isArray(data) ? data : (data?.carts || data?.orders || []));
+ setLoading(false);
+ });
+ }, []);
+
+ const truncateId = (id = "") => id.length > 16 ? id.slice(0, 8) + "…" + id.slice(-6) : id;
+
+ return (
+
+
Active Carts / Orders
+ {loading ? (
+
Loading orders…
+ ) : (
+
+
+
+
+ {["User ID", "Items", "Est. Total", "Last Updated", "Valkey Key", ""].map(h => (
+ {h}
+ ))}
+
+
+
+ {carts.length === 0 && (
+ No active carts.
+ )}
+ {carts.map((c, i) => {
+ const userId = c.userId || c.user || "—";
+ const items = c.items || [];
+ const total = c.subtotal ?? c.total ?? items.reduce((acc, it) => acc + (it.price || 0) * (it.quantity || 1), 0);
+ const updated = c.updatedAt ? new Date(c.updatedAt).toLocaleString() : "—";
+ const cartKey = `cart:${userId}`;
+ const isOpen = expanded === i;
+ return (
+
+
+
+ {truncateId(userId)}
+
+ {c.itemCount ?? items.length}
+ ${Number(total).toFixed(2)}
+ {updated}
+ {cartKey}
+
+ {items.length > 0 && (
+ setExpanded(isOpen ? null : i)}>
+
+ {isOpen ? "Collapse" : "View Items"}
+
+ )}
+
+
+ {isOpen && (
+
+
+
+
Cart Items
+
+
+
+ Product
+ Price
+ Qty
+ Subtotal
+
+
+
+ {items.map((it, j) => (
+
+ {it.name || it.productId}
+ ${Number(it.price || 0).toFixed(2)}
+ {it.quantity || 1}
+ ${(Number(it.price || 0) * (it.quantity || 1)).toFixed(2)}
+
+ ))}
+
+
+
+
+
+ )}
+
+ );
+ })}
+
+
+
+ )}
+
+ );
+}
+
+// ── Tab: Analytics ────────────────────────────────────────────────────────────
+
+function AnalyticsTab() {
+ const [analytics, setAnalytics] = useState(null);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ setLoading(true);
+ adminFetch("/api/analytics").then(data => {
+ setAnalytics(data);
+ setLoading(false);
+ });
+ }, []);
+
+ if (loading) return Loading analytics…
;
+ if (!analytics) return No analytics data available.
;
+
+ const trending = analytics.trendingProducts || [];
+ const maxScore = trending[0]?.score || 1;
+ const categories = analytics.categoryDistribution || analytics.categories || [];
+ const maxCatCount = Math.max(...categories.map(c => c.count || c.productCount || 0), 1);
+
+ return (
+
+
Analytics
+
+ {/* Metrics row */}
+
+ {[
+ { label: "Total Products", value: analytics.totalProducts, icon: "ph-package", color: "#4299e1" },
+ { label: "Active Users", value: analytics.activeUsers, icon: "ph-users", color: "#48bb78" },
+ { label: "Active Carts", value: analytics.activeCarts, icon: "ph-shopping-cart", color: "#ed8936" },
+ { label: "Sessions", value: analytics.activeSessions, icon: "ph-lightning", color: "#38b2ac" },
+ { label: "Wishlists", value: analytics.totalWishlists, icon: "ph-heart", color: "#f56565" },
+ { label: "Trending Sets", value: trending.length, icon: "ph-fire", color: "#9f7aea" },
+ ].map(m => (
+
+
+
{m.value ?? "—"}
+
{m.label}
+
+ ))}
+
+
+
+ {/* Trending products bar chart */}
+
+
+ Trending Products
+
+
+ {trending.slice(0, 10).map((p, i) => {
+ const pct = Math.round(((p.score || 1) / maxScore) * 100);
+ return (
+
+
+ #{i + 1} {p.name}
+ {p.score}
+
+
+
+ );
+ })}
+ {trending.length === 0 &&
No trending data yet.
}
+
+
+ {/* Category distribution */}
+
+
+ Category Distribution
+
+ {categories.map((c, i) => {
+ const count = c.count || c.productCount || 0;
+ const pct = Math.round((count / maxCatCount) * 100);
+ const colors = [TEAL, "#4299e1", "#48bb78", "#ed8936", "#9f7aea", "#f56565"];
+ return (
+
+
+ {c.category || c.name}
+ {count}
+
+
+
+ );
+ })}
+ {categories.length === 0 &&
No category data.
}
+
+
+
+ );
+}
+
+// ── Tab: Settings ─────────────────────────────────────────────────────────────
+
+function SettingsTab() {
+ const [reseeding, setReseeding] = useState(false);
+ const [reseedMsg, setReseedMsg] = useState(null);
+ const [showToken, setShowToken] = useState(false);
+ const [valkeyStats, setValkeyStats] = useState(null);
+
+ useEffect(() => {
+ adminFetch("/api/valkey-stats").then(d => setValkeyStats(d));
+ }, []);
+
+ async function reseedDatabase() {
+ if (!window.confirm("Reseed the database? This will reset all demo data.")) return;
+ setReseeding(true);
+ const data = await adminFetch("/api/admin/reseed", { method: "POST" });
+ setReseeding(false);
+ setReseedMsg(data?.message || data?.status || "Database reseeded successfully.");
+ setTimeout(() => setReseedMsg(null), 4000);
+ }
+
+ const masked = "admin-valkey-" + "*".repeat(4);
+
+ return (
+
+
Settings
+
+
+ {/* Admin Key */}
+
+
+ Admin Authentication
+
+
+
Admin Token (Header)
+
+
+ {showToken ? `X-Admin-Token: ${ADMIN_TOKEN}` : `X-Admin-Token: ${masked}`}
+
+ setShowToken(v => !v)}>
+
+
+
+
+
Used in all /api/admin/* requests
+
+
+ {/* Valkey connection */}
+
+
+ Valkey Connection
+
+ {valkeyStats ? (
+
+ {[
+ { label: "Status", value: valkeyStats.status || "connected" },
+ { label: "Host", value: valkeyStats.host || "localhost" },
+ { label: "Port", value: valkeyStats.port || "6379" },
+ { label: "Version", value: valkeyStats.version || "7.x" },
+ { label: "Keys", value: valkeyStats.totalKeys || valkeyStats.keys || "—" },
+ ].map(row => (
+
+ {row.label}
+
+ {String(row.value)}
+
+
+ ))}
+
+ ) : (
+
Loading…
+ )}
+
+
+ {/* Database actions */}
+
+
+ Database Actions
+
+ {reseedMsg && (
+
+ {reseedMsg}
+
+ )}
+
+
+
+ {reseeding ? : <> Reseed Database>}
+
+
+ Calls POST /api/admin/reseed — reloads demo product catalog into Valkey.
+
+
+
+
+
+ {/* Cache info */}
+
+
+ Cache Management
+
+
+
To flush all cache keys, run in Valkey CLI:
+
+ FLUSHDB
+
+
+
+
To clear only product cache:
+
+ {"DEL $(KEYS product:*)"}
+
+
+
+
+
+ );
+}
+
+// ── Sidebar Nav config ────────────────────────────────────────────────────────
+
+const TABS = [
+ { id: "dashboard", label: "Dashboard", icon: "ph-squares-four" },
+ { id: "products", label: "Products", icon: "ph-package" },
+ { id: "inventory", label: "Inventory", icon: "ph-warehouse" },
+ { id: "users", label: "Users", icon: "ph-users" },
+ { id: "orders", label: "Orders / Carts", icon: "ph-shopping-cart" },
+ { id: "analytics", label: "Analytics", icon: "ph-chart-bar" },
+ { id: "settings", label: "Settings", icon: "ph-gear" },
+];
+
+// ── Main AdminPage ─────────────────────────────────────────────────────────────
+
+export default function AdminPage() {
+ const [activeTab, setActiveTab] = useState("dashboard");
+
+ const tabLabel = TABS.find(t => t.id === activeTab)?.label || "Dashboard";
+
+ function renderTab() {
+ switch (activeTab) {
+ case "dashboard": return ;
+ case "products": return ;
+ case "inventory": return ;
+ case "users": return ;
+ case "orders": return ;
+ case "analytics": return ;
+ case "settings": return ;
+ default: return ;
+ }
+ }
+
+ return (
+ <>
+
+
+ {/* Sidebar */}
+
+
+ {/* Main area */}
+
+ {/* Header */}
+
+
+
{tabLabel}
+
Valkey Admin Dashboard
+
+
+
+
+ {/* Tab content */}
+
+ {renderTab()}
+
+
+
+ >
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/AnalyticsPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/AnalyticsPage.jsx
new file mode 100644
index 0000000..6b9ee03
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/AnalyticsPage.jsx
@@ -0,0 +1,404 @@
+import React, { useState, useEffect, useCallback } from "react";
+import HeaderTwo from "../components/HeaderTwo";
+import FooterTwo from "../components/FooterTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+const VALKEY_GREEN = "#00a86b";
+const VALKEY_GREEN_BG = "#e6f9f1";
+const TEAL = "#38b2ac";
+
+const PRODUCT_IMAGES = {
+ "Galaxy Ultra Pro": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=48&h=48&fit=crop",
+ "Dell XPS 15": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=48&h=48&fit=crop",
+ "Nike Air Max": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=48&h=48&fit=crop",
+ "Instant Pot": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=48&h=48&fit=crop",
+ "Sony WF-1000XM5": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=48&h=48&fit=crop",
+ "Adidas Yoga Mat": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=48&h=48&fit=crop",
+ "iPhone 15 Pro": "https://images.unsplash.com/photo-1694819488591-a43907d1c5cc?w=48&h=48&fit=crop",
+ "MacBook Air M3": "https://images.unsplash.com/photo-1517336714731-489689fd1ca8?w=48&h=48&fit=crop",
+ "OnePlus 12": "https://images.unsplash.com/photo-1598327105666-5b89351aff97?w=48&h=48&fit=crop",
+ "Bose QC45": "https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=48&h=48&fit=crop",
+ "Apple Watch": "https://images.unsplash.com/photo-1551816230-ef5deaed4a26?w=48&h=48&fit=crop",
+ "Dyson V11": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=48&h=48&fit=crop",
+ "Levi's Jeans": "https://images.unsplash.com/photo-1542272604-787c3835535d?w=48&h=48&fit=crop",
+ "Ray-Ban": "https://images.unsplash.com/photo-1511499767150-a48a237f0083?w=48&h=48&fit=crop",
+ "JBL Charge 5": "https://images.unsplash.com/photo-1608043152269-423dbba4e7e1?w=48&h=48&fit=crop",
+ "HP Spectre": "https://images.unsplash.com/photo-1496181133206-80ce9b88a853?w=48&h=48&fit=crop",
+ "Fitbit": "https://images.unsplash.com/photo-1575311373937-040b8e1fd5b6?w=48&h=48&fit=crop",
+ "iRobot Roomba": "https://images.unsplash.com/photo-1558618047-3c8c76ca7d13?w=48&h=48&fit=crop",
+};
+const FALLBACK_IMAGE = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=48&h=48&fit=crop";
+
+function getProductImage(name) {
+ if (!name) return FALLBACK_IMAGE;
+ for (const key of Object.keys(PRODUCT_IMAGES)) {
+ if (name.toLowerCase().includes(key.toLowerCase()) || key.toLowerCase().includes(name.toLowerCase())) {
+ return PRODUCT_IMAGES[key];
+ }
+ }
+ return FALLBACK_IMAGE;
+}
+
+function Spinner() {
+ return (
+
+ );
+}
+
+function ValkeyBadge({ cmd }) {
+ return (
+
+ {cmd}
+
+ );
+}
+
+const VALKEY_FEATURES = [
+ { name: "JSON Storage", description: "Products, carts, user profiles stored as JSON documents", cmd: "JSON.SET / JSON.GET", icon: "ph-brackets-curly", color: "#4299e1" },
+ { name: "Sorted Sets (Trending)", description: "Real-time product popularity ranking by view score", cmd: "ZADD / ZREVRANGE", icon: "ph-chart-line-up", color: "#48bb78" },
+ { name: "Session Management", description: "User sessions stored with TTL expiry", cmd: "SET / GET / EXPIRE", icon: "ph-lightning", color: TEAL },
+ { name: "Cart Operations", description: "Atomic cart updates with JSON path operations", cmd: "JSON.NUMINCRBY", icon: "ph-shopping-cart", color: "#ed8936" },
+ { name: "Wishlist Sets", description: "User wishlists as JSON arrays", cmd: "JSON.ARRAPPEND", icon: "ph-heart", color: "#f56565" },
+ { name: "Inventory Tracking", description: "Real-time stock reservations with atomic updates", cmd: "JSON.NUMINCRBY", icon: "ph-warehouse", color: "#9f7aea" },
+ { name: "Search (FT.SEARCH)", description: "Full-text product search with filters", cmd: "FT.SEARCH idx:products", icon: "ph-magnifying-glass", color: "#718096" },
+ { name: "TTL / Expiry", description: "Auto-expiring sessions and cache entries", cmd: "EXPIRE / TTL", icon: "ph-timer", color: "#b7791f" },
+];
+
+function apiFetch(path) {
+ return fetch(`${API}${path}`, {
+ headers: { "Content-Type": "application/json" },
+ }).then(r => r.json()).catch(() => null);
+}
+
+export default function AnalyticsPage() {
+ const [analytics, setAnalytics] = useState(null);
+ const [valkeyStats, setValkeyStats] = useState(null);
+ const [products, setProducts] = useState([]);
+ const [loading, setLoading] = useState(true);
+
+ const fetchAll = useCallback(async () => {
+ setLoading(true);
+ const [a, vs, prods] = await Promise.all([
+ apiFetch("/api/analytics"),
+ apiFetch("/api/valkey-stats"),
+ apiFetch("/api/products"),
+ ]);
+ setAnalytics(a);
+ setValkeyStats(vs);
+ setProducts(Array.isArray(prods) ? prods : (prods?.products || []));
+ setLoading(false);
+ }, []);
+
+ useEffect(() => { fetchAll(); }, [fetchAll]);
+
+ const trending = analytics?.trendingProducts || [];
+ const maxScore = trending[0]?.score || 1;
+ const categories = analytics?.categoryDistribution || analytics?.categories || [];
+ const maxCatCount = Math.max(...categories.map(c => c.count || c.productCount || 0), 1);
+
+ const metricCards = [
+ { label: "Total Products", value: analytics?.totalProducts ?? products.length, icon: "ph-package", color: "#4299e1", cmd: "KEYS product:*" },
+ { label: "Active Users", value: analytics?.activeUsers, icon: "ph-users", color: "#48bb78", cmd: "SMEMBERS active_users" },
+ { label: "Active Carts", value: analytics?.activeCarts, icon: "ph-shopping-cart", color: "#ed8936", cmd: "KEYS cart:*" },
+ { label: "Active Sessions", value: analytics?.activeSessions, icon: "ph-lightning", color: TEAL, cmd: "KEYS session:*" },
+ { label: "Wishlists", value: analytics?.totalWishlists, icon: "ph-heart", color: "#f56565", cmd: "KEYS wishlist:*" },
+ { label: "Trending Items", value: trending.length, icon: "ph-fire", color: "#9f7aea", cmd: "ZCARD trending" },
+ ];
+
+ const getStock = (p) => p.inventory?.quantity ?? p.stock ?? 0;
+ const getReserved = (p) => p.inventory?.reserved ?? 0;
+ const getAvailable = (p) => getStock(p) - getReserved(p);
+
+ const stockColor = (avail) => {
+ if (avail > 20) return { color: "#276749", bg: "#c6f6d5", label: "Healthy" };
+ if (avail >= 5) return { color: "#744210", bg: "#fefcbf", label: "Low" };
+ return { color: "#742a2a", bg: "#fff5f5", label: "Critical" };
+ };
+
+ const CHART_COLORS = [TEAL, "#4299e1", "#48bb78", "#ed8936", "#9f7aea", "#f56565", "#b7791f", "#718096"];
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ {loading ? (
+
+
+
Loading analytics from Valkey…
+
+ ) : (
+ <>
+ {/* ── Section 1: Key Metrics ──────────────────────────────────── */}
+
+
+
+
+ Key Metrics
+
+
+
+
+ {metricCards.map(m => (
+
+
+ {m.label}
+
+
+
{m.value ?? "—"}
+
{m.cmd}
+
+ ))}
+
+
+
+ {/* ── Section 2: Trending Products ────────────────────────────── */}
+
+
+
+
+ Trending Products
+
+
+
+
+ {trending.length === 0 ? (
+
+ No trending data yet. Products gain score as users view them.
+
+ ) : (
+ trending.slice(0, 10).map((p, i) => {
+ const pct = Math.round(((p.score || 1) / maxScore) * 100);
+ return (
+
+
+ {i + 1}
+
+
{ e.target.src = FALLBACK_IMAGE; }}
+ />
+
+
+
+ );
+ })
+ )}
+
+
+
+ {/* ── Section 3: Inventory Health ─────────────────────────────── */}
+
+
+
+
+ Inventory Health
+
+
+
+
+ {/* Low stock alert */}
+ {products.filter(p => getAvailable(p) < 5).length > 0 && (
+
+
+ {products.filter(p => getAvailable(p) < 5).length} item(s) critically low — immediate restock recommended.
+
+ )}
+
+
+
+
+
+ {["Product", "Category", "Total Stock", "Reserved", "Available", "Health"].map(h => (
+ {h}
+ ))}
+
+
+
+ {products.length === 0 && (
+ No products loaded.
+ )}
+ {products.map((p, i) => {
+ const avail = getAvailable(p);
+ const sc = stockColor(avail);
+ return (
+
+
+
+
{ e.target.src = FALLBACK_IMAGE; }} />
+
{p.name}
+
+
+ {p.category || "—"}
+ {getStock(p)}
+ {getReserved(p)}
+
+ {avail}
+
+
+
+
+
20 ? "#48bb78" : avail >= 5 ? "#ed8936" : "#f56565",
+ transition: "width 0.5s",
+ }} />
+
+
{sc.label}
+
+
+
+ );
+ })}
+
+
+
+
+
+ {/* ── Section 4: Feature Usage ────────────────────────────────── */}
+
+
+
+
+ Valkey Feature Usage
+
+
+
+
+ {VALKEY_FEATURES.map((f, i) => {
+ const counter = valkeyStats?.featureUsage?.[f.name] ?? valkeyStats?.ops?.[f.cmd] ?? "active";
+ return (
+
+
+
+
+
+
+ {f.name}
+
+ {typeof counter === "number" ? counter.toLocaleString() : "✓ active"}
+
+
+
{f.description}
+
{f.cmd}
+
+
+ );
+ })}
+
+
+
+ {/* Category Distribution chart */}
+ {categories.length > 0 && (
+
+
+
+
+ Category Distribution
+
+
+
+
+ {categories.map((c, i) => {
+ const count = c.count || c.productCount || 0;
+ const pct = Math.round((count / maxCatCount) * 100);
+ const color = CHART_COLORS[i % CHART_COLORS.length];
+ return (
+
+
+
+ {c.category || c.name}
+
+ {count} products
+
+
+
+ );
+ })}
+
+
+
+ )}
+
+ {/* Valkey connection info footer */}
+ {valkeyStats && (
+
+
⚡ Valkey Connection
+ {[
+ { label: "Status", value: valkeyStats.status || "connected" },
+ { label: "Host", value: valkeyStats.host || "localhost:6379" },
+ { label: "Keys", value: valkeyStats.totalKeys ?? valkeyStats.keys ?? "—" },
+ { label: "Version", value: valkeyStats.version || "7.x" },
+ ].map(r => (
+
+
{r.label}
+
{String(r.value)}
+
+ ))}
+
+ )}
+ >
+ )}
+
+
+
+
+ >
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/BecomeSellerPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/BecomeSellerPage.jsx
new file mode 100644
index 0000000..d9e1aff
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/BecomeSellerPage.jsx
@@ -0,0 +1,63 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import BreadcrumbImage from "../components/BreadcrumbImage";
+import WhyBecomeSeller from "../components/WhyBecomeSeller";
+import CounterSection from "../components/CounterSection";
+import StepsSection from "../components/StepsSection";
+import TestimonialOne from "../components/TestimonialOne";
+import ShippingOne from "../components/ShippingOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+
+const BecomeSellerPage = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* BreadcrumbImage */}
+
+
+ {/* WhyBecomeSeller */}
+
+
+ {/* CounterSection */}
+
+
+ {/* StepsSection */}
+
+
+ {/* TestimonialOne */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default BecomeSellerPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogDetailsPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogDetailsPage.jsx
new file mode 100644
index 0000000..5296ec6
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogDetailsPage.jsx
@@ -0,0 +1,44 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ShippingOne from "../components/ShippingOne";
+import BlogDetails from "../components/BlogDetails";
+import ScrollToTop from "react-scroll-to-top";
+const BlogDetailsPage = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* BlogDetails */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default BlogDetailsPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogPage.jsx
new file mode 100644
index 0000000..43dc821
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/BlogPage.jsx
@@ -0,0 +1,51 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ShippingOne from "../components/ShippingOne";
+import Blog from "../components/Blog";
+import ScrollToTop from "react-scroll-to-top";
+
+
+const BlogPage = () => {
+
+
+
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* Blog */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default BlogPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/CartPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/CartPage.jsx
new file mode 100644
index 0000000..3719c6f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/CartPage.jsx
@@ -0,0 +1,52 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import CartSection from "../components/CartSection";
+import ValkeyCartSection from "../components/ValkeyCartSection";
+import ShippingOne from "../components/ShippingOne";
+import ScrollToTop from "react-scroll-to-top";
+
+
+const CartPage = () => {
+
+
+
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* ValkeyCartSection – live cart backed by Valkey Hash */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default CartPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/CheckoutPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/CheckoutPage.jsx
new file mode 100644
index 0000000..be3ed3b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/CheckoutPage.jsx
@@ -0,0 +1,51 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ShippingOne from "../components/ShippingOne";
+import Checkout from "../components/Checkout";
+import ScrollToTop from "react-scroll-to-top";
+
+
+const CheckoutPage = () => {
+
+
+
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* Checkout */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default CheckoutPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ComparisonPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ComparisonPage.jsx
new file mode 100644
index 0000000..c6ba280
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ComparisonPage.jsx
@@ -0,0 +1,26 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import ComparisonSection from "../components/ComparisonSection";
+import ShippingOne from "../components/ShippingOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+
+export default function ComparisonPage() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ContactPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ContactPage.jsx
new file mode 100644
index 0000000..306f016
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ContactPage.jsx
@@ -0,0 +1,44 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ShippingOne from "../components/ShippingOne";
+import Contact from "../components/Contact";
+import ScrollToTop from "react-scroll-to-top";
+const ContactPage = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* Contact */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default ContactPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageOne.jsx
new file mode 100644
index 0000000..eec082a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageOne.jsx
@@ -0,0 +1,109 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import HeaderOne from "../components/HeaderOne";
+import BannerOne from "../components/BannerOne";
+import FeatureOne from "../components/FeatureOne";
+import PromotionalOne from "../components/PromotionalOne";
+import FlashSalesOne from "../components/FlashSalesOne";
+import ValkeyProductGrid from "../components/ValkeyProductGrid";
+import RecommendationsSection from "../components/RecommendationsSection";
+import OfferOne from "../components/OfferOne";
+import RecommendedOne from "../components/RecommendedOne";
+import HotDealsOne from "../components/HotDealsOne";
+import TopVendorsOne from "../components/TopVendorsOne";
+import BestSellsOne from "../components/BestSellsOne";
+import DeliveryOne from "../components/DeliveryOne";
+import OrganicOne from "../components/OrganicOne";
+import ShortProductOne from "../components/ShortProductOne";
+import BrandOne from "../components/BrandOne";
+import NewArrivalOne from "../components/NewArrivalOne";
+import ShippingOne from "../components/ShippingOne";
+import NewsletterOne from "../components/NewsletterOne";
+import FooterOne from "../components/FooterOne";
+import BottomFooter from "../components/BottomFooter";
+import ScrollToTop from "react-scroll-to-top";
+import ColorInit from "../helper/ColorInit";
+const HomePageOne = () => {
+
+ return (
+
+ <>
+
+ {/* Preloader */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* ColorInit */}
+
+
+ {/* HeaderOne */}
+
+
+ {/* BannerOne */}
+
+
+ {/* FeatureOne */}
+
+
+ {/* PromotionalOne */}
+
+
+ {/* FlashSalesOne */}
+
+
+ {/* ValkeyProductGrid — live products from Valkey JSON */}
+
+
+ {/* Real-time Recommendations & Trending Products powered by Valkey sorted sets */}
+
+
+ {/* OfferOne */}
+
+
+ {/* RecommendedOne */}
+
+
+ {/* HotDealsOne */}
+
+
+ {/* TopVendorsOne */}
+
+
+ {/* BestSellsOne */}
+
+
+ {/* DeliveryOne */}
+
+
+ {/* OrganicOne */}
+
+
+ {/* ShortProductOne */}
+
+
+ {/* BrandOne */}
+
+
+ {/* NewArrivalOne */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* NewsletterOne */}
+
+
+ {/* FooterOne */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default HomePageOne;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageThree.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageThree.jsx
new file mode 100644
index 0000000..603935f
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageThree.jsx
@@ -0,0 +1,85 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import HeaderThree from "../components/HeaderThree";
+import BannerThree from "../components/BannerThree";
+import PromotionalThree from "../components/PromotionalThree";
+import FeatureThree from "../components/FeatureThree";
+import TextSlider from "../components/TextSlider";
+import TrendingThree from "../components/TrendingThree";
+import DiscountThree from "../components/DiscountThree";
+import NewArrivalThree from "../components/NewArrivalThree";
+import DealsSection from "../components/DealsSection";
+import PopularProductsThree from "../components/PopularProductsThree";
+import BrandThree from "../components/BrandThree";
+import ShippingThree from "../components/ShippingThree";
+import TestimonialOne from "../components/TestimonialOne";
+import InstagramSection from "../components/InstagramSection";
+import NewsletterThree from "../components/NewsletterThree";
+import FooterThree from "../components/FooterThree";
+
+const HomePageThree = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderThree */}
+
+
+ {/* BannerThree */}
+
+
+ {/* PromotionalThree */}
+
+
+ {/* FeatureThree */}
+
+
+ {/* TextSlider */}
+
+
+ {/* TrendingThree */}
+
+
+ {/* DiscountThree */}
+
+
+ {/* NewArrivalThree */}
+
+
+ {/* DealsSection */}
+
+
+ {/* PopularProductsThree */}
+
+
+ {/* BrandThree */}
+
+
+ {/* ShippingThree */}
+
+
+ {/* TestimonialOne */}
+
+
+ {/* InstagramSection */}
+
+
+ {/* NewsletterThree */}
+
+
+ {/* FooterThree */}
+
+ >
+ );
+};
+
+export default HomePageThree;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageTwo.jsx
new file mode 100644
index 0000000..a658114
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/HomePageTwo.jsx
@@ -0,0 +1,102 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import BannerTwo from "../components/BannerTwo";
+import PromotionalTwo from "../components/PromotionalTwo";
+import DealsOne from "../components/DealsOne";
+import TopSellingOne from "../components/TopSellingOne";
+import TrendingOne from "../components/TrendingOne";
+import DiscountOne from "../components/DiscountOne";
+import FeaturedOne from "../components/FeaturedOne";
+import BigDealOne from "../components/BigDealOne";
+import TopSellingTwo from "../components/TopSellingTwo";
+import PopularProductsOne from "../components/PopularProductsOne";
+import TopVendorsTwo from "../components/TopVendorsTwo";
+import DaySaleOne from "../components/DaySaleOne";
+import RecentlyViewedOne from "../components/RecentlyViewedOne";
+import BrandTwo from "../components/BrandTwo";
+import ShippingTwo from "../components/ShippingTwo";
+import NewsletterTwo from "../components/NewsletterTwo";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+
+const HomePageTwo = () => {
+
+
+ return (
+
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* BannerTwo */}
+
+
+ {/* PromotionalTwo */}
+
+
+ {/* DealsOne */}
+
+
+ {/* TopSellingOne */}
+
+
+ {/* TrendingOne */}
+
+
+ {/* DiscountOne */}
+
+
+ {/* FeaturedOne */}
+
+
+ {/* BigDealOne */}
+
+
+ {/* TopSellingTwo */}
+
+
+ {/* PopularProductsOne */}
+
+
+ {/* TopVendorsTwo */}
+
+
+ {/* DaySaleOne */}
+
+
+ {/* RecentlyViewedOne */}
+
+
+ {/* BrandTwo */}
+
+
+ {/* ShippingTwo */}
+
+
+ {/* NewsletterTwo */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default HomePageTwo;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPage.jsx
new file mode 100644
index 0000000..fa95509
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPage.jsx
@@ -0,0 +1,311 @@
+import React, { useEffect, useState } from "react";
+import { useParams, Link, useNavigate } from "react-router-dom";
+import Preloader from "../helper/Preloader";
+import HeaderOne from "../components/HeaderOne";
+import FooterOne from "../components/FooterOne";
+import BottomFooter from "../components/BottomFooter";
+import ScrollToTop from "react-scroll-to-top";
+import ColorInit from "../helper/ColorInit";
+import { useValkey } from "../context/ValkeyContext";
+
+const API = process.env.REACT_APP_API_URL || "http://localhost:5000";
+
+const PRODUCT_IMAGES = {
+ "product:0192d4e6-2c4e-7a6b-8d8f-0a1b2c3d4e5f": "https://images.unsplash.com/photo-1610945415295-d9bbf067e59c?w=600&h=600&fit=crop&auto=format",
+ "product:0192d4e6-3d5f-7b8c-9e0a-1b2c3d4e5f6a": "https://images.unsplash.com/photo-1593642632559-0c6d3fc62b89?w=600&h=600&fit=crop&auto=format",
+ "product:0192d4e6-4e6a-7c9d-8f1b-2c3d4e5f6a7b": "https://images.unsplash.com/photo-1542291026-7eec264c27ff?w=600&h=600&fit=crop&auto=format",
+ "product:0192d4e6-5f7b-7d0e-8a2c-3d4e5f6a7b8c": "https://images.unsplash.com/photo-1585515320310-259814833e62?w=600&h=600&fit=crop&auto=format",
+ "product:0192d4e6-6a8c-7e1f-9b3d-4e5f6a7b8c9d": "https://images.unsplash.com/photo-1590658268037-6bf12165a8df?w=600&h=600&fit=crop&auto=format",
+ "product:0192d4e6-7b9d-7f2a-8c4e-5f6a7b8c9d0e": "https://images.unsplash.com/photo-1601925260368-ae2f83cf8b7f?w=600&h=600&fit=crop&auto=format",
+};
+
+function StarRating({ value }) {
+ return (
+
+ {[1, 2, 3, 4, 5].map(i => (
+ Math.round(value) ? " opacity-25" : ""}`} />
+ ))}
+ ({value})
+
+ );
+}
+
+function ValkeyBadge({ cmd }) {
+ return (
+
+ ⚡ {cmd}
+
+ );
+}
+
+const ProductDetailsPage = () => {
+ const { id } = useParams();
+ const navigate = useNavigate();
+ const { addToCart, addToWishlist, removeFromWishlist, isInWishlist, trackView } = useValkey();
+
+ const [product, setProduct] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [quantity, setQuantity] = useState(1);
+ const [cartMsg, setCartMsg] = useState(null);
+ const [wishMsg, setWishMsg] = useState(null);
+ const [valkeyOp, setValkeyOp] = useState(null);
+
+ useEffect(() => {
+ if (!id) { navigate("/shop"); return; }
+ setLoading(true);
+ fetch(`${API}/api/products/${encodeURIComponent(id)}`)
+ .then(r => r.json())
+ .then(data => {
+ if (data.error) { setError("Product not found"); return; }
+ setProduct(data.product || data);
+ setValkeyOp(data.valkeyOp || `JSON.GET ${id}`);
+ if (data.product?.categoryId) {
+ trackView(id, data.product.categoryId);
+ }
+ })
+ .catch(() => setError("Failed to load product"))
+ .finally(() => setLoading(false));
+ }, [id, navigate, trackView]);
+
+ const handleAddToCart = async () => {
+ if (!product) return;
+ const result = await addToCart({ ...product, quantity });
+ if (result) {
+ setCartMsg("Added to cart!");
+ setTimeout(() => setCartMsg(null), 2500);
+ }
+ };
+
+ const handleWishlist = async () => {
+ if (!product) return;
+ const inWl = isInWishlist(product.id);
+ if (inWl) {
+ await removeFromWishlist(product.id);
+ setWishMsg("Removed from wishlist");
+ } else {
+ await addToWishlist(product);
+ setWishMsg("Added to wishlist!");
+ }
+ setTimeout(() => setWishMsg(null), 2500);
+ };
+
+ const available = product ? (product.inventory?.quantity || 0) - (product.inventory?.reserved || 0) : 0;
+ const stockLabel = available <= 0 ? "Out of Stock" : available <= 10 ? `Only ${available} left!` : "In Stock";
+ const stockColor = available <= 0 ? "#e53e3e" : available <= 10 ? "#dd6b20" : "#38a169";
+
+ const img = product ? (PRODUCT_IMAGES[product.id] || product.images?.[0]?.url) : null;
+ const inWl = product ? isInWishlist(product.id) : false;
+
+ return (
+ <>
+
+
+
+
+
+ {/* Toast notifications */}
+ {(cartMsg || wishMsg) && (
+
+
+ {cartMsg || wishMsg}
+
+ )}
+
+
+
+ {/* Breadcrumb */}
+
+
+ Home
+ /
+ Shop
+ /
+ {product?.name || "Product"}
+
+
+
+ {/* Valkey badge */}
+ {valkeyOp && (
+
+
+ — fetched from Valkey JSON
+
+ )}
+
+ {loading && (
+
+
+
Loading from Valkey JSON…
+
+ )}
+
+ {error && (
+
+
+
{error}
+
Back to Shop
+
+ )}
+
+ {product && !loading && (
+
+ {/* Product Image */}
+
+
+
{ e.target.src = "https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop"; }}
+ />
+
+
+
+ {/* Product Info */}
+
+ {/* Category tag */}
+
+ {product.brand}
+
+
+
{product.name}
+
+ {/* Rating */}
+ {product.ratings && (
+
+
+ {product.ratings.count?.toLocaleString()} reviews
+
+ )}
+
+ {/* Price */}
+
+
+ ₹{Number(product.price?.amount).toLocaleString("en-IN")}
+
+ {product.price?.compareAt && (
+
+ ₹{Number(product.price.compareAt).toLocaleString("en-IN")}
+
+ )}
+ {product.price?.compareAt && (
+
+ {Math.round((1 - product.price.amount / product.price.compareAt) * 100)}% OFF
+
+ )}
+
+
+ {/* Description */}
+
{product.description}
+
+ {/* Inventory status */}
+
+
+ 0 ? "ph-check-circle" : "ph-x-circle"} me-4`} />
+ {stockLabel}
+
+
+
+
+ {/* Attributes */}
+ {product.attributes && Object.keys(product.attributes).length > 0 && (
+
+
+ {Object.entries(product.attributes).map(([k, v]) => (
+
+
+ {k}: {v}
+
+
+ ))}
+
+
+ )}
+
+ {/* Quantity + Actions */}
+
+ {/* Quantity picker */}
+
+ setQuantity(q => Math.max(1, q - 1))}
+ className="btn px-16 py-8 text-gray-600 hover-bg-main-50"
+ style={{ border: "none", background: "transparent" }}
+ >
+
+
+ {quantity}
+ setQuantity(q => Math.min(available, q + 1))}
+ className="btn px-16 py-8 text-gray-600 hover-bg-main-50"
+ style={{ border: "none", background: "transparent" }}
+ >
+
+
+
+
+ {/* Add to Cart */}
+
+
+ Add to Cart
+
+
+ {/* Wishlist */}
+
+
+ {inWl ? "In Wishlist" : "Wishlist"}
+
+
+
+ {/* Tags */}
+ {product.tags?.length > 0 && (
+
+ {product.tags.map(tag => (
+
+ #{tag}
+
+ ))}
+
+ )}
+
+ {/* Valkey info panel */}
+
+
⚡ Stored in Valkey JSON
+
+ Key: {product.id}
+ Command: JSON.GET {product.id}
+ SKU: {product.sku}
+
+
+
+
+ )}
+
+
+
+
+
+ >
+ );
+};
+
+export default ProductDetailsPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageOne.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageOne.jsx
new file mode 100644
index 0000000..870d306
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageOne.jsx
@@ -0,0 +1,60 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import HeaderOne from "../components/HeaderOne";
+import ProductDetailsOne from "../components/ProductDetailsOne";
+import NewArrivalTwo from "../components/NewArrivalTwo";
+import ShippingOne from "../components/ShippingOne";
+import NewsletterOne from "../components/NewsletterOne";
+import FooterOne from "../components/FooterOne";
+import BottomFooter from "../components/BottomFooter";
+import BreadcrumbTwo from './../components/BreadcrumbTwo';
+import ScrollToTop from "react-scroll-to-top";
+import ColorInit from "../helper/ColorInit";
+
+const ProductDetailsPageOne = () => {
+
+
+
+ return (
+ <>
+
+ {/* Preloader */}
+
+
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* HeaderOne */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* ProductDetailsOne */}
+
+
+ {/* NewArrivalTwo */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* NewsletterOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+
+ >
+ );
+};
+
+export default ProductDetailsPageOne;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageTwo.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageTwo.jsx
new file mode 100644
index 0000000..c6cedea
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ProductDetailsPageTwo.jsx
@@ -0,0 +1,59 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import ProductDetailsTwo from "../components/ProductDetailsTwo";
+import NewArrivalTwo from "../components/NewArrivalTwo";
+import ShippingOne from "../components/ShippingOne";
+import NewsletterOne from "../components/NewsletterOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+import ScrollToTop from "react-scroll-to-top";
+
+
+const ProductDetailsPageTwo = () => {
+
+
+
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* ProductDetailsTwo */}
+
+
+ {/* NewArrivalTwo */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* NewsletterOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+
+
+ >
+ );
+};
+
+export default ProductDetailsPageTwo;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/ShopPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/ShopPage.jsx
new file mode 100644
index 0000000..aff46df
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/ShopPage.jsx
@@ -0,0 +1,26 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import ValkeyShopSection from "../components/ValkeyShopSection";
+import ShippingTwo from "../components/ShippingTwo";
+import FooterTwo from "../components/FooterTwo";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+
+const ShopPage = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default ShopPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorDetailsPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorDetailsPage.jsx
new file mode 100644
index 0000000..fc5e58d
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorDetailsPage.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import Preloader from "../helper/Preloader";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import HeaderOne from "../components/HeaderOne";
+import BreadcrumbThree from "../components/BreadcrumbThree";
+import VendorsListTwo from "../components/VendorsListTwo";
+import NewsletterOne from "../components/NewsletterOne";
+import FooterOne from "../components/FooterOne";
+import BottomFooter from "../components/BottomFooter";
+
+const VendorDetailsPage = () => {
+ return (
+ <>
+ {/* Preloader */}
+
+
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* HeaderOne */}
+
+
+ {/* BreadcrumbThree */}
+
+
+ {/* VendorsListTwo */}
+
+
+ {/* NewsletterOne */}
+
+
+ {/* FooterOne */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default VendorDetailsPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorPage.jsx
new file mode 100644
index 0000000..4324f10
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorPage.jsx
@@ -0,0 +1,49 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderOne from "../components/HeaderOne";
+import BreadcrumbThree from "../components/BreadcrumbThree";
+import VendorsList from "../components/VendorsList";
+import ShippingOne from "../components/ShippingOne";
+import NewsletterOne from "../components/NewsletterOne";
+import FooterOne from "../components/FooterOne";
+import BottomFooter from "../components/BottomFooter";
+
+const VendorPage = () => {
+ return (
+ <>
+ {/* Preloader */}
+
+
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* HeaderOne */}
+
+
+ {/* BreadcrumbThree */}
+
+
+ {/* VendorsList */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* NewsletterOne */}
+
+
+ {/* FooterOne */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default VendorPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoDetailsPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoDetailsPage.jsx
new file mode 100644
index 0000000..5524e8e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoDetailsPage.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import VendorTwoDetails from "../components/VendorTwoDetails";
+import ShippingOne from "../components/ShippingOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+
+const VendorTwoDetailsPage = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* VendorTwoDetails */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default VendorTwoDetailsPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoPage.jsx
new file mode 100644
index 0000000..bd2f477
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/VendorTwoPage.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import VendorTwo from "../components/VendorTwo";
+import ShippingOne from "../components/ShippingOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+
+const VendorTwoPage = () => {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* VendorTwo */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+};
+
+export default VendorTwoPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/pages/WishlistPage.jsx b/submissions/valkey-ecommerce-demo/frontend/src/pages/WishlistPage.jsx
new file mode 100644
index 0000000..cbe3a5e
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/pages/WishlistPage.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import ColorInit from "../helper/ColorInit";
+import ScrollToTop from "react-scroll-to-top";
+import Preloader from "../helper/Preloader";
+import HeaderTwo from "../components/HeaderTwo";
+import Breadcrumb from "../components/Breadcrumb";
+import WishListSection from "../components/WishListSection";
+import ShippingOne from "../components/ShippingOne";
+import FooterTwo from "../components/FooterTwo";
+import BottomFooter from "../components/BottomFooter";
+
+function WishlistPage() {
+ return (
+ <>
+ {/* ColorInit */}
+
+
+ {/* ScrollToTop */}
+
+
+ {/* Preloader */}
+
+
+ {/* HeaderTwo */}
+
+
+ {/* Breadcrumb */}
+
+
+ {/* WishListSection */}
+
+
+ {/* ShippingOne */}
+
+
+ {/* FooterTwo */}
+
+
+ {/* BottomFooter */}
+
+ >
+ );
+}
+
+export default WishlistPage;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/reportWebVitals.js b/submissions/valkey-ecommerce-demo/frontend/src/reportWebVitals.js
new file mode 100644
index 0000000..5253d3a
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/reportWebVitals.js
@@ -0,0 +1,13 @@
+const reportWebVitals = onPerfEntry => {
+ if (onPerfEntry && onPerfEntry instanceof Function) {
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
+ getCLS(onPerfEntry);
+ getFID(onPerfEntry);
+ getFCP(onPerfEntry);
+ getLCP(onPerfEntry);
+ getTTFB(onPerfEntry);
+ });
+ }
+};
+
+export default reportWebVitals;
diff --git a/submissions/valkey-ecommerce-demo/frontend/src/setupTests.js b/submissions/valkey-ecommerce-demo/frontend/src/setupTests.js
new file mode 100644
index 0000000..8f2609b
--- /dev/null
+++ b/submissions/valkey-ecommerce-demo/frontend/src/setupTests.js
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom';