From 63146aa9b78c3582f97531ffb031b9650c02a246 Mon Sep 17 00:00:00 2001 From: "DESKTOP-RTLN3BA\\$punk" Date: Mon, 12 Aug 2024 00:32:42 -0700 Subject: [PATCH] init --- README.md | 36 + backend/.gitignore | 12 + backend/LLMGraphTransformer.py | 830 ++++ backend/database.py | 14 + backend/envs.py | 10 + backend/models.py | 14 + backend/prompts.py | 84 + backend/pydmodels.py | 41 + backend/requirements.txt | 8 + backend/server.py | 322 ++ extension/.gitignore | 4 + extension/.vscode/settings.json | 12 + extension/.vscode/tasks.json | 33 + extension/LICENSE | 21 + extension/README.md | 70 + extension/jest.config.js | 8 + extension/package-lock.json | 5033 ++++++++++++++++++++ extension/package.json | 52 + extension/pnpm-lock.yaml | 4622 ++++++++++++++++++ extension/postcss.config.js | 6 + extension/public/brain.png | Bin 0 -> 5816 bytes extension/public/icon-128.png | Bin 0 -> 5679 bytes extension/public/icon-16.png | Bin 0 -> 587 bytes extension/public/icon-32.png | Bin 0 -> 1343 bytes extension/public/icon-48.png | Bin 0 -> 2209 bytes extension/public/manifest.json | 38 + extension/public/options.html | 12 + extension/public/popup.html | 13 + extension/src/__tests__/sum.ts | 9 + extension/src/assets/tailwind.css | 39 + extension/src/background.ts | 454 ++ extension/src/commons.tsx | 126 + extension/src/content_script.tsx | 3 + extension/src/env.tsx | 2 + extension/src/interfaces.tsx | 4 + extension/src/options.tsx | 77 + extension/src/pages/EnvVarSettings.tsx | 75 + extension/src/pages/Loading.tsx | 28 + extension/src/pages/LoginForm.tsx | 94 + extension/src/popup.tsx | 582 +++ extension/src/sum.ts | 3 + extension/tailwind.config.js | 60 + extension/tsconfig.json | 15 + extension/tsconfig.test.json | 6 + extension/webpack/webpack.common.js | 66 + extension/webpack/webpack.dev.js | 7 + extension/webpack/webpack.prod.js | 6 + web/.gitignore | 36 + web/README.md | 36 + web/app/chat/markdown.tsx | 8 + web/app/chat/page.tsx | 344 ++ web/app/favicon.ico | Bin 0 -> 15406 bytes web/app/globals.css | 69 + web/app/layout.tsx | 73 + web/app/login/page.tsx | 9 + web/app/page.tsx | 10 + web/app/settings/page.tsx | 80 + web/app/signup/page.tsx | 9 + web/components.json | 20 + web/components/Settings/EnvVarSettings.tsx | 43 + web/components/homepage/Footer.tsx | 10 + web/components/homepage/HomePage.tsx | 43 + web/components/homepage/NavBar.tsx | 63 + web/components/homepage/theme-toggle.tsx | 40 + web/components/logins/LoginForm.tsx | 107 + web/components/logins/RegisterForm.tsx | 112 + web/components/theme-provider.tsx | 9 + web/components/ui/aurora-background.tsx | 54 + web/components/ui/button.tsx | 56 + web/components/ui/collapsible.tsx | 11 + web/components/ui/dropdown-menu.tsx | 200 + web/components/ui/lamp.tsx | 104 + web/components/ui/navbar-menu.tsx | 121 + web/components/ui/table.tsx | 117 + web/components/ui/toast.tsx | 129 + web/components/ui/toaster.tsx | 35 + web/components/ui/use-toast.ts | 194 + web/lib/utils.ts | 6 + web/next.config.mjs | 4 + web/package.json | 41 + web/pnpm-lock.yaml | 3428 +++++++++++++ web/postcss.config.mjs | 8 + web/public/SurfSense.png | Bin 0 -> 69851 bytes web/public/icon-128.png | Bin 0 -> 5679 bytes web/tailwind.config.ts | 160 + web/tsconfig.json | 26 + 86 files changed, 18766 insertions(+) create mode 100644 README.md create mode 100644 backend/.gitignore create mode 100644 backend/LLMGraphTransformer.py create mode 100644 backend/database.py create mode 100644 backend/envs.py create mode 100644 backend/models.py create mode 100644 backend/prompts.py create mode 100644 backend/pydmodels.py create mode 100644 backend/requirements.txt create mode 100644 backend/server.py create mode 100644 extension/.gitignore create mode 100644 extension/.vscode/settings.json create mode 100644 extension/.vscode/tasks.json create mode 100644 extension/LICENSE create mode 100644 extension/README.md create mode 100644 extension/jest.config.js create mode 100644 extension/package-lock.json create mode 100644 extension/package.json create mode 100644 extension/pnpm-lock.yaml create mode 100644 extension/postcss.config.js create mode 100644 extension/public/brain.png create mode 100644 extension/public/icon-128.png create mode 100644 extension/public/icon-16.png create mode 100644 extension/public/icon-32.png create mode 100644 extension/public/icon-48.png create mode 100644 extension/public/manifest.json create mode 100644 extension/public/options.html create mode 100644 extension/public/popup.html create mode 100644 extension/src/__tests__/sum.ts create mode 100644 extension/src/assets/tailwind.css create mode 100644 extension/src/background.ts create mode 100644 extension/src/commons.tsx create mode 100644 extension/src/content_script.tsx create mode 100644 extension/src/env.tsx create mode 100644 extension/src/interfaces.tsx create mode 100644 extension/src/options.tsx create mode 100644 extension/src/pages/EnvVarSettings.tsx create mode 100644 extension/src/pages/Loading.tsx create mode 100644 extension/src/pages/LoginForm.tsx create mode 100644 extension/src/popup.tsx create mode 100644 extension/src/sum.ts create mode 100644 extension/tailwind.config.js create mode 100644 extension/tsconfig.json create mode 100644 extension/tsconfig.test.json create mode 100644 extension/webpack/webpack.common.js create mode 100644 extension/webpack/webpack.dev.js create mode 100644 extension/webpack/webpack.prod.js create mode 100644 web/.gitignore create mode 100644 web/README.md create mode 100644 web/app/chat/markdown.tsx create mode 100644 web/app/chat/page.tsx create mode 100644 web/app/favicon.ico create mode 100644 web/app/globals.css create mode 100644 web/app/layout.tsx create mode 100644 web/app/login/page.tsx create mode 100644 web/app/page.tsx create mode 100644 web/app/settings/page.tsx create mode 100644 web/app/signup/page.tsx create mode 100644 web/components.json create mode 100644 web/components/Settings/EnvVarSettings.tsx create mode 100644 web/components/homepage/Footer.tsx create mode 100644 web/components/homepage/HomePage.tsx create mode 100644 web/components/homepage/NavBar.tsx create mode 100644 web/components/homepage/theme-toggle.tsx create mode 100644 web/components/logins/LoginForm.tsx create mode 100644 web/components/logins/RegisterForm.tsx create mode 100644 web/components/theme-provider.tsx create mode 100644 web/components/ui/aurora-background.tsx create mode 100644 web/components/ui/button.tsx create mode 100644 web/components/ui/collapsible.tsx create mode 100644 web/components/ui/dropdown-menu.tsx create mode 100644 web/components/ui/lamp.tsx create mode 100644 web/components/ui/navbar-menu.tsx create mode 100644 web/components/ui/table.tsx create mode 100644 web/components/ui/toast.tsx create mode 100644 web/components/ui/toaster.tsx create mode 100644 web/components/ui/use-toast.ts create mode 100644 web/lib/utils.ts create mode 100644 web/next.config.mjs create mode 100644 web/package.json create mode 100644 web/pnpm-lock.yaml create mode 100644 web/postcss.config.mjs create mode 100644 web/public/SurfSense.png create mode 100644 web/public/icon-128.png create mode 100644 web/tailwind.config.ts create mode 100644 web/tsconfig.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..c403366 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..01ef2dd --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,12 @@ +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +__pycache__ +__pycache__/ +.__pycache__ \ No newline at end of file diff --git a/backend/LLMGraphTransformer.py b/backend/LLMGraphTransformer.py new file mode 100644 index 0000000..1f0e3ff --- /dev/null +++ b/backend/LLMGraphTransformer.py @@ -0,0 +1,830 @@ +import asyncio +import json +from typing import Any, Dict, List, Optional, Sequence, Tuple, Type, Union, cast + +from langchain_community.graphs.graph_document import GraphDocument, Node, Relationship +from langchain_core.documents import Document +from langchain_core.language_models import BaseLanguageModel +from langchain_core.messages import SystemMessage +from langchain_core.output_parsers import JsonOutputParser +from langchain_core.prompts import ( + ChatPromptTemplate, + HumanMessagePromptTemplate, + PromptTemplate, +) +from langchain_core.pydantic_v1 import BaseModel, Field, create_model +from langchain_core.runnables import RunnableConfig + +examples = [ + { + "text": ( + "Adam is a software engineer in Microsoft since 2009, " + "and last year he got an award as the Best Talent" + ), + "head": "Adam", + "head_type": "Person", + "relation": "WORKS_FOR", + "tail": "Microsoft", + "tail_type": "Company", + }, + { + "text": ( + "Adam is a software engineer in Microsoft since 2009, " + "and last year he got an award as the Best Talent" + ), + "head": "Adam", + "head_type": "Person", + "relation": "HAS_AWARD", + "tail": "Best Talent", + "tail_type": "Award", + }, + { + "text": ( + "Microsoft is a tech company that provide " + "several products such as Microsoft Word" + ), + "head": "Microsoft Word", + "head_type": "Product", + "relation": "PRODUCED_BY", + "tail": "Microsoft", + "tail_type": "Company", + }, + { + "text": "Microsoft Word is a lightweight app that accessible offline", + "head": "Microsoft Word", + "head_type": "Product", + "relation": "HAS_CHARACTERISTIC", + "tail": "lightweight app", + "tail_type": "Characteristic", + }, + { + "text": "Microsoft Word is a lightweight app that accessible offline", + "head": "Microsoft Word", + "head_type": "Product", + "relation": "HAS_CHARACTERISTIC", + "tail": "accessible offline", + "tail_type": "Characteristic", + }, +] + +system_prompt = ( + "# Knowledge Graph Instructions for GPT-4\n" + "## 1. Overview\n" + "You are a top-tier algorithm designed for extracting information in structured " + "formats to build a knowledge graph.\n" + "Try to capture as much information from the text as possible without " + "sacrificing accuracy. Do not add any information that is not explicitly " + "mentioned in the text.\n" + "- **Nodes** represent entities and concepts.\n" + "- The aim is to achieve simplicity and clarity in the knowledge graph, making it\n" + "accessible for a vast audience.\n" + "## 2. Labeling Nodes\n" + "- **Consistency**: Ensure you use available types for node labels.\n" + "Ensure you use basic or elementary types for node labels.\n" + "- For example, when you identify an entity representing a person, " + "always label it as **'person'**. Avoid using more specific terms " + "like 'mathematician' or 'scientist'." + "- **Node IDs**: Never utilize integers as node IDs. Node IDs should be " + "names or human-readable identifiers found in the text.\n" + "- **Relationships** represent connections between entities or concepts.\n" + "Ensure consistency and generality in relationship types when constructing " + "knowledge graphs. Instead of using specific and momentary types " + "such as 'BECAME_PROFESSOR', use more general and timeless relationship types " + "like 'PROFESSOR'. Make sure to use general and timeless relationship types!\n" + "## 3. Coreference Resolution\n" + "- **Maintain Entity Consistency**: When extracting entities, it's vital to " + "ensure consistency.\n" + 'If an entity, such as "John Doe", is mentioned multiple times in the text ' + 'but is referred to by different names or pronouns (e.g., "Joe", "he"),' + "always use the most complete identifier for that entity throughout the " + 'knowledge graph. In this example, use "John Doe" as the entity ID.\n' + "Remember, the knowledge graph should be coherent and easily understandable, " + "so maintaining consistency in entity references is crucial.\n" + "## 4. Strict Compliance\n" + "Adhere to the rules strictly. Non-compliance will result in termination." +) + +default_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + system_prompt, + ), + ( + "human", + ( + "Note: The information given to you is information about a User's Web Browsing History." + "Tip: Make sure to answer in the correct format and do " + "not include any explanations. " + "Use the given format to extract information from the " + "following input: {input}" + ), + ), + ] +) + + +def _get_additional_info(input_type: str) -> str: + # Check if the input_type is one of the allowed values + if input_type not in ["node", "relationship", "property"]: + raise ValueError("input_type must be 'node', 'relationship', or 'property'") + + # Perform actions based on the input_type + if input_type == "node": + return ( + "Ensure you use basic or elementary types for node labels.\n" + "For example, when you identify an entity representing a person, " + "always label it as **'Person'**. Avoid using more specific terms " + "like 'Mathematician' or 'Scientist'" + ) + elif input_type == "relationship": + return ( + "Instead of using specific and momentary types such as " + "'BECAME_PROFESSOR', use more general and timeless relationship types " + "like 'PROFESSOR'. However, do not sacrifice any accuracy for generality" + ) + elif input_type == "property": + return "" + return "" + + +def optional_enum_field( + enum_values: Optional[List[str]] = None, + description: str = "", + input_type: str = "node", + llm_type: Optional[str] = None, + **field_kwargs: Any, +) -> Any: + """Utility function to conditionally create a field with an enum constraint.""" + # Only openai supports enum param + if enum_values and llm_type == "openai-chat": + return Field( + ..., + enum=enum_values, + description=f"{description}. Available options are {enum_values}", + **field_kwargs, + ) + elif enum_values: + return Field( + ..., + description=f"{description}. Available options are {enum_values}", + **field_kwargs, + ) + else: + additional_info = _get_additional_info(input_type) + return Field(..., description=description + additional_info, **field_kwargs) + + +class _Graph(BaseModel): + nodes: Optional[List] + relationships: Optional[List] + + +class UnstructuredRelation(BaseModel): + head: str = Field( + description=( + "extracted head entity like Microsoft, Apple, John. " + "Must use human-readable unique identifier." + ) + ) + head_type: str = Field( + description="type of the extracted head entity like Person, Company, etc" + ) + relation: str = Field(description="relation between the head and the tail entities") + tail: str = Field( + description=( + "extracted tail entity like Microsoft, Apple, John. " + "Must use human-readable unique identifier." + ) + ) + tail_type: str = Field( + description="type of the extracted tail entity like Person, Company, etc" + ) + + +def create_unstructured_prompt( + node_labels: Optional[List[str]] = None, rel_types: Optional[List[str]] = None +) -> ChatPromptTemplate: + node_labels_str = str(node_labels) if node_labels else "" + rel_types_str = str(rel_types) if rel_types else "" + base_string_parts = [ + "You are a top-tier algorithm designed for extracting information in " + "structured formats to build a knowledge graph. Your task is to identify " + "the entities and relations requested with the user prompt from a given " + "text. You must generate the output in a JSON format containing a list " + 'with JSON objects. Each object should have the keys: "head", ' + '"head_type", "relation", "tail", and "tail_type". The "head" ' + "key must contain the text of the extracted entity with one of the types " + "from the provided list in the user prompt.", + f'The "head_type" key must contain the type of the extracted head entity, ' + f"which must be one of the types from {node_labels_str}." + if node_labels + else "", + f'The "relation" key must contain the type of relation between the "head" ' + f'and the "tail", which must be one of the relations from {rel_types_str}.' + if rel_types + else "", + f'The "tail" key must represent the text of an extracted entity which is ' + f'the tail of the relation, and the "tail_type" key must contain the type ' + f"of the tail entity from {node_labels_str}." + if node_labels + else "", + "Attempt to extract as many entities and relations as you can. Maintain " + "Entity Consistency: When extracting entities, it's vital to ensure " + 'consistency. If an entity, such as "John Doe", is mentioned multiple ' + "times in the text but is referred to by different names or pronouns " + '(e.g., "Joe", "he"), always use the most complete identifier for ' + "that entity. The knowledge graph should be coherent and easily " + "understandable, so maintaining consistency in entity references is " + "crucial.", + "IMPORTANT NOTES:\n- Don't add any explanation and text.", + ] + system_prompt = "\n".join(filter(None, base_string_parts)) + + system_message = SystemMessage(content=system_prompt) + parser = JsonOutputParser(pydantic_object=UnstructuredRelation) + + human_string_parts = [ + "Based on the following example, extract entities and " + "relations from the provided text.\n\n", + "Use the following entity types, don't use other entity " + "that is not defined below:" + "# ENTITY TYPES:" + "{node_labels}" + if node_labels + else "", + "Use the following relation types, don't use other relation " + "that is not defined below:" + "# RELATION TYPES:" + "{rel_types}" + if rel_types + else "", + "Below are a number of examples of text and their extracted " + "entities and relationships." + "{examples}\n" + "For the following text, extract entities and relations as " + "in the provided example." + "{format_instructions}\nText: {input}", + ] + human_prompt_string = "\n".join(filter(None, human_string_parts)) + human_prompt = PromptTemplate( + template=human_prompt_string, + input_variables=["input"], + partial_variables={ + "format_instructions": parser.get_format_instructions(), + "node_labels": node_labels, + "rel_types": rel_types, + "examples": examples, + }, + ) + + human_message_prompt = HumanMessagePromptTemplate(prompt=human_prompt) + + chat_prompt = ChatPromptTemplate.from_messages( + [system_message, human_message_prompt] + ) + return chat_prompt + + +def create_simple_model( + node_labels: Optional[List[str]] = None, + rel_types: Optional[List[str]] = None, + node_properties: Union[bool, List[str]] = False, + llm_type: Optional[str] = None, + relationship_properties: Union[bool, List[str]] = False, +) -> Type[_Graph]: + """ + Create a simple graph model with optional constraints on node + and relationship types. + + Args: + node_labels (Optional[List[str]]): Specifies the allowed node types. + Defaults to None, allowing all node types. + rel_types (Optional[List[str]]): Specifies the allowed relationship types. + Defaults to None, allowing all relationship types. + node_properties (Union[bool, List[str]]): Specifies if node properties should + be included. If a list is provided, only properties with keys in the list + will be included. If True, all properties are included. Defaults to False. + relationship_properties (Union[bool, List[str]]): Specifies if relationship + properties should be included. If a list is provided, only properties with + keys in the list will be included. If True, all properties are included. + Defaults to False. + llm_type (Optional[str]): The type of the language model. Defaults to None. + Only openai supports enum param: openai-chat. + + Returns: + Type[_Graph]: A graph model with the specified constraints. + + Raises: + ValueError: If 'id' is included in the node or relationship properties list. + """ + + node_fields: Dict[str, Tuple[Any, Any]] = { + "id": ( + str, + Field(..., description="Name or human-readable unique identifier."), + ), + "type": ( + str, + optional_enum_field( + node_labels, + description="The type or label of the node.", + input_type="node", + llm_type=llm_type, + ), + ), + } + + if node_properties: + if isinstance(node_properties, list) and "id" in node_properties: + raise ValueError("The node property 'id' is reserved and cannot be used.") + # Map True to empty array + node_properties_mapped: List[str] = ( + [] if node_properties is True else node_properties + ) + + class Property(BaseModel): + """A single property consisting of key and value""" + + key: str = optional_enum_field( + node_properties_mapped, + description="Property key.", + input_type="property", + llm_type=llm_type, + ) + value: str = Field(..., description="value") + + node_fields["properties"] = ( + Optional[List[Property]], + Field(None, description="List of node properties"), + ) + SimpleNode = create_model("SimpleNode", **node_fields) # type: ignore + + relationship_fields: Dict[str, Tuple[Any, Any]] = { + "source_node_id": ( + str, + Field( + ..., + description="Name or human-readable unique identifier of source node", + ), + ), + "source_node_type": ( + str, + optional_enum_field( + node_labels, + description="The type or label of the source node.", + input_type="node", + llm_type=llm_type, + ), + ), + "target_node_id": ( + str, + Field( + ..., + description="Name or human-readable unique identifier of target node", + ), + ), + "target_node_type": ( + str, + optional_enum_field( + node_labels, + description="The type or label of the target node.", + input_type="node", + llm_type=llm_type, + ), + ), + "type": ( + str, + optional_enum_field( + rel_types, + description="The type of the relationship.", + input_type="relationship", + llm_type=llm_type, + ), + ), + } + if relationship_properties: + if ( + isinstance(relationship_properties, list) + and "id" in relationship_properties + ): + raise ValueError( + "The relationship property 'id' is reserved and cannot be used." + ) + # Map True to empty array + relationship_properties_mapped: List[str] = ( + [] if relationship_properties is True else relationship_properties + ) + + class RelationshipProperty(BaseModel): + """A single property consisting of key and value""" + + key: str = optional_enum_field( + relationship_properties_mapped, + description="Property key.", + input_type="property", + llm_type=llm_type, + ) + value: str = Field(..., description="value") + + relationship_fields["properties"] = ( + Optional[List[RelationshipProperty]], + Field(None, description="List of relationship properties"), + ) + SimpleRelationship = create_model("SimpleRelationship", **relationship_fields) # type: ignore + + class DynamicGraph(_Graph): + """Represents a graph document consisting of nodes and relationships.""" + + nodes: Optional[List[SimpleNode]] = Field(description="List of nodes") # type: ignore + relationships: Optional[List[SimpleRelationship]] = Field( # type: ignore + description="List of relationships" + ) + + return DynamicGraph + + +def map_to_base_node(node: Any) -> Node: + """Map the SimpleNode to the base Node.""" + properties = {} + if hasattr(node, "properties") and node.properties: + for p in node.properties: + properties[format_property_key(p.key)] = p.value + return Node(id=node.id, type=node.type, properties=properties) + + +def map_to_base_relationship(rel: Any) -> Relationship: + """Map the SimpleRelationship to the base Relationship.""" + source = Node(id=rel.source_node_id, type=rel.source_node_type) + target = Node(id=rel.target_node_id, type=rel.target_node_type) + properties = {} + if hasattr(rel, "properties") and rel.properties: + for p in rel.properties: + properties[format_property_key(p.key)] = p.value + return Relationship( + source=source, target=target, type=rel.type, properties=properties + ) + + +def _parse_and_clean_json( + argument_json: Dict[str, Any], +) -> Tuple[List[Node], List[Relationship]]: + nodes = [] + for node in argument_json["nodes"]: + if not node.get("id"): # Id is mandatory, skip this node + continue + node_properties = {} + if "properties" in node and node["properties"]: + for p in node["properties"]: + node_properties[format_property_key(p["key"])] = p["value"] + nodes.append( + Node( + id=node["id"], + type=node.get("type"), + properties=node_properties, + ) + ) + relationships = [] + for rel in argument_json["relationships"]: + # Mandatory props + if ( + not rel.get("source_node_id") + or not rel.get("target_node_id") + or not rel.get("type") + ): + continue + + # Node type copying if needed from node list + if not rel.get("source_node_type"): + try: + rel["source_node_type"] = [ + el.get("type") + for el in argument_json["nodes"] + if el["id"] == rel["source_node_id"] + ][0] + except IndexError: + rel["source_node_type"] = None + if not rel.get("target_node_type"): + try: + rel["target_node_type"] = [ + el.get("type") + for el in argument_json["nodes"] + if el["id"] == rel["target_node_id"] + ][0] + except IndexError: + rel["target_node_type"] = None + + rel_properties = {} + if "properties" in rel and rel["properties"]: + for p in rel["properties"]: + rel_properties[format_property_key(p["key"])] = p["value"] + + source_node = Node( + id=rel["source_node_id"], + type=rel["source_node_type"], + ) + target_node = Node( + id=rel["target_node_id"], + type=rel["target_node_type"], + ) + relationships.append( + Relationship( + source=source_node, + target=target_node, + type=rel["type"], + properties=rel_properties, + ) + ) + return nodes, relationships + + +def _format_nodes(nodes: List[Node]) -> List[Node]: + return [ + Node( + id=el.id.title() if isinstance(el.id, str) else el.id, + type=el.type.capitalize() # type: ignore[arg-type] + if el.type + else None, # handle empty strings # type: ignore[arg-type] + properties=el.properties, + ) + for el in nodes + ] + + +def _format_relationships(rels: List[Relationship]) -> List[Relationship]: + return [ + Relationship( + source=_format_nodes([el.source])[0], + target=_format_nodes([el.target])[0], + type=el.type.replace(" ", "_").upper(), + properties=el.properties, + ) + for el in rels + ] + + +def format_property_key(s: str) -> str: + words = s.split() + if not words: + return s + first_word = words[0].lower() + capitalized_words = [word.capitalize() for word in words[1:]] + return "".join([first_word] + capitalized_words) + + +def _convert_to_graph_document( + raw_schema: Dict[Any, Any], +) -> Tuple[List[Node], List[Relationship]]: + # If there are validation errors + if not raw_schema["parsed"]: + try: + try: # OpenAI type response + argument_json = json.loads( + raw_schema["raw"].additional_kwargs["tool_calls"][0]["function"][ + "arguments" + ] + ) + except Exception: # Google type response + argument_json = json.loads( + raw_schema["raw"].additional_kwargs["function_call"]["arguments"] + ) + + nodes, relationships = _parse_and_clean_json(argument_json) + except Exception: # If we can't parse JSON + return ([], []) + else: # If there are no validation errors use parsed pydantic object + parsed_schema: _Graph = raw_schema["parsed"] + nodes = ( + [map_to_base_node(node) for node in parsed_schema.nodes if node.id] + if parsed_schema.nodes + else [] + ) + + relationships = ( + [ + map_to_base_relationship(rel) + for rel in parsed_schema.relationships + if rel.type and rel.source_node_id and rel.target_node_id + ] + if parsed_schema.relationships + else [] + ) + # Title / Capitalize + return _format_nodes(nodes), _format_relationships(relationships) + + +class LLMGraphTransformer: + """Transform documents into graph-based documents using a LLM. + + It allows specifying constraints on the types of nodes and relationships to include + in the output graph. The class supports extracting properties for both nodes and + relationships. + + Args: + llm (BaseLanguageModel): An instance of a language model supporting structured + output. + allowed_nodes (List[str], optional): Specifies which node types are + allowed in the graph. Defaults to an empty list, allowing all node types. + allowed_relationships (List[str], optional): Specifies which relationship types + are allowed in the graph. Defaults to an empty list, allowing all relationship + types. + prompt (Optional[ChatPromptTemplate], optional): The prompt to pass to + the LLM with additional instructions. + strict_mode (bool, optional): Determines whether the transformer should apply + filtering to strictly adhere to `allowed_nodes` and `allowed_relationships`. + Defaults to True. + node_properties (Union[bool, List[str]]): If True, the LLM can extract any + node properties from text. Alternatively, a list of valid properties can + be provided for the LLM to extract, restricting extraction to those specified. + relationship_properties (Union[bool, List[str]]): If True, the LLM can extract + any relationship properties from text. Alternatively, a list of valid + properties can be provided for the LLM to extract, restricting extraction to + those specified. + + Example: + .. code-block:: python + from langchain_experimental.graph_transformers import LLMGraphTransformer + from langchain_core.documents import Document + from langchain_openai import ChatOpenAI + + llm=ChatOpenAI(temperature=0) + transformer = LLMGraphTransformer( + llm=llm, + allowed_nodes=["Person", "Organization"]) + + doc = Document(page_content="Elon Musk is suing OpenAI") + graph_documents = transformer.convert_to_graph_documents([doc]) + """ + + def __init__( + self, + llm: BaseLanguageModel, + allowed_nodes: List[str] = [], + allowed_relationships: List[str] = [], + prompt: Optional[ChatPromptTemplate] = None, + strict_mode: bool = True, + node_properties: Union[bool, List[str]] = False, + relationship_properties: Union[bool, List[str]] = False, + ) -> None: + self.allowed_nodes = allowed_nodes + self.allowed_relationships = allowed_relationships + self.strict_mode = strict_mode + self._function_call = True + # Check if the LLM really supports structured output + try: + llm.with_structured_output(_Graph) + except NotImplementedError: + self._function_call = False + if not self._function_call: + if node_properties or relationship_properties: + raise ValueError( + "The 'node_properties' and 'relationship_properties' parameters " + "cannot be used in combination with a LLM that doesn't support " + "native function calling." + ) + try: + import json_repair # type: ignore + + self.json_repair = json_repair + except ImportError: + raise ImportError( + "Could not import json_repair python package. " + "Please install it with `pip install json-repair`." + ) + prompt = prompt or create_unstructured_prompt( + allowed_nodes, allowed_relationships + ) + self.chain = prompt | llm + else: + # Define chain + try: + llm_type = llm._llm_type # type: ignore + except AttributeError: + llm_type = None + schema = create_simple_model( + allowed_nodes, + allowed_relationships, + node_properties, + llm_type, + relationship_properties, + ) + structured_llm = llm.with_structured_output(schema, include_raw=True) + prompt = prompt or default_prompt + self.chain = prompt | structured_llm + + def process_response( + self, document: Document, config: Optional[RunnableConfig] = None + ) -> GraphDocument: + """ + Processes a single document, transforming it into a graph document using + an LLM based on the model's schema and constraints. + """ + text = document.page_content + raw_schema = self.chain.invoke({"input": text}, config=config) + if self._function_call: + raw_schema = cast(Dict[Any, Any], raw_schema) + nodes, relationships = _convert_to_graph_document(raw_schema) + else: + nodes_set = set() + relationships = [] + if not isinstance(raw_schema, str): + raw_schema = raw_schema.content + parsed_json = self.json_repair.loads(raw_schema) + for rel in parsed_json: + # Nodes need to be deduplicated using a set + nodes_set.add((rel["head"], rel["head_type"])) + nodes_set.add((rel["tail"], rel["tail_type"])) + + source_node = Node(id=rel["head"], type=rel["head_type"]) + target_node = Node(id=rel["tail"], type=rel["tail_type"]) + relationships.append( + Relationship( + source=source_node, target=target_node, type=rel["relation"] + ) + ) + # Create nodes list + nodes = [Node(id=el[0], type=el[1]) for el in list(nodes_set)] + + # Strict mode filtering + if self.strict_mode and (self.allowed_nodes or self.allowed_relationships): + if self.allowed_nodes: + lower_allowed_nodes = [el.lower() for el in self.allowed_nodes] + nodes = [ + node for node in nodes if node.type.lower() in lower_allowed_nodes + ] + relationships = [ + rel + for rel in relationships + if rel.source.type.lower() in lower_allowed_nodes + and rel.target.type.lower() in lower_allowed_nodes + ] + if self.allowed_relationships: + relationships = [ + rel + for rel in relationships + if rel.type.lower() + in [el.lower() for el in self.allowed_relationships] + ] + + return GraphDocument(nodes=nodes, relationships=relationships, source=document) + + def convert_to_graph_documents( + self, documents: Sequence[Document], config: Optional[RunnableConfig] = None + ) -> List[GraphDocument]: + """Convert a sequence of documents into graph documents. + + Args: + documents (Sequence[Document]): The original documents. + **kwargs: Additional keyword arguments. + + Returns: + Sequence[GraphDocument]: The transformed documents as graphs. + """ + return [self.process_response(document, config) for document in documents] + + async def aprocess_response( + self, document: Document, config: Optional[RunnableConfig] = None + ) -> GraphDocument: + """ + Asynchronously processes a single document, transforming it into a + graph document. + """ + text = document.page_content + raw_schema = await self.chain.ainvoke({"input": text}, config=config) + raw_schema = cast(Dict[Any, Any], raw_schema) + nodes, relationships = _convert_to_graph_document(raw_schema) + + if self.strict_mode and (self.allowed_nodes or self.allowed_relationships): + if self.allowed_nodes: + lower_allowed_nodes = [el.lower() for el in self.allowed_nodes] + nodes = [ + node for node in nodes if node.type.lower() in lower_allowed_nodes + ] + relationships = [ + rel + for rel in relationships + if rel.source.type.lower() in lower_allowed_nodes + and rel.target.type.lower() in lower_allowed_nodes + ] + if self.allowed_relationships: + relationships = [ + rel + for rel in relationships + if rel.type.lower() + in [el.lower() for el in self.allowed_relationships] + ] + + return GraphDocument(nodes=nodes, relationships=relationships, source=document) + + async def aconvert_to_graph_documents( + self, documents: Sequence[Document], config: Optional[RunnableConfig] = None + ) -> List[GraphDocument]: + """ + Asynchronously convert a sequence of documents into graph documents. + """ + tasks = [ + asyncio.create_task(self.aprocess_response(document, config)) + for document in documents + ] + results = await asyncio.gather(*tasks) + return results diff --git a/backend/database.py b/backend/database.py new file mode 100644 index 0000000..7efae1d --- /dev/null +++ b/backend/database.py @@ -0,0 +1,14 @@ +from sqlalchemy import create_engine, Column, Integer, String +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +from envs import POSTGRES_DATABASE_URL + + +engine = create_engine( + POSTGRES_DATABASE_URL +) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() diff --git a/backend/envs.py b/backend/envs.py new file mode 100644 index 0000000..174b82f --- /dev/null +++ b/backend/envs.py @@ -0,0 +1,10 @@ +#POSTGRES DB TO TRACK USERS +POSTGRES_DATABASE_URL = "postgresql+psycopg2://postgres:postgres@localhost:5432/surfsense" + +# API KEY TO VERIFY +API_SECRET_KEY = "surfsense" + +# Your JWT secret and algorithm +SECRET_KEY = "your_secret_key" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 720 \ No newline at end of file diff --git a/backend/models.py b/backend/models.py new file mode 100644 index 0000000..5de9154 --- /dev/null +++ b/backend/models.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, Integer, String +from database import Base +from database import engine + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + username = Column(String, unique=True, index=True) + hashed_password = Column(String) + +# Create the database tables if they don't exist + +User.metadata.create_all(bind=engine) diff --git a/backend/prompts.py b/backend/prompts.py new file mode 100644 index 0000000..2a6a7f4 --- /dev/null +++ b/backend/prompts.py @@ -0,0 +1,84 @@ +from langchain_core.prompts.prompt import PromptTemplate +from langchain_core.prompts import ChatPromptTemplate +from datetime import datetime, timezone + + +DATE_TODAY = "Today's date is " + datetime.now(timezone.utc).astimezone().isoformat() + '\n' + +CYPHER_QA_TEMPLATE = DATE_TODAY + """You are an assistant that helps to form nice and human understandable answers. +The information part contains the provided information that you must use to construct an answer. +The provided information is authoritative, you must never doubt it or try to use your internal knowledge to correct it. +Make the answer sound as a response to the question. Do not mention that you based the result on the given information. +Here are the examples: + +Question: Website on which the most time was spend on? +Context:[{'d.VisitedWebPageURL': 'https://stackoverflow.com/questions/59873698/the-default-export-is-not-a-react-component-in-page-nextjs', 'totalDuration': 8889167}] +Helpful Answer: You visited https://stackoverflow.com/questions/59873698/the-default-export-is-not-a-react-component-in-page-nextjs for 8889167 milliseconds or 8889.167 seconds. + +Follow this example when generating answers. +If the provided information is empty, then and only then, return exactly 'don't know' as answer. + +Information: +{context} + +Question: {question} +Helpful Answer:""" + +CYPHER_QA_PROMPT = PromptTemplate( + input_variables=["context", "question"], template=CYPHER_QA_TEMPLATE +) + +SIMILARITY_SEARCH_RAG = DATE_TODAY + """You are an assistant for question-answering tasks. +Use the following pieces of retrieved context to answer the question. +If you don't know the answer, return exactly 'don't know' as answer. +Question: {question} +Context: {context} +Answer:""" + + +SIMILARITY_SEARCH_PROMPT = PromptTemplate( + input_variables=["context", "question"], template=SIMILARITY_SEARCH_RAG +) + +# doc_extract_chain = DOCUMENT_METADATA_EXTRACTION_PROMT | structured_llm + + +CYPHER_GENERATION_TEMPLATE = DATE_TODAY + """Task:Generate Cypher statement to query a graph database. +Instructions: +Use only the provided relationship types and properties in the schema. +Do not use any other relationship types or properties that are not provided. + +Schema: +{schema} +Note: Do not include any explanations or apologies in your responses. +Do not respond to any questions that might ask anything else than for you to construct a Cypher statement. +Do not include any text except the generated Cypher statement. + + +The question is: +{question}""" +CYPHER_GENERATION_PROMPT = PromptTemplate( + input_variables=["schema", "question"], template=CYPHER_GENERATION_TEMPLATE +) + + +DOC_DESCRIPTION_TEMPLATE = """Task:Give Detailed Description of the page content of the given document. +Instructions: +Provide as much details about metadata & page content as if you need to give human readable report of this Browsing session event. + +Document: +{document} +""" +DOC_DESCRIPTION_PROMPT = PromptTemplate( + input_variables=["document"], template=DOC_DESCRIPTION_TEMPLATE +) + + +DOCUMENT_METADATA_EXTRACTION_SYSTEM_MESSAGE = DATE_TODAY + """You are a helpful assistant. You are given a Cypher statement result after quering the Neo4j graph database. +Generate a very good Query that can be used to perform similarity search on the vector store of the Neo4j graph database""" + +DOCUMENT_METADATA_EXTRACTION_PROMT = ChatPromptTemplate.from_messages([("system", DOCUMENT_METADATA_EXTRACTION_SYSTEM_MESSAGE), ("human", "{input}")]) + + + + diff --git a/backend/pydmodels.py b/backend/pydmodels.py new file mode 100644 index 0000000..dad1201 --- /dev/null +++ b/backend/pydmodels.py @@ -0,0 +1,41 @@ +from pydantic import BaseModel, Field +from typing import List, Optional + +class UserQuery(BaseModel): + query: str + neourl: str + neouser: str + neopass: str + openaikey: str + apisecretkey: str + +class DescriptionResponse(BaseModel): + response: str + + +class DocMeta(BaseModel): + BrowsingSessionId: Optional[str] = Field(default=None, description="BrowsingSessionId of Document") + VisitedWebPageURL: Optional[str] = Field(default=None, description="VisitedWebPageURL of Document") + VisitedWebPageTitle: Optional[str] = Field(default=None, description="VisitedWebPageTitle of Document") + VisitedWebPageDateWithTimeInISOString: Optional[str] = Field(default=None, description="VisitedWebPageDateWithTimeInISOString of Document") + VisitedWebPageReffererURL: Optional[str] = Field(default=None, description="VisitedWebPageReffererURL of Document") + VisitedWebPageVisitDurationInMilliseconds: Optional[int] = Field(default=None, description="VisitedWebPageVisitDurationInMilliseconds of Document"), + VisitedWebPageContent: Optional[str] = Field(default=None, description="Visited WebPage Content in markdown of Document") + +class RetrivedDocListItem(BaseModel): + metadata: DocMeta + pageContent: str + +class RetrivedDocList(BaseModel): + documents: List[RetrivedDocListItem] + neourl: str + neouser: str + neopass: str + openaikey: str + apisecretkey: str + + +class UserQueryResponse(BaseModel): + response: str + relateddocs: List[DocMeta] + \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..b7eafc3 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,8 @@ +bcrypt +cryptography +fastapi +python-jose +python-multipart +SQLAlchemy +uvicorn +passlib \ No newline at end of file diff --git a/backend/server.py b/backend/server.py new file mode 100644 index 0000000..5b9cc77 --- /dev/null +++ b/backend/server.py @@ -0,0 +1,322 @@ +from __future__ import annotations + +from langchain.chains import GraphCypherQAChain +from langchain_community.graphs import Neo4jGraph +from langchain_core.documents import Document +from langchain_openai import OpenAIEmbeddings +from langchain_community.vectorstores import Neo4jVector +from envs import ACCESS_TOKEN_EXPIRE_MINUTES, ALGORITHM, API_SECRET_KEY, SECRET_KEY +from prompts import CYPHER_QA_PROMPT, DOC_DESCRIPTION_PROMPT, SIMILARITY_SEARCH_PROMPT , CYPHER_GENERATION_PROMPT, DOCUMENT_METADATA_EXTRACTION_PROMT +from pydmodels import DescriptionResponse, UserQuery, DocMeta, RetrivedDocList, UserQueryResponse +from langchain_experimental.text_splitter import SemanticChunker + +#Our Imps +from LLMGraphTransformer import LLMGraphTransformer +from langchain_openai import ChatOpenAI + +# Auth Libs +from fastapi import FastAPI, Depends, HTTPException, Request, status +from sqlalchemy.orm import Session +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from datetime import datetime, timedelta +from passlib.context import CryptContext +from models import User +from database import SessionLocal, engine +from pydantic import BaseModel +from fastapi.middleware.cors import CORSMiddleware + +app = FastAPI() + + + + + +@app.post("/") +def get_user_query_response(data: UserQuery, response_model=UserQueryResponse): + + if(data.apisecretkey != API_SECRET_KEY): + raise HTTPException(status_code=401, detail="Unauthorized") + + + query = data.query + + graph = Neo4jGraph(url=data.neourl, username=data.neouser, password=data.neopass) + + llm = ChatOpenAI( + model="gpt-4o-mini", + temperature=0, + max_tokens=None, + timeout=None, + api_key=data.openaikey + ) + + embeddings = OpenAIEmbeddings( + model="text-embedding-ada-002", + api_key=data.openaikey, + ) + + + chain = GraphCypherQAChain.from_llm( + graph=graph, + cypher_prompt=CYPHER_GENERATION_PROMPT, + cypher_llm=llm, + verbose=True, + validate_cypher=True, + qa_prompt=CYPHER_QA_PROMPT , + qa_llm=llm, + return_intermediate_steps=True, + top_k=5, + ) + + vector_index = Neo4jVector.from_existing_graph( + embeddings, + graph=graph, + search_type="hybrid", + node_label="Document", + text_node_properties=["text"], + embedding_node_property="embedding", + ) + + docs = vector_index.similarity_search(query,k=5) + + docstoreturn = [] + + for doc in docs: + docstoreturn.append( + DocMeta( + BrowsingSessionId=doc.metadata["BrowsingSessionId"] if "BrowsingSessionId" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageURL=doc.metadata["VisitedWebPageURL"] if "VisitedWebPageURL" in doc.metadata.keys()else "NOT AVAILABLE", + VisitedWebPageTitle=doc.metadata["VisitedWebPageTitle"] if "VisitedWebPageTitle" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageDateWithTimeInISOString= doc.metadata["VisitedWebPageDateWithTimeInISOString"] if "VisitedWebPageDateWithTimeInISOString" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageReffererURL= doc.metadata["VisitedWebPageReffererURL"] if "VisitedWebPageReffererURL" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageVisitDurationInMilliseconds= doc.metadata["VisitedWebPageVisitDurationInMilliseconds"] if "VisitedWebPageVisitDurationInMilliseconds" in doc.metadata.keys() else None, + VisitedWebPageContent= doc.page_content if doc.page_content else "NOT AVAILABLE" + ) + ) + + docstoreturn = [i for n, i in enumerate(docstoreturn) if i not in docstoreturn[n + 1:]] + + + try: + response = chain.invoke({"query": query}) + if "don't know" in response["result"]: + raise Exception("No response from graph") + + structured_llm = llm.with_structured_output(RetrivedDocList) + doc_extract_chain = DOCUMENT_METADATA_EXTRACTION_PROMT | structured_llm + + query = doc_extract_chain.invoke(response["intermediate_steps"][1]["context"]) + + docs = vector_index.similarity_search(query.searchquery,k=5) + + docstoreturn = [] + + for doc in docs: + docstoreturn.append( + DocMeta( + BrowsingSessionId=doc.metadata["BrowsingSessionId"] if "BrowsingSessionId" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageURL=doc.metadata["VisitedWebPageURL"] if "VisitedWebPageURL" in doc.metadata.keys()else "NOT AVAILABLE", + VisitedWebPageTitle=doc.metadata["VisitedWebPageTitle"] if "VisitedWebPageTitle" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageDateWithTimeInISOString= doc.metadata["VisitedWebPageDateWithTimeInISOString"] if "VisitedWebPageDateWithTimeInISOString" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageReffererURL= doc.metadata["VisitedWebPageReffererURL"] if "VisitedWebPageReffererURL" in doc.metadata.keys() else "NOT AVAILABLE", + VisitedWebPageVisitDurationInMilliseconds= doc.metadata["VisitedWebPageVisitDurationInMilliseconds"] if "VisitedWebPageVisitDurationInMilliseconds" in doc.metadata.keys() else None, + VisitedWebPageContent= doc.page_content if doc.page_content else "NOT AVAILABLE" + ) + ) + + docstoreturn = [i for n, i in enumerate(docstoreturn) if i not in docstoreturn[n + 1:]] + + return UserQueryResponse(relateddocs=docstoreturn,response=response["result"]) + except: + # Fallback to Similarity Search RAG + searchchain = SIMILARITY_SEARCH_PROMPT | llm + + response = searchchain.invoke({"question": query, "context": docs}) + + return UserQueryResponse(relateddocs=docstoreturn,response=response.content) + +# DOC DESCRIPTION +@app.post("/kb/doc") +def get_doc_description(data: UserQuery, response_model=DescriptionResponse): + if(data.apisecretkey != API_SECRET_KEY): + raise HTTPException(status_code=401, detail="Unauthorized") + + document = data.query + llm = ChatOpenAI( + model="gpt-4o-mini", + temperature=0, + max_tokens=None, + timeout=None, + api_key=data.openaikey + ) + + descriptionchain = DOC_DESCRIPTION_PROMPT | llm + + response = descriptionchain.invoke({"document": document}) + + return DescriptionResponse(response=response.content) + + +# SAVE DOCS TO GRAPH DB +@app.post("/kb/") +def populate_graph(apires: RetrivedDocList): + if(apires.apisecretkey != API_SECRET_KEY): + raise HTTPException(status_code=401, detail="Unauthorized") + + print("STARTED") + # print(apires) + graph = Neo4jGraph(url=apires.neourl, username=apires.neouser, password=apires.neopass) + + llm = ChatOpenAI( + model="gpt-4o-mini", + temperature=0, + max_tokens=None, + timeout=None, + api_key=apires.openaikey + ) + + embeddings = OpenAIEmbeddings( + model="text-embedding-ada-002", + api_key=apires.openaikey, + ) + + llm_transformer = LLMGraphTransformer(llm=llm) + + raw_documents = [] + + for doc in apires.documents: + raw_documents.append(Document(page_content=doc.pageContent, metadata=doc.metadata)) + + text_splitter = SemanticChunker(embeddings=embeddings) + + documents = text_splitter.split_documents(raw_documents) + graph_documents = llm_transformer.convert_to_graph_documents(documents) + + + graph.add_graph_documents( + graph_documents, + baseEntityLabel=True, + include_source=True + ) + + print("FINISHED") + + return { + "success": "Graph Will be populated Shortly" + } + + + + +#AUTH CODE +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + +# Recommended for Local Setups +# origins = [ +# "http://localhost:3000", # Adjust the port if your frontend runs on a different one +# "https://yourfrontenddomain.com", +# ] + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins from the list + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +# Dependency +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + + +class UserCreate(BaseModel): + username: str + password: str + apisecretkey: str + +def get_user_by_username(db: Session, username: str): + return db.query(User).filter(User.username == username).first() + +def create_user(db: Session, user: UserCreate): + hashed_password = pwd_context.hash(user.password) + db_user = User(username=user.username, hashed_password=hashed_password) + db.add(db_user) + db.commit() + return "complete" + +@app.post("/register") +def register_user(user: UserCreate, db: Session = Depends(get_db)): + if(user.apisecretkey != API_SECRET_KEY): + raise HTTPException(status_code=401, detail="Unauthorized") + + db_user = get_user_by_username(db, username=user.username) + if db_user: + raise HTTPException(status_code=400, detail="Username already registered") + + del user.apisecretkey + return create_user(db=db, user=user) + +# Authenticate the user +def authenticate_user(username: str, password: str, db: Session): + user = db.query(User).filter(User.username == username).first() + if not user: + return False + if not pwd_context.verify(password, user.hashed_password): + return False + return user + +# Create access token +def create_access_token(data: dict, expires_delta: timedelta | None = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + +@app.post("/token") +def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): + user = authenticate_user(form_data.username, form_data.password, db) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": user.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + + +def verify_token(token: str = Depends(oauth2_scheme)): + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise HTTPException(status_code=403, detail="Token is invalid or expired") + return payload + except JWTError: + raise HTTPException(status_code=403, detail="Token is invalid or expired") + +@app.get("/verify-token/{token}") +async def verify_user_token(token: str): + verify_token(token=token) + return {"message": "Token is valid"} + + +if __name__ == "__main__": + import uvicorn + + uvicorn.run(app, host="127.0.0.1", port=8000) \ No newline at end of file diff --git a/extension/.gitignore b/extension/.gitignore new file mode 100644 index 0000000..30d15a5 --- /dev/null +++ b/extension/.gitignore @@ -0,0 +1,4 @@ +npm-debug.log +node_modules/ +dist/ +tmp/ \ No newline at end of file diff --git a/extension/.vscode/settings.json b/extension/.vscode/settings.json new file mode 100644 index 0000000..193c9e4 --- /dev/null +++ b/extension/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "typescript.tsdk": "./node_modules/typescript/lib", + "files.eol": "\n", + "json.schemas": [ + { + "fileMatch": [ + "/manifest.json" + ], + "url": "http://json.schemastore.org/chrome-manifest" + } + ] +} \ No newline at end of file diff --git a/extension/.vscode/tasks.json b/extension/.vscode/tasks.json new file mode 100644 index 0000000..b1f6ab4 --- /dev/null +++ b/extension/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "command": "npm", + "tasks": [ + { + "label": "install", + "type": "shell", + "command": "npm", + "args": ["install"] + }, + { + "label": "update", + "type": "shell", + "command": "npm", + "args": ["update"] + }, + { + "label": "test", + "type": "shell", + "command": "npm", + "args": ["run", "test"] + }, + { + "label": "build", + "type": "shell", + "group": "build", + "command": "npm", + "args": ["run", "watch"] + } + ] +} \ No newline at end of file diff --git a/extension/LICENSE b/extension/LICENSE new file mode 100644 index 0000000..02e7ca2 --- /dev/null +++ b/extension/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Tomofumi Chiba + +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/extension/README.md b/extension/README.md new file mode 100644 index 0000000..593f6a2 --- /dev/null +++ b/extension/README.md @@ -0,0 +1,70 @@ +# Chrome Extension TypeScript Starter + +![build](https://github.com/chibat/chrome-extension-typescript-starter/workflows/build/badge.svg) + +Chrome Extension, TypeScript and Visual Studio Code + +## Prerequisites + +* [node + npm](https://nodejs.org/) (Current Version) + +## Option + +* [Visual Studio Code](https://code.visualstudio.com/) + +## Includes the following + +* TypeScript +* Webpack +* React +* Jest +* Example Code + * Chrome Storage + * Options Version 2 + * content script + * count up badge number + * background + +## Project Structure + +* src/typescript: TypeScript source files +* src/assets: static files +* dist: Chrome Extension directory +* dist/js: Generated JavaScript files + +## Setup + +``` +npm install +``` + +## Import as Visual Studio Code project + +... + +## Build + +``` +npm run build +``` + +## Build in watch mode + +### terminal + +``` +npm run watch +``` + +### Visual Studio Code + +Run watch mode. + +type `Ctrl + Shift + B` + +## Load extension to chrome + +Load `dist` directory + +## Test +`npx jest` or `npm run test` diff --git a/extension/jest.config.js b/extension/jest.config.js new file mode 100644 index 0000000..18cbe79 --- /dev/null +++ b/extension/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + "roots": [ + "src" + ], + "transform": { + "^.+\\.ts$": ["ts-jest", { tsconfig: "tsconfig.test.json" }] + }, +}; diff --git a/extension/package-lock.json b/extension/package-lock.json new file mode 100644 index 0000000..329bb7c --- /dev/null +++ b/extension/package-lock.json @@ -0,0 +1,5033 @@ +{ + "name": "chrome-extension-typescript-starter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chrome-extension-typescript-starter", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/chrome": "0.0.158", + "@types/jest": "^29.5.0", + "@types/react": "^18.0.29", + "@types/react-dom": "^18.0.11", + "copy-webpack-plugin": "^9.0.1", + "glob": "^7.1.6", + "jest": "^29.5.0", + "prettier": "^2.2.1", + "rimraf": "^3.0.2 ", + "ts-jest": "^29.1.0", + "ts-loader": "^8.0.0", + "typescript": "^5.0.4", + "webpack": "^5.76.0", + "webpack-cli": "^4.0.0", + "webpack-merge": "^5.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "dev": true, + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.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==", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.158", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.158.tgz", + "integrity": "sha512-sjBs9E/XDlYyLf3YkPYIN6sFZ/d9LbwMSK+BYphenFdkk39M5P8xcRfykk54RgZr8/QMex1yKlX5EB52TaqhsQ==", + "dev": true, + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/filesystem": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "dev": true, + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.10.tgz", + "integrity": "sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.1.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.3.tgz", + "integrity": "sha512-NP2yfZpgmf2eDRPmgGq+fjGjSwFgYbihA8/gK+ey23qT9RkxsgNTZvGOEpXgzIGqesTYkElELLgtKoMQTys5vA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "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/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@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.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-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==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copy-webpack-plugin": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "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==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", + "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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==", + "dev": true + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "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/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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==", + "dev": true + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "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.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "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/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==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/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==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", + "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-loader": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", + "integrity": "sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "*" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", + "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.0", + "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.9", + "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.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "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-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/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==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.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==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/extension/package.json b/extension/package.json new file mode 100644 index 0000000..bf2208b --- /dev/null +++ b/extension/package.json @@ -0,0 +1,52 @@ +{ + "name": "chrome-extension-typescript-starter", + "version": "1.0.0", + "description": "chrome-extension-typescript-starter", + "main": "index.js", + "scripts": { + "watch": "webpack --config webpack/webpack.dev.js --watch", + "build": "webpack --config webpack/webpack.prod.js", + "clean": "rimraf dist", + "test": "npx jest", + "style": "prettier --write \"src/**/*.{ts,tsx}\"" + }, + "author": "", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/chibat/chrome-extension-typescript-starter.git" + }, + "dependencies": { + "dom-to-semantic-markdown": "^1.2.0", + "postcss-loader": "^8.1.1", + "react": "^18.2.0", + "react-chrome-extension-router": "^1.4.0", + "react-dom": "^18.2.0", + "react-hooks-global-state": "^2.1.0", + "react-router-dom": "^6.26.0", + "react-toastify": "^10.0.5" + }, + "devDependencies": { + "@types/chrome": "0.0.158", + "@types/jest": "^29.5.0", + "@types/json2md": "^1.5.4", + "@types/react": "^18.0.29", + "@types/react-dom": "^18.0.11", + "autoprefixer": "^10.4.19", + "copy-webpack-plugin": "^9.0.1", + "css-loader": "^7.1.2", + "glob": "^7.1.6", + "jest": "^29.5.0", + "postcss": "^8.4.40", + "prettier": "^2.2.1", + "rimraf": "^3.0.2 ", + "style-loader": "^4.0.0", + "tailwindcss": "^3.4.7", + "ts-jest": "^29.1.0", + "ts-loader": "^8.0.0", + "typescript": "^5.0.4", + "webpack": "^5.76.0", + "webpack-cli": "^4.0.0", + "webpack-merge": "^5.0.0" + } +} diff --git a/extension/pnpm-lock.yaml b/extension/pnpm-lock.yaml new file mode 100644 index 0000000..33bc24e --- /dev/null +++ b/extension/pnpm-lock.yaml @@ -0,0 +1,4622 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + dom-to-semantic-markdown: + specifier: ^1.2.0 + version: 1.2.0 + postcss-loader: + specifier: ^8.1.1 + version: 8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(webpack-cli@4.10.0)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-chrome-extension-router: + specifier: ^1.4.0 + version: 1.4.0(react@18.3.1) + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-hooks-global-state: + specifier: ^2.1.0 + version: 2.1.0(react@18.3.1) + react-router-dom: + specifier: ^6.26.0 + version: 6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-toastify: + specifier: ^10.0.5 + version: 10.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@types/chrome': + specifier: 0.0.158 + version: 0.0.158 + '@types/jest': + specifier: ^29.5.0 + version: 29.5.12 + '@types/json2md': + specifier: ^1.5.4 + version: 1.5.4 + '@types/react': + specifier: ^18.0.29 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.40) + copy-webpack-plugin: + specifier: ^9.0.1 + version: 9.1.0(webpack@5.93.0(webpack-cli@4.10.0)) + css-loader: + specifier: ^7.1.2 + version: 7.1.2(webpack@5.93.0(webpack-cli@4.10.0)) + glob: + specifier: ^7.1.6 + version: 7.2.3 + jest: + specifier: ^29.5.0 + version: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + postcss: + specifier: ^8.4.40 + version: 8.4.40 + prettier: + specifier: ^2.2.1 + version: 2.8.8 + rimraf: + specifier: '^3.0.2 ' + version: 3.0.2 + style-loader: + specifier: ^4.0.0 + version: 4.0.0(webpack@5.93.0(webpack-cli@4.10.0)) + tailwindcss: + specifier: ^3.4.7 + version: 3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + ts-jest: + specifier: ^29.1.0 + version: 29.2.3(@babel/core@7.24.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.9))(jest@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)))(typescript@5.5.4) + ts-loader: + specifier: ^8.0.0 + version: 8.4.0(typescript@5.5.4)(webpack@5.93.0(webpack-cli@4.10.0)) + typescript: + specifier: ^5.0.4 + version: 5.5.4 + webpack: + specifier: ^5.76.0 + version: 5.93.0(webpack-cli@4.10.0) + webpack-cli: + specifier: ^4.0.0 + version: 4.10.0(webpack@5.93.0) + webpack-merge: + specifier: ^5.0.0 + version: 5.10.0 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.9': + resolution: {integrity: sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.9': + resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.10': + resolution: {integrity: sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.8': + resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.9': + resolution: {integrity: sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.8': + resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.8': + resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.8': + resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.9': + resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@remix-run/router@1.19.0': + resolution: {integrity: sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==} + engines: {node: '>=14.0.0'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/chrome@0.0.158': + resolution: {integrity: sha512-sjBs9E/XDlYyLf3YkPYIN6sFZ/d9LbwMSK+BYphenFdkk39M5P8xcRfykk54RgZr8/QMex1yKlX5EB52TaqhsQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.0': + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json2md@1.5.4': + resolution: {integrity: sha512-OFTAYD7Nnyu7FZPGnDwYbGOTKqzDfX71uFSgTbGhcr0aHCi17QkSOY3wO5H4yv5h23Ly+7suvf2lzHcdeDIH2Q==} + + '@types/node@20.14.12': + resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@webpack-cli/configtest@1.2.0': + resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} + peerDependencies: + webpack: 4.x.x || 5.x.x + webpack-cli: 4.x.x + + '@webpack-cli/info@1.5.0': + resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} + peerDependencies: + webpack-cli: 4.x.x + + '@webpack-cli/serve@1.7.0': + resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} + peerDependencies: + webpack-cli: 4.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001643: + resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-webpack-plugin@9.1.0: + resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.1.0 + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-to-semantic-markdown@1.2.0: + resolution: {integrity: sha512-eCvlkf43b/d6PW5IbsNkkyPpPFRNJTdbSz9XSlWYXCrLLTQRxVEpt5Wte8IlMvS5YIfjU4TCv7rxFPZEXX7oGQ==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.1: + resolution: {integrity: sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@4.5.0: + resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} + engines: {node: '>=6.9.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} + hasBin: true + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + memory-fs@0.5.0: + resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-loader@8.1.1: + resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-chrome-extension-router@1.4.0: + resolution: {integrity: sha512-ngf7DMVGIcr0w8Fp3Eo6nufi3L1mQqLz1xLfvzD1YBPI8zLSKAS9PP3pUS+vp7oeE62ZKxcFJiUC6OFKuBQ6Cg==} + peerDependencies: + react: '>=16' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-hooks-global-state@2.1.0: + resolution: {integrity: sha512-tLSRhB5pD3QiNsGOo893m8lVZXDuIkdin8PKKmGqnJniAaD/tzl3BdAkba1vOv1/q1bpuN+9zrqqAHkRJhXzJw==} + peerDependencies: + react: '>=16.8.0' + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-router-dom@6.26.0: + resolution: {integrity: sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.26.0: + resolution: {integrity: sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-toastify@10.0.5: + resolution: {integrity: sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.7.1: + resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} + engines: {node: '>= 0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@3.4.7: + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.3: + resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-jest@29.2.3: + resolution: {integrity: sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@8.4.0: + resolution: {integrity: sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw==} + engines: {node: '>=10.0.0'} + peerDependencies: + typescript: '*' + webpack: '*' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + useful@0.7.23: + resolution: {integrity: sha512-Zs8nJQH2ZjyuYxlbclPFnnv2FkrsPSRKM9Kdd3kVX2qc8Paq0q0ZL1AOICIeEemV13SuHw3E/GpPfyHf+7JrOg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + webpack-cli@4.10.0: + resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + '@webpack-cli/migrate': '*' + webpack: 4.x.x || 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + '@webpack-cli/migrate': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.93.0: + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zustand@4.0.0: + resolution: {integrity: sha512-OrsfQTnRXF1LZ9/vR/IqN9ws5EXUhb149xmPjErZnUrkgxS/gAHGy2dPNIVkVvoxrVe1sIydn4JjF0dYHmGeeQ==} + engines: {node: '>=12.7.0'} + peerDependencies: + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + immer: + optional: true + react: + optional: true + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.24.9': {} + + '@babel/core@7.24.9': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.10 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) + '@babel/helpers': 7.24.8 + '@babel/parser': 7.24.8 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.10': + dependencies: + '@babel/types': 7.24.9 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.24.8': + dependencies: + '@babel/compat-data': 7.24.9 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.9 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.9 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.9 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.9 + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.24.8': + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.9 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.24.8': + dependencies: + '@babel/types': 7.24.9 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/template@7.24.7': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + + '@babel/traverse@7.24.8': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.10 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.9': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + + '@discoveryjs/json-ext@0.5.7': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.14.12 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.14.12 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.9 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.14.12 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@remix-run/router@1.19.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.9 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.24.9 + + '@types/chrome@0.0.158': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.15 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.0 + '@types/estree': 1.0.5 + + '@types/eslint@9.6.0': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.14.12 + + '@types/har-format@1.2.15': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/json2md@1.5.4': {} + + '@types/node@20.14.12': + dependencies: + undici-types: 5.26.5 + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + 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 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + 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 + + '@webassemblyjs/wasm-gen@1.12.1': + 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 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + 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 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack@5.93.0))(webpack@5.93.0(webpack-cli@4.10.0))': + dependencies: + webpack: 5.93.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack@5.93.0) + + '@webpack-cli/info@1.5.0(webpack-cli@4.10.0(webpack@5.93.0))': + dependencies: + envinfo: 7.13.0 + webpack-cli: 4.10.0(webpack@5.93.0) + + '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0(webpack@5.93.0))': + dependencies: + webpack-cli: 4.10.0(webpack@5.93.0) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + optional: true + + acorn@8.12.1: {} + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: + optional: true + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + async@3.2.5: {} + + autoprefixer@10.4.19(postcss@8.4.40): + dependencies: + browserslist: 4.23.2 + caniuse-lite: 1.0.30001643 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-value-parser: 4.2.0 + + babel-jest@29.7.0(@babel/core@7.24.9): + dependencies: + '@babel/core': 7.24.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.9 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.9): + dependencies: + '@babel/core': 7.24.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) + + babel-preset-jest@29.6.3(@babel/core@7.24.9): + dependencies: + '@babel/core': 7.24.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.9) + + balanced-match@1.0.2: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.2: + dependencies: + caniuse-lite: 1.0.30001643 + electron-to-chromium: 1.5.1 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001643: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + cjs-module-lexer@1.3.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@2.1.1: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + copy-webpack-plugin@9.1.0(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 11.1.0 + normalize-path: 3.0.0 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + webpack: 5.93.0(webpack-cli@4.10.0) + + core-util-is@1.0.3: {} + + cosmiconfig@9.0.0(typescript@5.5.4): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.4 + + create-jest@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: + optional: true + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@7.1.2(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.40) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.40) + postcss-modules-scope: 3.2.0(postcss@8.4.40) + postcss-modules-values: 4.0.0(postcss@8.4.40) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(webpack-cli@4.10.0) + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + dedent@1.5.3: {} + + deepmerge@4.3.1: {} + + detect-newline@3.1.0: {} + + didyoumean@1.2.2: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: + optional: true + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + dom-to-semantic-markdown@1.2.0: + dependencies: + useful: 0.7.23 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.1: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@4.5.0: + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.5.0 + tapable: 1.1.3 + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + env-paths@2.2.1: {} + + envinfo@7.13.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-module-lexer@1.5.4: {} + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + 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 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-package-type@0.1.0: {} + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + human-signals@2.1.0: {} + + icss-utils@5.1.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + interpret@2.2.0: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-stream@2.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.24.9 + '@babel/parser': 7.24.8 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.24.9 + '@babel/parser': 7.24.8 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.5 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.24.9 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.9) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.12 + ts-node: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.14.12 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.24.9 + '@babel/generator': 7.24.10 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.9) + '@babel/types': 7.24.9 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.9) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 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 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.12 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.14.12 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.14.12 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jiti@1.21.6: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json5@2.2.3: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + leven@3.1.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.memoize@4.1.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + memory-fs@0.5.0: + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-int64@0.4.0: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss-import@15.1.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.40): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.40 + + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.40 + ts-node: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) + + postcss-loader@8.1.1(postcss@8.4.40)(typescript@5.5.4)(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + cosmiconfig: 9.0.0(typescript@5.5.4) + jiti: 1.21.6 + postcss: 8.4.40 + semver: 7.6.3 + optionalDependencies: + webpack: 5.93.0(webpack-cli@4.10.0) + transitivePeerDependencies: + - typescript + + postcss-modules-extract-imports@3.1.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + + postcss-modules-local-by-default@4.0.5(postcss@8.4.40): + dependencies: + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 + + postcss-modules-values@4.0.0(postcss@8.4.40): + dependencies: + icss-utils: 5.1.0(postcss@8.4.40) + postcss: 8.4.40 + + postcss-nested@6.2.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + postcss-selector-parser: 6.1.1 + + postcss-selector-parser@6.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.40: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prettier@2.8.8: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prr@1.0.1: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-chrome-extension-router@1.4.0(react@18.3.1): + dependencies: + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-hooks-global-state@2.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + zustand: 4.0.0(react@18.3.1) + transitivePeerDependencies: + - immer + + react-is@18.3.1: {} + + react-router-dom@6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.26.0(react@18.3.1) + + react-router@6.26.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.0 + react: 18.3.1 + + react-toastify@10.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.7.1: + dependencies: + resolve: 1.22.8 + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-js@1.2.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spark-md5@3.0.2: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + style-loader@4.0.0(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + webpack: 5.93.0(webpack-cli@4.10.0) + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-import: 15.1.0(postcss@8.4.40) + postcss-js: 4.0.1(postcss@8.4.40) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.4.40) + postcss-selector-parser: 6.1.1 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@1.1.3: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.10(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.93.0(webpack-cli@4.10.0) + + terser@5.31.3: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + ts-jest@29.2.3(@babel/core@7.24.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.9))(jest@29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.14.12)(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.24.9 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.9) + + ts-loader@8.4.0(typescript@5.5.4)(webpack@5.93.0(webpack-cli@4.10.0)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 4.5.0 + loader-utils: 2.0.4 + micromatch: 4.0.7 + semver: 7.6.3 + typescript: 5.5.4 + webpack: 5.93.0(webpack-cli@4.10.0) + + ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.12 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + typescript@5.5.4: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.1.0(browserslist@4.23.2): + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + useful@0.7.23: + dependencies: + spark-md5: 3.0.2 + + util-deprecate@1.0.2: {} + + v8-compile-cache-lib@3.0.1: + optional: true + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webpack-cli@4.10.0(webpack@5.93.0): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack@5.93.0))(webpack@5.93.0(webpack-cli@4.10.0)) + '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0(webpack@5.93.0)) + '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0(webpack@5.93.0)) + colorette: 2.0.20 + commander: 7.2.0 + cross-spawn: 7.0.3 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 2.2.0 + rechoir: 0.7.1 + webpack: 5.93.0(webpack-cli@4.10.0) + webpack-merge: 5.10.0 + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.93.0(webpack-cli@4.10.0): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.93.0(webpack-cli@4.10.0)) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 4.10.0(webpack@5.93.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.5.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: + optional: true + + yocto-queue@0.1.0: {} + + zustand@4.0.0(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + react: 18.3.1 diff --git a/extension/postcss.config.js b/extension/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/extension/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/extension/public/brain.png b/extension/public/brain.png new file mode 100644 index 0000000000000000000000000000000000000000..7d54b178a6770d0074c5a8d4cba37fcd5204ebaa GIT binary patch literal 5816 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 V{+N8%g;W3l002ovPDHLkV1hMo+s*(0 literal 0 HcmV?d00001 diff --git a/extension/public/icon-16.png b/extension/public/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1330096fb574a8f30c236de80b055629171238 GIT binary patch literal 587 zcmV-R0<`^!P)uvbQ}Z%U~MD}Gr|uvAL1VN0x7OR#-tno>}+cuJ);OsC5-ePf)*R7|mQU!PA` zwp>cCiBF+qTDML_sYYYGmU@t7T&Z4GwklVvY@o_`tImI^&2nkIt%`w8Ww>Kgq%%FC zGCZJ>b&yP5xMyCrb!4eEe92c=wRvQrKR}+AOO*&gkDNY?KS`wwu4GfPGFhT8RG;kR-1_d{O<0&xlEDQJU$1kgz=pN8-0-&C@R`i( z$fvHyspWnHm58H!8dPwr6G^761StLPQHe1|imf5W~gT&k0q>kVFPWD&-4R5i7EHcpxF* z@^#DNIv1B6%$*z=Y~cpyWMsg^|3$!n|Q9jfBn9_{zPiSVH4^;%)&5?<9HUF zH5kZVdq2%!&~~y38O|8z> zE2NiA=GmiPaQDeI61QThcxYa{Hpbd4nO<1>3Q?*e_uhBn%;Xi?SN~VlSpk7g{ zRY|I8Nvd&Op1{!LYG1e?D~3KhoxLD?C`Oq2!&LUKNCg^kt4No;lX9sPXafpQmUxMO zXO;N;{L;{{OjWkRJby@Axy(F(CNhquBYOSt(L8j-($TZ3hJIyKroBm#L}CD~K z+PGx(`TN7B#ffi`s-)Jvx!)8sjqRlX!2xqk@`gSf|G)ede%M>$6qlw{R1- z<9wXNn17cx6KXm>W1L}@-Q?oa)3oZ`yi&61PqFD)wd(%mw$SVNS~sw(OR`o^xLSXO zCS&X_0008INkl_JH8!c5W^Ae00c{Sh; z31rt035BTf4^HP&L&K8O*}BjS1?H_wFLXL{aDo>W);C&O7Z+PwHr7vvOJX^cCS~GX zn2LB|==1%akQ$!jnRw>C4yUBh+rV8f+}QMC#3Lg#>lps(Fq(3+1AkWRCkc!aKIO5Ik6Avmy&gbGZhoWdXOmO2i zT%aW{9c+T)*I1CLgLe>wH6MYPS%jW=p5xjzJ%-+EI=rC!P>AjVnLU;AP&)@pW=}GJ zj*I&QI%IYomCWv*Jrbm}?-glJA^$$Wgb4T_egboWmFo_jJ~IFS002ovPDHLkV1lNc Bi7fyC literal 0 HcmV?d00001 diff --git a/extension/public/icon-48.png b/extension/public/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5ac9d7dc142204484283c58d4332b9613bd226 GIT binary patch literal 2209 zcmV;S2wwMzP)}+@;ZWwaFJ$Q zx2ZRM=kNCHC4fa^z2K}|Yhk*_=JpyTek!2j4jp&=<+|xagS{$!tsi>PNQ{6edQPwA z!Ip0N%3Ex`>F~Hy>ataiN}lISg9Xd*ExE|R5`3SeaPlGf!`#4vPhM5N~gX^lIyr#R5Ysh!Bu5j zw>T!04VvGUc!*+CsoLr8{OG}|S(^IHb=EfR#**5S7X@F_E4G5AS<?Hz%EOFu9Tigq& zdyi^cXWgrN?>+wPy)V-b>8JgppMF2ddwKcX-#zEtd+s?8fd2|U{I??^fv*N$j734R ze?OFBSqebiLOg%i)-`;9CEB=fm(${l=I9&+1+yXm@F67cg+dU>0`dF7Q6!*5Ml_cb zqChl%$lPnE=ZFAcL3ogs^n_qx>U;por$>^a==8bi8YkbNDuM-+Vv?}+kdXu^hRI_5 zcSJxHGT{S2V`fH1eQmVE24vC1z?hRcsS%1xgU}EfeQ0Tx6oSc-M2I<~{zQGo3Zs4D zjDA=Qjhl|Mq&7G>%3rDU$6ta5Y-BmHEVEvJLO-H5#Ad)xUEVo5%Se|Lt48w%RK-#0_Qj$Eas9jx@CQrJQ#h_@Q;ri0gmwrszLpEv@NKAMwih$VJ1z1opJ2s#|e&t))1^^{!-?OR- zyHhjX7!&46UfsF#PTJTCG;UgQTS~G#DR%beq%P%r6Jy4^_YyjNKfy9c|pr?{f>{@y!- zcNBVW*+6N`wKX|9Ds3W~wYQrKn9sm8N^i+itJ<&dr+vR8H$@bCb;k z3{-Ifx95is@9OxesI6Vy*{*JHtL*G-*(#XoHie<7=-LB0B73r?rdC6XV9eJKI)3fw z?tb*BySwB2yPF;gyryCc2HtUvJ^5gDPqvP*3Iut#u0QD7{zu=g`@eME@)B4C5?(w- zId%@}4u{$-2n2$>ym5K`{aeT6<)H^G7`g?YaM65~LqYK3NsD0L_*s}IPsVfX^YVJl z&D)=b07eAVNF571OeWz3zh4t_JbujGPK?-x1XCE54!{Me5v-%Iz!@?I3m&$P;5cx= za&P?^TVQmH(Am09I znJ|hI08$)oI}cD=laz%8Tnq<)o5<1siWRGcxW&^;eeCEEtoWf|4OTlMJr^2mJh?vBY&$y&FkpbFuK~eS-iV6m*12mI3Xdqv` z^Y&YV5*eCgNvHXvN&)0UeuDczzC;4|1XKWh;>7mxq&AY2EJ25Qh?UhZa;&yJvqmTm z3NCe6AW6Q=>l1Y7Xc`wlL&B<6tFXXN!V!|bLPIMTV0RA|1qvy}3NvaZ1DYc-Kl@ZF?jUg&M_TB; z7&jRw4rmH-)k=w~Qy*okVEEz-&)K=K_`I|xdm(jR>q>C0C%Z}n_$ODsU}NRVlZ3RU z=NuUs`50RB)100000NkvXXu0mjf#j!%; literal 0 HcmV?d00001 diff --git a/extension/public/manifest.json b/extension/public/manifest.json new file mode 100644 index 0000000..43de8f3 --- /dev/null +++ b/extension/public/manifest.json @@ -0,0 +1,38 @@ +{ + "manifest_version": 3, + + "name": "SurfSense", + "description": "Extension to collect Browsing History for SurfSense.", + "version": "0.0.1", + + "action": { + "default_popup": "popup.html" + }, + "icons": { + "16": "icon-16.png", + "32": "icon-32.png", + "48": "icon-48.png", + "128": "icon-128.png" + }, + + "content_scripts": [ + { + "matches": [""], + "js": ["js/content_script.js"] + } + ], + + "background": { + "service_worker": "js/background.js" + }, + + "permissions": [ + "storage", + "scripting", + "unlimitedStorage" + ], + + "host_permissions": [ + "" + ] +} diff --git a/extension/public/options.html b/extension/public/options.html new file mode 100644 index 0000000..622f71f --- /dev/null +++ b/extension/public/options.html @@ -0,0 +1,12 @@ + + + + My Test Extension Options + + + + +
+ + + \ No newline at end of file diff --git a/extension/public/popup.html b/extension/public/popup.html new file mode 100644 index 0000000..ac321bd --- /dev/null +++ b/extension/public/popup.html @@ -0,0 +1,13 @@ + + + + + Getting Started Extension's Popup + + + +
+ + + + diff --git a/extension/src/__tests__/sum.ts b/extension/src/__tests__/sum.ts new file mode 100644 index 0000000..c24fe20 --- /dev/null +++ b/extension/src/__tests__/sum.ts @@ -0,0 +1,9 @@ +import { sum } from "../sum"; + +test("1 + 1 = 2", () => { + expect(sum(1, 1)).toBe(2); +}); + +test("1 + 2 != 2", () => { + expect(sum(1, 2)).not.toBe(2); +}); diff --git a/extension/src/assets/tailwind.css b/extension/src/assets/tailwind.css new file mode 100644 index 0000000..63abf68 --- /dev/null +++ b/extension/src/assets/tailwind.css @@ -0,0 +1,39 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.loading{ + margin: 0; + box-sizing: border-box; + display: flex; + justify-content: center; + align-items: center; + height: 80vh; +} + +body { + min-width: 400px; +} + +.btn1 { + width: 50px; + height: 50px; + border-radius: 25px; + border: none; + background-color: hotpink; + color: white; + font-size: 1.2em; +} + +@keyframes move { + 25% { + transform: translateY(50px); + } + 50% { + background-color: dodgerblue; + transform: translateY(0px); + } + 75% { + transform: translateY(-50px); + } +} diff --git a/extension/src/background.ts b/extension/src/background.ts new file mode 100644 index 0000000..03ef2e6 --- /dev/null +++ b/extension/src/background.ts @@ -0,0 +1,454 @@ +import { + initWebHistory, + getRenderedHtml, + initQueues, +} from "./commons"; +import { WebHistory } from "./interfaces"; + +chrome.tabs.onCreated.addListener(async (tab: any) => { + try { + await initWebHistory(tab.id); + await initQueues(tab.id); + } catch (error) { + console.log(error); + } +}); + +chrome.tabs.onUpdated.addListener( + async (tabId: number, changeInfo: any, tab: any) => { + if (changeInfo.status === "complete" && tab.url) { + await initWebHistory(tab.id); + await initQueues(tab.id); + + const result = await chrome.scripting.executeScript({ + // @ts-ignore + target: { tabId: tab.id }, + // @ts-ignore + function: getRenderedHtml, + }); + + let toPushInTabHistory = result[0].result; // const { renderedHtml, title, url, entryTime } = result[0].result; + + let urlQueueListObj = await chrome.storage.local.get(["urlQueueList"]); + let timeQueueListObj = await chrome.storage.local.get(["timeQueueList"]); + + urlQueueListObj.urlQueueList + .find((data: WebHistory) => data.tabsessionId === tabId) + .urlQueue.push(toPushInTabHistory.url); + timeQueueListObj.timeQueueList + .find((data: WebHistory) => data.tabsessionId === tabId) + .timeQueue.push(toPushInTabHistory.entryTime); + + await chrome.storage.local.set({ + urlQueueList: urlQueueListObj.urlQueueList, + }); + await chrome.storage.local.set({ + timeQueueList: timeQueueListObj.timeQueueList, + }); + } + } +); + +chrome.tabs.onRemoved.addListener(async (tabId: number, removeInfo: object) => { + let urlQueueListObj = await chrome.storage.local.get(["urlQueueList"]); + let timeQueueListObj = await chrome.storage.local.get(["timeQueueList"]); + if(urlQueueListObj.urlQueueList && timeQueueListObj.timeQueueList){ + + const urlQueueListToSave = urlQueueListObj.urlQueueList.map((element: WebHistory) => { + if(element.tabsessionId !== tabId){ + return element + } + }) + const timeQueueListSave = timeQueueListObj.timeQueueList.map((element: WebHistory) => { + if(element.tabsessionId !== tabId){ + return element + } + }) + await chrome.storage.local.set({ + urlQueueList: urlQueueListToSave.filter((item: any) => item), + }); + await chrome.storage.local.set({ + timeQueueList: timeQueueListSave.filter((item: any) => item), + }); + + } + +}); + + +///// IGONRE THESE COMMENTS THESE CONTAINS SOME IDEAS THAT NEVER WORKED AS INTENTDED +// await initWebHistory(tabId); +// console.log("tab", tab); +// if (tab.status === "loading") { +// if (tab.url) { +// const autotrackerFlag = await chrome.storage.local.get(["autoTracker"]); + +// const lastUrlObj = await chrome.storage.local.get(["lastUrl"]); + +// if (autotrackerFlag.autoTracker) { +// if (lastUrlObj.lastUrl[tabId] !== "START") { +// console.log("loading"); +// console.log(lastUrlObj.lastUrl[tabId]); +// //update last entry duration +// try { +// const lastEntryTimeObj = await chrome.storage.local.get([ +// "lastEntryTime", +// ]); +// let webhistoryObj = await chrome.storage.local.get([ +// "webhistory", +// ]); +// const webHistoryLength = webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory.length; + +// if(webHistoryLength > 0){ +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].duration = +// Date.now() - lastEntryTimeObj.lastEntryTime[tabId]; +// } + +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } +// } +// } +// } +// } + +// const autotrackerFlag = await chrome.storage.local.get(["autoTracker"]); +// if (!autotrackerFlag.autoTracker) { +// await initURlQueue(tab.id); +// } + +// const lastUrl = { +// // @ts-ignore +// [tab.id]: "START", +// }; + +// // console.log(lastUrl); + +// await chrome.storage.local.set({ +// lastUrl: lastUrl, +// }); + +// const lastEntryTime = { +// // @ts-ignore +// [tab.id]: Date.now(), +// }; + +// // console.log(lastUrl); + +// await chrome.storage.local.set({ +// lastEntryTime: lastEntryTime, +// }); + +// let webhistoryObj = await chrome.storage.local.get(["webhistory"]); +// const webHistoryOfTabId = webhistoryObj.webhistory.filter( +// (data: WebHistory) => { +// return data.tabsessionId === tab.id; +// } +// ); +// let tabhistory = webHistoryOfTabId[0].tabHistory; + +// if (tabhistory.length === 0) { +// toPushInTabHistory.reffererUrl = "START"; +// } else { +// toPushInTabHistory.reffererUrl = tabhistory[tabhistory.length - 1].url; +// tabhistory[tabhistory.length - 1].duration = +// toPushInTabHistory.entryTime - +// tabhistory[tabhistory.length - 1].entryTime; +// } + +// tabhistory.push(toPushInTabHistory); + +// //Update Webhistory +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; + +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } + +// const autotrackerFlag = await chrome.storage.local.get(["autoTracker"]); +// if (autotrackerFlag.autoTracker) { +// const result = await chrome.scripting.executeScript({ +// // @ts-ignore +// target: { tabId: tab.id }, +// // @ts-ignore +// function: getRenderedHtml, +// }); + +// let toPushInTabHistory = result[0].result; // const { renderedHtml, title, url, entryTime } = result[0].result; + +// // //Updates 'tabhistory' +// let webhistoryObj = await chrome.storage.local.get(["webhistory"]); + +// const webHistoryOfTabId = webhistoryObj.webhistory.filter( +// (data: WebHistory) => { +// return data.tabsessionId === tab.id; +// } +// ); + +// let tabhistory = webHistoryOfTabId[0].tabHistory; + +// // let lastUrlObj = await chrome.storage.local.get(["lastUrl"]); +// const lastEntryTimeObj = await chrome.storage.local.get([ +// "lastEntryTime", +// ]); +// lastEntryTimeObj.lastEntryTime[tabId] = Date.now(); + +// await chrome.storage.local.set({ +// lastEntryTime: lastEntryTimeObj.lastEntryTime, +// }); + +// //When first entry +// if (tabhistory.length === 0) { +// let lastUrlObj = await chrome.storage.local.get(["lastUrl"]); +// lastUrlObj.lastUrl[tabId] = tab.url; +// await chrome.storage.local.set({ +// lastUrl: lastUrlObj.lastUrl, +// }); + +// toPushInTabHistory.reffererUrl = "START"; +// toPushInTabHistory.entryTime = Date.now(); +// tabhistory.push(toPushInTabHistory); +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; + +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } +// } else { +// const lastUrlObj = await chrome.storage.local.get(["lastUrl"]); + +// toPushInTabHistory.reffererUrl = lastUrlObj.lastUrl[tabId]; +// toPushInTabHistory.entryTime = Date.now(); +// tabhistory.push(toPushInTabHistory); + +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; +// // console.log("webhistory",webhistoryObj); +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } + +// lastUrlObj.lastUrl[tabId] = tab.url; +// await chrome.storage.local.set({ +// lastUrl: lastUrlObj.lastUrl, +// }); +// } +// } else { +// await initURlQueue(tab.id); +// let urlQueue = await chrome.storage.local.get(["urlQueue"]); +// // console.log("urlQueue", urlQueue); +// urlQueue.urlQueue[tabId].push(tab.url) + +// urlQueue.urlQueue[tabId] = [...new Set(urlQueue.urlQueue[tabId])] +// await chrome.storage.local.set({ +// urlQueue: urlQueue.urlQueue, +// }); + +// const lastEntryTimeObj = await chrome.storage.local.get([ +// "lastEntryTime", +// ]); +// lastEntryTimeObj.lastEntryTime[tabId] = Date.now(); + +// await chrome.storage.local.set({ +// lastEntryTime: lastEntryTimeObj.lastEntryTime, +// }); +// } + +// chrome.tabs.onRemoved.addListener(async (tabId: number, removeInfo: object) => { +// const autotrackerFlag = await chrome.storage.local.get(["autoTracker"]); +// //duration, referURL edge conditions +// let webhistoryObj = await chrome.storage.local.get(["webhistory"]); +// const webHistoryLength = webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory.length; + +// if (webHistoryLength > 0) { +// if ( +// !webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].duration +// ) { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].duration = +// Date.now() - +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].entryTime; +// } +// } + +// let urlQueueLocal = await chrome.storage.local.get(["urlQueue"]); +// let timeQueueLocal = await chrome.storage.local.get(["timeQueue"]); +// delete urlQueueLocal.urlQueue[tabId] +// delete timeQueueLocal.timeQueue[tabId] +// await chrome.storage.local.set({ +// urlQueue: urlQueueLocal.urlQueue, +// }); +// await chrome.storage.local.set({ +// timeQueue: timeQueueLocal.timeQueue, +// }); + +// // if (autotrackerFlag.autoTracker) { +// // try { +// // const lastEntryTimeObj = await chrome.storage.local.get([ +// // "lastEntryTime", +// // ]); +// // let webhistoryObj = await chrome.storage.local.get(["webhistory"]); +// // const webHistoryLength = webhistoryObj.webhistory.find( +// // (data: WebHistory) => data.tabsessionId === tabId +// // ).tabHistory.length; + +// // if (webHistoryLength > 0) { +// // webhistoryObj.webhistory.find( +// // (data: WebHistory) => data.tabsessionId === tabId +// // ).tabHistory[webHistoryLength - 1].duration = +// // Date.now() - lastEntryTimeObj.lastEntryTime[tabId]; +// // } + +// // await chrome.storage.local.set({ +// // webhistory: webhistoryObj.webhistory, +// // }); +// // } catch (error) { +// // console.log(error); +// // } +// // } else { +// // await initURlQueue(tabId); +// // let urlQueue = await chrome.storage.local.get(["urlQueue"]); +// // delete urlQueue.urlQueue[tabId]; +// // chrome.storage.local.set({ +// // urlQueue: urlQueue.urlQueue, +// // }); +// // } +// }); + +// if (tabhistory.length > 0) { +// //updates duration of last entry in 'tabhistory' +// tabhistory[tabhistory.length - 1].duration = +// toPushInTabHistory.entryTime - +// tabhistory[tabhistory.length - 1].entryTime; + +// //Update refferer Url +// toPushInTabHistory.reffererUrl = tabhistory[tabhistory.length - 1].url; + +// if (tabhistory.length == 1) { +// tabhistory[0].reffererUrl = "START"; +// } +// } +// tabhistory.push(toPushInTabHistory); + +// //Set Updated tabhistory +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; +// // console.log("webhistory",webhistoryObj); +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } + +// try { +// let webhistoryObj = await chrome.storage.local.get(["webhistory"]); +// const webHistoryLength = webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory.length; +// const lastWebPageEntryTime = webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].entryTime; +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[webHistoryLength - 1].duration = +// Date.now() - lastWebPageEntryTime; +// //Edge Condition of reffererUrl +// if (webHistoryLength == 1) { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tabId +// ).tabHistory[0].reffererUrl = "START"; +// } +// //Sets 'webhistory' +// try { +// await chrome.storage.local.set({ webhistory: webhistoryObj.webhistory }); +// // const result = await chrome.storage.local.get(["webhistory"]); +// // console.log("webhistoryinRemoved",result); +// } catch (error) { +// console.log(error); +// } +// } catch (error) { +// console.log(error); +// } +// await chrome.storage.local.set({ id: tab.id }); +// await chrome.storage.local.set({ tabhistory: [] }); +// const result = await chrome.storage.local.get(["id"]); +// console.log(result); + +// const tabid = await chrome.storage.local.get(["id"]); +// const toPushinWebHostory = { +// tabsessionId: tabid.id, +// tabHistory: tabhistory, +// }; + +// //Updates 'webhistory' +// const webhistoryObj = await chrome.storage.local.get(["webhistory"]); +// // console.log("WEBH", webhistoryObj); +// const webhistory = webhistoryObj.webhistory; +// webhistory.push(toPushinWebHostory); + +// //Sets 'webhistory' +// try { +// await chrome.storage.local.set({ webhistory: webhistory }); +// const result = await chrome.storage.local.get(["webhistory"]); +// console.log("RES",result) +// } catch (error) { +// console.log(error); +// } + +// try { +// let lastUrlObj = await chrome.storage.local.get(["lastUrl"]); + +// // console.log("Before Update", lastUrlObj); +// if(tab.url !== lastUrlObj.lastUrl[tabId]){ +// // console.log("Before Update", lastUrlObj); +// lastUrlObj.lastUrl[tabId] = tab.url; +// // console.log("After Update", lastUrlObj); + +// await chrome.storage.local.set({ +// lastUrl: lastUrlObj.lastUrl, +// }); + +// //Update DURATION of old url +// } + +// // // const lastUrl = await chrome.storage.local.get(["lastUrl"]); + +// // await chrome.storage.local.set({ +// // lastUrl: lastUrlObj.lastUrl, +// // }); +// } catch (error) { +// console.log(error); +// } diff --git a/extension/src/commons.tsx b/extension/src/commons.tsx new file mode 100644 index 0000000..3bb102e --- /dev/null +++ b/extension/src/commons.tsx @@ -0,0 +1,126 @@ +import { WebHistory } from "./interfaces"; + +export const emptyArr: any[] = []; + +export const initQueues = async (tabId: number) => { + let urlQueueListObj = await chrome.storage.local.get(["urlQueueList"]); + let timeQueueListObj = await chrome.storage.local.get(["timeQueueList"]); + + if(!urlQueueListObj.urlQueueList && !timeQueueListObj.timeQueueList){ + await chrome.storage.local.set({ + urlQueueList: [{tabsessionId: tabId, urlQueue: []}], + }); + await chrome.storage.local.set({ + timeQueueList: [{tabsessionId: tabId, timeQueue: []}], + }); + + return + } + + if(urlQueueListObj.urlQueueList && timeQueueListObj.timeQueueList){ + const isUrlQueueThere = urlQueueListObj.urlQueueList.find((data: WebHistory) => data.tabsessionId === tabId) + const isTimeQueueThere = timeQueueListObj.timeQueueList.find((data: WebHistory) => data.tabsessionId === tabId) + + if(!isUrlQueueThere){ + urlQueueListObj.urlQueueList.push({tabsessionId: tabId, urlQueue: []}) + + await chrome.storage.local.set({ + urlQueueList: urlQueueListObj.urlQueueList, + }); + } + + if(!isTimeQueueThere){ + timeQueueListObj.timeQueueList.push({tabsessionId: tabId, timeQueue: []}) + + await chrome.storage.local.set({ + timeQueueList: timeQueueListObj.timeQueueList, + }); + } + + return + } +}; + +export function getRenderedHtml() { + return { + url: window.location.href, + entryTime: Date.now(), + title: document.title, + renderedHtml: document.documentElement.outerHTML, + }; +} + + + +export const initWebHistory = async (tabId: number) => { + const result = await chrome.storage.local.get(["webhistory"]); + + if (!result.webhistory) { + await chrome.storage.local.set({ webhistory: emptyArr }); + return + } + + const ifIdExists = result.webhistory.find( + (data: WebHistory) => data.tabsessionId === tabId + ); + + + if (ifIdExists === undefined) { + let webHistory = result.webhistory; + const initData = { + tabsessionId: tabId, + tabHistory: emptyArr, + }; + + webHistory.push(initData) + + try { + await chrome.storage.local.set({ webhistory: webHistory }); + return ; + } catch (error) { + console.log(error) + } + } else { + return; + } +}; + +export function toIsoString(date: Date) { + var tzo = -date.getTimezoneOffset(), + dif = tzo >= 0 ? '+' : '-', + pad = function (num: number) { + return (num < 10 ? '0' : '') + num; + }; + + return date.getFullYear() + + '-' + pad(date.getMonth() + 1) + + '-' + pad(date.getDate()) + + 'T' + pad(date.getHours()) + + ':' + pad(date.getMinutes()) + + ':' + pad(date.getSeconds()) + + dif + pad(Math.floor(Math.abs(tzo) / 60)) + + ':' + pad(Math.abs(tzo) % 60); +} + + +export const webhistoryToLangChainDocument = (tabId: number, tabHistory: any[]) => { + let toSaveFinally = [] + for (let j = 0; j < tabHistory.length; j++) { + + const mtadata = { + "BrowsingSessionId": `${tabId}`, + "VisitedWebPageURL": `${tabHistory[j].url}`, + "VisitedWebPageTitle": `${tabHistory[j].title}`, + "VisitedWebPageDateWithTimeInISOString": `${toIsoString(new Date(tabHistory[j].entryTime))}`, + "VisitedWebPageReffererURL": `${tabHistory[j].reffererUrl}`, + "VisitedWebPageVisitDurationInMilliseconds": tabHistory[j].duration, + } + + toSaveFinally.push({ + metadata: mtadata, + pageContent: tabHistory[j].pageContentMarkdown + }) + } + + return toSaveFinally +} \ No newline at end of file diff --git a/extension/src/content_script.tsx b/extension/src/content_script.tsx new file mode 100644 index 0000000..ad6a999 --- /dev/null +++ b/extension/src/content_script.tsx @@ -0,0 +1,3 @@ +chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { +}); + diff --git a/extension/src/env.tsx b/extension/src/env.tsx new file mode 100644 index 0000000..79c36ed --- /dev/null +++ b/extension/src/env.tsx @@ -0,0 +1,2 @@ +export const API_SECRET_KEY = "surfsense" +export const BACKEND_URL = "http://127.0.0.1:8000" \ No newline at end of file diff --git a/extension/src/interfaces.tsx b/extension/src/interfaces.tsx new file mode 100644 index 0000000..ba75e8d --- /dev/null +++ b/extension/src/interfaces.tsx @@ -0,0 +1,4 @@ +export interface WebHistory { + tabsessionId: number; + tabHistory: any[]; +} \ No newline at end of file diff --git a/extension/src/options.tsx b/extension/src/options.tsx new file mode 100644 index 0000000..7355227 --- /dev/null +++ b/extension/src/options.tsx @@ -0,0 +1,77 @@ +// import React, { useEffect, useState } from "react"; +// import { createRoot } from "react-dom/client"; + +// const Options = () => { +// const [color, setColor] = useState(""); +// const [status, setStatus] = useState(""); +// const [like, setLike] = useState(false); + +// useEffect(() => { +// // Restores select box and checkbox state using the preferences +// // stored in chrome.storage. +// chrome.storage.sync.get( +// { +// favoriteColor: "red", +// likesColor: true, +// }, +// (items) => { +// setColor(items.favoriteColor); +// setLike(items.likesColor); +// } +// ); +// }, []); + +// const saveOptions = () => { +// // Saves options to chrome.storage.sync. +// chrome.storage.sync.set( +// { +// favoriteColor: color, +// likesColor: like, +// }, +// () => { +// // Update status to let user know options were saved. +// setStatus("Options saved."); +// const id = setTimeout(() => { +// setStatus(""); +// }, 1000); +// return () => clearTimeout(id); +// } +// ); +// }; + +// return ( +// <> +//
+// Favorite color: +//
+//
+// +//
+//
{status}
+// +// +// ); +// }; + +// const root = createRoot(document.getElementById("root")!); + +// root.render( +// +// +// +// ); diff --git a/extension/src/pages/EnvVarSettings.tsx b/extension/src/pages/EnvVarSettings.tsx new file mode 100644 index 0000000..826246a --- /dev/null +++ b/extension/src/pages/EnvVarSettings.tsx @@ -0,0 +1,75 @@ +import React, { useState } from "react"; +import { goTo } from "react-chrome-extension-router"; +import { Popup } from "../popup"; +export const FillEnvVariables = () => { + const [neourl, setNeourl] = useState(''); + const [neouser, setNeouser] = useState(''); + const [neopass, setNeopass] = useState(''); + const [openaikey, setOpenaiKey] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const validateForm = () => { + if (!neourl || !neouser || !neopass || !openaikey) { + setError('All values are required'); + return false; + } + setError(''); + return true; + }; + + const handleSubmit = async (event: { preventDefault: () => void; }) => { + event.preventDefault(); + if (!validateForm()) return; + setLoading(true); + + localStorage.setItem('neourl', neourl); + localStorage.setItem('neouser', neouser); + localStorage.setItem('neopass', neopass); + localStorage.setItem('openaikey', openaikey); + + setLoading(false); + goTo(Popup) + }; + + + return ( +
+
+ + logo + SurfSense + +
+
+

+ Required Values +

+
+
+ + setNeourl(e.target.value)} name="neourl" id="neourl" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+ +
+ + setNeouser(e.target.value)} name="neouser" id="neouser" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+
+ + setNeopass(e.target.value)} name="neopass" id="neopass" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +
+
+ + setOpenaiKey(e.target.value)} name="openaikey" id="openaikey" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+ + {error &&

{error}

} +
+
+
+
+
+ ) + } + \ No newline at end of file diff --git a/extension/src/pages/Loading.tsx b/extension/src/pages/Loading.tsx new file mode 100644 index 0000000..c454027 --- /dev/null +++ b/extension/src/pages/Loading.tsx @@ -0,0 +1,28 @@ +import React from 'react' + +const Loading = () => { + return ( + <>
+
+ logo + SurfSense +
+
+ {"S A V I N G".split(" ").map((v, i) => ( + + ))} +
+
+ + + + ) +} + +export default Loading \ No newline at end of file diff --git a/extension/src/pages/LoginForm.tsx b/extension/src/pages/LoginForm.tsx new file mode 100644 index 0000000..f60edc9 --- /dev/null +++ b/extension/src/pages/LoginForm.tsx @@ -0,0 +1,94 @@ +import React, { useState } from "react"; +import { goTo } from "react-chrome-extension-router"; +import { Popup } from "../popup"; + +export const LoginForm = () => { + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + + const validateForm = () => { + if (!username || !password) { + setError('Username and password are required'); + return false; + } + setError(''); + return true; + }; + + const handleSubmit = async (event: { preventDefault: () => void; }) => { + event.preventDefault(); + if (!validateForm()) return; + setLoading(true); + + const formDetails = new URLSearchParams(); + formDetails.append('username', username); + formDetails.append('password', password); + + try { + const response = await fetch('http://localhost:8000/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: formDetails, + }); + + setLoading(false); + + if (response.ok) { + const data = await response.json(); + localStorage.setItem('token', data.access_token); + goTo(Popup); + } else { + const errorData = await response.json(); + setError(errorData.detail || 'Authentication failed!'); + } + } catch (error) { + setLoading(false); + setError('An error occurred. Please try again later.'); + } + }; + + // const goToRegister = async () => { + // console.log("Reg") + // goTo(RegisterForm) + // } + return ( + <> +
+ {/*
clearMem}>CLEAR MEM
*/} +
+ + logo + SurfSense + +
+
+

+ Sign in to your account +

+
+
+ + setUsername(e.target.value)} name="email" id="email" className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name" /> +
+
+ + setPassword(e.target.value)} name="password" id="password" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +
+ +

+ Don’t have an account yet? Sign up +

+ {error &&

{error}

} +
+
+
+
+
+ + ); +} diff --git a/extension/src/popup.tsx b/extension/src/popup.tsx new file mode 100644 index 0000000..923555c --- /dev/null +++ b/extension/src/popup.tsx @@ -0,0 +1,582 @@ +import React, { useEffect, useState } from "react"; +import { + goTo, + Router, +} from 'react-chrome-extension-router'; +import { createRoot } from "react-dom/client"; +import { ToastContainer, toast } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; +import "./assets/tailwind.css" + +import { convertHtmlToMarkdown } from "dom-to-semantic-markdown"; +import { WebHistory } from "./interfaces"; +import { webhistoryToLangChainDocument, getRenderedHtml, emptyArr } from "./commons"; +import Loading from "./pages/Loading"; + +import { LoginForm } from "./pages/LoginForm"; +import { FillEnvVariables } from "./pages/EnvVarSettings"; +import { API_SECRET_KEY, BACKEND_URL } from "./env"; + + + +export async function clearMem(): Promise { + try { + + let result = await chrome.storage.local.get(["webhistory"]); + + if (!result.webhistory) { + return + } + + //Main Cleanup COde + chrome.tabs.query({}, async (tabs) => { + //Get Active Tabs Ids + // console.log("Event Tabs",tabs) + let actives = tabs.map((tab) => { + if (tab.id) { + return tab.id + } + }) + + actives = actives.filter((item: any) => item) + + + //Only retain which is still active + const newHistory = result.webhistory.map((element: any) => { + //@ts-ignore + if (actives.includes(element.tabsessionId)) { + return element + } + }) + + + await chrome.storage.local.set({ webhistory: newHistory.filter((item: any) => item) }); + + toast.info("History Store Deleted!", { + position: "bottom-center" + }); + }); + } catch (error) { + console.log(error); + } +} + + +export const Popup = () => { + const [noOfWebPages, setNoOfWebPages] = useState(0); + const [loading, setLoading] = useState(true); + + + useEffect(() => { + const verifyToken = async () => { + const token = localStorage.getItem('token'); + console.log(token) + try { + const response = await fetch(`${BACKEND_URL}/verify-token/${token}`); + + if (!response.ok) { + throw new Error('Token verification failed'); + }else{ + const NEO4JURL = localStorage.getItem('neourl'); + const NEO4JUSERNAME = localStorage.getItem('neouser'); + const NEO4JPASSWORD = localStorage.getItem('neopass'); + const OPENAIKEY = localStorage.getItem('openaikey'); + + const check = (NEO4JURL && NEO4JUSERNAME && NEO4JPASSWORD && OPENAIKEY) + if(!check){ + goTo(FillEnvVariables); + } + } + } catch (error) { + localStorage.removeItem('token'); + goTo(LoginForm); + } + + + + }; + + verifyToken(); + setLoading(false) + }, []); + + + useEffect(() => { + async function onLoad() { + try { + chrome.storage.onChanged.addListener( + (changes: any, areaName: string) => { + if (changes.webhistory) { + // console.log("changes.webhistory", changes.webhistory) + const webhistory = changes.webhistory.newValue; + + let sum = 0 + webhistory.forEach((element: any) => { + sum = sum + element.tabHistory.length + }); + + setNoOfWebPages(sum) + } + // console.log(changes) + // console.log(areaName) + } + ); + + + + const webhistoryObj = await chrome.storage.local.get(["webhistory"]); + if (webhistoryObj.webhistory.length) { + const webhistory = webhistoryObj.webhistory; + + if (webhistoryObj) { + let sum = 0 + webhistory.forEach((element: any) => { + sum = sum + element.tabHistory.length + }); + setNoOfWebPages(sum) + } + } else { + setNoOfWebPages(0) + } + + + } catch (error) { + console.log(error); + } + } + + onLoad() + }, []); + + const saveData = async () => { + + try { + // setLoading(true); + + const webhistoryObj = await chrome.storage.local.get(["webhistory"]); + const webhistory = webhistoryObj.webhistory; + if (webhistory) { + + let processedHistory: any[] = [] + let newHistoryAfterCleanup: any[] = [] + + webhistory.forEach((element: any) => { + let tabhistory = element.tabHistory; + for (let i = 0; i < tabhistory.length; i++) { + tabhistory[i].pageContentMarkdown = convertHtmlToMarkdown(tabhistory[i].renderedHtml, { + extractMainContent: true, + enableTableColumnTracking: true, + }) + + delete tabhistory[i].renderedHtml + } + + processedHistory.push({ + tabsessionId: element.tabsessionId, + tabHistory: tabhistory, + }) + + newHistoryAfterCleanup.push({ + tabsessionId: element.tabsessionId, + tabHistory: emptyArr, + }) + }); + + await chrome.storage.local.set({ webhistory: newHistoryAfterCleanup }); + let toSaveFinally = [] + + for (let i = 0; i < processedHistory.length; i++) { + const markdownFormat = webhistoryToLangChainDocument(processedHistory[i].tabsessionId, processedHistory[i].tabHistory) + toSaveFinally.push(...markdownFormat) + } + + // console.log("SAVING", toSaveFinally) + + const toSend = { + documents: toSaveFinally, + neourl: localStorage.getItem('neourl'), + neouser: localStorage.getItem('neouser'), + neopass: localStorage.getItem('neopass'), + openaikey: localStorage.getItem('openaikey'), + apisecretkey: API_SECRET_KEY + } + + // console.log("toSend",toSend) + + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(toSend), + }; + + toast.info("Save Job Initiated.", { + position: "bottom-center" + }); + + const response = await fetch(`${BACKEND_URL}/kb/`, requestOptions); + const res = await response.json(); + if (res.success) { + toast.success("Save Job Completed.", { + position: "bottom-center", + autoClose: false + }); + } + + } + } catch (error) { + console.log(error); + } + + }; + + // async function showMem(): Promise { + // // localStorage.removeItem('token'); + // // await chrome.storage.local.clear() + // const webhistoryObj = await chrome.storage.local.get(["webhistory"]); + // const urlQueue = await chrome.storage.local.get(["urlQueueList"]); + // const timeQueue = await chrome.storage.local.get(["timeQueueList"]); + // console.log("CURR MEM", webhistoryObj, urlQueue, timeQueue); + + // // await chrome.storage.local.set({ + // // urlQueueList: urlQueueListObj.urlQueueList, + // // }); + // // await chrome.storage.local.set({ + // // timeQueueList: timeQueueListObj.timeQueueList, + // // }); + // // clearMem() + // } + + async function logOut(): Promise { + localStorage.removeItem('token'); + goTo(LoginForm) + } + + async function saveCurrSnapShot(): Promise { + chrome.tabs.query({ active: true, currentWindow: true }, async function (tabs) { + const tab = tabs[0]; + if (tab.id) { + // await initWebHistory(tab.id); + // await initQueues(tab.id); + const tabId: number = tab.id + const result = await chrome.scripting.executeScript({ + // @ts-ignore + target: { tabId: tab.id }, + // @ts-ignore + function: getRenderedHtml, + }); + + let toPushInTabHistory = result[0].result; // const { renderedHtml, title, url, entryTime } = result[0].result; + + // //Updates 'tabhistory' + let webhistoryObj = await chrome.storage.local.get(["webhistory"]); + + const webHistoryOfTabId = webhistoryObj.webhistory.filter( + (data: WebHistory) => { + return data.tabsessionId === tab.id; + } + ); + + let tabhistory = webHistoryOfTabId[0].tabHistory; + + + const urlQueueListObj = await chrome.storage.local.get(["urlQueueList"]); + const timeQueueListObj = await chrome.storage.local.get(["timeQueueList"]); + + const isUrlQueueThere = urlQueueListObj.urlQueueList.find((data: WebHistory) => data.tabsessionId === tabId) + const isTimeQueueThere = timeQueueListObj.timeQueueList.find((data: WebHistory) => data.tabsessionId === tabId) + + // console.log(isUrlQueueThere) + // console.log(isTimeQueueThere) + + // console.log(isTimeQueueThere.timeQueue[isTimeQueueThere.length - 1]) + + toPushInTabHistory.duration = toPushInTabHistory.entryTime - isTimeQueueThere.timeQueue[isTimeQueueThere.timeQueue.length - 1] + if (isUrlQueueThere.urlQueue.length == 1) { + toPushInTabHistory.reffererUrl = 'START' + } + if (isUrlQueueThere.urlQueue.length > 1) { + toPushInTabHistory.reffererUrl = isUrlQueueThere.urlQueue[isUrlQueueThere.urlQueue.length - 2]; + } + + tabhistory.push(toPushInTabHistory); + + // console.log(toPushInTabHistory) + + //Update Webhistory + try { + webhistoryObj.webhistory.find( + (data: WebHistory) => data.tabsessionId === tab.id + ).tabHistory = tabhistory; + + await chrome.storage.local.set({ + webhistory: webhistoryObj.webhistory, + }); + } catch (error) { + console.log(error); + } + + + toast.success("Saved Snapshot !", { + position: "bottom-center" + }); + } + + }); + } + + if (loading) { + return ; + } else { + return ( +
+ {/*
showMem()}>ShowMem
*/} +
+
+ logo + SurfSense +
+
+
+
+ + +
+ +
+
+
+ brain +
+ {noOfWebPages} +
+
+
+ + + + + +
+
+
+
+
+ ) + } +}; + + +const root = createRoot(document.getElementById("root")!); + +root.render( + + + + + + +); + +// chrome.tabs.query({ active: true, currentWindow: true }, async function (tabs) { +// const tab = tabs[0]; +// if (tab.id) { +// await initWebHistory(tab.id); +// await initQueues(tab.id); +// } +// }); +// export const LoginForm = () => { +// const [username, setUsername] = useState(''); +// const [password, setPassword] = useState(''); +// const [error, setError] = useState(''); +// const [loading, setLoading] = useState(false); + +// // const navigate = useNavigate(); + +// const validateForm = () => { +// if (!username || !password) { +// setError('Username and password are required'); +// return false; +// } +// setError(''); +// return true; +// }; + +// const handleSubmit = async (event: { preventDefault: () => void; }) => { +// event.preventDefault(); +// if (!validateForm()) return; +// setLoading(true); + +// const formDetails = new URLSearchParams(); +// formDetails.append('username', username); +// formDetails.append('password', password); + +// try { +// const response = await fetch('http://localhost:8000/token', { +// method: 'POST', +// headers: { +// 'Content-Type': 'application/x-www-form-urlencoded', +// }, +// body: formDetails, +// }); + +// setLoading(false); + +// if (response.ok) { +// const data = await response.json(); +// await chrome.storage.local.set({ +// token: data.access_token, +// }); +// // localStorage.setItem('token', data.access_token); +// goTo(Popup); +// } else { +// const errorData = await response.json(); +// setError(errorData.detail || 'Authentication failed!'); +// } +// } catch (error) { +// setLoading(false); +// setError('An error occurred. Please try again later.'); +// } +// }; + +// const goToRegister = async () => { +// console.log("Reg") +// goTo(RegisterForm) +// } +// return ( +// <> +//
+//
clearMem}>CLEAR MEM
+//
+// +// logo +// SurfSense +// +//
+//
+//

+// Sign in to your account +//

+//
+//
+// +// setUsername(e.target.value)} name="email" id="email" className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name" /> +//
+//
+// +// setPassword(e.target.value)} name="password" id="password" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +//
+// +//

+// Don’t have an account yet? goToRegister()}>Sign up +//

+// {error &&

{error}

} +//
+//
+//
+//
+//
+// +// ); +// } + +// import { createGlobalState } from 'react-hooks-global-state'; + +// const initialState = { count: 0 }; +// const { useGlobalState } = createGlobalState(initialState); +// const [count, setCount] = useGlobalState('count'); + +// setCount(v => v - 1); +// let saveJobsObj = await chrome.storage.local.get(["savejobs"]); + +// await chrome.storage.local.set({ +// savejobs: saveJobsObj.savejobs - 1, +// }); + +// else{ +// toPushInTabHistory.reffererUrl = urlQueueLocal.urlQueue[tabId][urlQueueLocal.urlQueue[tabId].length - 1] +// } + +// if(!tabhistory[tabhistory.length - 1].duration){ +// tabhistory[tabhistory.length - 1].duration = Date.now() - timeQueueLocal.timeQueue[tabId][timeQueueLocal.timeQueue[tabId].length - 1] +// } + + + +// if (tabhistory.length === 0) { +// toPushInTabHistory.duration = Date.now() - timeQueueLocal.timeQueue[tabId][timeQueueLocal.timeQueue[tabId].length - 1] +// } +// else { + +// } + +// const lastEntryTimeObj = await chrome.storage.local.get([ +// "lastEntryTime", +// ]); + +// const autotrackerFlag = await chrome.storage.local.get(["autoTracker"]); +// // if (autotrackerFlag.autoTracker) { +// // let urlQueue = await chrome.storage.local.get(["urlQueue"]); +// // delete urlQueue.urlQueue[tabId]; +// // } + + +// //When first entry +// if (tabhistory.length === 0) { +// let urlQueue = await chrome.storage.local.get(["urlQueue"]); + +// if (autotrackerFlag.autoTracker) { +// toPushInTabHistory.reffererUrl = "START"; +// try { +// delete urlQueue.urlQueue[tabId]; +// } catch (error) { +// console.log(error); +// } +// } else { + +// if (urlQueue.urlQueue[tabId].length >= 2) { +// toPushInTabHistory.reffererUrl = urlQueue.urlQueue[tabId][urlQueue.urlQueue[tabId].length - 2]; +// } else { +// toPushInTabHistory.reffererUrl = "START"; +// } + +// } +// toPushInTabHistory.duration = Date.now() - lastEntryTimeObj.lastEntryTime[tabId]; +// tabhistory.push(toPushInTabHistory); +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } +// } else { +// if (autotrackerFlag.autoTracker) { +// toPushInTabHistory.reffererUrl = tabhistory[tabhistory.length - 1].url; +// } else { +// let urlQueue = await chrome.storage.local.get(["urlQueue"]); +// toPushInTabHistory.reffererUrl = urlQueue.urlQueue[tabId][urlQueue.urlQueue[tabId].length - 2]; +// } +// if (!tabhistory[tabhistory.length - 1].duration) { +// toPushInTabHistory.duration = Date.now() - tabhistory[tabhistory.length - 1].entryTime +// } +// toPushInTabHistory.duration = Date.now() - lastEntryTimeObj.lastEntryTime[tabId]; +// tabhistory.push(toPushInTabHistory); + +// try { +// webhistoryObj.webhistory.find( +// (data: WebHistory) => data.tabsessionId === tab.id +// ).tabHistory = tabhistory; +// await chrome.storage.local.set({ +// webhistory: webhistoryObj.webhistory, +// }); +// } catch (error) { +// console.log(error); +// } +// } diff --git a/extension/src/sum.ts b/extension/src/sum.ts new file mode 100644 index 0000000..416912b --- /dev/null +++ b/extension/src/sum.ts @@ -0,0 +1,3 @@ +export function sum(x: number, y: number) { + return x + y; +} diff --git a/extension/tailwind.config.js b/extension/tailwind.config.js new file mode 100644 index 0000000..d7758be --- /dev/null +++ b/extension/tailwind.config.js @@ -0,0 +1,60 @@ +module.exports = { + content: ["./src/*.{js,jsx,ts,tsx}"], + darkMode: "selector", + theme: { + extend: { + colors: { + primary: { + 50: "#eff6ff", + 100: "#dbeafe", + 200: "#bfdbfe", + 300: "#93c5fd", + 400: "#60a5fa", + 500: "#3b82f6", + 600: "#2563eb", + 700: "#1d4ed8", + 800: "#1e40af", + 900: "#1e3a8a", + 950: "#172554", + }, + }, + }, + fontFamily: { + body: [ + "Inter", + "ui-sans-serif", + "system-ui", + "-apple-system", + "system-ui", + "Segoe UI", + "Roboto", + "Helvetica Neue", + "Arial", + "Noto Sans", + "sans-serif", + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji", + ], + sans: [ + "Inter", + "ui-sans-serif", + "system-ui", + "-apple-system", + "system-ui", + "Segoe UI", + "Roboto", + "Helvetica Neue", + "Arial", + "Noto Sans", + "sans-serif", + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji", + ], + }, + }, + plugins: [], +}; diff --git a/extension/tsconfig.json b/extension/tsconfig.json new file mode 100644 index 0000000..28ad8ed --- /dev/null +++ b/extension/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "strict": true, + "target": "es6", + "moduleResolution": "bundler", + "module": "ES6", + "esModuleInterop": true, + "sourceMap": false, + "rootDir": "src", + "outDir": "dist/js", + "noEmitOnError": true, + "jsx": "react", + "typeRoots": [ "node_modules/@types" ] + } +} diff --git a/extension/tsconfig.test.json b/extension/tsconfig.test.json new file mode 100644 index 0000000..d4977fa --- /dev/null +++ b/extension/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "moduleResolution": "node" + } +} diff --git a/extension/webpack/webpack.common.js b/extension/webpack/webpack.common.js new file mode 100644 index 0000000..445b1e7 --- /dev/null +++ b/extension/webpack/webpack.common.js @@ -0,0 +1,66 @@ +const webpack = require("webpack"); +const path = require("path"); +const CopyPlugin = require("copy-webpack-plugin"); +const srcDir = path.join(__dirname, "..", "src"); + +const tailwindcss = require('tailwindcss') +const autoprefixer = require('autoprefixer') + +module.exports = { + entry: { + popup: path.join(srcDir, 'popup.tsx'), + background: path.join(srcDir, 'background.ts'), + content_script: path.join(srcDir, 'content_script.tsx'), + }, + output: { + path: path.join(__dirname, "../dist/js"), + filename: "[name].js", + }, + optimization: { + splitChunks: { + name: "vendor", + chunks(chunk) { + return chunk.name !== 'background'; + } + }, + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + { + test: /\.css$/i, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + importLoaders: 1, + }, + }, + { + loader: 'postcss-loader', // postcss loader needed for tailwindcss + options: { + postcssOptions: { + ident: 'postcss', + plugins: [tailwindcss, autoprefixer], + }, + }, + }, + ], + }, + ], + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + }, + plugins: [ + new CopyPlugin({ + patterns: [{ from: ".", to: "../", context: "public" }], + options: {}, + }), + ], +}; diff --git a/extension/webpack/webpack.dev.js b/extension/webpack/webpack.dev.js new file mode 100644 index 0000000..b248755 --- /dev/null +++ b/extension/webpack/webpack.dev.js @@ -0,0 +1,7 @@ +const { merge } = require('webpack-merge'); +const common = require('./webpack.common.js'); + +module.exports = merge(common, { + devtool: 'inline-source-map', + mode: 'development' +}); \ No newline at end of file diff --git a/extension/webpack/webpack.prod.js b/extension/webpack/webpack.prod.js new file mode 100644 index 0000000..ddbd078 --- /dev/null +++ b/extension/webpack/webpack.prod.js @@ -0,0 +1,6 @@ +const { merge } = require('webpack-merge'); +const common = require('./webpack.common.js'); + +module.exports = merge(common, { + mode: 'production' +}); \ No newline at end of file diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..7e1e047 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..c403366 --- /dev/null +++ b/web/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/web/app/chat/markdown.tsx b/web/app/chat/markdown.tsx new file mode 100644 index 0000000..7b413d1 --- /dev/null +++ b/web/app/chat/markdown.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import MarkdownPreview from '@uiw/react-markdown-preview'; + +export default function MarkDownTest({source} : {source: string}) { + return ( + + ) +} \ No newline at end of file diff --git a/web/app/chat/page.tsx b/web/app/chat/page.tsx new file mode 100644 index 0000000..25c605c --- /dev/null +++ b/web/app/chat/page.tsx @@ -0,0 +1,344 @@ +"use client"; +import React, { useEffect, useState } from "react"; +import Image from "next/image"; +import logo from "@/public/SurfSense.png"; +import { FileCheck } from "lucide-react"; + +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible"; + +import { + Table, + TableBody, + TableCell, + TableRow, +} from "@/components/ui/table"; +import MarkDownTest from "./markdown"; +import { useRouter } from "next/navigation"; + +type Document = { + BrowsingSessionId: string; + VisitedWebPageURL: string; + VisitedWebPageTitle: string; + VisitedWebPageDateWithTimeInISOString: string; + VisitedWebPageReffererURL: string; + VisitedWebPageVisitDurationInMilliseconds: number; + VisitedWebPageContent: string; +}; + +// type Description = { +// response: string; +// }; + +// type NormalResponse = { +// response: string; +// relateddocs: Document[]; +// }; + +// type ChatMessage = { +// type: string; +// userquery: string; +// message: NormalResponse | string; +// }; + +function ProtectedPage() { + // const navigate = useNavigate(); + const router = useRouter(); + const [loading, setLoading] = useState(false); + + const [currentChat, setCurrentChat] = useState([]); + + useEffect(() => { + const verifyToken = async () => { + const token = window.localStorage.getItem('token'); + // console.log(token) + try { + const response = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL!}/verify-token/${token}`); + + if (!response.ok) { + throw new Error('Token verification failed'); + }else{ + const NEO4JURL = localStorage.getItem('neourl'); + const NEO4JUSERNAME = localStorage.getItem('neouser'); + const NEO4JPASSWORD = localStorage.getItem('neopass'); + const OPENAIKEY = localStorage.getItem('openaikey'); + + const check = (NEO4JURL && NEO4JUSERNAME && NEO4JPASSWORD && OPENAIKEY) + if(!check){ + router.push('/settings'); + } + } + } catch (error) { + window.localStorage.removeItem('token'); + router.push('/login'); + } + }; + + verifyToken(); + }, [router]); + + const handleSubmit = async (formData: any) => { + setLoading(true); + const query = formData.get("query"); + + if (!query) { + console.log("Query cant be empty!!"); + return; + } + + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: query, + neourl: localStorage.getItem('neourl'), + neouser: localStorage.getItem('neouser'), + neopass: localStorage.getItem('neopass'), + openaikey: localStorage.getItem('openaikey'), + apisecretkey: process.env.NEXT_PUBLIC_API_SECRET_KEY + }), + }; + + fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL!}`, requestOptions) + .then(res=>res.json()) + .then(data=> { + let cur = currentChat; + cur.push({ + type: "normal", + userquery: query, + message: data, + }); + + + setCurrentChat([...cur]); + setLoading(false); + }); + }; + + const getDocDescription = async (document: Document) => { + setLoading(true); + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: JSON.stringify(document), + neourl: localStorage.getItem('neourl'), + neouser: localStorage.getItem('neouser'), + neopass: localStorage.getItem('neopass'), + openaikey: localStorage.getItem('openaikey'), + apisecretkey: process.env.NEXT_PUBLIC_API_SECRET_KEY + }), + }; + + const response = await fetch( + `${process.env.NEXT_PUBLIC_BACKEND_URL!}/kb/doc`, + requestOptions + ); + const res = await response.json(); + + let cur = currentChat; + cur.push({ + type: "description", + doctitle: document.VisitedWebPageTitle, + message: res.response, + }); + + setLoading(false); + setCurrentChat([...cur]); + // console.log(document); + }; + + if (currentChat) { + return ( + <> +
+
+
+
+
+

