From 1d92d43fe091448526a5048f293fc078a26dd33d Mon Sep 17 00:00:00 2001 From: projects-g <63178974+projects-g@users.noreply.github.com> Date: Fri, 13 Oct 2023 22:53:29 +0530 Subject: [PATCH] New summary (#283) * handover final summary to Zephyr deployment * fix display error * push new summary feature * fix failing test case * Added markdown support for final summary * update UI render issue * retain sentence tokenizer call --------- Co-authored-by: Koper --- server/gpu/modal/reflector_llm_zephyr.py | 208 ++++++++ server/reflector/llm/base.py | 2 +- server/reflector/llm/llm_modal.py | 9 +- server/reflector/llm/llm_params.py | 69 +++ .../transcript_final_long_summary.py | 71 ++- server/reflector/settings.py | 1 + server/tests/conftest.py | 9 + server/tests/test_processors_pipeline.py | 1 + server/tests/test_transcripts_rtc_ws.py | 6 +- www/app/styles/markdown.css | 91 ++++ www/app/transcripts/finalSummary.tsx | 8 +- www/package.json | 1 + www/yarn.lock | 480 +++++++++++++++++- 13 files changed, 933 insertions(+), 23 deletions(-) create mode 100644 server/gpu/modal/reflector_llm_zephyr.py create mode 100644 www/app/styles/markdown.css diff --git a/server/gpu/modal/reflector_llm_zephyr.py b/server/gpu/modal/reflector_llm_zephyr.py new file mode 100644 index 00000000..1000de4e --- /dev/null +++ b/server/gpu/modal/reflector_llm_zephyr.py @@ -0,0 +1,208 @@ +""" +Reflector GPU backend - LLM +=========================== + +""" +import json +import os +from typing import Optional + +import modal +from modal import Image, Secret, Stub, asgi_app, method + +# LLM +LLM_MODEL: str = "HuggingFaceH4/zephyr-7b-alpha" +LLM_LOW_CPU_MEM_USAGE: bool = True +LLM_TORCH_DTYPE: str = "bfloat16" +LLM_MAX_NEW_TOKENS: int = 300 + +IMAGE_MODEL_DIR = "/root/llm_models" + +stub = Stub(name="reflector-llm-zephyr") + + +def download_llm(): + from huggingface_hub import snapshot_download + + print("Downloading LLM model") + snapshot_download(LLM_MODEL, cache_dir=IMAGE_MODEL_DIR) + print("LLM model downloaded") + + +def migrate_cache_llm(): + """ + XXX The cache for model files in Transformers v4.22.0 has been updated. + Migrating your old cache. This is a one-time only operation. You can + interrupt this and resume the migration later on by calling + `transformers.utils.move_cache()`. + """ + from transformers.utils.hub import move_cache + + print("Moving LLM cache") + move_cache(cache_dir=IMAGE_MODEL_DIR, new_cache_dir=IMAGE_MODEL_DIR) + print("LLM cache moved") + + +llm_image = ( + Image.debian_slim(python_version="3.10.8") + .apt_install("git") + .pip_install( + "transformers==4.34.0", + "torch", + "sentencepiece", + "protobuf", + "jsonformer==0.12.0", + "accelerate==0.21.0", + "einops==0.6.1", + "hf-transfer~=0.1", + "huggingface_hub==0.16.4" + ) + .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"}) + .run_function(download_llm) + .run_function(migrate_cache_llm) +) + + +@stub.cls( + gpu="A10G", + timeout=60 * 5, + container_idle_timeout=60 * 5, + concurrency_limit=2, + image=llm_image, +) +class LLM: + def __enter__(self): + import torch + from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig + + print("Instance llm model") + model = AutoModelForCausalLM.from_pretrained( + LLM_MODEL, + torch_dtype=getattr(torch, LLM_TORCH_DTYPE), + low_cpu_mem_usage=LLM_LOW_CPU_MEM_USAGE, + cache_dir=IMAGE_MODEL_DIR + ) + + # JSONFormer doesn't yet support generation configs + print("Instance llm generation config") + model.config.max_new_tokens = LLM_MAX_NEW_TOKENS + + # generation configuration + gen_cfg = GenerationConfig.from_model_config(model.config) + gen_cfg.max_new_tokens = LLM_MAX_NEW_TOKENS + + # load tokenizer + print("Instance llm tokenizer") + tokenizer = AutoTokenizer.from_pretrained( + LLM_MODEL, + cache_dir=IMAGE_MODEL_DIR + ) + gen_cfg.pad_token_id = tokenizer.eos_token_id + gen_cfg.eos_token_id = tokenizer.eos_token_id + tokenizer.pad_token = tokenizer.eos_token + model.config.pad_token_id = tokenizer.eos_token_id + + # move model to gpu + print("Move llm model to GPU") + model = model.cuda() + + print("Warmup llm done") + self.model = model + self.tokenizer = tokenizer + self.gen_cfg = gen_cfg + self.GenerationConfig = GenerationConfig + + def __exit__(self, *args): + print("Exit llm") + + @method() + def generate(self, prompt: str, gen_schema: str | None, gen_cfg: str | None) -> dict: + """ + Perform a generation action using the LLM + """ + print(f"Generate {prompt=}") + if gen_cfg: + gen_cfg = self.GenerationConfig.from_dict(json.loads(gen_cfg)) + gen_cfg.pad_token_id = self.tokenizer.eos_token_id + gen_cfg.eos_token_id = self.tokenizer.eos_token_id + else: + gen_cfg = self.gen_cfg + + # If a gen_schema is given, conform to gen_schema + if gen_schema: + import jsonformer + + print(f"Schema {gen_schema=}") + jsonformer_llm = jsonformer.Jsonformer( + model=self.model, + tokenizer=self.tokenizer, + json_schema=json.loads(gen_schema), + prompt=prompt, + max_string_token_length=gen_cfg.max_new_tokens + ) + response = jsonformer_llm() + else: + # If no gen_schema, perform prompt only generation + + # tokenize prompt + input_ids = self.tokenizer.encode(prompt, return_tensors="pt").to( + self.model.device + ) + output = self.model.generate(input_ids, generation_config=gen_cfg) + + # decode output + response = self.tokenizer.decode(output[0].cpu(), skip_special_tokens=True) + response = response[len(prompt):] + response = { + "long_summary": response + } + print(f"Generated {response=}") + return {"text": response} + +# ------------------------------------------------------------------- +# Web API +# ------------------------------------------------------------------- + + +@stub.function( + container_idle_timeout=60 * 10, + timeout=60 * 5, + secrets=[ + Secret.from_name("reflector-gpu"), + ], +) +@asgi_app() +def web(): + from fastapi import Depends, FastAPI, HTTPException, status + from fastapi.security import OAuth2PasswordBearer + from pydantic import BaseModel + + llmstub = LLM() + + app = FastAPI() + oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + + def apikey_auth(apikey: str = Depends(oauth2_scheme)): + if apikey != os.environ["REFLECTOR_GPU_APIKEY"]: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid API key", + headers={"WWW-Authenticate": "Bearer"}, + ) + + class LLMRequest(BaseModel): + prompt: str + gen_schema: Optional[dict] = None + gen_cfg: Optional[dict] = None + + @app.post("/llm", dependencies=[Depends(apikey_auth)]) + async def llm( + req: LLMRequest, + ): + gen_schema = json.dumps(req.gen_schema) if req.gen_schema else None + gen_cfg = json.dumps(req.gen_cfg) if req.gen_cfg else None + func = llmstub.generate.spawn(prompt=req.prompt, gen_schema=gen_schema, gen_cfg=gen_cfg) + result = func.get() + return result + + return app diff --git a/server/reflector/llm/base.py b/server/reflector/llm/base.py index e4103427..a1bb3ba8 100644 --- a/server/reflector/llm/base.py +++ b/server/reflector/llm/base.py @@ -258,7 +258,7 @@ class LLM: """ Choose the token size to set as the threshold to pack the LLM calls """ - buffer_token_size = 25 + buffer_token_size = 100 default_output_tokens = 1000 context_window = self.tokenizer.model_max_length tokens = self.tokenizer.tokenize( diff --git a/server/reflector/llm/llm_modal.py b/server/reflector/llm/llm_modal.py index 2c9d9bc9..220730e5 100644 --- a/server/reflector/llm/llm_modal.py +++ b/server/reflector/llm/llm_modal.py @@ -23,7 +23,7 @@ class ModalLLM(LLM): """ # TODO: Query the specific GPU platform # Replace this with a HTTP call - return ["lmsys/vicuna-13b-v1.5"] + return ["lmsys/vicuna-13b-v1.5", "HuggingFaceH4/zephyr-7b-alpha"] async def _generate( self, prompt: str, gen_schema: dict | None, gen_cfg: dict | None, **kwargs @@ -33,6 +33,13 @@ class ModalLLM(LLM): json_payload["gen_schema"] = gen_schema if gen_cfg: json_payload["gen_cfg"] = gen_cfg + + # Handing over generation of the final summary to Zephyr model + # but replacing the Vicuna model will happen after more testing + # TODO: Create a mapping of model names and cloud deployments + if self.model_name == "HuggingFaceH4/zephyr-7b-alpha": + self.llm_url = settings.ZEPHYR_LLM_URL + "/llm" + async with httpx.AsyncClient() as client: response = await retry(client.post)( self.llm_url, diff --git a/server/reflector/llm/llm_params.py b/server/reflector/llm/llm_params.py index 3d960a7c..fbe73bd9 100644 --- a/server/reflector/llm/llm_params.py +++ b/server/reflector/llm/llm_params.py @@ -144,7 +144,76 @@ class TopicParams(LLMTaskParams): return self._task_params +class BulletedSummaryParams(LLMTaskParams): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._gen_cfg = GenerationConfig( + max_new_tokens=800, + num_beams=1, + do_sample=True, + temperature=0.2, + early_stopping=True, + ) + self._instruct = """ + Given a meeting transcript, extract the key things discussed in the + form of a list. + + While generating the response, follow the constraints mentioned below. + + Summary constraints: + i) Do not add new content, except to fix spelling or punctuation. + ii) Do not add any prefixes or numbering in the response. + iii) The summarization should be as information dense as possible. + iv) Do not add any additional sections like Note, Conclusion, etc. in + the response. + + Response format: + i) The response should be in the form of a bulleted list. + ii) Iteratively merge all the relevant paragraphs together to keep the + number of paragraphs to a minimum. + iii) Remove any unfinished sentences from the final response. + iv) Do not include narrative or reporting clauses. + v) Use "*" as the bullet icon. + """ + self._task_params = TaskParams( + instruct=self._instruct, gen_schema=None, gen_cfg=self._gen_cfg + ) + + def _get_task_params(self) -> TaskParams: + """gen_schema + Return the parameters associated with a specific LLM task + """ + return self._task_params + + +class MergedSummaryParams(LLMTaskParams): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._gen_cfg = GenerationConfig( + max_new_tokens=600, + num_beams=1, + do_sample=True, + temperature=0.2, + early_stopping=True, + ) + self._instruct = """ + Given the key points of a meeting, summarize the points to describe the + meeting in the form of paragraphs. + """ + self._task_params = TaskParams( + instruct=self._instruct, gen_schema=None, gen_cfg=self._gen_cfg + ) + + def _get_task_params(self) -> TaskParams: + """gen_schema + Return the parameters associated with a specific LLM task + """ + return self._task_params + + LLMTaskParams.register("topic", TopicParams) LLMTaskParams.register("final_title", FinalTitleParams) LLMTaskParams.register("final_short_summary", FinalShortSummaryParams) LLMTaskParams.register("final_long_summary", FinalLongSummaryParams) +LLMTaskParams.register("bullet_summary", BulletedSummaryParams) +LLMTaskParams.register("merged_summary", MergedSummaryParams) diff --git a/server/reflector/processors/transcript_final_long_summary.py b/server/reflector/processors/transcript_final_long_summary.py index 477e65c9..45bbcafb 100644 --- a/server/reflector/processors/transcript_final_long_summary.py +++ b/server/reflector/processors/transcript_final_long_summary.py @@ -1,3 +1,4 @@ +import nltk from reflector.llm import LLM, LLMTaskParams from reflector.processors.base import Processor from reflector.processors.types import FinalLongSummary, TitleSummary @@ -10,36 +11,58 @@ class TranscriptFinalLongSummaryProcessor(Processor): INPUT_TYPE = TitleSummary OUTPUT_TYPE = FinalLongSummary - TASK = "final_long_summary" def __init__(self, **kwargs): super().__init__(**kwargs) self.chunks: list[TitleSummary] = [] - self.llm = LLM.get_instance() - self.params = LLMTaskParams.get_instance(self.TASK).task_params + self.llm = LLM.get_instance(model_name="HuggingFaceH4/zephyr-7b-alpha") async def _push(self, data: TitleSummary): self.chunks.append(data) + async def get_bullet_summary(self, text: str) -> str: + params = LLMTaskParams.get_instance("bullet_summary").task_params + chunks = list(self.llm.split_corpus(corpus=text, task_params=params)) + + bullet_summary = "" + for chunk in chunks: + prompt = self.llm.create_prompt(instruct=params.instruct, text=chunk) + summary_result = await self.llm.generate( + prompt=prompt, + gen_schema=params.gen_schema, + gen_cfg=params.gen_cfg, + logger=self.logger, + ) + bullet_summary += summary_result["long_summary"] + return bullet_summary + + async def get_merged_summary(self, text: str) -> str: + params = LLMTaskParams.get_instance("merged_summary").task_params + chunks = list(self.llm.split_corpus(corpus=text, task_params=params)) + + merged_summary = "" + for chunk in chunks: + prompt = self.llm.create_prompt(instruct=params.instruct, text=chunk) + summary_result = await self.llm.generate( + prompt=prompt, + gen_schema=params.gen_schema, + gen_cfg=params.gen_cfg, + logger=self.logger, + ) + merged_summary += summary_result["long_summary"] + return merged_summary + async def get_long_summary(self, text: str) -> str: """ Generate a long version of the final summary """ - self.logger.info(f"Smoothing out {len(text)} length summary to a long summary") - chunks = list(self.llm.split_corpus(corpus=text, task_params=self.params)) + bullet_summary = await self.get_bullet_summary(text) + merged_summary = await self.get_merged_summary(bullet_summary) - accumulated_summaries = "" - for chunk in chunks: - prompt = self.llm.create_prompt(instruct=self.params.instruct, text=chunk) - summary_result = await self.llm.generate( - prompt=prompt, - gen_schema=self.params.gen_schema, - gen_cfg=self.params.gen_cfg, - logger=self.logger, - ) - accumulated_summaries += summary_result["long_summary"] + return merged_summary - return accumulated_summaries + def sentence_tokenize(self, text: str) -> [str]: + return nltk.sent_tokenize(text) async def _flush(self): if not self.chunks: @@ -49,11 +72,25 @@ class TranscriptFinalLongSummaryProcessor(Processor): accumulated_summaries = " ".join([chunk.summary for chunk in self.chunks]) long_summary = await self.get_long_summary(accumulated_summaries) + # Format the output as much as possible to be handled + # by front-end for displaying + summary_sentences = [] + for sentence in self.sentence_tokenize(long_summary): + sentence = str(sentence).strip() + if sentence.startswith("- "): + sentence.replace("- ", "* ") + else: + sentence = "* " + sentence + sentence += " \n" + summary_sentences.append(sentence) + + formatted_long_summary = "".join(summary_sentences) + last_chunk = self.chunks[-1] duration = last_chunk.timestamp + last_chunk.duration final_long_summary = FinalLongSummary( - long_summary=long_summary, + long_summary=formatted_long_summary, duration=duration, ) await self.emit(final_long_summary) diff --git a/server/reflector/settings.py b/server/reflector/settings.py index fa2d1296..67baf9d2 100644 --- a/server/reflector/settings.py +++ b/server/reflector/settings.py @@ -72,6 +72,7 @@ class Settings(BaseSettings): LLM_TIMEOUT: int = 60 * 5 # take cold start into account LLM_MAX_TOKENS: int = 1024 LLM_TEMPERATURE: float = 0.7 + ZEPHYR_LLM_URL: str | None = None # LLM Banana configuration LLM_BANANA_API_KEY: str | None = None diff --git a/server/tests/conftest.py b/server/tests/conftest.py index ef56929a..76b56abf 100644 --- a/server/tests/conftest.py +++ b/server/tests/conftest.py @@ -93,3 +93,12 @@ def ensure_casing(): with patch("reflector.llm.base.LLM.ensure_casing") as mock_casing: mock_casing.return_value = "LLM TITLE" yield + + +@pytest.fixture +def sentence_tokenize(): + with patch( + "reflector.processors.TranscriptFinalLongSummaryProcessor" ".sentence_tokenize" + ) as mock_sent_tokenize: + mock_sent_tokenize.return_value = ["LLM LONG SUMMARY"] + yield diff --git a/server/tests/test_processors_pipeline.py b/server/tests/test_processors_pipeline.py index 69c3910d..79825b26 100644 --- a/server/tests/test_processors_pipeline.py +++ b/server/tests/test_processors_pipeline.py @@ -9,6 +9,7 @@ async def test_basic_process( dummy_llm, dummy_processors, ensure_casing, + sentence_tokenize, ): # goal is to start the server, and send rtc audio to it # validate the events received diff --git a/server/tests/test_transcripts_rtc_ws.py b/server/tests/test_transcripts_rtc_ws.py index 517567d0..50e74231 100644 --- a/server/tests/test_transcripts_rtc_ws.py +++ b/server/tests/test_transcripts_rtc_ws.py @@ -60,6 +60,7 @@ async def test_transcript_rtc_and_websocket( dummy_processors, ensure_casing, appserver, + sentence_tokenize, ): # goal: start the server, exchange RTC, receive websocket events # because of that, we need to start the server in a thread @@ -156,7 +157,7 @@ async def test_transcript_rtc_and_websocket( assert "FINAL_LONG_SUMMARY" in eventnames ev = events[eventnames.index("FINAL_LONG_SUMMARY")] - assert ev["data"]["long_summary"] == "LLM LONG SUMMARY" + assert ev["data"]["long_summary"] == "* LLM LONG SUMMARY \n" assert "FINAL_SHORT_SUMMARY" in eventnames ev = events[eventnames.index("FINAL_SHORT_SUMMARY")] @@ -193,6 +194,7 @@ async def test_transcript_rtc_and_websocket_and_fr( dummy_processors, ensure_casing, appserver, + sentence_tokenize, ): # goal: start the server, exchange RTC, receive websocket events # because of that, we need to start the server in a thread @@ -292,7 +294,7 @@ async def test_transcript_rtc_and_websocket_and_fr( assert "FINAL_LONG_SUMMARY" in eventnames ev = events[eventnames.index("FINAL_LONG_SUMMARY")] - assert ev["data"]["long_summary"] == "LLM LONG SUMMARY" + assert ev["data"]["long_summary"] == "* LLM LONG SUMMARY \n" assert "FINAL_SHORT_SUMMARY" in eventnames ev = events[eventnames.index("FINAL_SHORT_SUMMARY")] diff --git a/www/app/styles/markdown.css b/www/app/styles/markdown.css new file mode 100644 index 00000000..ef225d84 --- /dev/null +++ b/www/app/styles/markdown.css @@ -0,0 +1,91 @@ +/* Headings */ +.markdown h1, +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + margin-top: 1em; + margin-bottom: 0.5em; +} + +/* Paragraphs */ +.markdown p { + margin: 1em 0; +} + +/* Lists */ +.markdown ul, +.markdown ol { + margin: 1em; + padding-left: 1em; +} + +.markdown li { + margin: 0.2em 0; +} + +/* Bold and italic */ +.markdown b, +.markdown strong { + font-weight: bold; +} + +.markdown i, +.markdown em { + font-style: italic; +} + +/* Blockquotes */ +.markdown blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 2px solid #ccc; +} + +/* Code blocks and inline code */ +.markdown code { + font-family: "Courier New", monospace; +} + +.markdown pre { + background-color: #f4f4f4; + padding: 1em; + overflow-x: auto; +} + +/* Links */ +.markdown a { + color: blue; + text-decoration: underline; +} + +/* Horizontal rule */ +.markdown hr { + border: 0; + border-bottom: 1px solid #ccc; + margin: 1em 0; +} + +/* Images */ +.markdown img { + max-width: 100%; + height: auto; +} + +/* Lists */ +.markdown ul { + margin: 1em; + padding-left: 1em; + list-style-type: disc; +} + +.markdown ol { + margin: 1em; + padding-left: 1em; + list-style-type: decimal; +} + +.markdown li { + margin: 0.2em 0; +} diff --git a/www/app/transcripts/finalSummary.tsx b/www/app/transcripts/finalSummary.tsx index ddb3bee3..747a20be 100644 --- a/www/app/transcripts/finalSummary.tsx +++ b/www/app/transcripts/finalSummary.tsx @@ -1,4 +1,8 @@ import { useRef, useState } from "react"; +import React from "react"; +import ReactDom from "react-dom"; +import Markdown from "react-markdown"; +import "../styles/markdown.css"; type FinalSummaryProps = { summary: string; @@ -62,7 +66,9 @@ export default function FinalSummary(props: FinalSummaryProps) { -

{props.summary}

+

+ {props.summary} +

); } diff --git a/www/package.json b/www/package.json index aa5b9ede..407f5512 100644 --- a/www/package.json +++ b/www/package.json @@ -25,6 +25,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-dropdown": "^1.11.0", + "react-markdown": "^9.0.0", "react-qr-code": "^2.0.12", "sass": "^1.63.6", "simple-peer": "^9.11.1", diff --git a/www/yarn.lock b/www/yarn.lock index d59b44ce..5902f7a7 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -400,11 +400,25 @@ dependencies: tslib "^2.4.0" +"@types/debug@^4.0.0": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== + dependencies: + "@types/ms" "*" + "@types/estree@*", "@types/estree@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/hast@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.1.tgz#e1705ec9258ac4885659c2d50bac06b4fcd16466" + integrity sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ== + dependencies: + "@types/unist" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -424,6 +438,18 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/mdast@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.1.tgz#9c45e60a04e79f160dcefe6545d28ae536a6ed22" + integrity sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "0.7.32" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" + integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== + "@types/node@*": version "20.4.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" @@ -448,6 +474,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.0.tgz#988ae8af1e5239e89f9fbb1ade4c935f4eeedf9a" + integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -460,6 +491,11 @@ dependencies: "@types/yargs-parser" "*" +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -543,6 +579,11 @@ axios@^1.4.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -656,6 +697,11 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -741,6 +787,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + commander@8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -824,13 +875,20 @@ date-fns@^2.16.1: dependencies: "@babel/runtime" "^7.21.0" -debug@4, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -843,6 +901,18 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +devlop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -905,6 +975,11 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -1098,6 +1173,28 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hast-util-to-jsx-runtime@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz#ffd59bfcf0eb8321c6ed511bfc4b399ac3404bc2" + integrity sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" @@ -1110,6 +1207,11 @@ hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" +html-url-attributes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.0.tgz#fc4abf0c3fb437e2329c678b80abb3c62cff6f08" + integrity sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow== + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -1160,6 +1262,11 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + inquirer@8.2.5: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" @@ -1222,6 +1329,11 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-reference@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -1353,6 +1465,45 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -1368,6 +1519,200 @@ methods@^1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz#a798808d02cc74113e2c939fc95363096ade7f1d" + integrity sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -1664,6 +2009,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-information@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -1713,6 +2063,23 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-markdown@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.0.tgz#7a41bde9e1b0b1d6911f6f9f8c3cdb4a3e9f9328" + integrity sha512-v6yNf3AB8GfJ8lCpUvzxAXKxgsHpdmWPlcVRQ6Nocsezp255E/IDrF31kLQsPJeB/cKto/geUwjU36wH784FCA== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + micromark-util-sanitize-uri "^2.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + react-qr-code@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.12.tgz#98f99e9ad5ede46d73ab819e2dd9925c5f5d7a2d" @@ -1761,6 +2128,27 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -1893,6 +2281,11 @@ simple-peer@^9.11.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -1933,6 +2326,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +style-to-object@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" + integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== + dependencies: + inline-style-parser "0.1.1" + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" @@ -2065,6 +2465,16 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" @@ -2117,6 +2527,57 @@ uid@2.0.1: dependencies: "@lukeed/csprng" "^1.0.0" +unified@^11.0.0: + version "11.0.3" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.3.tgz#e141be0fe466a2d28b2160f62712bc9cbc08fdd4" + integrity sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -2135,6 +2596,23 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + watchpack@2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz"