├── .gitignore ├── .vscode └── settings.json ├── README.md ├── attendees.py ├── build_graph.py ├── generate_embeddings.py ├── graph ├── .DS_Store ├── .gitignore ├── fonts │ ├── .DS_Store │ ├── Space_Mono │ │ ├── OFL.txt │ │ ├── SpaceMono-Bold.ttf │ │ ├── SpaceMono-BoldItalic.ttf │ │ ├── SpaceMono-Italic.ttf │ │ └── SpaceMono-Regular.ttf │ ├── Tiempos Headline │ │ ├── TiemposHeadline-Black.otf │ │ ├── TiemposHeadline-BlackItalic.otf │ │ ├── TiemposHeadline-Bold.otf │ │ ├── TiemposHeadline-BoldItalic.otf │ │ ├── TiemposHeadline-Light.otf │ │ ├── TiemposHeadline-LightItalic.otf │ │ ├── TiemposHeadline-Medium.otf │ │ ├── TiemposHeadline-MediumItalic.otf │ │ ├── TiemposHeadline-Regular.otf │ │ ├── TiemposHeadline-RegularItalic.otf │ │ ├── TiemposHeadline-Semibold.otf │ │ └── TiemposHeadline-SemiboldItalic.otf │ └── Untitled Sans │ │ ├── UntitledSans-Black.otf │ │ ├── UntitledSans-BlackItalic.otf │ │ ├── UntitledSans-Bold.otf │ │ ├── UntitledSans-BoldItalic.otf │ │ ├── UntitledSans-Light.otf │ │ ├── UntitledSans-LightItalic.otf │ │ ├── UntitledSans-Medium.otf │ │ ├── UntitledSans-MediumItalic.otf │ │ ├── UntitledSans-Regular.otf │ │ └── UntitledSans-RegularItalic.otf ├── index.html ├── index.js ├── input.css ├── nodeSettings.js ├── package.json ├── pnpm-lock.yaml └── tailwind.config.js ├── images ├── graph.png └── match.png ├── main.py ├── match ├── .eslintrc.json ├── .gitignore ├── README.md ├── components.json ├── next.config.mjs ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public │ ├── fonts │ │ ├── Space_Mono │ │ │ ├── OFL.txt │ │ │ ├── SpaceMono-Bold.ttf │ │ │ ├── SpaceMono-BoldItalic.ttf │ │ │ ├── SpaceMono-Italic.ttf │ │ │ └── SpaceMono-Regular.ttf │ │ ├── Tiempos Headline │ │ │ ├── TiemposHeadline-Black.otf │ │ │ ├── TiemposHeadline-BlackItalic.otf │ │ │ ├── TiemposHeadline-Bold.otf │ │ │ ├── TiemposHeadline-BoldItalic.otf │ │ │ ├── TiemposHeadline-Light.otf │ │ │ ├── TiemposHeadline-LightItalic.otf │ │ │ ├── TiemposHeadline-Medium.otf │ │ │ ├── TiemposHeadline-MediumItalic.otf │ │ │ ├── TiemposHeadline-Regular.otf │ │ │ ├── TiemposHeadline-RegularItalic.otf │ │ │ ├── TiemposHeadline-Semibold.otf │ │ │ └── TiemposHeadline-SemiboldItalic.otf │ │ └── Untitled Sans │ │ │ ├── UntitledSans-Black.otf │ │ │ ├── UntitledSans-BlackItalic.otf │ │ │ ├── UntitledSans-Bold.otf │ │ │ ├── UntitledSans-BoldItalic.otf │ │ │ ├── UntitledSans-Light.otf │ │ │ ├── UntitledSans-LightItalic.otf │ │ │ ├── UntitledSans-Medium.otf │ │ │ ├── UntitledSans-MediumItalic.otf │ │ │ ├── UntitledSans-Regular.otf │ │ │ └── UntitledSans-RegularItalic.otf │ ├── next.svg │ └── vercel.svg ├── src │ ├── app │ │ ├── favicon.ico │ │ ├── globals.css │ │ ├── layout.tsx │ │ └── page.tsx │ ├── components │ │ ├── Search.tsx │ │ └── ui │ │ │ ├── dialog.tsx │ │ │ └── input.tsx │ └── lib │ │ └── utils.ts ├── tailwind.config.ts └── tsconfig.json ├── requirements.txt ├── summarize.py ├── summarize_graph_data.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | venv 2 | __pycache__/ 3 | 4 | graph/bundle.js 5 | **/bundle.js 6 | **/output.css 7 | 8 | 9 | # Ignore the data 10 | data.csv 11 | 12 | # Ignore the embeddings db 13 | chromadb 14 | 15 | # Ignore formatted 16 | graphData.json 17 | summarizedGraphData.json 18 | attendees.json 19 | .vercel 20 | 21 | .env 22 | .DS_Store -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5501 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Matchmaking Tools 2 | 3 | ### Download participant data 4 | 5 | In lu.ma, go to your event page and click "Manage". Click "Guests" and click the download button to get the CSV file. Put this in the root directory of this repository as "**data.csv**" 6 | 7 | If you have your own CSV, format it as follows: 8 | 9 | | Names | Responses | 10 | | ------------------- | --------------------------------------------- | 11 | | Freeman Jiang | I wish to explore the world | 12 | | Rajan Agarwal | I want to build AGI | 13 | | Hudhayfa Nazoordeen | I want to grow more vegetables hydroponically | 14 | 15 | In `generate_embeddings.py`, set the `COLUMN_INDEX` to be the column that your responses are in. For example, In the above csv the index would be `1`. 16 | 17 | ### Running the script 18 | 19 | Install dependencies 20 | 21 | ```sh 22 | python3 -m venv venv 23 | source venv/bin/activate 24 | pip install -r requirements.txt 25 | ``` 26 | 27 | Generate embeddings 28 | 29 | ```sh 30 | python generate_embeddings.py 31 | python build_graph.py # to create the graph based on the distance threshold 32 | python attendees.py # to create initial cache 33 | ``` 34 | 35 | You should now successfully have a `graphData.json` file. 36 | 37 | ### Generating summarized data (optional) 38 | 39 | You now have the option to summarize each response. For example, 40 | 41 | > i want to learn how to sculpt/pottery! creating something from a block of clay would be incredible but would take a lot of time/lessons. 42 | 43 | would become 44 | 45 | > Would learn how to sculpt and create pottery from clay. 46 | 47 | We recommend this for events where you can search for people, using the `match` site. If you are just using the graph, **this is not necessary.** 48 | 49 | ```sh 50 | python summarize_graph_data.py # (OPTIONAL) to summarize responses with LLM 51 | ``` 52 | 53 | then, uncomment the line in `graph/index.js`: 54 | 55 | ```js 56 | // Use the below line if you want to use the summarized graph instead 57 | //const json = require("../summarizedGraphData.json"); 58 | ``` 59 | 60 | If you choose to summarize the data with an LLM, a `summarizedGraphData.json` file will be present too. If you do the AI summarization, change `ai_summarization` in `attendees.py` to True. Then, run attendees again to recache. 61 | 62 | ```sh 63 | python attendees.py # create attendees.json for searching 64 | ``` 65 | 66 | ## Developing the Graph 67 | 68 | ![Graph Preview](images/graph.png) 69 | 70 | In the **graph/** directory 71 | 72 | ```sh 73 | cd graph 74 | npm i 75 | npm run dev 76 | ``` 77 | 78 | Next, concurrently run Tailwind in a new terminal: 79 | 80 | ```sh 81 | npm run tailwind 82 | ``` 83 | 84 | Finally, open **graph/index.html** in a browser. 85 | 86 | To serve: 87 | 88 | ```sh 89 | npm start 90 | ``` 91 | 92 | ## Developing the Matchmaking Site 93 | 94 | ![Match Preview](images/match.png) 95 | 96 | Now in the **match/** directory 97 | 98 | ```sh 99 | cd match 100 | npm i 101 | npm run dev 102 | ``` 103 | 104 | Then open **localhost:3000** in a browser. 105 | 106 | To serve: 107 | 108 | ```sh 109 | npm start 110 | ``` 111 | 112 | ### Deployment 113 | 114 | We suggest you deploy using the Vercel CLI, so you do not release personal information in the CSV. You can individually deploy `match` and `graph` with the same compiled dataset. You can check out their documentation: [Vercel CLI Docs](https://vercel.com/docs/cli). 115 | -------------------------------------------------------------------------------- /attendees.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def read_graph_data(filename): 4 | with open(filename, 'r') as file: 5 | data = json.load(file) 6 | return data 7 | 8 | def extract_responses(graph_data): 9 | attendees = {} 10 | for node in graph_data['nodes']: 11 | node_id = node['id'] 12 | response = node['data']['response'] 13 | attendees[node_id] = response 14 | return attendees 15 | 16 | def write_attendees(attendees_data, filename): 17 | with open(filename, 'w') as file: 18 | json.dump(attendees_data, file, indent=4) 19 | 20 | def main(): 21 | ai_summarization = False 22 | graph_data = read_graph_data('summarizedGraphData.json' if ai_summarization else 'graphData.json') 23 | attendees_data = extract_responses(graph_data) 24 | write_attendees(attendees_data, 'attendees.json') 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /build_graph.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pydantic import BaseModel 3 | import chromadb 4 | 5 | # How many matches an individual can have at maximum 6 | N_RESULTS = 10 7 | 8 | # Larger = more likely to be matched 9 | DISTANCE_THRESHOLD = 1.1 10 | 11 | # Which prompt stored in sqlite to process 12 | # We define this in generate_embeddings.py 13 | COLLECTION_TO_PROCESS = "time_prompt_embeddings" 14 | 15 | class NodeData(BaseModel): 16 | name: str 17 | major: str 18 | response: str 19 | topMatch: str 20 | 21 | class Node(BaseModel): 22 | id: str 23 | data: NodeData 24 | 25 | class Link(BaseModel): 26 | source: str 27 | target: str 28 | 29 | def process_collection(collection: chromadb.Collection, nodes: list[Node], links: list[Link]): 30 | results = collection.get( 31 | ids=None, include=["metadatas", "documents", "embeddings"]) 32 | if results["embeddings"] is None or results["metadatas"] is None: 33 | raise ValueError("No embeddings found in the collection") 34 | 35 | for i, embedding in enumerate(results["embeddings"]): 36 | self_id = results["ids"][i] 37 | self_name = results["metadatas"][i]["name"] 38 | self_major = results['metadatas'][i]['program'] 39 | self_response = results['documents'][i] 40 | 41 | query = collection.query( 42 | n_results=N_RESULTS, 43 | query_embeddings=[embedding], 44 | include=["metadatas", "distances", "documents"], 45 | where={ 46 | "name": { 47 | "$ne": self_name, 48 | } 49 | } 50 | ) 51 | 52 | nearest_ids = query["ids"][0] 53 | 54 | if not query["distances"]: 55 | raise ValueError("No distances found in the query") 56 | distances = query["distances"][0] 57 | 58 | name = str(results["metadatas"][i]["name"]) 59 | 60 | print( 61 | f"{i+1}/{len(results['embeddings'])}: Processing {name} ({self_major})") 62 | 63 | # Always give a match 64 | top_match = nearest_ids[0] 65 | 66 | new_node = Node( 67 | id=self_id, 68 | data=NodeData( 69 | name=name, 70 | response=self_response, 71 | major=self_major, 72 | topMatch=top_match 73 | ) 74 | ) 75 | 76 | nodes.append(new_node) 77 | 78 | # Always add the links 79 | for i, distance in enumerate(distances): 80 | if distance < DISTANCE_THRESHOLD: 81 | links.append( 82 | Link( 83 | source=self_id, 84 | target=nearest_ids[i] 85 | ) 86 | ) 87 | 88 | def main(): 89 | chroma_client = chromadb.PersistentClient(path="chromadb") 90 | nodes: list[Node] = [] 91 | links: list[Link] = [] 92 | collection = chroma_client.get_collection(COLLECTION_TO_PROCESS) 93 | 94 | process_collection(collection, nodes, links) 95 | 96 | print(f"Graph constructed from collection: {COLLECTION_TO_PROCESS}") 97 | 98 | with open("graphData.json", "w") as f: 99 | json.dump({"nodes": [n.model_dump() for n in nodes], 100 | "links": [l.model_dump() for l in links]}, f) 101 | 102 | if __name__ == '__main__': 103 | main() 104 | -------------------------------------------------------------------------------- /generate_embeddings.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | import numpy as np 4 | import pandas as pd 5 | 6 | import chromadb 7 | from utils import chunk_array 8 | 9 | # SET THIS TO BE THE COLUMN OF YOUR RESPONSE 10 | COLUMN_INDEX = 23 11 | 12 | 13 | def generate_embeddings(): 14 | chroma_client = chromadb.PersistentClient(path="chromadb") 15 | time_prompt_collection = chroma_client.get_or_create_collection( 16 | name="time_prompt_embeddings" 17 | ) 18 | 19 | problem_prompt_collection = chroma_client.get_or_create_collection( 20 | name="problem_prompt_embeddings" 21 | ) 22 | 23 | # Load the CSV file into a Pandas DataFrame 24 | file_path = "data.csv" 25 | df = pd.read_csv(file_path) 26 | df = df.replace({np.nan: None}) # Replace NaN with None 27 | 28 | # Lists to hold batch data 29 | time_prompts = [] 30 | time_ids = [] 31 | time_metadatas = [] 32 | 33 | problem_prompts = [] 34 | problem_ids = [] 35 | problem_metadatas = [] 36 | 37 | column_name_to_process = df.iloc[:, COLUMN_INDEX].name 38 | 39 | # Ask for input and accept enter or y as confirmation, else end 40 | inp = input( 41 | f'Are you sure you want to process column {COLUMN_INDEX}:\n\n "{column_name_to_process}"?\n\n(y/n): ' 42 | ) 43 | 44 | if inp.lower() not in ["", "y"]: 45 | print("Ending process...") 46 | return 47 | 48 | print("Processing column...") 49 | 50 | # Iterate over DataFrame to accumulate batch data 51 | for index, row in df.iterrows(): 52 | api_id = row["api_id"] 53 | name = row["name"] 54 | email = row["email"] 55 | program: Optional[str] = row.iloc[21] 56 | 57 | prompt_response: Optional[str] = row.iloc[COLUMN_INDEX] 58 | # problem_prompt: Optional[str] = None 59 | 60 | # Accumulate time_prompt data 61 | if prompt_response: 62 | time_prompts.append(prompt_response) 63 | time_ids.append(api_id) 64 | time_metadatas.append( 65 | { 66 | "name": name, 67 | "email": email, 68 | "program": program or "N/A", 69 | } 70 | ) 71 | 72 | # Accumulate problem_prompt data 73 | # if problem_prompt: 74 | # problem_prompts.append(problem_prompt) 75 | # problem_ids.append(api_id) 76 | # problem_metadatas.append({ 77 | # "name": name, 78 | # "email": email, 79 | # "program": program or "N/A", 80 | # }) 81 | 82 | print(f"{index}: Processed {name} ({program})") 83 | 84 | print("Performing batch upserts...") 85 | 86 | # Split batch data into smaller chunks of 20 participants each 87 | 88 | chunk_size = 5 # This can be any value you would like. We recommend 5 89 | time_prompts = chunk_array(time_prompts, chunk_size) 90 | time_ids = chunk_array(time_ids, chunk_size) 91 | time_metadatas = chunk_array(time_metadatas, chunk_size) 92 | 93 | problem_prompts = chunk_array(problem_prompts, chunk_size) 94 | problem_ids = chunk_array(problem_ids, chunk_size) 95 | problem_metadatas = chunk_array(problem_metadatas, chunk_size) 96 | 97 | for i in range(len(time_prompts)): 98 | time_prompt_collection.upsert( 99 | ids=time_ids[i], documents=time_prompts[i], metadatas=time_metadatas[i] 100 | ) 101 | print( 102 | f"Finished {len(time_prompts[i])} time prompts ({i+1}/{len(time_prompts)})" 103 | ) 104 | 105 | for i in range(len(problem_prompts)): 106 | problem_prompt_collection.upsert( 107 | ids=problem_ids[i], 108 | documents=problem_prompts[i], 109 | metadatas=problem_metadatas[i], 110 | ) 111 | print( 112 | f"Finished {len(problem_prompts[i])} problem prompts ({i+1}/{len(problem_prompts)})" 113 | ) 114 | 115 | 116 | if __name__ == "__main__": 117 | generate_embeddings() 118 | -------------------------------------------------------------------------------- /graph/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/.DS_Store -------------------------------------------------------------------------------- /graph/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | 3 | package-lock.json 4 | .vercel 5 | -------------------------------------------------------------------------------- /graph/fonts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/.DS_Store -------------------------------------------------------------------------------- /graph/fonts/Space_Mono/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2016 Google Inc. All Rights Reserved. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://openfontlicense.org 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /graph/fonts/Space_Mono/SpaceMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Bold.ttf -------------------------------------------------------------------------------- /graph/fonts/Space_Mono/SpaceMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-BoldItalic.ttf -------------------------------------------------------------------------------- /graph/fonts/Space_Mono/SpaceMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Italic.ttf -------------------------------------------------------------------------------- /graph/fonts/Space_Mono/SpaceMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Regular.ttf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Black.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Bold.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Light.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Medium.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Regular.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf -------------------------------------------------------------------------------- /graph/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Black.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-BlackItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Bold.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-BoldItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Light.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-LightItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Medium.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-MediumItalic.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Regular.otf -------------------------------------------------------------------------------- /graph/fonts/Untitled Sans/UntitledSans-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-RegularItalic.otf -------------------------------------------------------------------------------- /graph/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Socratica W24 Symposium Graph 5 | 6 | 7 | 8 | 9 | 17 | 31 |
34 |
Socratica
35 |
W24 Symposium
36 |
37 |
38 |
39 | They should meet 40 |
41 |
45 |
49 |
50 |
53 |
54 |
55 |
56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /graph/index.js: -------------------------------------------------------------------------------- 1 | const graphConfig = { 2 | nodeColor: 0xe8c6a5, // (#C6492C) 3 | nodeSize: 25, 4 | nodeHoverColor: 0xffe213, // (#ffe213) 5 | nodeConnectionColor: 0xffe213, // (#a9ba22) 6 | linkFromColor: 0x732196, // (#a33f3f) 7 | linkToColor: 0xc6492c, // (#35130b) 8 | linkConnectionFromColor: 0xffffff, // (#ffffff) 9 | linkConnectionToColor: 0xffe213, // (#ffe213) 10 | springLength: 200, 11 | springCoeff: 0.001, 12 | gravity: -10, 13 | theta: 0.2, 14 | dragCoeff: 0.3, 15 | timeStep: 1, 16 | backgroundColor: 0x0, // (Socratica Black) 17 | }; 18 | 19 | var createSettingsView = require("config.pixel"); 20 | var query = require("query-string").parse(window.location.search.substring(1)); 21 | const json = require("../graphData.json"); 22 | // Use the below line if you want to use the summarized graph instead 23 | // const json = require("../summarizedGraphData.json"); 24 | var graph = getGraphFromQueryString(query); 25 | var renderGraph = require("ngraph.pixel"); 26 | var addCurrentNodeSettings = require("./nodeSettings.js"); 27 | var THREE = require("three"); 28 | var createLayout = require("pixel.layout"); 29 | 30 | let activateCycle = true; 31 | 32 | const layout = createLayout(graph); 33 | 34 | var renderer = renderGraph(graph, { 35 | // See API: https://github.com/anvaka/ngraph.pixel/blob/master/index.js#L25 36 | node: () => { 37 | return { 38 | color: graphConfig.nodeColor, 39 | size: graphConfig.nodeSize, 40 | }; 41 | }, 42 | link: () => { 43 | return { 44 | fromColor: graphConfig.linkFromColor, 45 | toColor: graphConfig.linkToColor, 46 | }; 47 | }, 48 | clearColor: graphConfig.backgroundColor, // (#121212) 49 | }); 50 | 51 | var simulator = renderer.layout().simulator; 52 | simulator.springLength(graphConfig.springLength); 53 | simulator.springCoeff(graphConfig.springCoeff); 54 | simulator.gravity(graphConfig.gravity); 55 | simulator.theta(graphConfig.theta); 56 | simulator.dragCoeff(graphConfig.dragCoeff); 57 | simulator.timeStep(graphConfig.timeStep); 58 | renderer.focus(); 59 | // var settingsView = createSettingsView(renderer); 60 | // var gui = settingsView.gui(); 61 | 62 | // var nodeSettings = addCurrentNodeSettings(gui, renderer); 63 | 64 | renderer.on("nodehover", showNodeDetails); 65 | renderer.on("nodeclick", resetNodeDetails); 66 | 67 | const nodeAttendees = document.getElementById("nodeAttendees").textContent; 68 | console.log(nodeAttendees); 69 | document.getElementById( 70 | "nodeAttendees" 71 | ).textContent = `${json.nodes.length} People`; 72 | 73 | function showNodeDetails(node) { 74 | if (!node) { 75 | return; 76 | } 77 | 78 | // Reset node and link colors 79 | resetNodeDetails(); 80 | 81 | // Update node details 82 | document.getElementById("nodeName").textContent = 83 | node.data.name.toUpperCase(); 84 | document.getElementById("nodeMajor").textContent = 85 | node.data.major && node.data.major != "N/A" ? node.data.major : ""; 86 | document.getElementById("nodeConnections").textContent = `${ 87 | graph.getLinks(node.id)?.length || 0 88 | } Potential Connections`; 89 | document.getElementById("nodeDescription").textContent = node.data.response; 90 | 91 | const topMatch = node.data.topMatch; 92 | const topMatchNode = graph.getNode(topMatch); 93 | 94 | const topMatchName = document.getElementById("topMatchName"); 95 | const topMatchResponse = document.getElementById("topMatchResponse"); 96 | 97 | if (topMatch) { 98 | topMatchName.textContent = topMatchNode.data.name; 99 | topMatchResponse.textContent = `Who ${ 100 | topMatchNode.data.response.charAt(0).toLowerCase() + 101 | topMatchNode.data.response.slice(1) 102 | }`; 103 | } else { 104 | topMatchName.textContent = ""; 105 | topMatchResponse.textContent = ""; 106 | } 107 | 108 | // Show the panel 109 | document.getElementById("nodePanel").classList.remove("hidden"); 110 | 111 | // Update node and link colors as before... 112 | var nodeUI = renderer.getNode(node.id); 113 | nodeUI.color = graphConfig.nodeHoverColor; 114 | 115 | if (graph.getLinks(node.id)) { 116 | graph.getLinks(node.id).forEach(function (link) { 117 | var toNode = link.toId === node.id ? link.fromId : link.toId; 118 | var toNodeUI = renderer.getNode(toNode); 119 | toNodeUI.color = graphConfig.nodeConnectionColor; 120 | 121 | var linkUI = renderer.getLink(link.id); 122 | linkUI.fromColor = graphConfig.linkConnectionFromColor; 123 | linkUI.toColor = graphConfig.linkConnectionToColor; 124 | }); 125 | } 126 | } 127 | 128 | function resetNodeDetails() { 129 | // Hide the node panel 130 | document.getElementById("nodePanel").classList.add("hidden"); 131 | 132 | // Reset node and link colors as before... 133 | graph.forEachNode(function (node) { 134 | var nodeUI = renderer.getNode(node.id); 135 | nodeUI.color = graphConfig.nodeColor; 136 | }); 137 | graph.forEachLink(function (link) { 138 | var linkUI = renderer.getLink(link.id); 139 | linkUI.fromColor = graphConfig.linkFromColor; 140 | linkUI.toColor = graphConfig.linkToColor; 141 | }); 142 | } 143 | 144 | function getGraphFromQueryString(query) { 145 | var graphGenerators = require("ngraph.generators"); 146 | var createGraph = graphGenerators[query.graph] || graphGenerators.grid; 147 | return query.graph 148 | ? createGraph( 149 | getNumber(query.n), 150 | getNumber(query.m), 151 | getNumber(query.k) 152 | ) 153 | : populateGraph(); 154 | } 155 | 156 | function getNumber(string, defaultValue) { 157 | var number = parseFloat(string); 158 | return typeof number === "number" && !isNaN(number) 159 | ? number 160 | : defaultValue || 10; 161 | } 162 | 163 | function populateGraph() { 164 | var createGraph = require("ngraph.graph"); 165 | var g = createGraph(); 166 | 167 | var nodes = json.nodes; 168 | var links = json.links; 169 | 170 | nodes.forEach(function (node) { 171 | g.addNode(node.id, node.data); 172 | }); 173 | links.forEach(function (link) { 174 | g.addLink(link.source, link.target); 175 | }); 176 | 177 | return g; 178 | } 179 | 180 | function intersect(from, to, r) { 181 | var dx = from.x - to.x; 182 | var dy = from.y - to.y; 183 | var dz = from.z - to.z; 184 | var r1 = Math.sqrt(dx * dx + dy * dy + dz * dz); 185 | var teta = Math.acos(dz / r1); 186 | var phi = Math.atan2(dy, dx); 187 | 188 | return { 189 | x: r * Math.sin(teta) * Math.cos(phi) + to.x, 190 | y: r * Math.sin(teta) * Math.sin(phi) + to.y, 191 | z: r * Math.cos(teta) + to.z, 192 | }; 193 | } 194 | 195 | function flyTo(camera, to, radius) { 196 | if (!to || to.x === undefined || to.y === undefined || to.z === undefined) { 197 | console.error("Invalid target position:", to); 198 | return; 199 | } 200 | 201 | var from = { 202 | x: camera.position.x, 203 | y: camera.position.y, 204 | z: camera.position.z, 205 | }; 206 | 207 | var cameraOffset = radius / Math.tan((Math.PI / 180.0) * camera.fov * 0.5); 208 | var cameraEndPos = intersect(from, to, cameraOffset); 209 | 210 | if (!cameraEndPos) { 211 | console.error("Failed to calculate camera end position."); 212 | return; 213 | } 214 | 215 | camera.position.set(to.x, to.y, to.z); 216 | // camera.lookAt(new THREE.Vector3(to.x, to.y, to.z)); 217 | } 218 | 219 | function getRandomNodeId() { 220 | console.log(json.nodes); 221 | if (json.nodes.length === 0) return null; 222 | const randomIndex = Math.floor(Math.random() * json.nodes.length); 223 | return json.nodes[randomIndex]; 224 | } 225 | 226 | function cycleThroughNodes() { 227 | setInterval(() => { 228 | const randomNode = getRandomNodeId(); 229 | if (randomNode && activateCycle) { 230 | showNodeDetails(randomNode); 231 | } 232 | }, 10000); 233 | } 234 | 235 | function showSearchBar() { 236 | if (document.getElementById("searchBarContainer")) { 237 | document.getElementById("searchBarContainer").remove(); 238 | } 239 | 240 | var nodes = json.nodes; 241 | 242 | var searchBarContainer = document.createElement("div"); 243 | searchBarContainer.id = "searchBarContainer"; 244 | searchBarContainer.style.position = "absolute"; 245 | searchBarContainer.style.top = "20px"; 246 | searchBarContainer.style.right = "20px"; 247 | searchBarContainer.style.background = "rgba(255, 255, 255, 0.2)"; 248 | searchBarContainer.style.borderRadius = "12px"; 249 | searchBarContainer.style.border = "1px solid rgba(255, 255, 255, 0.18)"; 250 | searchBarContainer.style.backdropFilter = "blur(5px)"; 251 | searchBarContainer.style.padding = "20px"; 252 | searchBarContainer.style.width = "300px"; 253 | searchBarContainer.style.boxSizing = "border-box"; 254 | searchBarContainer.style.fontFamily = "'Geist', sans-serif"; 255 | searchBarContainer.style.display = "flex"; 256 | searchBarContainer.style.flexDirection = "column"; 257 | searchBarContainer.style.gap = "10px"; 258 | 259 | var input = document.createElement("input"); 260 | input.style.padding = "10px"; 261 | input.style.borderRadius = "8px"; 262 | input.style.border = "none"; 263 | input.style.background = "rgba(0, 0, 0, 0.4)"; 264 | input.style.borderRadius = "12px"; 265 | input.style.border = "1px solid rgba(255, 255, 255, 0.18)"; 266 | input.style.backdropFilter = "blur(5px)"; 267 | input.style.fontFamily = "'Geist', sans-serif"; 268 | input.style.outlineColor = "rgba(255, 255, 255, 0.1)"; 269 | input.style.color = "white"; 270 | 271 | var button = document.createElement("button"); 272 | button.style.fontFamily = "'Geist', sans-serif"; 273 | button.textContent = "Search"; 274 | button.style.color = "white"; 275 | button.style.padding = "10px"; 276 | button.style.borderRadius = "8px"; 277 | button.style.border = "none"; 278 | button.style.cursor = "pointer"; 279 | button.style.background = "rgba(0, 0, 0, 0.4)"; 280 | 281 | input.addEventListener("keyup", function (event) { 282 | if (event.key === "Enter") { 283 | event.preventDefault(); 284 | button.click(); 285 | } 286 | }); 287 | 288 | var resultsContainer = document.createElement("div"); 289 | resultsContainer.id = "resultsContainer"; 290 | resultsContainer.style.maxHeight = "150px"; 291 | resultsContainer.style.overflowY = "auto"; 292 | resultsContainer.style.marginTop = "10px"; 293 | resultsContainer.style.display = "flex"; 294 | resultsContainer.style.flexDirection = "column"; 295 | resultsContainer.style.gap = "5px"; 296 | resultsContainer.style.color = "white"; 297 | 298 | searchBarContainer.appendChild(input); 299 | searchBarContainer.appendChild(button); 300 | searchBarContainer.appendChild(resultsContainer); 301 | 302 | document.body.appendChild(searchBarContainer); 303 | 304 | button.addEventListener("click", function () { 305 | resultsContainer.innerHTML = ""; 306 | 307 | var query = input.value; 308 | var matchingIndexes = searchByNameOrSchool(nodes, query); 309 | 310 | matchingIndexes.forEach((index) => { 311 | var node = nodes.find((node) => node.id === index); 312 | if (node) { 313 | var result = document.createElement("div"); 314 | result.innerHTML = `${node.data.name}
${ 315 | node.data.major != "N/A" ? node.data.major : "" 316 | }
`; 317 | resultsContainer.appendChild(result); 318 | result.style.cursor = "pointer"; 319 | 320 | result.addEventListener("click", function () { 321 | var nodePosition = layout.getNodePosition 322 | ? layout.getNodePosition(node.id) 323 | : { x: 0, y: 0, z: 0 }; 324 | activateCycle = false; 325 | showNodeDetails(node); 326 | console.log(renderer.camera()); 327 | console.log(nodePosition); 328 | }); 329 | } 330 | }); 331 | 332 | if (matchingIndexes.length === 0) { 333 | resultsContainer.innerHTML = "
No results found
"; 334 | } 335 | }); 336 | } 337 | 338 | function searchByNameOrSchool(nodes, query) { 339 | const resultIds = nodes 340 | .filter((node) => { 341 | const nameMatch = node.data.name 342 | .toLowerCase() 343 | .includes(query.toLowerCase()); 344 | return nameMatch; 345 | }) 346 | .map((node) => node.id); 347 | 348 | return resultIds; 349 | } 350 | 351 | // uncomment this if you want search in the graph 352 | // showSearchBar(); 353 | 354 | cycleThroughNodes(); 355 | -------------------------------------------------------------------------------- /graph/input.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | // Add Tiempos Headline font in otf, from light to black 6 | @font-face { 7 | font-family: "Tiempos Headline"; 8 | font-style: normal; 9 | font-weight: 300; 10 | src: url("fonts/Tiempos Headline/TiemposHeadline-Light.otf") 11 | format("opentype"); 12 | } 13 | 14 | @font-face { 15 | font-family: "Tiempos Headline"; 16 | font-style: normal; 17 | font-weight: 400; 18 | src: url("fonts/Tiempos Headline/TiemposHeadline-Regular.otf") 19 | format("opentype"); 20 | } 21 | 22 | @font-face { 23 | font-family: "Tiempos Headline"; 24 | font-style: normal; 25 | font-weight: 500; 26 | src: url("fonts/Tiempos Headline/TiemposHeadline-Medium.otf") 27 | format("opentype"); 28 | } 29 | 30 | @font-face { 31 | font-family: "Tiempos Headline"; 32 | font-style: normal; 33 | font-weight: 600; 34 | src: url("fonts/Tiempos Headline/TiemposHeadline-Semibold.otf") 35 | format("opentype"); 36 | } 37 | 38 | @font-face { 39 | font-family: "Tiempos Headline"; 40 | font-style: normal; 41 | font-weight: 700; 42 | src: url("fonts/Tiempos Headline/TiemposHeadline-Bold.otf") format("opentype"); 43 | } 44 | 45 | // Add italic versions of Tiempos Headline font 46 | @font-face { 47 | font-family: "Tiempos Headline"; 48 | font-style: italic; 49 | font-weight: 300; 50 | src: url("fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf") 51 | format("opentype"); 52 | } 53 | 54 | @font-face { 55 | font-family: "Tiempos Headline"; 56 | font-style: italic; 57 | font-weight: 400; 58 | src: url("fonts/Tiempos Headline/TiemposHeadline-Italic.otf") 59 | format("opentype"); 60 | } 61 | 62 | @font-face { 63 | font-family: "Tiempos Headline"; 64 | font-style: italic; 65 | font-weight: 500; 66 | src: url("fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf") 67 | format("opentype"); 68 | } 69 | 70 | @font-face { 71 | font-family: "Tiempos Headline"; 72 | font-style: italic; 73 | font-weight: 600; 74 | src: url("fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf") 75 | format("opentype"); 76 | } 77 | 78 | @font-face { 79 | font-family: "Tiempos Headline"; 80 | font-style: italic; 81 | font-weight: 700; 82 | src: url("fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf") 83 | format("opentype"); 84 | } 85 | 86 | // SpaceMono 87 | 88 | @font-face { 89 | font-family: "Space Mono"; 90 | font-style: normal; 91 | font-weight: 400; 92 | src: url("fonts/Space_Mono/SpaceMono-Regular.ttf") format("truetype"); 93 | } 94 | 95 | @font-face { 96 | font-family: "Space Mono"; 97 | font-style: normal; 98 | font-weight: 700; 99 | src: url("fonts/Space_Mono/SpaceMono-Bold.ttf") format("truetype"); 100 | } 101 | 102 | @font-face { 103 | font-family: "Space Mono"; 104 | font-style: italic; 105 | font-weight: 400; 106 | src: url("fonts/Space_Mono/SpaceMono-Italic.ttf") format("truetype"); 107 | } 108 | 109 | @font-face { 110 | font-family: "Space Mono"; 111 | font-style: italic; 112 | font-weight: 700; 113 | src: url("fonts/Space_Mono/SpaceMono-BoldItalic.ttf") format("truetype"); 114 | } 115 | 116 | // Untitled Sans 117 | 118 | @font-face { 119 | font-family: "Untitled Sans"; 120 | font-style: normal; 121 | font-weight: 300; 122 | src: url("fonts/Untitled Sans/UntitledSans-Light.otf") format("opentype"); 123 | } 124 | 125 | @font-face { 126 | font-family: "Untitled Sans"; 127 | font-style: normal; 128 | font-weight: 400; 129 | src: url("fonts/Untitled Sans/UntitledSans-Regular.otf") format("opentype"); 130 | } 131 | 132 | @font-face { 133 | font-family: "Untitled Sans"; 134 | font-style: normal; 135 | font-weight: 500; 136 | src: url("fonts/Untitled Sans/UntitledSans-Medium.otf") format("opentype"); 137 | } 138 | 139 | @font-face { 140 | font-family: "Untitled Sans"; 141 | font-style: normal; 142 | font-weight: 700; 143 | src: url("fonts/Untitled Sans/UntitledSans-Bold.otf") format("opentype"); 144 | } 145 | -------------------------------------------------------------------------------- /graph/nodeSettings.js: -------------------------------------------------------------------------------- 1 | module.exports = createNodeSettings; 2 | 3 | function createNodeSettings(gui, renderer) { 4 | var nodeSettings = gui.addFolder("Current Node"); 5 | var currentNode = { 6 | id: "", 7 | color: 0, 8 | size: 0, 9 | isPinned: false, 10 | }; 11 | 12 | nodeSettings.add(currentNode, "id"); 13 | nodeSettings.addColor(currentNode, "color").onChange(setColor); 14 | nodeSettings.add(currentNode, "size", 0, 200).onChange(setSize); 15 | nodeSettings.add(currentNode, "isPinned").onChange(setPinned); 16 | 17 | return { 18 | setUI: setUI, 19 | }; 20 | 21 | function setUI(nodeUI) { 22 | if (nodeUI) { 23 | currentNode.id = nodeUI.id; 24 | currentNode.color = nodeUI.color; 25 | currentNode.size = nodeUI.size; 26 | var layout = renderer.layout(); 27 | if (layout && layout.pinNode) { 28 | currentNode.isPinned = layout.pinNode(nodeUI.id); 29 | } 30 | } else { 31 | currentNode.id = ""; 32 | currentNode.color = 0; 33 | currentNode.size = 0; 34 | currentNode.isPinned = false; 35 | } 36 | gui.update(); 37 | } 38 | 39 | function setColor() { 40 | var node = renderer.getNode(currentNode.id); 41 | if (node) { 42 | node.color = currentNode.color; 43 | renderer.focus(); 44 | } 45 | } 46 | 47 | function setSize() { 48 | var node = renderer.getNode(currentNode.id); 49 | if (node) { 50 | node.size = currentNode.size; 51 | renderer.focus(); 52 | } 53 | } 54 | 55 | function setPinned() { 56 | if (!currentNode.id) return; 57 | 58 | var layout = renderer.layout(); 59 | if (layout.pinNode) { 60 | layout.pinNode(currentNode.id, currentNode.isPinned); 61 | } else { 62 | currentNode.isPinned = false; 63 | gui.update(); 64 | } 65 | renderer.focus(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /graph/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "config.pixel": "2.0.0", 4 | "ngraph.generators": "0.0.18", 5 | "query-string": "^1.0.0", 6 | "tailwindcss": "^3.4.3", 7 | "watchify": "^4.0.0" 8 | }, 9 | "scripts": { 10 | "build": "npx tailwindcss -i ./input.css -o ./output.css && browserify index.js -o bundle.js", 11 | "start": "browserify index.js -o bundle.js", 12 | "dev": "watchify index.js -o bundle.js", 13 | "tailwind": "npx tailwindcss -i ./input.css -o ./output.css --watch" 14 | }, 15 | "dependencies": { 16 | "browserify": "^17.0.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /graph/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | browserify: 9 | specifier: ^17.0.0 10 | version: 17.0.0 11 | 12 | devDependencies: 13 | config.pixel: 14 | specifier: 2.0.0 15 | version: 2.0.0(ngraph.pixel@2.4.1) 16 | ngraph.generators: 17 | specifier: 0.0.18 18 | version: 0.0.18 19 | query-string: 20 | specifier: ^1.0.0 21 | version: 1.0.1 22 | tailwindcss: 23 | specifier: ^3.4.3 24 | version: 3.4.3 25 | watchify: 26 | specifier: ^4.0.0 27 | version: 4.0.0 28 | 29 | packages: 30 | 31 | /@alloc/quick-lru@5.2.0: 32 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 33 | engines: {node: '>=10'} 34 | dev: true 35 | 36 | /@isaacs/cliui@8.0.2: 37 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 38 | engines: {node: '>=12'} 39 | dependencies: 40 | string-width: 5.1.2 41 | string-width-cjs: /string-width@4.2.3 42 | strip-ansi: 7.1.0 43 | strip-ansi-cjs: /strip-ansi@6.0.1 44 | wrap-ansi: 8.1.0 45 | wrap-ansi-cjs: /wrap-ansi@7.0.0 46 | dev: true 47 | 48 | /@jridgewell/gen-mapping@0.3.5: 49 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 50 | engines: {node: '>=6.0.0'} 51 | dependencies: 52 | '@jridgewell/set-array': 1.2.1 53 | '@jridgewell/sourcemap-codec': 1.4.15 54 | '@jridgewell/trace-mapping': 0.3.25 55 | dev: true 56 | 57 | /@jridgewell/resolve-uri@3.1.2: 58 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 59 | engines: {node: '>=6.0.0'} 60 | dev: true 61 | 62 | /@jridgewell/set-array@1.2.1: 63 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 64 | engines: {node: '>=6.0.0'} 65 | dev: true 66 | 67 | /@jridgewell/sourcemap-codec@1.4.15: 68 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 69 | dev: true 70 | 71 | /@jridgewell/trace-mapping@0.3.25: 72 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 73 | dependencies: 74 | '@jridgewell/resolve-uri': 3.1.2 75 | '@jridgewell/sourcemap-codec': 1.4.15 76 | dev: true 77 | 78 | /@nodelib/fs.scandir@2.1.5: 79 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 80 | engines: {node: '>= 8'} 81 | dependencies: 82 | '@nodelib/fs.stat': 2.0.5 83 | run-parallel: 1.2.0 84 | dev: true 85 | 86 | /@nodelib/fs.stat@2.0.5: 87 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 88 | engines: {node: '>= 8'} 89 | dev: true 90 | 91 | /@nodelib/fs.walk@1.2.8: 92 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 93 | engines: {node: '>= 8'} 94 | dependencies: 95 | '@nodelib/fs.scandir': 2.1.5 96 | fastq: 1.17.1 97 | dev: true 98 | 99 | /@pkgjs/parseargs@0.11.0: 100 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 101 | engines: {node: '>=14'} 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /JSONStream@1.3.5: 107 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 108 | hasBin: true 109 | dependencies: 110 | jsonparse: 1.3.1 111 | through: 2.3.8 112 | 113 | /acorn-node@1.8.2: 114 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 115 | dependencies: 116 | acorn: 7.4.1 117 | acorn-walk: 7.2.0 118 | xtend: 4.0.2 119 | 120 | /acorn-walk@7.2.0: 121 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 122 | engines: {node: '>=0.4.0'} 123 | 124 | /acorn@7.4.1: 125 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 126 | engines: {node: '>=0.4.0'} 127 | hasBin: true 128 | 129 | /ansi-regex@5.0.1: 130 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 131 | engines: {node: '>=8'} 132 | dev: true 133 | 134 | /ansi-regex@6.0.1: 135 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 136 | engines: {node: '>=12'} 137 | dev: true 138 | 139 | /ansi-styles@4.3.0: 140 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 141 | engines: {node: '>=8'} 142 | dependencies: 143 | color-convert: 2.0.1 144 | dev: true 145 | 146 | /ansi-styles@6.2.1: 147 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 148 | engines: {node: '>=12'} 149 | dev: true 150 | 151 | /any-promise@1.3.0: 152 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 153 | dev: true 154 | 155 | /anymatch@3.1.3: 156 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 157 | engines: {node: '>= 8'} 158 | dependencies: 159 | normalize-path: 3.0.0 160 | picomatch: 2.3.1 161 | dev: true 162 | 163 | /arg@5.0.2: 164 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 165 | dev: true 166 | 167 | /asn1.js@4.10.1: 168 | resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} 169 | dependencies: 170 | bn.js: 4.12.0 171 | inherits: 2.0.4 172 | minimalistic-assert: 1.0.1 173 | 174 | /assert@1.5.1: 175 | resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} 176 | dependencies: 177 | object.assign: 4.1.5 178 | util: 0.10.4 179 | 180 | /available-typed-arrays@1.0.7: 181 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 182 | engines: {node: '>= 0.4'} 183 | dependencies: 184 | possible-typed-array-names: 1.0.0 185 | 186 | /balanced-match@1.0.2: 187 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 188 | 189 | /base64-js@1.5.1: 190 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 191 | 192 | /binary-extensions@2.3.0: 193 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 194 | engines: {node: '>=8'} 195 | dev: true 196 | 197 | /bn.js@4.12.0: 198 | resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} 199 | 200 | /bn.js@5.2.1: 201 | resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} 202 | 203 | /brace-expansion@1.1.11: 204 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 205 | dependencies: 206 | balanced-match: 1.0.2 207 | concat-map: 0.0.1 208 | 209 | /brace-expansion@2.0.1: 210 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 211 | dependencies: 212 | balanced-match: 1.0.2 213 | dev: true 214 | 215 | /braces@3.0.2: 216 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 217 | engines: {node: '>=8'} 218 | dependencies: 219 | fill-range: 7.0.1 220 | dev: true 221 | 222 | /brfs@1.6.1: 223 | resolution: {integrity: sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==} 224 | hasBin: true 225 | dependencies: 226 | quote-stream: 1.0.2 227 | resolve: 1.22.8 228 | static-module: 2.2.5 229 | through2: 2.0.5 230 | dev: true 231 | 232 | /brorand@1.1.0: 233 | resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} 234 | 235 | /browser-pack@6.1.0: 236 | resolution: {integrity: sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==} 237 | hasBin: true 238 | dependencies: 239 | JSONStream: 1.3.5 240 | combine-source-map: 0.8.0 241 | defined: 1.0.1 242 | safe-buffer: 5.2.1 243 | through2: 2.0.5 244 | umd: 3.0.3 245 | 246 | /browser-resolve@2.0.0: 247 | resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} 248 | dependencies: 249 | resolve: 1.22.8 250 | 251 | /browserify-aes@1.2.0: 252 | resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} 253 | dependencies: 254 | buffer-xor: 1.0.3 255 | cipher-base: 1.0.4 256 | create-hash: 1.2.0 257 | evp_bytestokey: 1.0.3 258 | inherits: 2.0.4 259 | safe-buffer: 5.2.1 260 | 261 | /browserify-cipher@1.0.1: 262 | resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} 263 | dependencies: 264 | browserify-aes: 1.2.0 265 | browserify-des: 1.0.2 266 | evp_bytestokey: 1.0.3 267 | 268 | /browserify-des@1.0.2: 269 | resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} 270 | dependencies: 271 | cipher-base: 1.0.4 272 | des.js: 1.1.0 273 | inherits: 2.0.4 274 | safe-buffer: 5.2.1 275 | 276 | /browserify-rsa@4.1.0: 277 | resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} 278 | dependencies: 279 | bn.js: 5.2.1 280 | randombytes: 2.1.0 281 | 282 | /browserify-sign@4.2.3: 283 | resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} 284 | engines: {node: '>= 0.12'} 285 | dependencies: 286 | bn.js: 5.2.1 287 | browserify-rsa: 4.1.0 288 | create-hash: 1.2.0 289 | create-hmac: 1.1.7 290 | elliptic: 6.5.5 291 | hash-base: 3.0.4 292 | inherits: 2.0.4 293 | parse-asn1: 5.1.7 294 | readable-stream: 2.3.8 295 | safe-buffer: 5.2.1 296 | 297 | /browserify-zlib@0.2.0: 298 | resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} 299 | dependencies: 300 | pako: 1.0.11 301 | 302 | /browserify@17.0.0: 303 | resolution: {integrity: sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==} 304 | engines: {node: '>= 0.8'} 305 | hasBin: true 306 | dependencies: 307 | JSONStream: 1.3.5 308 | assert: 1.5.1 309 | browser-pack: 6.1.0 310 | browser-resolve: 2.0.0 311 | browserify-zlib: 0.2.0 312 | buffer: 5.2.1 313 | cached-path-relative: 1.1.0 314 | concat-stream: 1.6.2 315 | console-browserify: 1.2.0 316 | constants-browserify: 1.0.0 317 | crypto-browserify: 3.12.0 318 | defined: 1.0.1 319 | deps-sort: 2.0.1 320 | domain-browser: 1.2.0 321 | duplexer2: 0.1.4 322 | events: 3.3.0 323 | glob: 7.2.3 324 | has: 1.0.4 325 | htmlescape: 1.1.1 326 | https-browserify: 1.0.0 327 | inherits: 2.0.4 328 | insert-module-globals: 7.2.1 329 | labeled-stream-splicer: 2.0.2 330 | mkdirp-classic: 0.5.3 331 | module-deps: 6.2.3 332 | os-browserify: 0.3.0 333 | parents: 1.0.1 334 | path-browserify: 1.0.1 335 | process: 0.11.10 336 | punycode: 1.4.1 337 | querystring-es3: 0.2.1 338 | read-only-stream: 2.0.0 339 | readable-stream: 2.3.8 340 | resolve: 1.22.8 341 | shasum-object: 1.0.0 342 | shell-quote: 1.8.1 343 | stream-browserify: 3.0.0 344 | stream-http: 3.2.0 345 | string_decoder: 1.3.0 346 | subarg: 1.0.0 347 | syntax-error: 1.4.0 348 | through2: 2.0.5 349 | timers-browserify: 1.4.2 350 | tty-browserify: 0.0.1 351 | url: 0.11.3 352 | util: 0.12.5 353 | vm-browserify: 1.1.2 354 | xtend: 4.0.2 355 | 356 | /buffer-equal@0.0.1: 357 | resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} 358 | engines: {node: '>=0.4.0'} 359 | dev: true 360 | 361 | /buffer-from@1.1.2: 362 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 363 | 364 | /buffer-xor@1.0.3: 365 | resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} 366 | 367 | /buffer@5.2.1: 368 | resolution: {integrity: sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==} 369 | dependencies: 370 | base64-js: 1.5.1 371 | ieee754: 1.2.1 372 | 373 | /builtin-status-codes@3.0.0: 374 | resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} 375 | 376 | /cached-path-relative@1.1.0: 377 | resolution: {integrity: sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==} 378 | 379 | /call-bind@1.0.7: 380 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 381 | engines: {node: '>= 0.4'} 382 | dependencies: 383 | es-define-property: 1.0.0 384 | es-errors: 1.3.0 385 | function-bind: 1.1.2 386 | get-intrinsic: 1.2.4 387 | set-function-length: 1.2.2 388 | 389 | /camelcase-css@2.0.1: 390 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 391 | engines: {node: '>= 6'} 392 | dev: true 393 | 394 | /chokidar@3.6.0: 395 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 396 | engines: {node: '>= 8.10.0'} 397 | dependencies: 398 | anymatch: 3.1.3 399 | braces: 3.0.2 400 | glob-parent: 5.1.2 401 | is-binary-path: 2.1.0 402 | is-glob: 4.0.3 403 | normalize-path: 3.0.0 404 | readdirp: 3.6.0 405 | optionalDependencies: 406 | fsevents: 2.3.3 407 | dev: true 408 | 409 | /cipher-base@1.0.4: 410 | resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} 411 | dependencies: 412 | inherits: 2.0.4 413 | safe-buffer: 5.2.1 414 | 415 | /color-convert@2.0.1: 416 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 417 | engines: {node: '>=7.0.0'} 418 | dependencies: 419 | color-name: 1.1.4 420 | dev: true 421 | 422 | /color-name@1.1.4: 423 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 424 | dev: true 425 | 426 | /combine-source-map@0.8.0: 427 | resolution: {integrity: sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==} 428 | dependencies: 429 | convert-source-map: 1.1.3 430 | inline-source-map: 0.6.3 431 | lodash.memoize: 3.0.4 432 | source-map: 0.5.7 433 | 434 | /commander@4.1.1: 435 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 436 | engines: {node: '>= 6'} 437 | dev: true 438 | 439 | /concat-map@0.0.1: 440 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 441 | 442 | /concat-stream@1.6.2: 443 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 444 | engines: {'0': node >= 0.8} 445 | dependencies: 446 | buffer-from: 1.1.2 447 | inherits: 2.0.4 448 | readable-stream: 2.3.8 449 | typedarray: 0.0.6 450 | 451 | /config.layout@0.1.2: 452 | resolution: {integrity: sha512-urXkJgq6AJu7RACZl9jxH8DGGEbcT7+IGTi9yXGcQSlrg0GwhfmrkU1TOkb0PBfq4VCv8f9QJSAByEsHCgcqXg==} 453 | dev: true 454 | 455 | /config.pixel@2.0.0(ngraph.pixel@2.4.1): 456 | resolution: {integrity: sha512-doE1RnfvKJdOnvp+bnHMB6/U3kKH2skQjz4XCJa7EmPzVN+2vqMEqjdGVg+nuTuy5iflZLNHQjXJqs+au9vo9g==} 457 | peerDependencies: 458 | ngraph.pixel: 2.x 459 | dependencies: 460 | config.layout: 0.1.2 461 | config.view: 2.0.0(ngraph.pixel@2.4.1) 462 | exdat: 0.6.2 463 | ngraph.pixel: 2.4.1 464 | dev: true 465 | 466 | /config.view@2.0.0(ngraph.pixel@2.4.1): 467 | resolution: {integrity: sha512-SNEMjfSmCygVjlTjMKwfstG/gOHjKi8lDxVOQ8OfJKexgMv2soZsYY7f995TL1VmevXKMiR240motq+bZdrdXw==} 468 | peerDependencies: 469 | ngraph.pixel: 2.x 470 | dependencies: 471 | ngraph.pixel: 2.4.1 472 | dev: true 473 | 474 | /console-browserify@1.2.0: 475 | resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} 476 | 477 | /constants-browserify@1.0.0: 478 | resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} 479 | 480 | /convert-source-map@1.1.3: 481 | resolution: {integrity: sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==} 482 | 483 | /convert-source-map@1.9.0: 484 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 485 | dev: true 486 | 487 | /core-util-is@1.0.3: 488 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 489 | 490 | /create-ecdh@4.0.4: 491 | resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} 492 | dependencies: 493 | bn.js: 4.12.0 494 | elliptic: 6.5.5 495 | 496 | /create-hash@1.2.0: 497 | resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} 498 | dependencies: 499 | cipher-base: 1.0.4 500 | inherits: 2.0.4 501 | md5.js: 1.3.5 502 | ripemd160: 2.0.2 503 | sha.js: 2.4.11 504 | 505 | /create-hmac@1.1.7: 506 | resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} 507 | dependencies: 508 | cipher-base: 1.0.4 509 | create-hash: 1.2.0 510 | inherits: 2.0.4 511 | ripemd160: 2.0.2 512 | safe-buffer: 5.2.1 513 | sha.js: 2.4.11 514 | 515 | /cross-spawn@7.0.3: 516 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 517 | engines: {node: '>= 8'} 518 | dependencies: 519 | path-key: 3.1.1 520 | shebang-command: 2.0.0 521 | which: 2.0.2 522 | dev: true 523 | 524 | /crypto-browserify@3.12.0: 525 | resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} 526 | dependencies: 527 | browserify-cipher: 1.0.1 528 | browserify-sign: 4.2.3 529 | create-ecdh: 4.0.4 530 | create-hash: 1.2.0 531 | create-hmac: 1.1.7 532 | diffie-hellman: 5.0.3 533 | inherits: 2.0.4 534 | pbkdf2: 3.1.2 535 | public-encrypt: 4.0.3 536 | randombytes: 2.1.0 537 | randomfill: 1.0.4 538 | 539 | /cssesc@3.0.0: 540 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 541 | engines: {node: '>=4'} 542 | hasBin: true 543 | dev: true 544 | 545 | /dash-ast@1.0.0: 546 | resolution: {integrity: sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==} 547 | 548 | /deep-is@0.1.4: 549 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 550 | dev: true 551 | 552 | /define-data-property@1.1.4: 553 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 554 | engines: {node: '>= 0.4'} 555 | dependencies: 556 | es-define-property: 1.0.0 557 | es-errors: 1.3.0 558 | gopd: 1.0.1 559 | 560 | /define-properties@1.2.1: 561 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 562 | engines: {node: '>= 0.4'} 563 | dependencies: 564 | define-data-property: 1.1.4 565 | has-property-descriptors: 1.0.2 566 | object-keys: 1.1.1 567 | 568 | /defined@1.0.1: 569 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} 570 | 571 | /deps-sort@2.0.1: 572 | resolution: {integrity: sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==} 573 | hasBin: true 574 | dependencies: 575 | JSONStream: 1.3.5 576 | shasum-object: 1.0.0 577 | subarg: 1.0.0 578 | through2: 2.0.5 579 | 580 | /des.js@1.1.0: 581 | resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} 582 | dependencies: 583 | inherits: 2.0.4 584 | minimalistic-assert: 1.0.1 585 | 586 | /detective@5.2.1: 587 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} 588 | engines: {node: '>=0.8.0'} 589 | hasBin: true 590 | dependencies: 591 | acorn-node: 1.8.2 592 | defined: 1.0.1 593 | minimist: 1.2.8 594 | 595 | /didyoumean@1.2.2: 596 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 597 | dev: true 598 | 599 | /diffie-hellman@5.0.3: 600 | resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} 601 | dependencies: 602 | bn.js: 4.12.0 603 | miller-rabin: 4.0.1 604 | randombytes: 2.1.0 605 | 606 | /dlv@1.1.3: 607 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 608 | dev: true 609 | 610 | /domain-browser@1.2.0: 611 | resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} 612 | engines: {node: '>=0.4', npm: '>=1.2'} 613 | 614 | /duplexer2@0.1.4: 615 | resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} 616 | dependencies: 617 | readable-stream: 2.3.8 618 | 619 | /eastasianwidth@0.2.0: 620 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 621 | dev: true 622 | 623 | /element-class@0.2.2: 624 | resolution: {integrity: sha512-e4tkRAFtQkGiZB8fzxAFdjEbx5zajMb1GpiRwKs3lhOLxQcvdOIG7XlERT1sTX3/ulIUGZrgL02YZ0cRNC5OLQ==} 625 | dev: true 626 | 627 | /elliptic@6.5.5: 628 | resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} 629 | dependencies: 630 | bn.js: 4.12.0 631 | brorand: 1.1.0 632 | hash.js: 1.1.7 633 | hmac-drbg: 1.0.1 634 | inherits: 2.0.4 635 | minimalistic-assert: 1.0.1 636 | minimalistic-crypto-utils: 1.0.1 637 | 638 | /emoji-regex@8.0.0: 639 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 640 | dev: true 641 | 642 | /emoji-regex@9.2.2: 643 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 644 | dev: true 645 | 646 | /es-define-property@1.0.0: 647 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 648 | engines: {node: '>= 0.4'} 649 | dependencies: 650 | get-intrinsic: 1.2.4 651 | 652 | /es-errors@1.3.0: 653 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 654 | engines: {node: '>= 0.4'} 655 | 656 | /escodegen@1.9.1: 657 | resolution: {integrity: sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==} 658 | engines: {node: '>=4.0'} 659 | hasBin: true 660 | dependencies: 661 | esprima: 3.1.3 662 | estraverse: 4.3.0 663 | esutils: 2.0.3 664 | optionator: 0.8.3 665 | optionalDependencies: 666 | source-map: 0.6.1 667 | dev: true 668 | 669 | /escodegen@2.1.0: 670 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 671 | engines: {node: '>=6.0'} 672 | hasBin: true 673 | dependencies: 674 | esprima: 4.0.1 675 | estraverse: 5.3.0 676 | esutils: 2.0.3 677 | optionalDependencies: 678 | source-map: 0.6.1 679 | dev: true 680 | 681 | /esprima@3.1.3: 682 | resolution: {integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==} 683 | engines: {node: '>=4'} 684 | hasBin: true 685 | dev: true 686 | 687 | /esprima@4.0.1: 688 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 689 | engines: {node: '>=4'} 690 | hasBin: true 691 | dev: true 692 | 693 | /estraverse@4.3.0: 694 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 695 | engines: {node: '>=4.0'} 696 | dev: true 697 | 698 | /estraverse@5.3.0: 699 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 700 | engines: {node: '>=4.0'} 701 | dev: true 702 | 703 | /esutils@2.0.3: 704 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 705 | engines: {node: '>=0.10.0'} 706 | dev: true 707 | 708 | /events@3.3.0: 709 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 710 | engines: {node: '>=0.8.x'} 711 | 712 | /evp_bytestokey@1.0.3: 713 | resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} 714 | dependencies: 715 | md5.js: 1.3.5 716 | safe-buffer: 5.2.1 717 | 718 | /exdat@0.6.2: 719 | resolution: {integrity: sha512-sAmx6qczb5cJug9hcZXiaJUv8Ikhh3klPK60xIDow+IU9vynb1OX2DPrfA+F0XD9HX3T18gwWarpdIc3Ua1o7Q==} 720 | dependencies: 721 | brfs: 1.6.1 722 | dev: true 723 | 724 | /falafel@2.2.5: 725 | resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} 726 | engines: {node: '>=0.4.0'} 727 | dependencies: 728 | acorn: 7.4.1 729 | isarray: 2.0.5 730 | dev: true 731 | 732 | /fast-glob@3.3.2: 733 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 734 | engines: {node: '>=8.6.0'} 735 | dependencies: 736 | '@nodelib/fs.stat': 2.0.5 737 | '@nodelib/fs.walk': 1.2.8 738 | glob-parent: 5.1.2 739 | merge2: 1.4.1 740 | micromatch: 4.0.5 741 | dev: true 742 | 743 | /fast-levenshtein@2.0.6: 744 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 745 | dev: true 746 | 747 | /fast-safe-stringify@2.1.1: 748 | resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} 749 | 750 | /fastq@1.17.1: 751 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 752 | dependencies: 753 | reusify: 1.0.4 754 | dev: true 755 | 756 | /fill-range@7.0.1: 757 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 758 | engines: {node: '>=8'} 759 | dependencies: 760 | to-regex-range: 5.0.1 761 | dev: true 762 | 763 | /for-each@0.3.3: 764 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 765 | dependencies: 766 | is-callable: 1.2.7 767 | 768 | /foreground-child@3.1.1: 769 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 770 | engines: {node: '>=14'} 771 | dependencies: 772 | cross-spawn: 7.0.3 773 | signal-exit: 4.1.0 774 | dev: true 775 | 776 | /fs.realpath@1.0.0: 777 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 778 | 779 | /fsevents@2.3.3: 780 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 781 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 782 | os: [darwin] 783 | requiresBuild: true 784 | dev: true 785 | optional: true 786 | 787 | /function-bind@1.1.2: 788 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 789 | 790 | /get-assigned-identifiers@1.2.0: 791 | resolution: {integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==} 792 | 793 | /get-intrinsic@1.2.4: 794 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 795 | engines: {node: '>= 0.4'} 796 | dependencies: 797 | es-errors: 1.3.0 798 | function-bind: 1.1.2 799 | has-proto: 1.0.3 800 | has-symbols: 1.0.3 801 | hasown: 2.0.2 802 | 803 | /glob-parent@5.1.2: 804 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 805 | engines: {node: '>= 6'} 806 | dependencies: 807 | is-glob: 4.0.3 808 | dev: true 809 | 810 | /glob-parent@6.0.2: 811 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 812 | engines: {node: '>=10.13.0'} 813 | dependencies: 814 | is-glob: 4.0.3 815 | dev: true 816 | 817 | /glob@10.3.12: 818 | resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} 819 | engines: {node: '>=16 || 14 >=14.17'} 820 | hasBin: true 821 | dependencies: 822 | foreground-child: 3.1.1 823 | jackspeak: 2.3.6 824 | minimatch: 9.0.4 825 | minipass: 7.0.4 826 | path-scurry: 1.10.2 827 | dev: true 828 | 829 | /glob@7.2.3: 830 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 831 | dependencies: 832 | fs.realpath: 1.0.0 833 | inflight: 1.0.6 834 | inherits: 2.0.4 835 | minimatch: 3.1.2 836 | once: 1.4.0 837 | path-is-absolute: 1.0.1 838 | 839 | /gopd@1.0.1: 840 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 841 | dependencies: 842 | get-intrinsic: 1.2.4 843 | 844 | /has-property-descriptors@1.0.2: 845 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 846 | dependencies: 847 | es-define-property: 1.0.0 848 | 849 | /has-proto@1.0.3: 850 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 851 | engines: {node: '>= 0.4'} 852 | 853 | /has-symbols@1.0.3: 854 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 855 | engines: {node: '>= 0.4'} 856 | 857 | /has-tostringtag@1.0.2: 858 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 859 | engines: {node: '>= 0.4'} 860 | dependencies: 861 | has-symbols: 1.0.3 862 | 863 | /has@1.0.4: 864 | resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} 865 | engines: {node: '>= 0.4.0'} 866 | 867 | /hash-base@3.0.4: 868 | resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} 869 | engines: {node: '>=4'} 870 | dependencies: 871 | inherits: 2.0.4 872 | safe-buffer: 5.2.1 873 | 874 | /hash-base@3.1.0: 875 | resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} 876 | engines: {node: '>=4'} 877 | dependencies: 878 | inherits: 2.0.4 879 | readable-stream: 3.6.2 880 | safe-buffer: 5.2.1 881 | 882 | /hash.js@1.1.7: 883 | resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} 884 | dependencies: 885 | inherits: 2.0.4 886 | minimalistic-assert: 1.0.1 887 | 888 | /hasown@2.0.2: 889 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 890 | engines: {node: '>= 0.4'} 891 | dependencies: 892 | function-bind: 1.1.2 893 | 894 | /hmac-drbg@1.0.1: 895 | resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} 896 | dependencies: 897 | hash.js: 1.1.7 898 | minimalistic-assert: 1.0.1 899 | minimalistic-crypto-utils: 1.0.1 900 | 901 | /htmlescape@1.1.1: 902 | resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==} 903 | engines: {node: '>=0.10'} 904 | 905 | /https-browserify@1.0.0: 906 | resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} 907 | 908 | /ieee754@1.2.1: 909 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 910 | 911 | /inflight@1.0.6: 912 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 913 | dependencies: 914 | once: 1.4.0 915 | wrappy: 1.0.2 916 | 917 | /inherits@2.0.3: 918 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 919 | 920 | /inherits@2.0.4: 921 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 922 | 923 | /inline-source-map@0.6.3: 924 | resolution: {integrity: sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==} 925 | dependencies: 926 | source-map: 0.5.7 927 | 928 | /insert-css@0.2.0: 929 | resolution: {integrity: sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==} 930 | dev: true 931 | 932 | /insert-module-globals@7.2.1: 933 | resolution: {integrity: sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==} 934 | hasBin: true 935 | dependencies: 936 | JSONStream: 1.3.5 937 | acorn-node: 1.8.2 938 | combine-source-map: 0.8.0 939 | concat-stream: 1.6.2 940 | is-buffer: 1.1.6 941 | path-is-absolute: 1.0.1 942 | process: 0.11.10 943 | through2: 2.0.5 944 | undeclared-identifiers: 1.1.3 945 | xtend: 4.0.2 946 | 947 | /is-arguments@1.1.1: 948 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 949 | engines: {node: '>= 0.4'} 950 | dependencies: 951 | call-bind: 1.0.7 952 | has-tostringtag: 1.0.2 953 | 954 | /is-binary-path@2.1.0: 955 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 956 | engines: {node: '>=8'} 957 | dependencies: 958 | binary-extensions: 2.3.0 959 | dev: true 960 | 961 | /is-buffer@1.1.6: 962 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 963 | 964 | /is-callable@1.2.7: 965 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 966 | engines: {node: '>= 0.4'} 967 | 968 | /is-core-module@2.13.1: 969 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 970 | dependencies: 971 | hasown: 2.0.2 972 | 973 | /is-extglob@2.1.1: 974 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 975 | engines: {node: '>=0.10.0'} 976 | dev: true 977 | 978 | /is-fullwidth-code-point@3.0.0: 979 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 980 | engines: {node: '>=8'} 981 | dev: true 982 | 983 | /is-generator-function@1.0.10: 984 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 985 | engines: {node: '>= 0.4'} 986 | dependencies: 987 | has-tostringtag: 1.0.2 988 | 989 | /is-glob@4.0.3: 990 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 991 | engines: {node: '>=0.10.0'} 992 | dependencies: 993 | is-extglob: 2.1.1 994 | dev: true 995 | 996 | /is-number@7.0.0: 997 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 998 | engines: {node: '>=0.12.0'} 999 | dev: true 1000 | 1001 | /is-typed-array@1.1.13: 1002 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1003 | engines: {node: '>= 0.4'} 1004 | dependencies: 1005 | which-typed-array: 1.1.15 1006 | 1007 | /isarray@1.0.0: 1008 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1009 | 1010 | /isarray@2.0.5: 1011 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1012 | dev: true 1013 | 1014 | /isexe@2.0.0: 1015 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1016 | dev: true 1017 | 1018 | /jackspeak@2.3.6: 1019 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1020 | engines: {node: '>=14'} 1021 | dependencies: 1022 | '@isaacs/cliui': 8.0.2 1023 | optionalDependencies: 1024 | '@pkgjs/parseargs': 0.11.0 1025 | dev: true 1026 | 1027 | /jiti@1.21.0: 1028 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1029 | hasBin: true 1030 | dev: true 1031 | 1032 | /jsonparse@1.3.1: 1033 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 1034 | engines: {'0': node >= 0.2.0} 1035 | 1036 | /labeled-stream-splicer@2.0.2: 1037 | resolution: {integrity: sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==} 1038 | dependencies: 1039 | inherits: 2.0.4 1040 | stream-splicer: 2.0.1 1041 | 1042 | /levn@0.3.0: 1043 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} 1044 | engines: {node: '>= 0.8.0'} 1045 | dependencies: 1046 | prelude-ls: 1.1.2 1047 | type-check: 0.3.2 1048 | dev: true 1049 | 1050 | /lilconfig@2.1.0: 1051 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1052 | engines: {node: '>=10'} 1053 | dev: true 1054 | 1055 | /lilconfig@3.1.1: 1056 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1057 | engines: {node: '>=14'} 1058 | dev: true 1059 | 1060 | /lines-and-columns@1.2.4: 1061 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1062 | dev: true 1063 | 1064 | /lodash.memoize@3.0.4: 1065 | resolution: {integrity: sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==} 1066 | 1067 | /lru-cache@10.2.0: 1068 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1069 | engines: {node: 14 || >=16.14} 1070 | dev: true 1071 | 1072 | /magic-string@0.22.5: 1073 | resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} 1074 | dependencies: 1075 | vlq: 0.2.3 1076 | dev: true 1077 | 1078 | /md5.js@1.3.5: 1079 | resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} 1080 | dependencies: 1081 | hash-base: 3.1.0 1082 | inherits: 2.0.4 1083 | safe-buffer: 5.2.1 1084 | 1085 | /merge-source-map@1.0.4: 1086 | resolution: {integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==} 1087 | dependencies: 1088 | source-map: 0.5.7 1089 | dev: true 1090 | 1091 | /merge2@1.4.1: 1092 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1093 | engines: {node: '>= 8'} 1094 | dev: true 1095 | 1096 | /micromatch@4.0.5: 1097 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1098 | engines: {node: '>=8.6'} 1099 | dependencies: 1100 | braces: 3.0.2 1101 | picomatch: 2.3.1 1102 | dev: true 1103 | 1104 | /miller-rabin@4.0.1: 1105 | resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} 1106 | hasBin: true 1107 | dependencies: 1108 | bn.js: 4.12.0 1109 | brorand: 1.1.0 1110 | 1111 | /minimalistic-assert@1.0.1: 1112 | resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} 1113 | 1114 | /minimalistic-crypto-utils@1.0.1: 1115 | resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} 1116 | 1117 | /minimatch@3.1.2: 1118 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1119 | dependencies: 1120 | brace-expansion: 1.1.11 1121 | 1122 | /minimatch@9.0.4: 1123 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 1124 | engines: {node: '>=16 || 14 >=14.17'} 1125 | dependencies: 1126 | brace-expansion: 2.0.1 1127 | dev: true 1128 | 1129 | /minimist@1.2.8: 1130 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1131 | 1132 | /minipass@7.0.4: 1133 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1134 | engines: {node: '>=16 || 14 >=14.17'} 1135 | dev: true 1136 | 1137 | /mkdirp-classic@0.5.3: 1138 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1139 | 1140 | /module-deps@6.2.3: 1141 | resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==} 1142 | engines: {node: '>= 0.8.0'} 1143 | hasBin: true 1144 | dependencies: 1145 | JSONStream: 1.3.5 1146 | browser-resolve: 2.0.0 1147 | cached-path-relative: 1.1.0 1148 | concat-stream: 1.6.2 1149 | defined: 1.0.1 1150 | detective: 5.2.1 1151 | duplexer2: 0.1.4 1152 | inherits: 2.0.4 1153 | parents: 1.0.1 1154 | readable-stream: 2.3.8 1155 | resolve: 1.22.8 1156 | stream-combiner2: 1.1.1 1157 | subarg: 1.0.0 1158 | through2: 2.0.5 1159 | xtend: 4.0.2 1160 | 1161 | /mz@2.7.0: 1162 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1163 | dependencies: 1164 | any-promise: 1.3.0 1165 | object-assign: 4.1.1 1166 | thenify-all: 1.6.0 1167 | dev: true 1168 | 1169 | /nanoid@3.3.7: 1170 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1171 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1172 | hasBin: true 1173 | dev: true 1174 | 1175 | /ngraph.events@0.0.3: 1176 | resolution: {integrity: sha512-UrewofHOFk/05otBm9GD4DA3PTEY/yaElhCclmGC4IcmAYaSDRrC3lENQxJ00AzeBnz1GY2xH7Ct7AfIdhsdWA==} 1177 | dev: true 1178 | 1179 | /ngraph.expose@0.0.0: 1180 | resolution: {integrity: sha512-Hr88MuhgoSLVGf2aaaXcKl22Rn95duWsjRcoeJMP9PtFmYHGFw/3ctDqBf5phnIyktm0P/Quxs5EGg6xgJcZAQ==} 1181 | dev: true 1182 | 1183 | /ngraph.forcelayout3d@0.0.15: 1184 | resolution: {integrity: sha512-d6cYhknnK5OhfpmZL89nySje8QzqESTXPc/yz7Clz2wuSGSn8k+ufm+w/78q53kkQzkyNgJqM7aU4g5e+RuERQ==} 1185 | dependencies: 1186 | ngraph.expose: 0.0.0 1187 | ngraph.forcelayout: 0.0.22 1188 | ngraph.merge: 0.0.1 1189 | ngraph.physics.primitives: 0.0.7 1190 | ngraph.quadtreebh3d: 0.0.3 1191 | ngraph.random: 0.0.1 1192 | dev: true 1193 | 1194 | /ngraph.forcelayout@0.0.22: 1195 | resolution: {integrity: sha512-eGjonxfqLa9e4BfFGmgWeVLLHkolUzOgKtFsQMgwpCpGtXUQwfO+iz5kRn8scRgyh0iaPNPrPLtKepA2Ojpe5Q==} 1196 | dependencies: 1197 | ngraph.events: 0.0.3 1198 | ngraph.physics.simulator: 0.0.12 1199 | dev: true 1200 | 1201 | /ngraph.generators@0.0.18: 1202 | resolution: {integrity: sha512-N+LXllDpeDkKV4e/x3gnw3moXfRWu72ZCo2DxY4bL5ZdrIZP91ryIu3A1Bg8HG0TDpX19TIju6YoCUNEwReNNw==} 1203 | dependencies: 1204 | ngraph.graph: 0.0.14 1205 | ngraph.random: 0.0.1 1206 | dev: true 1207 | 1208 | /ngraph.graph@0.0.14: 1209 | resolution: {integrity: sha512-ERTLng4KrsGbR7iLZFvg5H+zJ7V+SY8RDqZKYCnOZib5W8M5LCvcil9/8eiJcTRUIPPXW3j8hqPCdLnBvgsn/A==} 1210 | dependencies: 1211 | ngraph.events: 0.0.3 1212 | dev: true 1213 | 1214 | /ngraph.merge@0.0.1: 1215 | resolution: {integrity: sha512-iXchI5xMjYzA96mee//O7I7gtd4cCakWaSTu11aMTxRDbvBK2qpDDytYg58jO3usAUkjFxBdy1gxYppKmBDuRQ==} 1216 | dev: true 1217 | 1218 | /ngraph.physics.primitives@0.0.7: 1219 | resolution: {integrity: sha512-7jPm14fYcuJ9kytOVNOKxFy6r/Uu9Dnj++uT3iR9XkBcsBahn2xcYJkV6vF1bIb1fQ5XrDCRjRIOcMwEum6jwQ==} 1220 | dev: true 1221 | 1222 | /ngraph.physics.simulator@0.0.12: 1223 | resolution: {integrity: sha512-c5THBS9fbzfUsFP39lKrWAt4UdNUqdKtahRE+SmB1uuv2B9aglyd0yAOtNTumrzGIG7vNy8isAw0Qd4Qztg7BQ==} 1224 | dependencies: 1225 | ngraph.events: 0.0.3 1226 | ngraph.expose: 0.0.0 1227 | ngraph.merge: 0.0.1 1228 | ngraph.physics.primitives: 0.0.7 1229 | ngraph.quadtreebh: 0.0.3 1230 | ngraph.random: 0.0.1 1231 | dev: true 1232 | 1233 | /ngraph.pixel@2.4.1: 1234 | resolution: {integrity: sha512-H4hqyEVMhGZ6hGL30pXKZ+RpZw8NQaLa4hGGj3UutokUp3yfvTLrToOq+/W09jK/Sn6DzimYPuLAn+OuIfx4Zw==} 1235 | dependencies: 1236 | element-class: 0.2.2 1237 | insert-css: 0.2.0 1238 | ngraph.events: 0.0.3 1239 | pixel.layout: 0.1.2 1240 | three: 0.73.2 1241 | three.fly: 0.1.6 1242 | dev: true 1243 | 1244 | /ngraph.quadtreebh3d@0.0.3: 1245 | resolution: {integrity: sha512-DIRiviYWity+/yiZpRRs95V7gShtXnxDifQbdLffAi4PdNWnprFarcXuk+q/YbTakH4cWcOXZo7mQyUTO9odZg==} 1246 | dependencies: 1247 | ngraph.random: 0.0.1 1248 | dev: true 1249 | 1250 | /ngraph.quadtreebh@0.0.3: 1251 | resolution: {integrity: sha512-vnmXcwnaourj6L4ssCwtHV5ObybvuyPkPVEFZI7nW5T6Tmt+t2dFA3ljym6MlSEcrayOgD7S2Ac+2YDN1DRZ3w==} 1252 | dependencies: 1253 | ngraph.random: 0.0.1 1254 | dev: true 1255 | 1256 | /ngraph.random@0.0.1: 1257 | resolution: {integrity: sha512-QPKU7ChXF/VrvMQxVo9aWcvXCXp98VfL4nKUteTW/olDqeUqQ61t7m+jvFb8Dj7kKvlKlnsbDA1aWLJGmm17XA==} 1258 | dev: true 1259 | 1260 | /normalize-path@3.0.0: 1261 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1262 | engines: {node: '>=0.10.0'} 1263 | dev: true 1264 | 1265 | /object-assign@4.1.1: 1266 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1267 | engines: {node: '>=0.10.0'} 1268 | dev: true 1269 | 1270 | /object-hash@3.0.0: 1271 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1272 | engines: {node: '>= 6'} 1273 | dev: true 1274 | 1275 | /object-inspect@1.13.1: 1276 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1277 | 1278 | /object-inspect@1.4.1: 1279 | resolution: {integrity: sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==} 1280 | dev: true 1281 | 1282 | /object-keys@1.1.1: 1283 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1284 | engines: {node: '>= 0.4'} 1285 | 1286 | /object.assign@4.1.5: 1287 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1288 | engines: {node: '>= 0.4'} 1289 | dependencies: 1290 | call-bind: 1.0.7 1291 | define-properties: 1.2.1 1292 | has-symbols: 1.0.3 1293 | object-keys: 1.1.1 1294 | 1295 | /once@1.4.0: 1296 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1297 | dependencies: 1298 | wrappy: 1.0.2 1299 | 1300 | /optionator@0.8.3: 1301 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} 1302 | engines: {node: '>= 0.8.0'} 1303 | dependencies: 1304 | deep-is: 0.1.4 1305 | fast-levenshtein: 2.0.6 1306 | levn: 0.3.0 1307 | prelude-ls: 1.1.2 1308 | type-check: 0.3.2 1309 | word-wrap: 1.2.5 1310 | dev: true 1311 | 1312 | /os-browserify@0.3.0: 1313 | resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} 1314 | 1315 | /outpipe@1.1.1: 1316 | resolution: {integrity: sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==} 1317 | dependencies: 1318 | shell-quote: 1.8.1 1319 | dev: true 1320 | 1321 | /pako@1.0.11: 1322 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 1323 | 1324 | /parents@1.0.1: 1325 | resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==} 1326 | dependencies: 1327 | path-platform: 0.11.15 1328 | 1329 | /parse-asn1@5.1.7: 1330 | resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} 1331 | engines: {node: '>= 0.10'} 1332 | dependencies: 1333 | asn1.js: 4.10.1 1334 | browserify-aes: 1.2.0 1335 | evp_bytestokey: 1.0.3 1336 | hash-base: 3.0.4 1337 | pbkdf2: 3.1.2 1338 | safe-buffer: 5.2.1 1339 | 1340 | /path-browserify@1.0.1: 1341 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1342 | 1343 | /path-is-absolute@1.0.1: 1344 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1345 | engines: {node: '>=0.10.0'} 1346 | 1347 | /path-key@3.1.1: 1348 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1349 | engines: {node: '>=8'} 1350 | dev: true 1351 | 1352 | /path-parse@1.0.7: 1353 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1354 | 1355 | /path-platform@0.11.15: 1356 | resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==} 1357 | engines: {node: '>= 0.8.0'} 1358 | 1359 | /path-scurry@1.10.2: 1360 | resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} 1361 | engines: {node: '>=16 || 14 >=14.17'} 1362 | dependencies: 1363 | lru-cache: 10.2.0 1364 | minipass: 7.0.4 1365 | dev: true 1366 | 1367 | /pbkdf2@3.1.2: 1368 | resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} 1369 | engines: {node: '>=0.12'} 1370 | dependencies: 1371 | create-hash: 1.2.0 1372 | create-hmac: 1.1.7 1373 | ripemd160: 2.0.2 1374 | safe-buffer: 5.2.1 1375 | sha.js: 2.4.11 1376 | 1377 | /picocolors@1.0.0: 1378 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1379 | dev: true 1380 | 1381 | /picomatch@2.3.1: 1382 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1383 | engines: {node: '>=8.6'} 1384 | dev: true 1385 | 1386 | /pify@2.3.0: 1387 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1388 | engines: {node: '>=0.10.0'} 1389 | dev: true 1390 | 1391 | /pirates@4.0.6: 1392 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1393 | engines: {node: '>= 6'} 1394 | dev: true 1395 | 1396 | /pixel.layout@0.1.2: 1397 | resolution: {integrity: sha512-GwEZPvzOgZ3adzeGmuWGebB0t7PklsGQF9zYYOzL2W6bPbG6dwDgY7A7yLTO6OLenl2ohxdbdYyqEkDmRuRXfw==} 1398 | dependencies: 1399 | ngraph.events: 0.0.3 1400 | ngraph.forcelayout3d: 0.0.15 1401 | dev: true 1402 | 1403 | /possible-typed-array-names@1.0.0: 1404 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1405 | engines: {node: '>= 0.4'} 1406 | 1407 | /postcss-import@15.1.0(postcss@8.4.38): 1408 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1409 | engines: {node: '>=14.0.0'} 1410 | peerDependencies: 1411 | postcss: ^8.0.0 1412 | dependencies: 1413 | postcss: 8.4.38 1414 | postcss-value-parser: 4.2.0 1415 | read-cache: 1.0.0 1416 | resolve: 1.22.8 1417 | dev: true 1418 | 1419 | /postcss-js@4.0.1(postcss@8.4.38): 1420 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1421 | engines: {node: ^12 || ^14 || >= 16} 1422 | peerDependencies: 1423 | postcss: ^8.4.21 1424 | dependencies: 1425 | camelcase-css: 2.0.1 1426 | postcss: 8.4.38 1427 | dev: true 1428 | 1429 | /postcss-load-config@4.0.2(postcss@8.4.38): 1430 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1431 | engines: {node: '>= 14'} 1432 | peerDependencies: 1433 | postcss: '>=8.0.9' 1434 | ts-node: '>=9.0.0' 1435 | peerDependenciesMeta: 1436 | postcss: 1437 | optional: true 1438 | ts-node: 1439 | optional: true 1440 | dependencies: 1441 | lilconfig: 3.1.1 1442 | postcss: 8.4.38 1443 | yaml: 2.4.1 1444 | dev: true 1445 | 1446 | /postcss-nested@6.0.1(postcss@8.4.38): 1447 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1448 | engines: {node: '>=12.0'} 1449 | peerDependencies: 1450 | postcss: ^8.2.14 1451 | dependencies: 1452 | postcss: 8.4.38 1453 | postcss-selector-parser: 6.0.16 1454 | dev: true 1455 | 1456 | /postcss-selector-parser@6.0.16: 1457 | resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} 1458 | engines: {node: '>=4'} 1459 | dependencies: 1460 | cssesc: 3.0.0 1461 | util-deprecate: 1.0.2 1462 | dev: true 1463 | 1464 | /postcss-value-parser@4.2.0: 1465 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1466 | dev: true 1467 | 1468 | /postcss@8.4.38: 1469 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 1470 | engines: {node: ^10 || ^12 || >=14} 1471 | dependencies: 1472 | nanoid: 3.3.7 1473 | picocolors: 1.0.0 1474 | source-map-js: 1.2.0 1475 | dev: true 1476 | 1477 | /prelude-ls@1.1.2: 1478 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} 1479 | engines: {node: '>= 0.8.0'} 1480 | dev: true 1481 | 1482 | /process-nextick-args@2.0.1: 1483 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1484 | 1485 | /process@0.11.10: 1486 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1487 | engines: {node: '>= 0.6.0'} 1488 | 1489 | /public-encrypt@4.0.3: 1490 | resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} 1491 | dependencies: 1492 | bn.js: 4.12.0 1493 | browserify-rsa: 4.1.0 1494 | create-hash: 1.2.0 1495 | parse-asn1: 5.1.7 1496 | randombytes: 2.1.0 1497 | safe-buffer: 5.2.1 1498 | 1499 | /punycode@1.4.1: 1500 | resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} 1501 | 1502 | /qs@6.12.0: 1503 | resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} 1504 | engines: {node: '>=0.6'} 1505 | dependencies: 1506 | side-channel: 1.0.6 1507 | 1508 | /query-string@1.0.1: 1509 | resolution: {integrity: sha512-uXqAMcbt2Z3n/TGfXjwI8DofeZEiNyeD86AEvIm2f/fCcFexxve9ZktMKkr3L7+pK+iSjE6M2/DfHiREVwHkvQ==} 1510 | engines: {node: '>=0.10.0'} 1511 | dev: true 1512 | 1513 | /querystring-es3@0.2.1: 1514 | resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} 1515 | engines: {node: '>=0.4.x'} 1516 | 1517 | /queue-microtask@1.2.3: 1518 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1519 | dev: true 1520 | 1521 | /quote-stream@1.0.2: 1522 | resolution: {integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==} 1523 | hasBin: true 1524 | dependencies: 1525 | buffer-equal: 0.0.1 1526 | minimist: 1.2.8 1527 | through2: 2.0.5 1528 | dev: true 1529 | 1530 | /randombytes@2.1.0: 1531 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1532 | dependencies: 1533 | safe-buffer: 5.2.1 1534 | 1535 | /randomfill@1.0.4: 1536 | resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} 1537 | dependencies: 1538 | randombytes: 2.1.0 1539 | safe-buffer: 5.2.1 1540 | 1541 | /read-cache@1.0.0: 1542 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1543 | dependencies: 1544 | pify: 2.3.0 1545 | dev: true 1546 | 1547 | /read-only-stream@2.0.0: 1548 | resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==} 1549 | dependencies: 1550 | readable-stream: 2.3.8 1551 | 1552 | /readable-stream@2.3.8: 1553 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1554 | dependencies: 1555 | core-util-is: 1.0.3 1556 | inherits: 2.0.4 1557 | isarray: 1.0.0 1558 | process-nextick-args: 2.0.1 1559 | safe-buffer: 5.1.2 1560 | string_decoder: 1.1.1 1561 | util-deprecate: 1.0.2 1562 | 1563 | /readable-stream@3.6.2: 1564 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1565 | engines: {node: '>= 6'} 1566 | dependencies: 1567 | inherits: 2.0.4 1568 | string_decoder: 1.3.0 1569 | util-deprecate: 1.0.2 1570 | 1571 | /readdirp@3.6.0: 1572 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1573 | engines: {node: '>=8.10.0'} 1574 | dependencies: 1575 | picomatch: 2.3.1 1576 | dev: true 1577 | 1578 | /resolve@1.22.8: 1579 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1580 | hasBin: true 1581 | dependencies: 1582 | is-core-module: 2.13.1 1583 | path-parse: 1.0.7 1584 | supports-preserve-symlinks-flag: 1.0.0 1585 | 1586 | /reusify@1.0.4: 1587 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1588 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1589 | dev: true 1590 | 1591 | /ripemd160@2.0.2: 1592 | resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} 1593 | dependencies: 1594 | hash-base: 3.1.0 1595 | inherits: 2.0.4 1596 | 1597 | /run-parallel@1.2.0: 1598 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1599 | dependencies: 1600 | queue-microtask: 1.2.3 1601 | dev: true 1602 | 1603 | /safe-buffer@5.1.2: 1604 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1605 | 1606 | /safe-buffer@5.2.1: 1607 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1608 | 1609 | /set-function-length@1.2.2: 1610 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1611 | engines: {node: '>= 0.4'} 1612 | dependencies: 1613 | define-data-property: 1.1.4 1614 | es-errors: 1.3.0 1615 | function-bind: 1.1.2 1616 | get-intrinsic: 1.2.4 1617 | gopd: 1.0.1 1618 | has-property-descriptors: 1.0.2 1619 | 1620 | /sha.js@2.4.11: 1621 | resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} 1622 | hasBin: true 1623 | dependencies: 1624 | inherits: 2.0.4 1625 | safe-buffer: 5.2.1 1626 | 1627 | /shallow-copy@0.0.1: 1628 | resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} 1629 | dev: true 1630 | 1631 | /shasum-object@1.0.0: 1632 | resolution: {integrity: sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==} 1633 | dependencies: 1634 | fast-safe-stringify: 2.1.1 1635 | 1636 | /shebang-command@2.0.0: 1637 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1638 | engines: {node: '>=8'} 1639 | dependencies: 1640 | shebang-regex: 3.0.0 1641 | dev: true 1642 | 1643 | /shebang-regex@3.0.0: 1644 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1645 | engines: {node: '>=8'} 1646 | dev: true 1647 | 1648 | /shell-quote@1.8.1: 1649 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 1650 | 1651 | /side-channel@1.0.6: 1652 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 1653 | engines: {node: '>= 0.4'} 1654 | dependencies: 1655 | call-bind: 1.0.7 1656 | es-errors: 1.3.0 1657 | get-intrinsic: 1.2.4 1658 | object-inspect: 1.13.1 1659 | 1660 | /signal-exit@4.1.0: 1661 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1662 | engines: {node: '>=14'} 1663 | dev: true 1664 | 1665 | /simple-concat@1.0.1: 1666 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 1667 | 1668 | /source-map-js@1.2.0: 1669 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1670 | engines: {node: '>=0.10.0'} 1671 | dev: true 1672 | 1673 | /source-map@0.5.7: 1674 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 1675 | engines: {node: '>=0.10.0'} 1676 | 1677 | /source-map@0.6.1: 1678 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1679 | engines: {node: '>=0.10.0'} 1680 | requiresBuild: true 1681 | dev: true 1682 | optional: true 1683 | 1684 | /static-eval@2.1.1: 1685 | resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} 1686 | dependencies: 1687 | escodegen: 2.1.0 1688 | dev: true 1689 | 1690 | /static-module@2.2.5: 1691 | resolution: {integrity: sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==} 1692 | dependencies: 1693 | concat-stream: 1.6.2 1694 | convert-source-map: 1.9.0 1695 | duplexer2: 0.1.4 1696 | escodegen: 1.9.1 1697 | falafel: 2.2.5 1698 | has: 1.0.4 1699 | magic-string: 0.22.5 1700 | merge-source-map: 1.0.4 1701 | object-inspect: 1.4.1 1702 | quote-stream: 1.0.2 1703 | readable-stream: 2.3.8 1704 | shallow-copy: 0.0.1 1705 | static-eval: 2.1.1 1706 | through2: 2.0.5 1707 | dev: true 1708 | 1709 | /stream-browserify@3.0.0: 1710 | resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} 1711 | dependencies: 1712 | inherits: 2.0.4 1713 | readable-stream: 3.6.2 1714 | 1715 | /stream-combiner2@1.1.1: 1716 | resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} 1717 | dependencies: 1718 | duplexer2: 0.1.4 1719 | readable-stream: 2.3.8 1720 | 1721 | /stream-http@3.2.0: 1722 | resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} 1723 | dependencies: 1724 | builtin-status-codes: 3.0.0 1725 | inherits: 2.0.4 1726 | readable-stream: 3.6.2 1727 | xtend: 4.0.2 1728 | 1729 | /stream-splicer@2.0.1: 1730 | resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==} 1731 | dependencies: 1732 | inherits: 2.0.4 1733 | readable-stream: 2.3.8 1734 | 1735 | /string-width@4.2.3: 1736 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1737 | engines: {node: '>=8'} 1738 | dependencies: 1739 | emoji-regex: 8.0.0 1740 | is-fullwidth-code-point: 3.0.0 1741 | strip-ansi: 6.0.1 1742 | dev: true 1743 | 1744 | /string-width@5.1.2: 1745 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1746 | engines: {node: '>=12'} 1747 | dependencies: 1748 | eastasianwidth: 0.2.0 1749 | emoji-regex: 9.2.2 1750 | strip-ansi: 7.1.0 1751 | dev: true 1752 | 1753 | /string_decoder@1.1.1: 1754 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1755 | dependencies: 1756 | safe-buffer: 5.1.2 1757 | 1758 | /string_decoder@1.3.0: 1759 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1760 | dependencies: 1761 | safe-buffer: 5.2.1 1762 | 1763 | /strip-ansi@6.0.1: 1764 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1765 | engines: {node: '>=8'} 1766 | dependencies: 1767 | ansi-regex: 5.0.1 1768 | dev: true 1769 | 1770 | /strip-ansi@7.1.0: 1771 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1772 | engines: {node: '>=12'} 1773 | dependencies: 1774 | ansi-regex: 6.0.1 1775 | dev: true 1776 | 1777 | /subarg@1.0.0: 1778 | resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} 1779 | dependencies: 1780 | minimist: 1.2.8 1781 | 1782 | /sucrase@3.35.0: 1783 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1784 | engines: {node: '>=16 || 14 >=14.17'} 1785 | hasBin: true 1786 | dependencies: 1787 | '@jridgewell/gen-mapping': 0.3.5 1788 | commander: 4.1.1 1789 | glob: 10.3.12 1790 | lines-and-columns: 1.2.4 1791 | mz: 2.7.0 1792 | pirates: 4.0.6 1793 | ts-interface-checker: 0.1.13 1794 | dev: true 1795 | 1796 | /supports-preserve-symlinks-flag@1.0.0: 1797 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1798 | engines: {node: '>= 0.4'} 1799 | 1800 | /syntax-error@1.4.0: 1801 | resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==} 1802 | dependencies: 1803 | acorn-node: 1.8.2 1804 | 1805 | /tailwindcss@3.4.3: 1806 | resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} 1807 | engines: {node: '>=14.0.0'} 1808 | hasBin: true 1809 | dependencies: 1810 | '@alloc/quick-lru': 5.2.0 1811 | arg: 5.0.2 1812 | chokidar: 3.6.0 1813 | didyoumean: 1.2.2 1814 | dlv: 1.1.3 1815 | fast-glob: 3.3.2 1816 | glob-parent: 6.0.2 1817 | is-glob: 4.0.3 1818 | jiti: 1.21.0 1819 | lilconfig: 2.1.0 1820 | micromatch: 4.0.5 1821 | normalize-path: 3.0.0 1822 | object-hash: 3.0.0 1823 | picocolors: 1.0.0 1824 | postcss: 8.4.38 1825 | postcss-import: 15.1.0(postcss@8.4.38) 1826 | postcss-js: 4.0.1(postcss@8.4.38) 1827 | postcss-load-config: 4.0.2(postcss@8.4.38) 1828 | postcss-nested: 6.0.1(postcss@8.4.38) 1829 | postcss-selector-parser: 6.0.16 1830 | resolve: 1.22.8 1831 | sucrase: 3.35.0 1832 | transitivePeerDependencies: 1833 | - ts-node 1834 | dev: true 1835 | 1836 | /thenify-all@1.6.0: 1837 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1838 | engines: {node: '>=0.8'} 1839 | dependencies: 1840 | thenify: 3.3.1 1841 | dev: true 1842 | 1843 | /thenify@3.3.1: 1844 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1845 | dependencies: 1846 | any-promise: 1.3.0 1847 | dev: true 1848 | 1849 | /three.fly@0.1.6: 1850 | resolution: {integrity: sha512-iduRTbHyb2WVas4FOyXj8W/wtjfyu0DtFeSMIL7akm3Bfa8+QubDdlsDFTf+382ATzSbA3gKZGo091ZonBt87w==} 1851 | dependencies: 1852 | ngraph.events: 0.0.3 1853 | dev: true 1854 | 1855 | /three@0.73.2: 1856 | resolution: {integrity: sha512-TC2H54TAnLwLwuMz5mUNN60BuK5MvLI1OgF2X1PdxnVehgZ7p9sNbaHpJEj3hi2T8WadlIUE8d/96oe3XlpPAw==} 1857 | dev: true 1858 | 1859 | /through2@2.0.5: 1860 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 1861 | dependencies: 1862 | readable-stream: 2.3.8 1863 | xtend: 4.0.2 1864 | 1865 | /through2@4.0.2: 1866 | resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} 1867 | dependencies: 1868 | readable-stream: 3.6.2 1869 | dev: true 1870 | 1871 | /through@2.3.8: 1872 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1873 | 1874 | /timers-browserify@1.4.2: 1875 | resolution: {integrity: sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==} 1876 | engines: {node: '>=0.6.0'} 1877 | dependencies: 1878 | process: 0.11.10 1879 | 1880 | /to-regex-range@5.0.1: 1881 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1882 | engines: {node: '>=8.0'} 1883 | dependencies: 1884 | is-number: 7.0.0 1885 | dev: true 1886 | 1887 | /ts-interface-checker@0.1.13: 1888 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1889 | dev: true 1890 | 1891 | /tty-browserify@0.0.1: 1892 | resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} 1893 | 1894 | /type-check@0.3.2: 1895 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} 1896 | engines: {node: '>= 0.8.0'} 1897 | dependencies: 1898 | prelude-ls: 1.1.2 1899 | dev: true 1900 | 1901 | /typedarray@0.0.6: 1902 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1903 | 1904 | /umd@3.0.3: 1905 | resolution: {integrity: sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==} 1906 | hasBin: true 1907 | 1908 | /undeclared-identifiers@1.1.3: 1909 | resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==} 1910 | hasBin: true 1911 | dependencies: 1912 | acorn-node: 1.8.2 1913 | dash-ast: 1.0.0 1914 | get-assigned-identifiers: 1.2.0 1915 | simple-concat: 1.0.1 1916 | xtend: 4.0.2 1917 | 1918 | /url@0.11.3: 1919 | resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} 1920 | dependencies: 1921 | punycode: 1.4.1 1922 | qs: 6.12.0 1923 | 1924 | /util-deprecate@1.0.2: 1925 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1926 | 1927 | /util@0.10.4: 1928 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 1929 | dependencies: 1930 | inherits: 2.0.3 1931 | 1932 | /util@0.12.5: 1933 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 1934 | dependencies: 1935 | inherits: 2.0.4 1936 | is-arguments: 1.1.1 1937 | is-generator-function: 1.0.10 1938 | is-typed-array: 1.1.13 1939 | which-typed-array: 1.1.15 1940 | 1941 | /vlq@0.2.3: 1942 | resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} 1943 | dev: true 1944 | 1945 | /vm-browserify@1.1.2: 1946 | resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} 1947 | 1948 | /watchify@4.0.0: 1949 | resolution: {integrity: sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==} 1950 | engines: {node: '>= 8.10.0'} 1951 | hasBin: true 1952 | dependencies: 1953 | anymatch: 3.1.3 1954 | browserify: 17.0.0 1955 | chokidar: 3.6.0 1956 | defined: 1.0.1 1957 | outpipe: 1.1.1 1958 | through2: 4.0.2 1959 | xtend: 4.0.2 1960 | dev: true 1961 | 1962 | /which-typed-array@1.1.15: 1963 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 1964 | engines: {node: '>= 0.4'} 1965 | dependencies: 1966 | available-typed-arrays: 1.0.7 1967 | call-bind: 1.0.7 1968 | for-each: 0.3.3 1969 | gopd: 1.0.1 1970 | has-tostringtag: 1.0.2 1971 | 1972 | /which@2.0.2: 1973 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1974 | engines: {node: '>= 8'} 1975 | hasBin: true 1976 | dependencies: 1977 | isexe: 2.0.0 1978 | dev: true 1979 | 1980 | /word-wrap@1.2.5: 1981 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1982 | engines: {node: '>=0.10.0'} 1983 | dev: true 1984 | 1985 | /wrap-ansi@7.0.0: 1986 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1987 | engines: {node: '>=10'} 1988 | dependencies: 1989 | ansi-styles: 4.3.0 1990 | string-width: 4.2.3 1991 | strip-ansi: 6.0.1 1992 | dev: true 1993 | 1994 | /wrap-ansi@8.1.0: 1995 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1996 | engines: {node: '>=12'} 1997 | dependencies: 1998 | ansi-styles: 6.2.1 1999 | string-width: 5.1.2 2000 | strip-ansi: 7.1.0 2001 | dev: true 2002 | 2003 | /wrappy@1.0.2: 2004 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2005 | 2006 | /xtend@4.0.2: 2007 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2008 | engines: {node: '>=0.4'} 2009 | 2010 | /yaml@2.4.1: 2011 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} 2012 | engines: {node: '>= 14'} 2013 | hasBin: true 2014 | dev: true 2015 | -------------------------------------------------------------------------------- /graph/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./**/*.{html,js}"], 4 | theme: { 5 | extend: { 6 | fontFamily: { 7 | "tiempos-headline": ["'Tiempos Headline'", "serif"], 8 | "space-mono": ["'Space Mono'", "monospace"], 9 | "untitled-sans": ["'Untitled Sans'", "sans-serif"], 10 | }, 11 | colors: { 12 | "socratica-cream": "#FBF8EF", 13 | "socratica-black": "#121212", 14 | "socratica-grey": "#A09D98", 15 | }, 16 | }, 17 | }, 18 | plugins: [], 19 | }; 20 | -------------------------------------------------------------------------------- /images/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/images/graph.png -------------------------------------------------------------------------------- /images/match.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/images/match.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import chromadb 2 | 3 | 4 | def main(): 5 | chroma_client = chromadb.PersistentClient(path="chromadb") 6 | time_prompt_collection = chroma_client.get_or_create_collection( 7 | name="time_prompt_embeddings") 8 | 9 | problem_prompt_collection = chroma_client.get_or_create_collection( 10 | name="problem_prompt_embeddings") 11 | 12 | query = "I can't stop thinking about how we all are just conditioned to follow the textbook from school so everyone just accepts there is a 'right way' to go about life. We need to have stronger opinions on a different future where people are more inclined to follow things that are out of the ordinary" 13 | 14 | results = problem_prompt_collection.query( 15 | query_texts=[ 16 | query 17 | ], 18 | n_results=5, 19 | include=["documents", "distances", "metadatas"] 20 | ) 21 | 22 | print(f"Queried top results for '{query}'\n") 23 | 24 | for i in range(len(results["ids"][0])): 25 | print(f"ID: {results['ids'][0][i]}") 26 | print(f"Name: {results['metadatas'][0][i]['name']}") 27 | print(f"Program: {results['metadatas'][0][i]['program']}") 28 | print(f"Response: {results['documents'][0][i]}") 29 | print(f"Distance: {results['distances'][0][i]}") 30 | # print(f"Metadata: {results['metadatas'][0][i]}") 31 | print() 32 | 33 | 34 | if __name__ == '__main__': 35 | main() 36 | -------------------------------------------------------------------------------- /match/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /match/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /match/README.md: -------------------------------------------------------------------------------- 1 | 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). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | 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. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /match/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/app/globals.css", 9 | "baseColor": "stone", 10 | "cssVariables": false, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | } 17 | } -------------------------------------------------------------------------------- /match/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /match/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-graph", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-dialog": "^1.0.5", 13 | "class-variance-authority": "^0.7.0", 14 | "clsx": "^2.1.0", 15 | "fuse.js": "^7.0.0", 16 | "lucide-react": "^0.364.0", 17 | "next": "14.1.4", 18 | "react": "^18", 19 | "react-dom": "^18", 20 | "react-force-graph": "^1.44.3", 21 | "react-hook-form": "^7.51.2", 22 | "tailwind-merge": "^2.2.2", 23 | "tailwindcss-animate": "^1.0.7", 24 | "three": "^0.162.0" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^20", 28 | "@types/react": "^18", 29 | "@types/react-dom": "^18", 30 | "@types/three": "^0.162.0", 31 | "autoprefixer": "^10.0.1", 32 | "eslint": "^8", 33 | "eslint-config-next": "14.1.4", 34 | "postcss": "^8", 35 | "tailwindcss": "^3.3.0", 36 | "typescript": "^5" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /match/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /match/public/fonts/Space_Mono/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2016 Google Inc. All Rights Reserved. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | https://openfontlicense.org 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /match/public/fonts/Space_Mono/SpaceMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Bold.ttf -------------------------------------------------------------------------------- /match/public/fonts/Space_Mono/SpaceMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-BoldItalic.ttf -------------------------------------------------------------------------------- /match/public/fonts/Space_Mono/SpaceMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Italic.ttf -------------------------------------------------------------------------------- /match/public/fonts/Space_Mono/SpaceMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Regular.ttf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Black.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Bold.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Light.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Medium.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Regular.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf -------------------------------------------------------------------------------- /match/public/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Black.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-BlackItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Bold.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-BoldItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Light.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-LightItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Medium.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-MediumItalic.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Regular.otf -------------------------------------------------------------------------------- /match/public/fonts/Untitled Sans/UntitledSans-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-RegularItalic.otf -------------------------------------------------------------------------------- /match/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /match/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /match/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/src/app/favicon.ico -------------------------------------------------------------------------------- /match/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | // Add Tiempos Headline font in otf, from light to black 6 | @font-face { 7 | font-family: "Tiempos Headline"; 8 | font-style: normal; 9 | font-weight: 300; 10 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Light.otf") 11 | format("opentype"); 12 | } 13 | 14 | @font-face { 15 | font-family: "Tiempos Headline"; 16 | font-style: normal; 17 | font-weight: 400; 18 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Regular.otf") 19 | format("opentype"); 20 | } 21 | 22 | @font-face { 23 | font-family: "Tiempos Headline"; 24 | font-style: normal; 25 | font-weight: 500; 26 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Medium.otf") 27 | format("opentype"); 28 | } 29 | 30 | @font-face { 31 | font-family: "Tiempos Headline"; 32 | font-style: normal; 33 | font-weight: 600; 34 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf") 35 | format("opentype"); 36 | } 37 | 38 | @font-face { 39 | font-family: "Tiempos Headline"; 40 | font-style: normal; 41 | font-weight: 700; 42 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Bold.otf") 43 | format("opentype"); 44 | } 45 | 46 | // Add italic versions of Tiempos Headline font 47 | @font-face { 48 | font-family: "Tiempos Headline"; 49 | font-style: italic; 50 | font-weight: 300; 51 | src: url("/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf") 52 | format("opentype"); 53 | } 54 | 55 | @font-face { 56 | font-family: "Tiempos Headline"; 57 | font-style: italic; 58 | font-weight: 400; 59 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Italic.otf") 60 | format("opentype"); 61 | } 62 | 63 | @font-face { 64 | font-family: "Tiempos Headline"; 65 | font-style: italic; 66 | font-weight: 500; 67 | src: url("/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf") 68 | format("opentype"); 69 | } 70 | 71 | @font-face { 72 | font-family: "Tiempos Headline"; 73 | font-style: italic; 74 | font-weight: 600; 75 | src: url("/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf") 76 | format("opentype"); 77 | } 78 | 79 | @font-face { 80 | font-family: "Tiempos Headline"; 81 | font-style: italic; 82 | font-weight: 700; 83 | src: url("/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf") 84 | format("opentype"); 85 | } 86 | 87 | // SpaceMono 88 | 89 | @font-face { 90 | font-family: "Space Mono"; 91 | font-style: normal; 92 | font-weight: 400; 93 | src: url("/fonts/Space_Mono/SpaceMono-Regular.ttf") format("truetype"); 94 | } 95 | 96 | @font-face { 97 | font-family: "Space Mono"; 98 | font-style: normal; 99 | font-weight: 700; 100 | src: url("/fonts/Space_Mono/SpaceMono-Bold.ttf") format("truetype"); 101 | } 102 | 103 | @font-face { 104 | font-family: "Space Mono"; 105 | font-style: italic; 106 | font-weight: 400; 107 | src: url("/fonts/Space_Mono/SpaceMono-Italic.ttf") format("truetype"); 108 | } 109 | 110 | @font-face { 111 | font-family: "Space Mono"; 112 | font-style: italic; 113 | font-weight: 700; 114 | src: url("/fonts/Space_Mono/SpaceMono-BoldItalic.ttf") format("truetype"); 115 | } 116 | 117 | // Untitled Sans 118 | 119 | @font-face { 120 | font-family: "Untitled Sans"; 121 | font-style: normal; 122 | font-weight: 300; 123 | src: url("/fonts/Untitled Sans/UntitledSans-Light.otf") format("opentype"); 124 | } 125 | 126 | @font-face { 127 | font-family: "Untitled Sans"; 128 | font-style: normal; 129 | font-weight: 400; 130 | src: url("/fonts/Untitled Sans/UntitledSans-Regular.otf") format("opentype"); 131 | } 132 | 133 | @font-face { 134 | font-family: "Untitled Sans"; 135 | font-style: normal; 136 | font-weight: 500; 137 | src: url("/fonts/Untitled Sans/UntitledSans-Medium.otf") format("opentype"); 138 | } 139 | 140 | @font-face { 141 | font-family: "Untitled Sans"; 142 | font-style: normal; 143 | font-weight: 700; 144 | src: url("/fonts/Untitled Sans/UntitledSans-Bold.otf") format("opentype"); 145 | } 146 | -------------------------------------------------------------------------------- /match/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import "./globals.css"; 4 | 5 | const inter = Inter({ subsets: ["latin"] }); 6 | 7 | export const metadata: Metadata = { 8 | title: "W24 Symposium Matchmaking", 9 | }; 10 | 11 | export default function RootLayout({ 12 | children, 13 | }: Readonly<{ 14 | children: React.ReactNode; 15 | }>) { 16 | return ( 17 | 18 | {children} 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /match/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { Search } from "@/components/Search"; 2 | 3 | export default function Home() { 4 | return ( 5 |
6 |
7 | Socratica W24 Symposium Search 8 |
9 |
Waterloo, ON, Canada
10 |
11 | 12 |
13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /match/src/components/Search.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { 4 | DialogContent, 5 | DialogHeader, 6 | DialogTitle, 7 | } from "@/components/ui/dialog"; 8 | import { titleCase } from "@/lib/utils"; 9 | import Fuse from "fuse.js"; 10 | 11 | // change this to summarizedGraphData if AI summarization is enabled 12 | import graphData from "../../../graphData.json"; 13 | import { Dialog, DialogTrigger } from "@radix-ui/react-dialog"; 14 | import { useEffect, useState } from "react"; 15 | import { Input } from "./ui/input"; 16 | 17 | interface Node { 18 | id: string; 19 | data: { 20 | name: string; 21 | major: string; 22 | response: string; 23 | topMatch: string; 24 | originalResponse: string; 25 | }; 26 | } 27 | 28 | interface CustomNode extends Node { 29 | links: { source: string; target: string }[]; 30 | } 31 | 32 | // Create hashmap of id -> node and attach links to each nod 33 | const nodeMap = new Map(); 34 | graphData.nodes.forEach((node) => { 35 | return nodeMap.set(node.id, { 36 | ...node, 37 | data: { 38 | ...node.data, 39 | originalResponse: "", 40 | }, 41 | links: [], 42 | }); 43 | }); 44 | 45 | graphData.links.forEach((link) => { 46 | const sourceNode = nodeMap.get(link.source); 47 | const targetNode = nodeMap.get(link.target); 48 | 49 | if (sourceNode) { 50 | sourceNode.links.push(link); 51 | } 52 | 53 | if (targetNode) { 54 | targetNode.links.push(link); 55 | } 56 | }); 57 | 58 | // For all empty links in the nodemap add their best match 59 | nodeMap.forEach((node) => { 60 | if (node.links.length === 0) { 61 | const bestMatch = nodeMap.get(node.data.topMatch); 62 | if (bestMatch) { 63 | nodeMap.set(node.id, { 64 | ...node, 65 | links: [ 66 | { 67 | source: node.id, 68 | target: bestMatch.id, 69 | }, 70 | ], 71 | }); 72 | } 73 | } 74 | }); 75 | 76 | export const Search = () => { 77 | const [searchTerm, setSearchTerm] = useState(""); 78 | const [searchResults, setSearchResults] = useState([]); 79 | 80 | const handleSearch = (event: React.ChangeEvent) => { 81 | setSearchTerm(event.target.value); 82 | }; 83 | 84 | const fuseOptions = { 85 | keys: ["data.name", "data.response"], 86 | includeScore: true, 87 | isCaseSensitive: false, 88 | findAllMatches: true, 89 | threshold: 0.4, // adjust this to be more lenient with search 90 | }; 91 | 92 | const fuse = new Fuse(graphData.nodes, fuseOptions); 93 | 94 | useEffect(() => { 95 | const results = fuse.search(searchTerm).map((result) => ({ 96 | ...result.item, 97 | data: { 98 | ...result.item.data, 99 | originalResponse: "", 100 | }, 101 | })); 102 | 103 | setSearchResults(results); 104 | }, [searchTerm]); 105 | 106 | return ( 107 |
108 | 113 |
114 | {searchResults.map((item) => { 115 | const currentNode = nodeMap.get(item.id); 116 | const neighbors = currentNode?.links.map((link) => { 117 | const neighborNode = nodeMap.get( 118 | link.source === item.id ? link.target : link.source 119 | ); 120 | 121 | return neighborNode; 122 | }); 123 | 124 | const name = titleCase(item.data.name); 125 | const dedupNeighbors = Array.from(new Set(neighbors)); 126 | 127 | const major = 128 | item.data.major === "N/A" ? "" : titleCase(item.data.major); 129 | 130 | return ( 131 | 132 | 133 |

134 | {name} 135 |

136 |

137 | {major} 138 |

139 |

{item.data.response}

140 |
141 | 142 | 143 | Potential Connections 144 | 145 | 146 |
147 | {dedupNeighbors?.map((neighbor) => { 148 | return ( 149 |
153 |

154 | {neighbor?.data.name} 155 |

156 |

157 | {neighbor?.data.major} 158 |

159 |

160 | {neighbor?.data.response} 161 |

162 |
163 | ); 164 | })} 165 |
166 | 167 | {/* 168 | 169 | */} 170 |
171 |
172 | ); 173 | })} 174 |
175 |
176 | ); 177 | }; 178 | -------------------------------------------------------------------------------- /match/src/components/ui/dialog.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as DialogPrimitive from "@radix-ui/react-dialog" 5 | import { X } from "lucide-react" 6 | 7 | import { cn } from "@/lib/utils" 8 | 9 | const Dialog = DialogPrimitive.Root 10 | 11 | const DialogTrigger = DialogPrimitive.Trigger 12 | 13 | const DialogPortal = DialogPrimitive.Portal 14 | 15 | const DialogClose = DialogPrimitive.Close 16 | 17 | const DialogOverlay = React.forwardRef< 18 | React.ElementRef, 19 | React.ComponentPropsWithoutRef 20 | >(({ className, ...props }, ref) => ( 21 | 29 | )) 30 | DialogOverlay.displayName = DialogPrimitive.Overlay.displayName 31 | 32 | const DialogContent = React.forwardRef< 33 | React.ElementRef, 34 | React.ComponentPropsWithoutRef 35 | >(({ className, children, ...props }, ref) => ( 36 | 37 | 38 | 46 | {children} 47 | 48 | 49 | Close 50 | 51 | 52 | 53 | )) 54 | DialogContent.displayName = DialogPrimitive.Content.displayName 55 | 56 | const DialogHeader = ({ 57 | className, 58 | ...props 59 | }: React.HTMLAttributes) => ( 60 |
67 | ) 68 | DialogHeader.displayName = "DialogHeader" 69 | 70 | const DialogFooter = ({ 71 | className, 72 | ...props 73 | }: React.HTMLAttributes) => ( 74 |
81 | ) 82 | DialogFooter.displayName = "DialogFooter" 83 | 84 | const DialogTitle = React.forwardRef< 85 | React.ElementRef, 86 | React.ComponentPropsWithoutRef 87 | >(({ className, ...props }, ref) => ( 88 | 96 | )) 97 | DialogTitle.displayName = DialogPrimitive.Title.displayName 98 | 99 | const DialogDescription = React.forwardRef< 100 | React.ElementRef, 101 | React.ComponentPropsWithoutRef 102 | >(({ className, ...props }, ref) => ( 103 | 108 | )) 109 | DialogDescription.displayName = DialogPrimitive.Description.displayName 110 | 111 | export { 112 | Dialog, 113 | DialogPortal, 114 | DialogOverlay, 115 | DialogClose, 116 | DialogTrigger, 117 | DialogContent, 118 | DialogHeader, 119 | DialogFooter, 120 | DialogTitle, 121 | DialogDescription, 122 | } 123 | -------------------------------------------------------------------------------- /match/src/components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface InputProps 6 | extends React.InputHTMLAttributes {} 7 | 8 | const Input = React.forwardRef( 9 | ({ className, type, ...props }, ref) => { 10 | return ( 11 | 20 | ) 21 | } 22 | ) 23 | Input.displayName = "Input" 24 | 25 | export { Input } 26 | -------------------------------------------------------------------------------- /match/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | 8 | export const titleCase = (str: string) => { 9 | // use regex to match all words and capitalize the first letter of each word 10 | return str.replace( 11 | /\w\S*/g, 12 | (txt) => txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase() 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /match/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config = { 4 | darkMode: ["class"], 5 | content: [ 6 | "./pages/**/*.{ts,tsx}", 7 | "./components/**/*.{ts,tsx}", 8 | "./app/**/*.{ts,tsx}", 9 | "./src/**/*.{ts,tsx}", 10 | ], 11 | prefix: "", 12 | theme: { 13 | container: { 14 | center: true, 15 | padding: "2rem", 16 | screens: { 17 | "2xl": "1400px", 18 | }, 19 | }, 20 | extend: { 21 | keyframes: { 22 | "accordion-down": { 23 | from: { height: "0" }, 24 | to: { height: "var(--radix-accordion-content-height)" }, 25 | }, 26 | "accordion-up": { 27 | from: { height: "var(--radix-accordion-content-height)" }, 28 | to: { height: "0" }, 29 | }, 30 | }, 31 | animation: { 32 | "accordion-down": "accordion-down 0.2s ease-out", 33 | "accordion-up": "accordion-up 0.2s ease-out", 34 | }, 35 | fontFamily: { 36 | "tiempos-headline": ["'Tiempos Headline'", "serif"], 37 | "space-mono": ["'Space Mono'", "monospace"], 38 | "untitled-sans": ["'Untitled Sans'", "sans-serif"], 39 | }, 40 | colors: { 41 | "socratica-cream": "#FBF8EF", 42 | "socratica-black": "#121212", 43 | "socratica-grey": "#A09D98", 44 | }, 45 | }, 46 | }, 47 | plugins: [require("tailwindcss-animate")], 48 | } satisfies Config; 49 | 50 | export default config; 51 | -------------------------------------------------------------------------------- /match/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | annotated-types==0.6.0 2 | anyio==4.3.0 3 | asgiref==3.8.1 4 | backoff==2.2.1 5 | bcrypt==4.1.2 6 | build==1.1.1 7 | cachetools==5.3.3 8 | certifi==2024.2.2 9 | charset-normalizer==3.3.2 10 | chroma-hnswlib==0.7.3 11 | chromadb==0.4.24 12 | click==8.1.7 13 | coloredlogs==15.0.1 14 | Deprecated==1.2.14 15 | distro==1.9.0 16 | fastapi==0.110.0 17 | filelock==3.13.1 18 | flatbuffers==24.3.7 19 | fsspec==2024.3.1 20 | google-auth==2.29.0 21 | googleapis-common-protos==1.63.0 22 | grpcio==1.62.1 23 | h11==0.14.0 24 | httpcore==1.0.5 25 | httptools==0.6.1 26 | httpx==0.27.0 27 | huggingface-hub==0.21.4 28 | humanfriendly==10.0 29 | idna==3.6 30 | importlib-metadata==6.11.0 31 | importlib_resources==6.4.0 32 | kubernetes==29.0.0 33 | mmh3==4.1.0 34 | monotonic==1.6 35 | mpmath==1.3.0 36 | numpy==1.26.4 37 | oauthlib==3.2.2 38 | onnxruntime==1.17.1 39 | openai==1.14.3 40 | opentelemetry-api==1.23.0 41 | opentelemetry-exporter-otlp-proto-common==1.23.0 42 | opentelemetry-exporter-otlp-proto-grpc==1.23.0 43 | opentelemetry-instrumentation==0.44b0 44 | opentelemetry-instrumentation-asgi==0.44b0 45 | opentelemetry-instrumentation-fastapi==0.44b0 46 | opentelemetry-proto==1.23.0 47 | opentelemetry-sdk==1.23.0 48 | opentelemetry-semantic-conventions==0.44b0 49 | opentelemetry-util-http==0.44b0 50 | orjson==3.9.15 51 | overrides==7.7.0 52 | packaging==24.0 53 | pandas==2.2.1 54 | posthog==3.5.0 55 | protobuf==4.25.3 56 | pulsar-client==3.4.0 57 | pyasn1==0.5.1 58 | pyasn1-modules==0.3.0 59 | pydantic==2.6.4 60 | pydantic_core==2.16.3 61 | PyPika==0.48.9 62 | pyproject_hooks==1.0.0 63 | python-dateutil==2.9.0.post0 64 | python-dotenv==1.0.1 65 | pytz==2024.1 66 | PyYAML==6.0.1 67 | requests==2.31.0 68 | requests-oauthlib==2.0.0 69 | rsa==4.9 70 | six==1.16.0 71 | sniffio==1.3.1 72 | starlette==0.36.3 73 | sympy==1.12 74 | tenacity==8.2.3 75 | tokenizers==0.15.2 76 | tqdm==4.66.2 77 | typer==0.9.4 78 | typing_extensions==4.10.0 79 | tzdata==2024.1 80 | urllib3==2.2.1 81 | uvicorn==0.29.0 82 | uvloop==0.19.0 83 | watchfiles==0.21.0 84 | websocket-client==1.7.0 85 | websockets==12.0 86 | wrapt==1.16.0 87 | zipp==3.18.1 88 | -------------------------------------------------------------------------------- /summarize.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # Load from .env 4 | from dotenv import load_dotenv 5 | from openai import OpenAI 6 | 7 | load_dotenv() 8 | 9 | if "OPENAI_API_KEY" not in os.environ: 10 | raise Exception("API key not found") 11 | 12 | 13 | client = OpenAI( 14 | api_key=os.environ["OPENAI_API_KEY"] 15 | ) 16 | 17 | example_messages = [ 18 | { 19 | "role": "system", 20 | "content": "You are an assistant who is to take participant responses answering the question: \"If you had no other obligations, what would you spend your time trying/creating\" and summarize them in a concise, 1-2 sentence abstract.\n\nYou should give your response beginning with the word \"Would\", similar to the following forms:\n\n1) Would create ______\n2) Would make ______" 21 | }, 22 | { 23 | "role": "user", 24 | "content": "Summarize response: \"Learning and working with embedded projects interfacing with AI\"\n" 25 | }, 26 | { 27 | "role": "assistant", 28 | "content": "Would learn and work on embedded projects interfacing with AI" 29 | }, 30 | { 31 | "role": "user", 32 | "content": "Summarize: \"I have been meaning to connect with community organizations/ngos I'm tied to, about campaigns promoting longevity of girls in sports and programs that promoting healthy coaching approaches for girls in high performance training. This is an important cause for me since most girls abandon their sport after adolescence, there are big systematic differences and disparity in opportunities to pursue professional careers - and i just want girls to feel fulfilled through sport. Also I've recently been into metal crafts and jewelry making by repurposing scraps and unconventional pieces to make something wearable. I also enjoy making embroidery and hand textiles projects. So many half-started crafts projects I could mention.\"" 33 | }, 34 | { 35 | "role": "assistant", 36 | "content": "Would connect with community organizations promoting girls in sports and jewelry making by repurposing scraps" 37 | }, 38 | { 39 | "role": "user", 40 | "content": "Summarize: \"Music\"\n" 41 | }, 42 | { 43 | "role": "assistant", 44 | "content": "Would work on music" 45 | }, 46 | { 47 | "role": "user", 48 | "content": "Summarize: \"Building schools or skateparks in Nigeria and neighboring countries. And sending millions to Congo and Palestine\"\n" 49 | }, 50 | { 51 | "role": "assistant", 52 | "content": "Would build schools or skateparks in Nigeria and send millions to Congo and Palestine" 53 | }, 54 | { 55 | "role": "user", 56 | "content": "Summarize: \"I would love to dive into learning robotics. I have ideas about how robots can be applied and commercialized but I have no experience with that type of hardware yet.\"" 57 | }, 58 | { 59 | "role": "assistant", 60 | "content": "Would dive into learning robotics, with my ideas on how robots can be applied and commercialized" 61 | }, 62 | { 63 | "role": "user", 64 | "content": "Summarize: \"Healthcare/biotech community, music label, content house\"" 65 | }, 66 | { 67 | "role": "assistant", 68 | "content": "Would create a healthcare/biotech community, a music label, and a content house." 69 | }, 70 | { 71 | "role": "user", 72 | "content": "Summarize: \"Visiting small towns in rural Canada to learn more about how they see the future, which problems are on their mind, etc.\"" 73 | }, 74 | { 75 | "role": "assistant", 76 | "content": "Would visit small towns in rural Canada to learn more about how they see their future and their problems" 77 | }, 78 | { 79 | "role": "user", 80 | "content": "Summarize: \"I'd want to work on something to help people live up to their true potential, to make the best of the time we have. I want to help people be more fulfilled and happier in their day-to-day lives.\"" 81 | }, 82 | { 83 | "role": "assistant", 84 | "content": "Would work on a project to help people live up to their true potential for a more fulfilled and happier life." 85 | }, 86 | { 87 | "role": "user", 88 | "content": "Summarize: \"With no obligations, would: I have been tackling the problem of finding better matches for peer-tutor pairs. For all large-scale tutoring platforms such as Chegg, Khan Academy, etc, there are no features that recommend tutors to users based on their individual needs. On the other hand, in-person tutoring institutions including Kumon, private tutors, and services offered by schools create pairings based on heuristics; not considering a student's unique learning profile. If I had no other obligations (school, clubs, etc), I would go head-on into discussing these issues with current individuals in the tutoring scene. I have already been developing a platform to algorithmically find the most compatible matches for students and tutors, however progress is not steady as there are other obligations that cause priorities to change.\"" 89 | }, 90 | { 91 | "role": "assistant", 92 | "content": "Would engage fully in developing a platform that algorithmically finds the most compatible matches for students and tutors in large-scale tutoring platforms." 93 | }, 94 | { 95 | "role": "user", 96 | "content": "Summarize: \"With no obligations, would: Travel around the world, take pictures and videos, play and record and publish music\"" 97 | }, 98 | { 99 | "role": "assistant", 100 | "content": "Would travel around the world, take pictures and videos, and publish music" 101 | }, 102 | { 103 | "role": "user", 104 | "content": "Summarize: \"Working on ai personal assistant google chrome extension. Looking for interesting projects to join in as a SWE\"" 105 | }, 106 | { 107 | "role": "assistant", 108 | "content": "" 109 | }, 110 | { 111 | "role": "assistant", 112 | "content": "Would work on an AI personal assistant Google Chrome extension and seek interesting projects to join as a Software Engineer." 113 | }, 114 | { 115 | "role": "user", 116 | "content": "Summarize: \"With no obligations, would: I would love to work with scientists and engineers on exciting scientific problem spaces (quantum computing, AI, etc) to introduce new advancements in these areas. For example, experimenting with new methodologies and technology to study black holes and the universe better is fascinating to me.\"" 117 | }, 118 | { 119 | "role": "assistant", 120 | "content": "Would work with scientists and engineers on advancements on scientific problem spaces like quantum computing, AI, and astronomical studies." 121 | }, 122 | { 123 | "role": "user", 124 | "content": "Summarize: \"With no obligations, would: I will work on different projects on different technologies like blockchain, machine learning and mobile development. Creating such applications will strengthen my hold on the basics and expose me to practical examples.\"" 125 | }, 126 | { 127 | "role": "assistant", 128 | "content": "Would work on various projects involving technologies such as blockchain, machine learning, and mobile development to strengthen basic skills and gain practical experience." 129 | }, 130 | { 131 | "role": "user", 132 | "content": "Summarize: \"With no obligations, would: i'd spend time researching whatever topics I feel like in STEM, humanities, social sciences, and i'd also make bad art: music, film, drawings\"" 133 | }, 134 | { 135 | "role": "assistant", 136 | "content": "Would spend time researching topics across STEM, humanities, social sciences, and create experimental music, film, and drawings." 137 | }, 138 | { 139 | "role": "user", 140 | "content": "Summarize: \"With no obligations, would: A tech venture idea that can make a social impact\"" 141 | }, 142 | { 143 | "role": "assistant", 144 | "content": "Would create a tech venture that can make a social impact." 145 | } 146 | ] 147 | 148 | 149 | def generate_summary(response: str) -> str: 150 | last_prompt = f"Summarize: \"{response}\"\n" 151 | 152 | # Create a NEW array with the examples messages and the last prompt 153 | new_example_messages = example_messages + \ 154 | [{"role": "user", "content": last_prompt}] 155 | 156 | chat_response = client.chat.completions.create( 157 | model="gpt-4", 158 | messages=new_example_messages, 159 | temperature=1, 160 | max_tokens=40, 161 | top_p=1, 162 | frequency_penalty=0, 163 | presence_penalty=0 164 | ) 165 | 166 | return chat_response.choices[0].message.content 167 | 168 | 169 | if __name__ == "__main__": 170 | res = generate_summary( 171 | "A game") 172 | print(res) 173 | -------------------------------------------------------------------------------- /summarize_graph_data.py: -------------------------------------------------------------------------------- 1 | # Read from graphData.json 2 | 3 | import json 4 | 5 | from summarize import generate_summary 6 | 7 | def main(): 8 | # Get cached from attendees.json 9 | with open("attendees.json", "r") as f: 10 | attendees = json.load(f) 11 | # parse as dict 12 | attendees = dict(attendees) 13 | 14 | with open("graphData.json", "r") as f: 15 | graph_data = json.load(f) 16 | nodes = graph_data["nodes"] 17 | links = graph_data["links"] 18 | 19 | # Process the new nodes by changing the response using summarize.py 20 | for i, node in enumerate(nodes): 21 | # get node id 22 | node_name = node["data"]["name"] 23 | node_id = node["id"] 24 | 25 | print( 26 | f"({i+1}/{len(nodes)}) Processing node: {node_name}") 27 | response = node["data"]["response"] 28 | 29 | # If response already exists in attendees.json skip don't recompute 30 | if node_id in attendees: 31 | print( 32 | f"Node {node_id}: {node_name} already exists in attendees.json") 33 | new_response = attendees[node_id] 34 | else: 35 | new_response = generate_summary(response) 36 | 37 | node["data"]["response"] = new_response 38 | node["data"]["originalResponse"] = response 39 | 40 | # Write the new graph data to a new file 41 | with open("summarizedGraphData.json", "w") as f: 42 | json.dump({"nodes": nodes, "links": links}, f) 43 | 44 | 45 | if __name__ == '__main__': 46 | main() 47 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | def chunk_array(arr, chunk_size): 2 | # Use list comprehension to create subarrays of size 'chunk_size' 3 | return [arr[i:i + chunk_size] for i in range(0, len(arr), chunk_size)] 4 | --------------------------------------------------------------------------------