+ Welcome to SurfSense +

+

+ 🧠 Ask Your Knowledge Graph Brain 🧠 +

+
+ {currentChat.map((chat, index) => { + // console.log("chat", chat); + if (chat.type === "normal") { + return ( +
+

+ {chat.userquery} +

+

+ SurfSense Response: +

+ +

+ Related Browsing Sessions +

+ + { + //@ts-ignore + chat.message.relateddocs.map((doc) => { + return ( + + + + {doc.VisitedWebPageTitle} + + + + + + + Browsing Session Id + + + {doc.BrowsingSessionId} + + + + + URL + + + {doc.VisitedWebPageURL} + + + + + Reffering URL + + + {doc.VisitedWebPageReffererURL} + + + + + + Date & Time Visited + + + { + doc.VisitedWebPageDateWithTimeInISOString + } + + + + + + Visit Duration (In Milliseconds) + + + { + doc.VisitedWebPageVisitDurationInMilliseconds + } + + + +
+ +
+
+ ); + }) + } +
+ ); + } + + if (chat.type === "description") { + return ( +
+

+ {chat.doctitle} +

+ +
+ ); + } + })} +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ aiicon + New Chat + +
+ +
+
+
+
+
+
+
+
+ + ); + } +} + +export default ProtectedPage; diff --git a/web/app/favicon.ico b/web/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..171ab2c49d2585cd77cd2e31688086a416f3e199 GIT binary patch literal 15406 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�V;wS1Lf&4Elw_m0Y%H}My5#f-}XrhlPVrIF*r2HYw_dJ6jm+&v7{0u6s_dSPg zem&xC6y<6AvXkj~JRd^gO=G#XPN79G%fEw}S#?0W&kMz>@456Ur$OQGSU@PO=(*MMg8{C$1I`kYKX~+57$i^_as+d2Suf*QY5s4{>E}7dP z5jy1Cr(ATt9^sugUCK-B4hFkyhI#QlSnMU9p>@Qx7je;D?u%mIWjJyq_j zu@SqJv#_apilp<;uqLL0>nH3xi;qckrFseDgTnzMQD!Uk!LoZJi+!-zWvKR1p1;m? zTi)0Idz{@i2<3Lt{#o>YNukTbFhBMXW~H9PV#;gVLih4*ahKuSwq$o=^TGglY%W9S z1__eLuPf`5C|F1Tla#>s!P*!f$=7+N)P(?-@hsFhbi!1{geWG literal 0 HcmV?d00001 diff --git a/web/app/globals.css b/web/app/globals.css new file mode 100644 index 0000000..bc0ea3d --- /dev/null +++ b/web/app/globals.css @@ -0,0 +1,69 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --radius: 0.5rem; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/web/app/layout.tsx b/web/app/layout.tsx new file mode 100644 index 0000000..7b30dd3 --- /dev/null +++ b/web/app/layout.tsx @@ -0,0 +1,73 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; +import { ThemeProvider } from "@/components/theme-provider"; +import { MainNavbar } from "@/components/homepage/NavBar"; +import { Toaster } from "@/components/ui/toaster" +import { Footer } from "@/components/homepage/Footer"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "SurfSense - A Knowledge Graph Brain for World Wide Web Surfers.", + description: + "Save anything you see or browse on the Internet and save it to ask AI about it.", + openGraph: { + images: [ + { + url: "https://surfsense.net/og-image.png", + width: 1200, + height: 627, + alt: "SurfSense - A Knowledge Graph Brain for World Wide Web Surfers.", + }, + ], + }, + twitter: { + card: "summary_large_image", + site: "https://surfsense.net", + creator: "https://surfsense.net", + title: "SurfSense - A Knowledge Graph Brain for World Wide Web Surfers.", + description: + "Save anything you see or browse on the Internet and save it to ask AI about it.", + images: [ + { + url: "https://surfsense.net/og-image.png", + width: 1200, + height: 627, + alt: "SurfSense - A Knowledge Graph Brain for World Wide Web Surfers.", + }, + ], + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + +
+ +
+ {children} +
+
+
+ + + + +
+ + + ); +} diff --git a/web/app/login/page.tsx b/web/app/login/page.tsx new file mode 100644 index 0000000..7ebcb5b --- /dev/null +++ b/web/app/login/page.tsx @@ -0,0 +1,9 @@ +import { LoginForm } from "@/components/logins/LoginForm" + +const page = () => { + return ( + <> + ) +} + +export default page \ No newline at end of file diff --git a/web/app/page.tsx b/web/app/page.tsx new file mode 100644 index 0000000..888319c --- /dev/null +++ b/web/app/page.tsx @@ -0,0 +1,10 @@ +import { HomePage } from "@/components/homepage/HomePage"; + +export default function Home() { + return ( + <> + + + + ); +} diff --git a/web/app/settings/page.tsx b/web/app/settings/page.tsx new file mode 100644 index 0000000..aca297b --- /dev/null +++ b/web/app/settings/page.tsx @@ -0,0 +1,80 @@ +"use client" +import React, { useState } from "react"; +import { useRouter } from "next/navigation"; + +const FillEnvVariables = () => { + const [neourl, setNeourl] = useState(''); + const [neouser, setNeouser] = useState(''); + const [neopass, setNeopass] = useState(''); + const [openaikey, setOpenaiKey] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + + const router = useRouter(); + + const validateForm = () => { + if (!neourl || !neouser || !neopass || !openaikey) { + setError('All values are required'); + return false; + } + setError(''); + return true; + }; + + const handleSubmit = async (event: { preventDefault: () => void; }) => { + event.preventDefault(); + if (!validateForm()) return; + setLoading(true); + + localStorage.setItem('neourl', neourl); + localStorage.setItem('neouser', neouser); + localStorage.setItem('neopass', neopass); + localStorage.setItem('openaikey', openaikey); + + setLoading(false); + router.push('/chat') + }; + + + return ( +
+
+ + logo + SurfSense + +
+
+

+ Required Values +

+
+
+ + setNeourl(e.target.value)} name="neourl" id="neourl" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+ +
+ + setNeouser(e.target.value)} name="neouser" id="neouser" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+
+ + setNeopass(e.target.value)} name="neopass" id="neopass" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +
+
+ + setOpenaiKey(e.target.value)} name="openaikey" id="openaikey" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+ + {error &&

{error}

} +
+
+
+
+
+ ) +} + +export default FillEnvVariables diff --git a/web/app/signup/page.tsx b/web/app/signup/page.tsx new file mode 100644 index 0000000..cf49d97 --- /dev/null +++ b/web/app/signup/page.tsx @@ -0,0 +1,9 @@ +import { RegisterForm } from "@/components/logins/RegisterForm" + +const page = () => { + return ( + + ) +} + +export default page \ No newline at end of file diff --git a/web/components.json b/web/components.json new file mode 100644 index 0000000..d1d2285 --- /dev/null +++ b/web/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "examples": "@/components/examples", + "blocks": "@/components/blocks" + } +} \ No newline at end of file diff --git a/web/components/Settings/EnvVarSettings.tsx b/web/components/Settings/EnvVarSettings.tsx new file mode 100644 index 0000000..2f18347 --- /dev/null +++ b/web/components/Settings/EnvVarSettings.tsx @@ -0,0 +1,43 @@ +import React from "react"; +import { useToast } from "../ui/use-toast"; +export const FillEnvVariables = () => { + const { toast } = useToast() + return ( +
+
+ + logo + SurfSense + +
+
+

+ Required Values +

+
+
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ ) + } + \ No newline at end of file diff --git a/web/components/homepage/Footer.tsx b/web/components/homepage/Footer.tsx new file mode 100644 index 0000000..03263ce --- /dev/null +++ b/web/components/homepage/Footer.tsx @@ -0,0 +1,10 @@ +export const Footer = () => { + return ( + + ) +} diff --git a/web/components/homepage/HomePage.tsx b/web/components/homepage/HomePage.tsx new file mode 100644 index 0000000..f2e9bde --- /dev/null +++ b/web/components/homepage/HomePage.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { motion } from "framer-motion"; +import React from "react"; +import { AuroraBackground } from "../ui/aurora-background"; + +import icon from "../../public/SurfSense.png" +import Image from "next/image"; +import Link from "next/link"; + +export function HomePage() { + return ( + + +
+ logo +
+
+ SurfSense +
+ {/*
Beta v0.0.1
*/} +
+ A Knowledge Graph 🧠 Brain 🧠 for World Wide Web Surfers. +
+ +
+
+ ); +} diff --git a/web/components/homepage/NavBar.tsx b/web/components/homepage/NavBar.tsx new file mode 100644 index 0000000..e46dfe9 --- /dev/null +++ b/web/components/homepage/NavBar.tsx @@ -0,0 +1,63 @@ +"use client"; +import React, { useState } from "react"; +import { HoveredLink, Menu, MenuItem, ProductItem } from "../ui/navbar-menu"; +import { cn } from "@/lib/utils"; +import { ThemeToggle } from "./theme-toggle"; +import Image from "next/image"; +import logo from "../../public/SurfSense.png" +import Link from "next/link"; + +export function MainNavbar() { + return ( +
+ +
+ ); +} + +function Navbar({ className }: { className?: string }) { + const [active, setActive] = useState(null); + return ( +
+ + + logo + SurfSense + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/web/components/homepage/theme-toggle.tsx b/web/components/homepage/theme-toggle.tsx new file mode 100644 index 0000000..59876a1 --- /dev/null +++ b/web/components/homepage/theme-toggle.tsx @@ -0,0 +1,40 @@ +"use client" + +import * as React from "react" +import { Moon, Sun } from "lucide-react" +import { useTheme } from "next-themes" + +import { Button } from "@/components/ui/button" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" + +export function ThemeToggle() { + const { setTheme } = useTheme() + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ) +} diff --git a/web/components/logins/LoginForm.tsx b/web/components/logins/LoginForm.tsx new file mode 100644 index 0000000..b2f306a --- /dev/null +++ b/web/components/logins/LoginForm.tsx @@ -0,0 +1,107 @@ +"use client" +import React, { useState } from "react"; +import { useRouter } from "next/navigation"; +import Link from "next/link"; + + + +export const LoginForm = () => { + const router = useRouter(); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + + const validateForm = () => { + if (!username || !password) { + setError('Username and password are required'); + return false; + } + setError(''); + return true; + }; + + const handleSubmit = async (event: any) => { + event.preventDefault(); + if (!validateForm()) return; + setLoading(true); + + const formDetails = new URLSearchParams(); + formDetails.append('username', username); + formDetails.append('password', password); + + try { + const response = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL!}/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: formDetails, + }); + + setLoading(false); + + if (response.ok) { + const data = await response.json(); + window.localStorage.setItem('token', data.access_token); + router.push('/chat'); + // navigate('/protected'); + } else { + const errorData = await response.json(); + setError(errorData.detail || 'Authentication failed!'); + } + } catch (error) { + setLoading(false); + setError('An error occurred. Please try again later.'); + } + }; + + + return ( + <> +
+
+ + logo + SurfSense + +
+
+

+ Sign in to your account +

+
+
+ + setUsername(e.target.value)} className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name" /> +
+
+ + setPassword(e.target.value)} + className="bg-gray-50 border border-gray-300 text-gray-900 rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" + /> +
+ +

+ Don’t have an account yet? Sign up +

+ {error &&

{error}

} +
+
+
+
+
+ + ); +} + + diff --git a/web/components/logins/RegisterForm.tsx b/web/components/logins/RegisterForm.tsx new file mode 100644 index 0000000..185100b --- /dev/null +++ b/web/components/logins/RegisterForm.tsx @@ -0,0 +1,112 @@ +"use client" +import React, { FormEvent, useState } from "react"; +import ReCAPTCHA from "react-google-recaptcha"; +import { useRouter } from "next/navigation"; +import { useToast } from "../ui/use-toast"; +import Link from "next/link"; + +export const RegisterForm = () => { + const [captcha, setCaptcha] = useState(); + const router = useRouter(); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [confpassword, setConfPassword] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(false); + const { toast } = useToast() + + const validateForm = () => { + if (!username || !password || !confpassword) { + setError('Username and password are required'); + return false; + } + setError(''); + return true; + }; + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault(); + setLoading(true); + + if (captcha) { + if (!validateForm()) return; + + try { + + const toSend = { + username: username, + password: password, + apisecretkey: process.env.NEXT_PUBLIC_API_SECRET_KEY! + } + + const response = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_URL!}/register`, { + method: 'POST', + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(toSend), + }); + + setLoading(false); + + if (response.ok) { + toast({ + title: "Registered Successfully", + description: "Redirecting to Login", + }) + router.push('/login'); + } else { + const errorData = await response.json(); + setError(errorData.detail || 'Authentication failed!'); + } + } catch (error) { + setLoading(false); + setError('An error occurred. Please try again later.'); + } + + } else { + setError('Recaptcha Failed'); + } + } + return ( +
+
+
+ logo + SurfSense +
+
+
+

+ Create an account +

+
+
+ + setUsername(e.target.value)} type="username" name="username" id="username" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" /> +
+
+ + setPassword(e.target.value)} type="password" name="password" id="password" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +
+
+ + setConfPassword(e.target.value)} + type="confirm-password" name="confpassword" id="confpassword" placeholder="••••••••" className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" /> +
+ + +

+ Already have an account? Login here +

+ {error &&

{error}

} + +
+
+
+
+ ) +} \ No newline at end of file diff --git a/web/components/theme-provider.tsx b/web/components/theme-provider.tsx new file mode 100644 index 0000000..8c90fbc --- /dev/null +++ b/web/components/theme-provider.tsx @@ -0,0 +1,9 @@ +"use client" + +import * as React from "react" +import { ThemeProvider as NextThemesProvider } from "next-themes" +import { type ThemeProviderProps } from "next-themes/dist/types" + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/web/components/ui/aurora-background.tsx b/web/components/ui/aurora-background.tsx new file mode 100644 index 0000000..7627178 --- /dev/null +++ b/web/components/ui/aurora-background.tsx @@ -0,0 +1,54 @@ +"use client"; +import { cn } from "@/lib/utils"; +import React, { ReactNode } from "react"; + +interface AuroraBackgroundProps extends React.HTMLProps { + children: ReactNode; + showRadialGradient?: boolean; +} + +export const AuroraBackground = ({ + className, + children, + showRadialGradient = true, + ...props +}: AuroraBackgroundProps) => { + return ( +
+
+
+
+
+ {children} +
+
+ ); +}; diff --git a/web/components/ui/button.tsx b/web/components/ui/button.tsx new file mode 100644 index 0000000..0ba4277 --- /dev/null +++ b/web/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/web/components/ui/collapsible.tsx b/web/components/ui/collapsible.tsx new file mode 100644 index 0000000..9fa4894 --- /dev/null +++ b/web/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/web/components/ui/dropdown-menu.tsx b/web/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..f69a0d6 --- /dev/null +++ b/web/components/ui/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/web/components/ui/lamp.tsx b/web/components/ui/lamp.tsx new file mode 100644 index 0000000..c97c2cd --- /dev/null +++ b/web/components/ui/lamp.tsx @@ -0,0 +1,104 @@ +"use client"; +import React from "react"; +import { motion } from "framer-motion"; +import { cn } from "@/lib/utils"; + +export default function LampDemo() { + return ( + + + Build lamps
the right way +
+
+ ); +} + +export const LampContainer = ({ + children, + className, +}: { + children: React.ReactNode; + className?: string; +}) => { + return ( +
+
+ +
+
+ + +
+
+ +
+
+
+ + + +
+
+ +
+ {children} +
+
+ ); +}; diff --git a/web/components/ui/navbar-menu.tsx b/web/components/ui/navbar-menu.tsx new file mode 100644 index 0000000..bff7b92 --- /dev/null +++ b/web/components/ui/navbar-menu.tsx @@ -0,0 +1,121 @@ +"use client"; +import React from "react"; +import { motion } from "framer-motion"; +import Link from "next/link"; +import Image from "next/image"; + +const transition = { + type: "spring", + mass: 0.5, + damping: 11.5, + stiffness: 100, + restDelta: 0.001, + restSpeed: 0.001, +}; + +export const MenuItem = ({ + setActive, + active, + item, + children, +}: { + setActive: (item: string) => void; + active: string | null; + item: string; + children?: React.ReactNode; +}) => { + return ( +
setActive(item)} className="relative "> + + {item} + + {active !== null && ( + + {active === item && ( +
+ + + {children} + + +
+ )} +
+ )} +
+ ); +}; + +export const Menu = ({ + setActive, + children, +}: { + setActive: (item: string | null) => void; + children: React.ReactNode; +}) => { + return ( + + ); +}; + +export const ProductItem = ({ + title, + description, + href, + src, +}: { + title: string; + description: string; + href: string; + src: string; +}) => { + return ( + + {title} +
+

+ {title} +

+

+ {description} +

+
+ + ); +}; + +export const HoveredLink = ({ children, ...rest }: any) => { + return ( + + {children} + + ); +}; diff --git a/web/components/ui/table.tsx b/web/components/ui/table.tsx new file mode 100644 index 0000000..7f3502f --- /dev/null +++ b/web/components/ui/table.tsx @@ -0,0 +1,117 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:border-b-0", + className + )} + {...props} + /> +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/web/components/ui/toast.tsx b/web/components/ui/toast.tsx new file mode 100644 index 0000000..521b94b --- /dev/null +++ b/web/components/ui/toast.tsx @@ -0,0 +1,129 @@ +"use client" + +import * as React from "react" +import * as ToastPrimitives from "@radix-ui/react-toast" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const ToastProvider = ToastPrimitives.Provider + +const ToastViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastViewport.displayName = ToastPrimitives.Viewport.displayName + +const toastVariants = cva( + "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", + { + variants: { + variant: { + default: "border bg-background text-foreground", + destructive: + "destructive group border-destructive bg-destructive text-destructive-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Toast = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, ...props }, ref) => { + return ( + + ) +}) +Toast.displayName = ToastPrimitives.Root.displayName + +const ToastAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastAction.displayName = ToastPrimitives.Action.displayName + +const ToastClose = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +ToastClose.displayName = ToastPrimitives.Close.displayName + +const ToastTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastTitle.displayName = ToastPrimitives.Title.displayName + +const ToastDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastDescription.displayName = ToastPrimitives.Description.displayName + +type ToastProps = React.ComponentPropsWithoutRef + +type ToastActionElement = React.ReactElement + +export { + type ToastProps, + type ToastActionElement, + ToastProvider, + ToastViewport, + Toast, + ToastTitle, + ToastDescription, + ToastClose, + ToastAction, +} diff --git a/web/components/ui/toaster.tsx b/web/components/ui/toaster.tsx new file mode 100644 index 0000000..e223385 --- /dev/null +++ b/web/components/ui/toaster.tsx @@ -0,0 +1,35 @@ +"use client" + +import { + Toast, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, +} from "@/components/ui/toast" +import { useToast } from "@/components/ui/use-toast" + +export function Toaster() { + const { toasts } = useToast() + + return ( + + {toasts.map(function ({ id, title, description, action, ...props }) { + return ( + +
+ {title && {title}} + {description && ( + {description} + )} +
+ {action} + +
+ ) + })} + +
+ ) +} diff --git a/web/components/ui/use-toast.ts b/web/components/ui/use-toast.ts new file mode 100644 index 0000000..02e111d --- /dev/null +++ b/web/components/ui/use-toast.ts @@ -0,0 +1,194 @@ +"use client" + +// Inspired by react-hot-toast library +import * as React from "react" + +import type { + ToastActionElement, + ToastProps, +} from "@/components/ui/toast" + +const TOAST_LIMIT = 1 +const TOAST_REMOVE_DELAY = 1000000 + +type ToasterToast = ToastProps & { + id: string + title?: React.ReactNode + description?: React.ReactNode + action?: ToastActionElement +} + +const actionTypes = { + ADD_TOAST: "ADD_TOAST", + UPDATE_TOAST: "UPDATE_TOAST", + DISMISS_TOAST: "DISMISS_TOAST", + REMOVE_TOAST: "REMOVE_TOAST", +} as const + +let count = 0 + +function genId() { + count = (count + 1) % Number.MAX_SAFE_INTEGER + return count.toString() +} + +type ActionType = typeof actionTypes + +type Action = + | { + type: ActionType["ADD_TOAST"] + toast: ToasterToast + } + | { + type: ActionType["UPDATE_TOAST"] + toast: Partial + } + | { + type: ActionType["DISMISS_TOAST"] + toastId?: ToasterToast["id"] + } + | { + type: ActionType["REMOVE_TOAST"] + toastId?: ToasterToast["id"] + } + +interface State { + toasts: ToasterToast[] +} + +const toastTimeouts = new Map>() + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId) + dispatch({ + type: "REMOVE_TOAST", + toastId: toastId, + }) + }, TOAST_REMOVE_DELAY) + + toastTimeouts.set(toastId, timeout) +} + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case "ADD_TOAST": + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + } + + case "UPDATE_TOAST": + return { + ...state, + toasts: state.toasts.map((t) => + t.id === action.toast.id ? { ...t, ...action.toast } : t + ), + } + + case "DISMISS_TOAST": { + const { toastId } = action + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId) + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id) + }) + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t + ), + } + } + case "REMOVE_TOAST": + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + } + } + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + } + } +} + +const listeners: Array<(state: State) => void> = [] + +let memoryState: State = { toasts: [] } + +function dispatch(action: Action) { + memoryState = reducer(memoryState, action) + listeners.forEach((listener) => { + listener(memoryState) + }) +} + +type Toast = Omit + +function toast({ ...props }: Toast) { + const id = genId() + + const update = (props: ToasterToast) => + dispatch({ + type: "UPDATE_TOAST", + toast: { ...props, id }, + }) + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) + + dispatch({ + type: "ADD_TOAST", + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss() + }, + }, + }) + + return { + id: id, + dismiss, + update, + } +} + +function useToast() { + const [state, setState] = React.useState(memoryState) + + React.useEffect(() => { + listeners.push(setState) + return () => { + const index = listeners.indexOf(setState) + if (index > -1) { + listeners.splice(index, 1) + } + } + }, [state]) + + return { + ...state, + toast, + dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), + } +} + +export { useToast, toast } diff --git a/web/lib/utils.ts b/web/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/web/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/web/next.config.mjs b/web/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/web/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..a68c9ce --- /dev/null +++ b/web/package.json @@ -0,0 +1,41 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-collapsible": "^1.1.0", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", + "@types/react-google-recaptcha": "^2.1.9", + "@uiw/react-markdown-preview": "^5.1.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "framer-motion": "^11.3.24", + "lucide-react": "^0.426.0", + "next": "14.2.5", + "next-themes": "^0.3.0", + "react": "^18", + "react-dom": "^18", + "react-element-to-jsx-string": "^15.0.0", + "react-google-recaptcha": "^3.1.0", + "react-markdown": "^9.0.1", + "tailwind-merge": "^2.4.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.9", + "typescript": "^5" + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..9920ccc --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,3428 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@radix-ui/react-collapsible': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.0 + version: 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-toast': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react-google-recaptcha': + specifier: ^2.1.9 + version: 2.1.9 + '@uiw/react-markdown-preview': + specifier: ^5.1.2 + version: 5.1.2(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + framer-motion: + specifier: ^11.3.24 + version: 11.3.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lucide-react: + specifier: ^0.426.0 + version: 0.426.0(react@18.3.1) + next: + specifier: 14.2.5 + version: 14.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes: + specifier: ^0.3.0 + version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18 + version: 18.3.1 + react-dom: + specifier: ^18 + version: 18.3.1(react@18.3.1) + react-element-to-jsx-string: + specifier: ^15.0.0 + version: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-google-recaptcha: + specifier: ^3.1.0 + version: 3.1.0(react@18.3.1) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.3.3)(react@18.3.1) + tailwind-merge: + specifier: ^2.4.0 + version: 2.4.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.9) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.14.14 + '@types/react': + specifier: ^18 + version: 18.3.3 + '@types/react-dom': + specifier: ^18 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.41) + postcss: + specifier: ^8.4.41 + version: 8.4.41 + tailwindcss: + specifier: ^3.4.9 + version: 3.4.9 + typescript: + specifier: ^5 + version: 5.5.4 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/react-dom@2.1.1': + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@next/env@14.2.5': + resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} + + '@next/swc-darwin-arm64@14.2.5': + resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.5': + resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.5': + resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.5': + resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.5': + resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.5': + resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.5': + resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.5': + resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.5': + resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.0': + resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toast@1.2.1': + resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.14.14': + resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react-google-recaptcha@2.1.9': + resolution: {integrity: sha512-nT31LrBDuoSZJN4QuwtQSF3O89FVHC4jLhM+NtKEmVF5R1e8OY0Jo4//x2Yapn2aNHguwgX5doAq8Zo+Ehd0ug==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@uiw/copy-to-clipboard@1.0.17': + resolution: {integrity: sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==} + + '@uiw/react-markdown-preview@5.1.2': + resolution: {integrity: sha512-IheBzajVKZ3NUhYAfrnnereJmKVNQ6vRZDjQhKEQy7IMarJXrUKC1eG8OzTgy1J/3m67MBTs6d52kkSB699efA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-selector-parser@3.0.5: + resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@11.3.24: + resolution: {integrity: sha512-kl0YI7HwAtyV0VOAWuU/rXoOS8+z5qSkMN6rZS+a9oe6fIha6SC3vjJN6u/hBpvjrg5MQNdSnqnjYxm0WYTX9g==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.0.4: + resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} + + hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lucide-react@0.426.0: + resolution: {integrity: sha512-aby5G+Zt+LIIEU0n9900XQNJFJUcs7/S+jOEgIhkV08NX3kGx1zxALKh1JvAKcYqutWLg07exbnYvh66szhrRA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next-themes@0.3.0: + resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} + peerDependencies: + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 + + next@14.2.5: + resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-async-script@1.2.0: + resolution: {integrity: sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==} + peerDependencies: + react: '>=16.4.1' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + + react-google-recaptcha@3.1.0: + resolution: {integrity: sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==} + peerDependencies: + react: '>=16.4.1' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + + react-markdown@9.0.1: + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + refractor@4.8.1: + resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + rehype-attr@3.0.3: + resolution: {integrity: sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw==} + engines: {node: '>=16'} + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-ignore@2.0.2: + resolution: {integrity: sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==} + engines: {node: '>=16'} + + rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + + rehype-prism-plus@2.0.0: + resolution: {integrity: sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-rewrite@4.0.2: + resolution: {integrity: sha512-rjLJ3z6fIV11phwCqHp/KRo8xuUCO8o9bFJCNw5o6O2wlLk6g8r323aRswdGBQwfXPFYeSuZdAjp4tzo6RGqEg==} + engines: {node: '>=16.0.0'} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-github-blockquote-alert@1.2.1: + resolution: {integrity: sha512-qNf2mSAoZgh3Cl23/9Y1L7S4Kbf9NsdHvYK398ab/52yEsDPDU5I4cuTcgDRrdIX7Ltc6RK+KCLRtWkbFnL6Dg==} + engines: {node: '>=16'} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.4.0: + resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.9: + resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-filter@5.0.1: + resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.2: + resolution: {integrity: sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@base2/pretty-print-object@1.0.1': {} + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.7': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@next/env@14.2.5': {} + + '@next/swc-darwin-arm64@14.2.5': + optional: true + + '@next/swc-darwin-x64@14.2.5': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.5': + optional: true + + '@next/swc-linux-arm64-musl@14.2.5': + optional: true + + '@next/swc-linux-x64-gnu@14.2.5': + optional: true + + '@next/swc-linux-x64-musl@14.2.5': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.5': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.5': + optional: true + + '@next/swc-win32-x64-msvc@14.2.5': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/rect@1.1.0': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.6.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.5 + + '@types/estree@1.0.5': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/ms@0.7.34': {} + + '@types/node@20.14.14': + dependencies: + undici-types: 5.26.5 + + '@types/prismjs@1.26.4': {} + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react-google-recaptcha@2.1.9': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@uiw/copy-to-clipboard@1.0.17': {} + + '@uiw/react-markdown-preview@5.1.2(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.0 + '@uiw/copy-to-clipboard': 1.0.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-markdown: 9.0.1(@types/react@18.3.3)(react@18.3.1) + rehype-attr: 3.0.3 + rehype-autolink-headings: 7.1.0 + rehype-ignore: 2.0.2 + rehype-prism-plus: 2.0.0 + rehype-raw: 7.0.0 + rehype-rewrite: 4.0.2 + rehype-slug: 6.0.0 + remark-gfm: 4.0.0 + remark-github-blockquote-alert: 1.2.1 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + + '@ungap/structured-clone@1.2.0': {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.3 + + autoprefixer@10.4.20(postcss@8.4.41): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bcp-47-match@2.0.3: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001651: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + client-only@0.0.1: {} + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-selector-parser@3.0.5: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.5: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + escalade@3.1.2: {} + + escape-string-regexp@5.0.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + extend@3.0.2: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + framer-motion@11.3.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.6.3 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-nonce@1.0.1: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + graceful-fs@4.2.11: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.1: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.2 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.2 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.5 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.6 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-url-attributes@3.0.0: {} + + html-void-elements@3.0.0: {} + + inline-style-parser@0.2.3: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + js-tokens@4.0.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lucide-react@0.426.0(react@18.3.1): + dependencies: + react: 18.3.1 + + markdown-table@3.0.3: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.2 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.6 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next@14.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.5 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001651 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.5 + '@next/swc-darwin-x64': 14.2.5 + '@next/swc-linux-arm64-gnu': 14.2.5 + '@next/swc-linux-arm64-musl': 14.2.5 + '@next/swc-linux-x64-gnu': 14.2.5 + '@next/swc-linux-x64-musl': 14.2.5 + '@next/swc-win32-arm64-msvc': 14.2.5 + '@next/swc-win32-ia32-msvc': 14.2.5 + '@next/swc-win32-x64-msvc': 14.2.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + not@0.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + package-json-from-dist@1.0.0: {} + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-numeric-range@1.3.0: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.41): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.41 + + postcss-load-config@4.0.2(postcss@8.4.41): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.41 + + postcss-nested@6.2.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-selector-parser: 6.1.1 + + postcss-selector-parser@6.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + queue-microtask@1.2.3: {} + + react-async-script@1.2.0(react@18.3.1): + dependencies: + hoist-non-react-statics: 3.3.2 + prop-types: 15.8.1 + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.1.0 + + react-google-recaptcha@3.1.0(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-async-script: 1.2.0(react@18.3.1) + + react-is@16.13.1: {} + + react-is@18.1.0: {} + + react-markdown@9.0.1(@types/react@18.3.3)(react@18.3.1): + dependencies: + '@types/hast': 3.0.4 + '@types/react': 18.3.3 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.2.0 + react: 18.3.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.2 + transitivePeerDependencies: + - supports-color + + react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + refractor@4.8.1: + dependencies: + '@types/hast': 2.3.10 + '@types/prismjs': 1.26.4 + hastscript: 7.2.0 + parse-entities: 4.0.1 + + regenerator-runtime@0.14.1: {} + + rehype-attr@3.0.3: + dependencies: + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-ignore@2.0.2: + dependencies: + hast-util-select: 6.0.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-parse@9.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.1 + unified: 11.0.5 + + rehype-prism-plus@2.0.0: + dependencies: + hast-util-to-string: 3.0.0 + parse-numeric-range: 1.3.0 + refractor: 4.8.1 + rehype-parse: 9.0.0 + unist-util-filter: 5.0.1 + unist-util-visit: 5.0.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.0.4 + vfile: 6.0.2 + + rehype-rewrite@4.0.2: + dependencies: + hast-util-select: 6.0.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.0 + unist-util-visit: 5.0.0 + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github-blockquote-alert@1.2.1: + dependencies: + unist-util-visit: 5.0.0 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.2 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.0: {} + + space-separated-tokens@2.0.2: {} + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + style-to-object@1.0.6: + dependencies: + inline-style-parser: 0.2.3 + + styled-jsx@5.1.1(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.4.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.9): + dependencies: + tailwindcss: 3.4.9 + + tailwindcss@3.4.9: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-import: 15.1.0(postcss@8.4.41) + postcss-js: 4.0.1(postcss@8.4.41) + postcss-load-config: 4.0.2(postcss@8.4.41) + postcss-nested: 6.2.0(postcss@8.4.41) + postcss-selector-parser: 6.1.1 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.6.3: {} + + typescript@5.5.4: {} + + undici-types@5.26.5: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.2 + + unist-util-filter@5.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.2 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + web-namespaces@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yaml@2.5.0: {} + + zwitch@2.0.4: {} diff --git a/web/postcss.config.mjs b/web/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/web/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/web/public/SurfSense.png b/web/public/SurfSense.png new file mode 100644 index 0000000000000000000000000000000000000000..1a31918fed7d6f5001d7fb55786a6f0205129871 GIT binary patch literal 69851 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 literal 0 HcmV?d00001 diff --git a/web/public/icon-128.png b/web/public/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1464a7ada1c4dee741a474b892f1cf87944f23 GIT binary patch literal 5679 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 V{+N8%g;W3l002ovPDHLkV1hMo+s*(0 literal 0 HcmV?d00001 diff --git a/web/tailwind.config.ts b/web/tailwind.config.ts new file mode 100644 index 0000000..ad9a425 --- /dev/null +++ b/web/tailwind.config.ts @@ -0,0 +1,160 @@ +import type { Config } from "tailwindcss"; + +const { + default: flattenColorPalette, +} = require("tailwindcss/lib/util/flattenColorPalette"); + +const config = { + darkMode: ["class"], + content: [ + "./app/**/*.{js,ts,jsx,tsx,mdx}", + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + "50": "#eff6ff", + "100": "#dbeafe", + "200": "#bfdbfe", + "300": "#93c5fd", + "400": "#60a5fa", + "500": "#3b82f6", + "600": "#2563eb", + "700": "#1d4ed8", + "800": "#1e40af", + "900": "#1e3a8a", + "950": "#172554", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + aurora: { + from: { + backgroundPosition: "50% 50%, 50% 50%", + }, + to: { + backgroundPosition: "350% 50%, 350% 50%", + }, + }, + shimmer: { + from: { + backgroundPosition: "0 0", + }, + to: { + backgroundPosition: "-200% 0", + }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + aurora: "aurora 60s linear infinite", + shimmer: "shimmer 2s linear infinite", + }, + fontFamily: { + 'body': [ + 'Inter', + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'system-ui', + 'Segoe UI', + 'Roboto', + 'Helvetica Neue', + 'Arial', + 'Noto Sans', + 'sans-serif', + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ], + 'sans': [ + 'Inter', + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'system-ui', + 'Segoe UI', + 'Roboto', + 'Helvetica Neue', + 'Arial', + 'Noto Sans', + 'sans-serif', + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ] + } + } + }, + plugins: [require("tailwindcss-animate"), addVariablesForColors], +} satisfies Config; + +// This plugin adds each Tailwind color as a global CSS variable, e.g. var(--gray-200). +function addVariablesForColors({ addBase, theme }: any) { + let allColors = flattenColorPalette(theme("colors")); + let newVars = Object.fromEntries( + Object.entries(allColors).map(([key, val]) => [`--${key}`, val]) + ); + + addBase({ + ":root": newVars, + }); +} + +export default config; diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..e7ff90f --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}