diff --git a/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py b/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py index 43ff6907..b134199d 100644 --- a/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +++ b/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py @@ -11,8 +11,9 @@ from eval_protocol.pytest.types import RolloutProcessorConfig from openai.types.chat import ChatCompletion, ChatCompletionMessageParam from openai.types.chat.chat_completion import Choice as ChatCompletionChoice - +from pydantic_ai.models.anthropic import AnthropicModel from pydantic_ai.models.openai import OpenAIModel +from pydantic_ai.models.google import GoogleModel from pydantic import TypeAdapter from pydantic_ai.messages import ModelMessage from pydantic_ai._utils import generate_tool_call_id @@ -61,10 +62,19 @@ def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> ) kwargs = {} for k, v in config.completion_params["model"].items(): - kwargs[k] = OpenAIModel( - v["model"], - provider=v["provider"], - ) + if v["model"] and v["model"].startswith("anthropic:"): + kwargs[k] = AnthropicModel( + v["model"].removeprefix("anthropic:"), + ) + elif v["model"] and v["model"].startswith("google:"): + kwargs[k] = GoogleModel( + v["model"].removeprefix("google:"), + ) + else: + kwargs[k] = OpenAIModel( + v["model"], + provider=v["provider"], + ) agent = setup_agent(**kwargs) model = None else: diff --git a/tests/chinook/agent.py b/tests/chinook/agent.py index 0d8afc27..7a8790bc 100644 --- a/tests/chinook/agent.py +++ b/tests/chinook/agent.py @@ -12,8 +12,10 @@ def setup_agent(orchestrator_agent_model: Model): introspection_result_str = "\n".join([",".join(map(str, item)) for item in introspection_result]) SYSTEM_PROMPT = f"""You are a helpful assistant that has access to the -Chinook database. You have access to a tool to execute SQL queries. Your job -is to answer questions about the database. Here is the schema of the database: +Chinook database stored in a Postgres database. You have access to a tool to +execute SQL queries that you should use to answer questions. Your job is to +answer questions about the database. If you run into an error, you should try to +fix the query and try again. Here is the schema of the database: Schema: table_name,column_name,data_type,is_nullable @@ -26,10 +28,33 @@ def setup_agent(orchestrator_agent_model: Model): ) @agent.tool(retries=5) - def execute_sql(ctx: RunContext, query: str) -> tuple[any, ...]: + def execute_sql(ctx: RunContext, query: str) -> dict: try: cursor.execute(query) - return cursor.fetchall() + # Get column headers from cursor description + columns = [desc[0] for desc in cursor.description] if cursor.description else [] + # Get data rows + rows = cursor.fetchall() + + if not columns or not rows: + return "No results found." + + # Create markdown table + table_lines = [] + + # Header row + table_lines.append("| " + " | ".join(columns) + " |") + + # Separator row + table_lines.append("| " + " | ".join(["---"] * len(columns)) + " |") + + # Data rows + for row in rows: + # Convert all values to strings and escape pipes + formatted_row = [str(cell).replace("|", "\\|") if cell is not None else "" for cell in row] + table_lines.append("| " + " | ".join(formatted_row) + " |") + + return "\n".join(table_lines) except Exception as e: connection.rollback() raise ModelRetry("Please try again with a different query. Here is the error: " + str(e)) diff --git a/tests/chinook/dataset.py b/tests/chinook/dataset.py new file mode 100644 index 00000000..a042add9 --- /dev/null +++ b/tests/chinook/dataset.py @@ -0,0 +1,50 @@ +from typing import List +import os +import glob + +from eval_protocol.models import EvaluationRow, Message + + +def collect_dataset() -> List[EvaluationRow]: + """ + Iterate through the dataset folder and create EvaluationRow objects. + + For each folder named "task_", reads "task.txt" and "ground_truth.md" + and creates an EvaluationRow where: + - messages contains a user message with the task content + - ground_truth contains the contents of ground_truth.md + """ + dataset_rows = [] + dataset_path = os.path.join(os.path.dirname(__file__), "dataset") + + # Find all task folders (task_) + task_folders = glob.glob(os.path.join(dataset_path, "task_*")) + + for task_folder in sorted(task_folders): + task_name = os.path.basename(task_folder) + + # Read task.txt + task_file = os.path.join(task_folder, "task.txt") + if not os.path.exists(task_file): + raise FileNotFoundError(f"Task file not found: {task_file}") + + with open(task_file, "r", encoding="utf-8") as f: + task_content = f.read().strip() + + # Read ground_truth.md + ground_truth_file = os.path.join(task_folder, "ground_truth.md") + if not os.path.exists(ground_truth_file): + raise FileNotFoundError(f"Ground truth file not found: {ground_truth_file}") + + with open(ground_truth_file, "r", encoding="utf-8") as f: + ground_truth_content = f.read().strip() + + # Create user message with the task + user_message = Message(role="user", content=task_content) + + # Create EvaluationRow + evaluation_row = EvaluationRow(messages=[user_message], ground_truth=ground_truth_content) + + dataset_rows.append(evaluation_row) + + return dataset_rows diff --git a/tests/chinook/dataset/task_1/ground_truth.md b/tests/chinook/dataset/task_1/ground_truth.md new file mode 100644 index 00000000..588d4fb4 --- /dev/null +++ b/tests/chinook/dataset/task_1/ground_truth.md @@ -0,0 +1,7 @@ +| customer_name | favorite_genre | total_invoices | total_spent | spending_rank | +| ------------------ | -------------- | -------------- | ----------- | ------------- | +| Helena Holý | Rock | 7 | 49.62 | 1 | +| Richard Cunningham | Rock | 7 | 47.62 | 2 | +| Luis Rojas | Rock | 7 | 46.62 | 3 | +| Ladislav Kovács | Rock | 7 | 45.62 | 4 | +| Hugh O'Reilly | Rock | 7 | 45.62 | 4 | diff --git a/tests/chinook/dataset/task_1/task.txt b/tests/chinook/dataset/task_1/task.txt new file mode 100644 index 00000000..b92b6b3b --- /dev/null +++ b/tests/chinook/dataset/task_1/task.txt @@ -0,0 +1 @@ +Find the top 5 customers by total spending, including their favorite genre. Show customer name, favorite genre, total invoices, total spent, and spending rank. diff --git a/tests/chinook/dataset/task_2/ground_truth.md b/tests/chinook/dataset/task_2/ground_truth.md new file mode 100644 index 00000000..3b340de1 --- /dev/null +++ b/tests/chinook/dataset/task_2/ground_truth.md @@ -0,0 +1,10 @@ +| name | level | hierarchy_path | +| ---------------- | ----- | -------------------------------------------------- | +| Andrew Adams | 0 | Andrew Adams | +| Michael Mitchell | 1 | Andrew Adams -> Michael Mitchell | +| Laura Callahan | 2 | Andrew Adams -> Michael Mitchell -> Laura Callahan | +| Robert King | 2 | Andrew Adams -> Michael Mitchell -> Robert King | +| Nancy Edwards | 1 | Andrew Adams -> Nancy Edwards | +| Jane Peacock | 2 | Andrew Adams -> Nancy Edwards -> Jane Peacock | +| Margaret Park | 2 | Andrew Adams -> Nancy Edwards -> Margaret Park | +| Steve Johnson | 2 | Andrew Adams -> Nancy Edwards -> Steve Johnson | diff --git a/tests/chinook/dataset/task_2/task.txt b/tests/chinook/dataset/task_2/task.txt new file mode 100644 index 00000000..9dba4d50 --- /dev/null +++ b/tests/chinook/dataset/task_2/task.txt @@ -0,0 +1 @@ +Find all employees and their reporting hierarchy levels using a recursive CTE. Show employee name, level, and the complete hierarchy path from top to bottom. diff --git a/tests/chinook/dataset/task_3/ground_truth.md b/tests/chinook/dataset/task_3/ground_truth.md new file mode 100644 index 00000000..c3d460dc --- /dev/null +++ b/tests/chinook/dataset/task_3/ground_truth.md @@ -0,0 +1,3 @@ +| artist_name | genre_count | longest_track_name_length | total_tracks | most_popular_track | +| ------------- | ----------- | ------------------------- | ------------ | ------------------ | +| Lenny Kravitz | 3 | 32 | 57 | Mr. Cab Driver | diff --git a/tests/chinook/dataset/task_3/task.txt b/tests/chinook/dataset/task_3/task.txt new file mode 100644 index 00000000..7a222aa8 --- /dev/null +++ b/tests/chinook/dataset/task_3/task.txt @@ -0,0 +1 @@ +Find artists who have albums in multiple genres and their most popular track. Include genre count, longest track name, and total tracks. Only include artists who have at least one album with 'Greatest' in the title. diff --git a/tests/chinook/dataset/task_4/ground_truth.md b/tests/chinook/dataset/task_4/ground_truth.md new file mode 100644 index 00000000..09db62aa --- /dev/null +++ b/tests/chinook/dataset/task_4/ground_truth.md @@ -0,0 +1,86 @@ +| month | day_of_week | unique_customers | total_invoices | average_order_value | total_revenue | day_over_day_growth_percentage | +| ----- | ----------- | ---------------- | -------------- | ------------------- | ------------- | ------------------------------ | +| 1 | Friday | 2 | 2 | 5.45 | 10.89 | null | +| 1 | Monday | 7 | 7 | 6.22 | 43.57 | 300.09 | +| 1 | Saturday | 4 | 4 | 4.21 | 16.83 | -61.37 | +| 1 | Sunday | 4 | 4 | 3.47 | 13.86 | -17.65 | +| 1 | Thursday | 3 | 3 | 10.92 | 32.76 | 136.36 | +| 1 | Tuesday | 8 | 8 | 6.07 | 48.56 | 48.23 | +| 1 | Wednesday | 6 | 6 | 5.78 | 34.65 | -28.64 | +| 2 | Friday | 8 | 8 | 6.45 | 51.56 | null | +| 2 | Monday | 3 | 3 | 4.29 | 12.87 | -75.04 | +| 2 | Saturday | 5 | 5 | 6.34 | 31.69 | 146.23 | +| 2 | Sunday | 2 | 2 | 8.91 | 17.82 | -43.77 | +| 2 | Thursday | 7 | 7 | 6.08 | 42.57 | 138.89 | +| 2 | Tuesday | 4 | 4 | 4.21 | 16.83 | -60.47 | +| 2 | Wednesday | 4 | 4 | 3.47 | 13.86 | -17.65 | +| 3 | Friday | 4 | 4 | 5.21 | 20.83 | null | +| 3 | Monday | 8 | 8 | 5.70 | 45.56 | 118.72 | +| 3 | Saturday | 5 | 5 | 3.56 | 17.82 | -60.89 | +| 3 | Sunday | 8 | 8 | 6.06 | 48.51 | 172.22 | +| 3 | Thursday | 3 | 3 | 4.29 | 12.87 | -73.47 | +| 3 | Tuesday | 5 | 5 | 6.14 | 30.69 | 138.46 | +| 3 | Wednesday | 2 | 2 | 9.41 | 18.82 | -38.68 | +| 4 | Friday | 5 | 5 | 7.74 | 38.69 | null | +| 4 | Monday | 4 | 4 | 4.21 | 16.83 | -56.50 | +| 4 | Saturday | 2 | 2 | 8.91 | 17.82 | 5.88 | +| 4 | Sunday | 3 | 3 | 6.29 | 18.87 | 5.89 | +| 4 | Thursday | 6 | 6 | 6.60 | 39.60 | 109.86 | +| 4 | Tuesday | 5 | 5 | 3.56 | 17.82 | -55.00 | +| 4 | Wednesday | 8 | 8 | 6.06 | 48.51 | 172.22 | +| 5 | Friday | 5 | 5 | 3.56 | 17.82 | null | +| 5 | Monday | 5 | 5 | 7.14 | 35.69 | 100.28 | +| 5 | Saturday | 8 | 8 | 6.06 | 48.51 | 35.92 | +| 5 | Sunday | 6 | 6 | 6.60 | 39.60 | -18.37 | +| 5 | Thursday | 6 | 6 | 3.47 | 20.79 | -47.50 | +| 5 | Tuesday | 2 | 2 | 8.91 | 17.82 | -14.29 | +| 5 | Wednesday | 3 | 3 | 4.29 | 12.87 | -27.78 | +| 6 | Friday | 2 | 2 | 8.91 | 17.82 | null | +| 6 | Monday | 5 | 5 | 4.16 | 20.82 | 16.84 | +| 6 | Saturday | 3 | 3 | 4.29 | 12.87 | -38.18 | +| 6 | Sunday | 6 | 6 | 3.47 | 20.79 | 61.54 | +| 6 | Thursday | 5 | 5 | 6.54 | 32.69 | 57.24 | +| 6 | Tuesday | 8 | 8 | 6.69 | 53.51 | 63.69 | +| 6 | Wednesday | 6 | 6 | 7.10 | 42.60 | -20.39 | +| 7 | Friday | 8 | 8 | 6.06 | 48.51 | null | +| 7 | Monday | 2 | 2 | 8.91 | 17.82 | -63.27 | +| 7 | Saturday | 6 | 6 | 6.60 | 39.60 | 122.22 | +| 7 | Sunday | 5 | 5 | 6.14 | 30.69 | -22.50 | +| 7 | Thursday | 5 | 5 | 3.56 | 17.82 | -41.94 | +| 7 | Tuesday | 3 | 3 | 4.29 | 12.87 | -27.78 | +| 7 | Wednesday | 6 | 6 | 3.80 | 22.79 | 77.08 | +| 8 | Friday | 3 | 3 | 4.29 | 12.87 | null | +| 8 | Monday | 8 | 8 | 7.31 | 58.51 | 354.62 | +| 8 | Saturday | 6 | 6 | 3.47 | 20.79 | -64.47 | +| 8 | Sunday | 5 | 5 | 3.56 | 17.82 | -14.29 | +| 8 | Thursday | 2 | 2 | 8.91 | 17.82 | 0.00 | +| 8 | Tuesday | 6 | 6 | 6.60 | 39.60 | 122.22 | +| 8 | Wednesday | 5 | 5 | 6.14 | 30.69 | -22.50 | +| 9 | Friday | 6 | 6 | 7.43 | 44.60 | null | +| 9 | Monday | 3 | 3 | 4.29 | 12.87 | -71.14 | +| 9 | Saturday | 4 | 4 | 8.93 | 35.70 | 177.39 | +| 9 | Sunday | 2 | 2 | 8.91 | 17.82 | -50.08 | +| 9 | Thursday | 8 | 8 | 6.94 | 55.51 | 211.50 | +| 9 | Tuesday | 5 | 5 | 2.38 | 11.88 | -78.60 | +| 9 | Wednesday | 5 | 5 | 3.56 | 17.82 | 50.00 | +| 10 | Friday | 5 | 5 | 2.38 | 11.88 | null | +| 10 | Monday | 6 | 6 | 6.60 | 39.60 | 233.33 | +| 10 | Saturday | 6 | 6 | 3.14 | 18.81 | -52.50 | +| 10 | Sunday | 8 | 8 | 6.44 | 51.51 | 173.84 | +| 10 | Thursday | 3 | 3 | 4.29 | 12.87 | -75.01 | +| 10 | Tuesday | 5 | 5 | 8.12 | 40.61 | 215.54 | +| 10 | Wednesday | 2 | 2 | 8.91 | 17.82 | -56.12 | +| 11 | Friday | 4 | 4 | 6.19 | 24.75 | null | +| 11 | Monday | 5 | 5 | 2.38 | 11.88 | -52.00 | +| 11 | Saturday | 2 | 2 | 8.91 | 17.82 | 50.00 | +| 11 | Sunday | 3 | 3 | 4.29 | 12.87 | -27.78 | +| 11 | Thursday | 6 | 6 | 8.60 | 51.60 | 300.93 | +| 11 | Tuesday | 6 | 6 | 3.14 | 18.81 | -63.55 | +| 11 | Wednesday | 8 | 8 | 6.06 | 48.51 | 157.89 | +| 12 | Friday | 7 | 7 | 4.67 | 32.67 | null | +| 12 | Monday | 4 | 4 | 6.44 | 25.75 | -21.18 | +| 12 | Saturday | 8 | 8 | 6.06 | 48.51 | 88.39 | +| 12 | Sunday | 6 | 6 | 6.60 | 39.60 | -18.37 | +| 12 | Thursday | 5 | 5 | 2.38 | 11.88 | -70.00 | +| 12 | Tuesday | 2 | 2 | 8.91 | 17.82 | 50.00 | +| 12 | Wednesday | 3 | 3 | 4.29 | 12.87 | -27.78 | diff --git a/tests/chinook/dataset/task_4/task.txt b/tests/chinook/dataset/task_4/task.txt new file mode 100644 index 00000000..e5bb282d --- /dev/null +++ b/tests/chinook/dataset/task_4/task.txt @@ -0,0 +1 @@ +Analyze customer purchasing patterns by month and day of week. Show month, day of week, unique customers, total invoices, average order value, total revenue, and day-over-day growth percentage for invoices from 2010 onwards. diff --git a/tests/chinook/dataset/task_5/ground_truth.md b/tests/chinook/dataset/task_5/ground_truth.md new file mode 100644 index 00000000..d7611038 --- /dev/null +++ b/tests/chinook/dataset/task_5/ground_truth.md @@ -0,0 +1,26 @@ +| genre_name | usa_revenue | canada_revenue | germany_revenue | france_revenue | brazil_revenue | total_revenue | total_unique_customers | percentage_of_total | +| ------------------ | ----------- | -------------- | --------------- | -------------- | -------------- | ------------- | ---------------------- | ------------------- | +| Rock | 1526.14 | 989.03 | 577.17 | 525.73 | 691.02 | 4309.09 | 35 | 35.47 | +| Latin | 754.67 | 510.84 | 163.35 | 265.32 | 501.93 | 2196.11 | 33 | 18.08 | +| Metal | 554.45 | 335.61 | 189.09 | 192.06 | 74.25 | 1345.46 | 34 | 11.07 | +| Alternative & Punk | 415.92 | 300.96 | 105.12 | 207.90 | 71.28 | 1101.18 | 29 | 9.06 | +| Jazz | 202.95 | 126.72 | 27.72 | 139.59 | 0 | 496.98 | 19 | 4.09 | +| Blues | 126.72 | 15.84 | 97.02 | 11.88 | 30.69 | 282.15 | 13 | 2.32 | +| TV Shows | 191.70 | 3.98 | 44.73 | 16.86 | 0 | 257.27 | 10 | 2.12 | +| Reggae | 73.26 | 58.41 | 0 | 13.86 | 83.16 | 228.69 | 8 | 1.88 | +| Soundtrack | 45.54 | 0 | 59.40 | 54.45 | 55.44 | 214.83 | 7 | 1.77 | +| Drama | 143.16 | 13.89 | 14.91 | 38.69 | 0 | 210.65 | 7 | 1.73 | +| Classical | 87.20 | 24.75 | 0 | 57.48 | 39.60 | 209.03 | 9 | 1.72 | +| R&B/Soul | 75.28 | 69.30 | 0 | 0 | 29.70 | 174.28 | 10 | 1.43 | +| Alternative | 79.30 | 0 | 0.99 | 67.44 | 0 | 147.73 | 3 | 1.22 | +| Hip Hop/Rap | 6.93 | 57.45 | 0 | 33.72 | 27.72 | 125.82 | 7 | 1.04 | +| Pop | 33.66 | 0 | 13.86 | 27.72 | 36.63 | 111.87 | 7 | 0.92 | +| World | 0 | 83.16 | 0 | 0 | 27.72 | 110.88 | 5 | 0.91 | +| Heavy Metal | 50.49 | 0 | 41.58 | 0 | 0 | 92.07 | 3 | 0.76 | +| Comedy | 90.44 | 0 | 0 | 0 | 0 | 90.44 | 3 | 0.74 | +| Sci Fi & Fantasy | 71.62 | 0 | 0 | 7.96 | 7.96 | 87.54 | 4 | 0.72 | +| Bossa Nova | 43.56 | 28.71 | 0 | 13.86 | 0 | 86.13 | 7 | 0.71 | +| Rock And Roll | 41.58 | 27.72 | 0 | 13.86 | 0 | 83.16 | 4 | 0.68 | +| Electronica/Dance | 0 | 43.59 | 0 | 33.72 | 0 | 77.31 | 3 | 0.64 | +| Easy Listening | 41.58 | 0 | 27.72 | 0 | 0 | 69.30 | 2 | 0.57 | +| Science Fiction | 10.91 | 0 | 29.82 | 0 | 0 | 40.73 | 2 | 0.34 | diff --git a/tests/chinook/dataset/task_5/task.txt b/tests/chinook/dataset/task_5/task.txt new file mode 100644 index 00000000..d9f07e81 --- /dev/null +++ b/tests/chinook/dataset/task_5/task.txt @@ -0,0 +1 @@ +Create a genre popularity matrix by country. Show genre name, revenue by country (USA, Canada, Germany, France, Brazil), total revenue, unique customers, and revenue percentage of total sales. diff --git a/tests/chinook/dataset/task_6/ground_truth.md b/tests/chinook/dataset/task_6/ground_truth.md new file mode 100644 index 00000000..9e97e4e2 --- /dev/null +++ b/tests/chinook/dataset/task_6/ground_truth.md @@ -0,0 +1,12 @@ +| track_name | artist_name | album_name | duration | pattern_type | +| ---------------------------------------------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------- | -------- | ---------------- | +| .07% | Heroes | Heroes, Season 1 | 43:05 | Contains numbers | +| "40" | U2 | War | 02:37 | Contains numbers | +| "Eine Kleine Nachtmusik" Serenade In G, K. 525: I. Allegro | Academy of St. Martin in the Fields Chamber Ensemble & Sir Neville Marriner | Sir Neville Marriner: A Celebration | 05:48 | Contains numbers | +| #1 Zero | Audioslave | Out Of Exile | 04:59 | Contains numbers | +| #9 Dream | U2 | Instant Karma: The Amnesty International Campaign to Save Darfur | 04:38 | Contains numbers | +| 01 - Prowler | Iron Maiden | Iron Maiden | 03:56 | Contains numbers | +| 02 - Sanctuary | Iron Maiden | Iron Maiden | 03:16 | Contains numbers | +| 03 - Remember Tomorrow | Iron Maiden | Iron Maiden | 05:28 | Contains numbers | +| 04 - Running Free | Iron Maiden | Iron Maiden | 03:17 | Contains numbers | +| 05 - Phantom of the Opera | Iron Maiden | Iron Maiden | 07:08 | Contains numbers | diff --git a/tests/chinook/dataset/task_6/task.txt b/tests/chinook/dataset/task_6/task.txt new file mode 100644 index 00000000..418da1fa --- /dev/null +++ b/tests/chinook/dataset/task_6/task.txt @@ -0,0 +1 @@ +Find tracks with complex text patterns in titles. Look for tracks that are either two-word titles starting with capital letters, contain numbers, contain special characters, or are in title case. Show track name, artist, album, duration, and identified pattern type. diff --git a/tests/chinook/tasks.jsonl b/tests/chinook/tasks.jsonl new file mode 100644 index 00000000..4d48ee14 --- /dev/null +++ b/tests/chinook/tasks.jsonl @@ -0,0 +1,16 @@ +{"task": "Find the top 5 customers by total spending, including their favorite genre. Show customer name, favorite genre, total invoices, total spent, and spending rank."} +{"task": "Find all employees and their reporting hierarchy levels using a recursive CTE. Show employee name, level, and the complete hierarchy path from top to bottom."} +{"task": "Find artists who have albums in multiple genres and their most popular track. Include genre count, longest track name, and total tracks. Only include artists who have at least one album with 'Greatest' in the title.", "expected_answer": {"sample_results": [{"ArtistName": "Queen", "GenreCount": 3, "LongestTrack": "Bohemian Rhapsody", "TotalTracks": 15}, {"ArtistName": "The Beatles", "GenreCount": 4, "LongestTrack": "Hey Jude", "TotalTracks": 27}, {"ArtistName": "Led Zeppelin", "GenreCount": 2, "LongestTrack": "Stairway to Heaven", "TotalTracks": 8}], "expected_columns": ["ArtistName", "GenreCount", "LongestTrack", "TotalTracks"], "expected_result_type": "table of multi-genre artists with 'Greatest' albums", "difficulty": "very_high", "sql_concepts": ["correlated subqueries", "EXISTS clause", "LIKE operator", "HAVING with multiple conditions", "aggregations"]}} +{"task": "Analyze customer purchasing patterns by month and day of week. Show month, day of week, unique customers, total invoices, average order value, total revenue, and day-over-day growth percentage for invoices from 2010 onwards.", "expected_answer": {"sample_results": [{"Month": "2010-01", "DayOfWeek": "Monday", "UniqueCustomers": 12, "TotalInvoices": 15, "AvgOrderValue": 8.99, "TotalRevenue": 134.85, "DayOverDayGrowth": null}, {"Month": "2010-01", "DayOfWeek": "Tuesday", "UniqueCustomers": 8, "TotalInvoices": 10, "AvgOrderValue": 7.99, "TotalRevenue": 79.90, "DayOverDayGrowth": -40.8}], "expected_columns": ["Month", "DayOfWeek", "UniqueCustomers", "TotalInvoices", "AvgOrderValue", "TotalRevenue", "DayOverDayGrowth"], "expected_result_type": "time-series analysis table", "difficulty": "very_high", "sql_concepts": ["date functions", "CASE statements", "window functions", "LAG", "PARTITION BY", "strftime", "HAVING"]}} +{"task": "Create a genre popularity matrix by country. Show genre name, revenue by country (USA, Canada, Germany, France, Brazil), total revenue, unique customers, and revenue percentage of total sales.", "expected_answer": {"sample_results": [{"Genre": "Rock", "USA_Revenue": 847.80, "Canada_Revenue": 140.67, "Germany_Revenue": 156.48, "France_Revenue": 195.56, "Brazil_Revenue": 127.91, "TotalRevenue": 1468.42, "UniqueCustomers": 28, "RevenuePercentage": 34.2}, {"Genre": "Latin", "USA_Revenue": 97.16, "Canada_Revenue": 31.32, "Germany_Revenue": 0.00, "France_Revenue": 0.00, "Brazil_Revenue": 35.91, "TotalRevenue": 164.39, "UniqueCustomers": 8, "RevenuePercentage": 3.8}], "expected_columns": ["Genre", "USA_Revenue", "Canada_Revenue", "Germany_Revenue", "France_Revenue", "Brazil_Revenue", "TotalRevenue", "UniqueCustomers", "RevenuePercentage"], "expected_result_type": "pivot-like matrix table", "difficulty": "high", "sql_concepts": ["CASE statements", "conditional aggregations", "subqueries in SELECT", "ROUND function", "pivot-like analysis"]}} +{"task": "Find tracks with complex text patterns in titles. Look for tracks that are either two-word titles starting with capital letters, contain numbers, contain special characters, or are in title case. Show track name, artist, album, duration, and identified pattern type.", "expected_answer": {"sample_results": [{"TrackName": "For Those About To Rock (We Salute You)", "ArtistName": "AC/DC", "AlbumTitle": "For Those About To Rock We Salute You", "Milliseconds": 343719, "TitlePattern": "Contains Special Characters"}, {"TrackName": "Fast As a Shark", "ArtistName": "Accept", "AlbumTitle": "Restless and Wild", "Milliseconds": 230619, "TitlePattern": "Two Word Title"}, {"TrackName": "2 Minutes To Midnight", "ArtistName": "Iron Maiden", "AlbumTitle": "Powerslave", "Milliseconds": 337423, "TitlePattern": "Contains Numbers"}], "expected_columns": ["TrackName", "ArtistName", "AlbumTitle", "Milliseconds", "TitlePattern"], "expected_result_type": "pattern analysis table", "difficulty": "high", "sql_concepts": ["REGEXP", "CASE statements", "regular expressions", "pattern matching", "OR conditions"]}} +{"task": "Find high-value customers who haven't purchased recently and their potential re-engagement opportunities. Identify customers who haven't purchased in 3+ months, have lifetime value >$25, and have >10 related tracks available. Include customer status (At Risk/Needs Attention/Active) and segment (High Value Diverse/Medium Value/Low Value).", "expected_answer": {"sample_results": [{"CustomerId": 15, "CustomerName": "Jennifer Peterson", "Country": "Canada", "LastPurchaseDate": "2010-02-22", "TotalPurchases": 3, "LifetimeValue": 128.70, "AvgOrderValue": 42.90, "GenresExplored": 4, "RelatedTracksAvailable": 15, "CustomerStatus": "Needs Attention", "CustomerSegment": "High Value, Diverse Taste"}, {"CustomerId": 23, "CustomerName": "John Gordon", "Country": "USA", "LastPurchaseDate": "2010-01-03", "TotalPurchases": 2, "LifetimeValue": 43.65, "AvgOrderValue": 21.83, "GenresExplored": 2, "RelatedTracksAvailable": 12, "CustomerStatus": "Needs Attention", "CustomerSegment": "Medium Value"}], "expected_columns": ["CustomerId", "CustomerName", "Country", "LastPurchaseDate", "TotalPurchases", "LifetimeValue", "AvgOrderValue", "GenresExplored", "RelatedTracksAvailable", "CustomerStatus", "CustomerSegment"], "expected_result_type": "customer re-engagement analysis table", "difficulty": "very_high", "sql_concepts": ["CTEs", "correlated subqueries", "IN operator", "date functions", "CASE statements", "business logic", "complex filtering"]}} +{"task": "Find the most expensive tracks by genre and their popularity metrics. Show genre, track name, artist, unit price, total quantity sold, total revenue, and popularity rank within each genre.", "expected_answer": {"sample_results": [{"Genre": "Rock", "TrackName": "Stairway to Heaven", "ArtistName": "Led Zeppelin", "UnitPrice": 0.99, "TotalQuantity": 45, "TotalRevenue": 44.55, "PopularityRank": 1}, {"Genre": "Jazz", "TrackName": "Take Five", "ArtistName": "Dave Brubeck", "UnitPrice": 0.99, "TotalQuantity": 38, "TotalRevenue": 37.62, "PopularityRank": 1}, {"Genre": "Classical", "TrackName": "Symphony No. 9", "ArtistName": "Beethoven", "UnitPrice": 0.99, "TotalQuantity": 22, "TotalRevenue": 21.78, "PopularityRank": 1}], "expected_columns": ["Genre", "TrackName", "ArtistName", "UnitPrice", "TotalQuantity", "TotalRevenue", "PopularityRank"], "expected_result_type": "genre-based ranking table", "difficulty": "high", "sql_concepts": ["window functions", "PARTITION BY", "RANK", "aggregations", "multi-table JOINs"]}} +{"task": "Calculate customer lifetime value segments and predict churn risk. Group customers into segments based on spending patterns and calculate days since last purchase to identify churn risk.", "expected_answer": {"sample_results": [{"CustomerId": 6, "CustomerName": "Helena Holý", "LifetimeValue": 49.62, "Segment": "High Value", "DaysSinceLastPurchase": 45, "ChurnRisk": "Low", "PurchaseFrequency": 7.5}, {"CustomerId": 26, "CustomerName": "Richard Cunningham", "LifetimeValue": 47.62, "Segment": "High Value", "DaysSinceLastPurchase": 120, "ChurnRisk": "Medium", "PurchaseFrequency": 6.0}, {"CustomerId": 57, "CustomerName": "Luis Rojas", "LifetimeValue": 46.62, "Segment": "High Value", "DaysSinceLastPurchase": 90, "ChurnRisk": "Medium", "PurchaseFrequency": 5.5}], "expected_columns": ["CustomerId", "CustomerName", "LifetimeValue", "Segment", "DaysSinceLastPurchase", "ChurnRisk", "PurchaseFrequency"], "expected_result_type": "customer segmentation and churn analysis", "difficulty": "high", "sql_concepts": ["CASE statements", "date calculations", "business logic", "segmentation", "risk assessment"]}} +{"task": "Find albums with the highest track count variance and their genre distribution. Show album title, artist, total tracks, track count variance, genre count, and most common genre.", "expected_answer": {"sample_results": [{"AlbumTitle": "Greatest Hits", "ArtistName": "Queen", "TotalTracks": 15, "TrackCountVariance": 2.8, "GenreCount": 3, "MostCommonGenre": "Rock", "GenrePercentage": 60.0}, {"AlbumTitle": "The Wall", "ArtistName": "Pink Floyd", "TotalTracks": 26, "TrackCountVariance": 3.2, "GenreCount": 2, "MostCommonGenre": "Rock", "GenrePercentage": 85.0}, {"AlbumTitle": "Abbey Road", "ArtistName": "The Beatles", "TotalTracks": 17, "TrackCountVariance": 1.9, "GenreCount": 4, "MostCommonGenre": "Rock", "GenrePercentage": 70.0}], "expected_columns": ["AlbumTitle", "ArtistName", "TotalTracks", "TrackCountVariance", "GenreCount", "MostCommonGenre", "GenrePercentage"], "expected_result_type": "album complexity analysis table", "difficulty": "very_high", "sql_concepts": ["variance calculations", "mode functions", "complex aggregations", "subqueries", "percentage calculations"]}} +{"task": "Analyze seasonal purchasing trends by customer country and genre preference. Show country, genre, month, average purchase value, customer count, and seasonal trend indicator.", "expected_answer": {"sample_results": [{"Country": "USA", "Genre": "Rock", "Month": "January", "AvgPurchaseValue": 8.99, "CustomerCount": 12, "SeasonalTrend": "Peak"}, {"Country": "Canada", "Genre": "Rock", "Month": "January", "AvgPurchaseValue": 7.99, "CustomerCount": 8, "SeasonalTrend": "Peak"}, {"Country": "Germany", "Genre": "Classical", "Month": "March", "AvgPurchaseValue": 9.99, "CustomerCount": 5, "SeasonalTrend": "Rising"}, {"Country": "France", "Genre": "Jazz", "Month": "February", "AvgPurchaseValue": 6.99, "CustomerCount": 6, "SeasonalTrend": "Stable"}], "expected_columns": ["Country", "Genre", "Month", "AvgPurchaseValue", "CustomerCount", "SeasonalTrend"], "expected_result_type": "seasonal analysis by geography and genre", "difficulty": "high", "sql_concepts": ["seasonal analysis", "geographic grouping", "trend indicators", "multi-dimensional aggregations"]}} +{"task": "Find customers with the most diverse music taste and their spending correlation. Calculate genre diversity score, average track price, total spending, and diversity-to-spending ratio.", "expected_answer": {"sample_results": [{"CustomerId": 15, "CustomerName": "Jennifer Peterson", "GenreDiversityScore": 0.85, "AvgTrackPrice": 0.99, "TotalSpending": 128.70, "DiversityToSpendingRatio": 0.0066}, {"CustomerId": 23, "CustomerName": "John Gordon", "GenreDiversityScore": 0.72, "AvgTrackPrice": 0.99, "TotalSpending": 43.65, "DiversityToSpendingRatio": 0.0165}, {"CustomerId": 6, "CustomerName": "Helena Holý", "GenreDiversityScore": 0.68, "AvgTrackPrice": 0.99, "TotalSpending": 49.62, "DiversityToSpendingRatio": 0.0137}], "expected_columns": ["CustomerId", "CustomerName", "GenreDiversityScore", "AvgTrackPrice", "TotalSpending", "DiversityToSpendingRatio"], "expected_result_type": "customer diversity analysis table", "difficulty": "very_high", "sql_concepts": ["diversity calculations", "correlation analysis", "ratio calculations", "complex aggregations", "business metrics"]}} +{"task": "Calculate employee performance metrics based on customer satisfaction and sales volume. Show employee name, total customers served, average customer spending, customer retention rate, and performance score.", "expected_answer": {"sample_results": [{"EmployeeId": 3, "EmployeeName": "Jane Peacock", "TotalCustomersServed": 45, "AvgCustomerSpending": 42.15, "CustomerRetentionRate": 0.78, "PerformanceScore": 8.7}, {"EmployeeId": 4, "EmployeeName": "Margaret Park", "TotalCustomersServed": 38, "AvgCustomerSpending": 38.92, "CustomerRetentionRate": 0.72, "PerformanceScore": 7.9}, {"EmployeeId": 5, "EmployeeName": "Steve Johnson", "TotalCustomersServed": 32, "AvgCustomerSpending": 35.67, "CustomerRetentionRate": 0.68, "PerformanceScore": 7.2}], "expected_columns": ["EmployeeId", "EmployeeName", "TotalCustomersServed", "AvgCustomerSpending", "CustomerRetentionRate", "PerformanceScore"], "expected_result_type": "employee performance evaluation table", "difficulty": "high", "sql_concepts": ["employee metrics", "customer retention", "performance scoring", "complex aggregations", "business intelligence"]}} +{"task": "Find the most profitable music combinations (artist-album-genre) and their market performance. Calculate profit margin, total sales, customer acquisition cost, and return on investment by combination.", "expected_answer": {"sample_results": [{"ArtistName": "Queen", "AlbumTitle": "Greatest Hits", "Genre": "Rock", "ProfitMargin": 0.75, "TotalSales": 847.80, "CustomerAcquisitionCost": 2.50, "ROI": 3.2}, {"ArtistName": "The Beatles", "AlbumTitle": "Abbey Road", "Genre": "Rock", "ProfitMargin": 0.72, "TotalSales": 756.45, "CustomerAcquisitionCost": 2.75, "ROI": 2.9}, {"ArtistName": "Led Zeppelin", "AlbumTitle": "Led Zeppelin IV", "Genre": "Rock", "ProfitMargin": 0.78, "TotalSales": 689.32, "CustomerAcquisitionCost": 2.25, "ROI": 3.5}], "expected_columns": ["ArtistName", "AlbumTitle", "Genre", "ProfitMargin", "TotalSales", "CustomerAcquisitionCost", "ROI"], "expected_result_type": "profitability analysis table", "difficulty": "very_high", "sql_concepts": ["profit calculations", "ROI analysis", "cost analysis", "business metrics", "complex aggregations"]}} +{"task": "Analyze customer migration patterns between genres over time. Show customer ID, original genre preference, current genre preference, migration date, and genre evolution score.", "expected_answer": {"sample_results": [{"CustomerId": 15, "OriginalGenre": "Rock", "CurrentGenre": "Jazz", "MigrationDate": "2010-03-15", "GenreEvolutionScore": 0.65}, {"CustomerId": 23, "OriginalGenre": "Pop", "CurrentGenre": "Classical", "MigrationDate": "2010-02-28", "GenreEvolutionScore": 0.72}, {"CustomerId": 6, "OriginalGenre": "Rock", "CurrentGenre": "Latin", "MigrationDate": "2010-01-20", "GenreEvolutionScore": 0.58}], "expected_columns": ["CustomerId", "OriginalGenre", "CurrentGenre", "MigrationDate", "GenreEvolutionScore"], "expected_result_type": "customer genre migration analysis", "difficulty": "very_high", "sql_concepts": ["temporal analysis", "migration tracking", "evolution scoring", "time-based comparisons", "customer behavior analysis"]}} +{"task": "Calculate the network effect of music recommendations based on customer similarity. Find customer clusters with similar music taste and calculate recommendation strength scores.", "expected_answer": {"sample_results": [{"ClusterId": 1, "ClusterSize": 8, "AvgGenreOverlap": 0.75, "RecommendationStrength": 0.82, "MostCommonGenre": "Rock", "ClusterCohesion": 0.68}, {"ClusterId": 2, "ClusterSize": 6, "AvgGenreOverlap": 0.68, "RecommendationStrength": 0.74, "MostCommonGenre": "Jazz", "ClusterCohesion": 0.72}, {"ClusterId": 3, "ClusterSize": 5, "AvgGenreOverlap": 0.62, "RecommendationStrength": 0.69, "MostCommonGenre": "Classical", "ClusterCohesion": 0.65}], "expected_columns": ["ClusterId", "ClusterSize", "AvgGenreOverlap", "RecommendationStrength", "MostCommonGenre", "ClusterCohesion"], "expected_result_type": "customer clustering and recommendation analysis", "difficulty": "very_high", "sql_concepts": ["clustering algorithms", "similarity calculations", "network analysis", "recommendation systems", "complex data mining"]} diff --git a/tests/chinook/test_pydantic_chinook.py b/tests/chinook/test_pydantic_chinook.py index 2bd82549..9d4c128c 100644 --- a/tests/chinook/test_pydantic_chinook.py +++ b/tests/chinook/test_pydantic_chinook.py @@ -9,6 +9,15 @@ from agent import setup_agent from pydantic_ai.models.openai import OpenAIModel +from tests.chinook.dataset import collect_dataset + +LLM_JUDGE_PROMPT = ( + "Your job is to compare the response to the expected answer.\n" + "The response will be a narrative report of the query results.\n" + "If the response contains the same or well summarized information as the expected answer, return 1.0.\n" + "If the response does not contain the same information or is missing information, return 0.0." +) + @pytest.mark.asyncio @evaluation_test( @@ -25,7 +34,6 @@ ], rollout_processor=PydanticAgentRolloutProcessor(), rollout_processor_kwargs={"agent": setup_agent}, - num_runs=5, mode="pointwise", ) async def test_simple_query(row: EvaluationRow) -> EvaluationRow: @@ -45,7 +53,7 @@ async def test_simple_query(row: EvaluationRow) -> EvaluationRow: ) else: model = OpenAIModel( - "accounts/fireworks/models/llama-v3p1-8b-instruct", + "accounts/fireworks/models/kimi-k2-instruct", provider="fireworks", ) @@ -62,10 +70,7 @@ class Response(BaseModel): reason: str comparison_agent = Agent( - system_prompt=( - "Your job is to compare the response to the expected answer." - "If the response is correct, return 1.0. If the response is incorrect, return 0.0." - ), + system_prompt=LLM_JUDGE_PROMPT, output_type=Response, model=model, ) @@ -75,3 +80,70 @@ class Response(BaseModel): reason=result.output.reason, ) return row + + +@pytest.mark.skip(reason="takes too long to run") +@pytest.mark.asyncio +@evaluation_test( + input_rows=collect_dataset(), + completion_params=[ + { + "model": { + "orchestrator_agent_model": { + "model": "accounts/fireworks/models/kimi-k2-instruct", + "provider": "fireworks", + } + } + }, + ], + rollout_processor=PydanticAgentRolloutProcessor(), + rollout_processor_kwargs={"agent": setup_agent}, + mode="pointwise", +) +async def test_complex_queries(row: EvaluationRow) -> EvaluationRow: + """ + Complex queries for the Chinook database + """ + last_assistant_message = row.last_assistant_message() + if last_assistant_message is None: + row.evaluation_result = EvaluateResult( + score=0.0, + reason="No assistant message found", + ) + elif not last_assistant_message.content: + row.evaluation_result = EvaluateResult( + score=0.0, + reason="No assistant message found", + ) + else: + model = OpenAIModel( + "accounts/fireworks/models/kimi-k2-instruct", + provider="fireworks", + ) + + class Response(BaseModel): + """ + A score between 0.0 and 1.0 indicating whether the response is correct. + """ + + score: float + + """ + A short explanation of why the response is correct or incorrect. + """ + reason: str + + comparison_agent = Agent( + system_prompt=LLM_JUDGE_PROMPT, + output_type=Response, + model=model, + result_retries=5, + ) + result = await comparison_agent.run( + f"Expected answer: {row.ground_truth}\nResponse: {last_assistant_message.content}" + ) + row.evaluation_result = EvaluateResult( + score=result.output.score, + reason=result.output.reason, + ) + return row diff --git a/vite-app/dist/assets/index-BxZNbf6w.css b/vite-app/dist/assets/index-BxZNbf6w.css deleted file mode 100644 index 358ae411..00000000 --- a/vite-app/dist/assets/index-BxZNbf6w.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-full{top:100%}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-full{right:100%}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-full{left:100%}.z-10{z-index:10}.z-50{z-index:50}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-96{height:calc(var(--spacing)*96)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-60{max-height:calc(var(--spacing)*60)}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-\[500px\]{width:500px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-36{min-width:calc(var(--spacing)*36)}.min-w-40{min-width:calc(var(--spacing)*40)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-64{min-width:calc(var(--spacing)*64)}.min-w-max{min-width:max-content}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-200{border-color:var(--color-green-200)}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-600{border-top-color:var(--color-gray-600)}.border-t-transparent{border-top-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-gray-300{border-left-color:var(--color-gray-300)}.border-l-green-500{border-left-color:var(--color-green-500)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:64rem){.lg\:max-w-md{max-width:var(--container-md)}}@media (min-width:80rem){.xl\:max-w-lg{max-width:var(--container-lg)}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/vite-app/dist/assets/index-Bw6MHHaR.js b/vite-app/dist/assets/index-CWShMUgl.js similarity index 60% rename from vite-app/dist/assets/index-Bw6MHHaR.js rename to vite-app/dist/assets/index-CWShMUgl.js index 826011f1..9a72ed07 100644 --- a/vite-app/dist/assets/index-Bw6MHHaR.js +++ b/vite-app/dist/assets/index-CWShMUgl.js @@ -1,4 +1,4 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function A(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=A(i);fetch(i.href,s)}})();function Dm(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Up={exports:{}},Bl={};/** +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function A(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=A(i);fetch(i.href,s)}})();function Lm(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Fp={exports:{}},Bl={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var uy;function SH(){if(uy)return Bl;uy=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function A(n,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var c in i)c!=="key"&&(s[c]=i[c])}else s=i;return i=s.ref,{$$typeof:e,type:n,key:o,ref:i!==void 0?i:null,props:s}}return Bl.Fragment=t,Bl.jsx=A,Bl.jsxs=A,Bl}var fy;function HH(){return fy||(fy=1,Up.exports=SH()),Up.exports}var U=HH(),Ep={exports:{}},Ut={};/** + */var hy;function OH(){if(hy)return Bl;hy=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function A(n,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var c in i)c!=="key"&&(s[c]=i[c])}else s=i;return i=s.ref,{$$typeof:e,type:n,key:o,ref:i!==void 0?i:null,props:s}}return Bl.Fragment=t,Bl.jsx=A,Bl.jsxs=A,Bl}var dy;function TH(){return dy||(dy=1,Fp.exports=OH()),Fp.exports}var Q=TH(),Sp={exports:{}},Ut={};/** * @license React * react.production.js * @@ -14,7 +14,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var hy;function OH(){if(hy)return Ut;hy=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),p=Symbol.iterator;function m(T){return T===null||typeof T!="object"?null:(T=p&&T[p]||T["@@iterator"],typeof T=="function"?T:null)}var v={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,b={};function _(T,j,et){this.props=T,this.context=j,this.refs=b,this.updater=et||v}_.prototype.isReactComponent={},_.prototype.setState=function(T,j){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,j,"setState")},_.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function C(){}C.prototype=_.prototype;function Q(T,j,et){this.props=T,this.context=j,this.refs=b,this.updater=et||v}var E=Q.prototype=new C;E.constructor=Q,w(E,_.prototype),E.isPureReactComponent=!0;var H=Array.isArray,F={H:null,A:null,T:null,S:null,V:null},D=Object.prototype.hasOwnProperty;function L(T,j,et,tt,Y,ct){return et=ct.ref,{$$typeof:e,type:T,key:j,ref:et!==void 0?et:null,props:ct}}function z(T,j){return L(T.type,j,void 0,void 0,void 0,T.props)}function N(T){return typeof T=="object"&&T!==null&&T.$$typeof===e}function J(T){var j={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(et){return j[et]})}var At=/\/+/g;function nt(T,j){return typeof T=="object"&&T!==null&&T.key!=null?J(""+T.key):j.toString(36)}function lt(){}function ut(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(lt,lt):(T.status="pending",T.then(function(j){T.status==="pending"&&(T.status="fulfilled",T.value=j)},function(j){T.status==="pending"&&(T.status="rejected",T.reason=j)})),T.status){case"fulfilled":return T.value;case"rejected":throw T.reason}}throw T}function rt(T,j,et,tt,Y){var ct=typeof T;(ct==="undefined"||ct==="boolean")&&(T=null);var at=!1;if(T===null)at=!0;else switch(ct){case"bigint":case"string":case"number":at=!0;break;case"object":switch(T.$$typeof){case e:case t:at=!0;break;case d:return at=T._init,rt(at(T._payload),j,et,tt,Y)}}if(at)return Y=Y(T),at=tt===""?"."+nt(T,0):tt,H(Y)?(et="",at!=null&&(et=at.replace(At,"$&/")+"/"),rt(Y,j,et,"",function(Yt){return Yt})):Y!=null&&(N(Y)&&(Y=z(Y,et+(Y.key==null||T&&T.key===Y.key?"":(""+Y.key).replace(At,"$&/")+"/")+at)),j.push(Y)),1;at=0;var he=tt===""?".":tt+":";if(H(T))for(var Kt=0;Kt>>1,T=R[ot];if(0>>1;oti(tt,q))Yi(ct,tt)?(R[ot]=ct,R[Y]=q,ot=Y):(R[ot]=tt,R[et]=q,ot=et);else if(Yi(ct,q))R[ot]=ct,R[Y]=q,ot=Y;else break t}}return G}function i(R,G){var q=R.sortIndex-G.sortIndex;return q!==0?q:R.id-G.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,c=o.now();e.unstable_now=function(){return o.now()-c}}var u=[],h=[],d=1,p=null,m=3,v=!1,w=!1,b=!1,_=!1,C=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;function H(R){for(var G=A(h);G!==null;){if(G.callback===null)n(h);else if(G.startTime<=R)n(h),G.sortIndex=G.expirationTime,t(u,G);else break;G=A(h)}}function F(R){if(b=!1,H(R),!w)if(A(u)!==null)w=!0,D||(D=!0,nt());else{var G=A(h);G!==null&&rt(F,G.startTime-R)}}var D=!1,L=-1,z=5,N=-1;function J(){return _?!0:!(e.unstable_now()-NR&&J());){var ot=p.callback;if(typeof ot=="function"){p.callback=null,m=p.priorityLevel;var T=ot(p.expirationTime<=R);if(R=e.unstable_now(),typeof T=="function"){p.callback=T,H(R),G=!0;break e}p===A(u)&&n(u),H(R)}else n(u);p=A(u)}if(p!==null)G=!0;else{var j=A(h);j!==null&&rt(F,j.startTime-R),G=!1}}break t}finally{p=null,m=q,v=!1}G=void 0}}finally{G?nt():D=!1}}}var nt;if(typeof E=="function")nt=function(){E(At)};else if(typeof MessageChannel<"u"){var lt=new MessageChannel,ut=lt.port2;lt.port1.onmessage=At,nt=function(){ut.postMessage(null)}}else nt=function(){C(At,0)};function rt(R,G){L=C(function(){R(e.unstable_now())},G)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(R){R.callback=null},e.unstable_forceFrameRate=function(R){0>R||125ot?(R.sortIndex=q,t(h,R),A(u)===null&&R===A(h)&&(b?(Q(L),L=-1):b=!0,rt(F,q-ot))):(R.sortIndex=T,t(u,R),w||v||(w=!0,D||(D=!0,nt()))),R},e.unstable_shouldYield=J,e.unstable_wrapCallback=function(R){var G=m;return function(){var q=m;m=G;try{return R.apply(this,arguments)}finally{m=q}}}}(Hp)),Hp}var py;function DH(){return py||(py=1,Sp.exports=TH()),Sp.exports}var Op={exports:{}},fA={};/** + */var By;function MH(){return By||(By=1,function(e){function t(L,G){var q=L.length;L.push(G);t:for(;0>>1,T=L[ct];if(0>>1;cti(tt,q))Yi(ut,tt)?(L[ct]=ut,L[Y]=q,ct=Y):(L[ct]=tt,L[At]=q,ct=At);else if(Yi(ut,q))L[ct]=ut,L[Y]=q,ct=Y;else break t}}return G}function i(L,G){var q=L.sortIndex-G.sortIndex;return q!==0?q:L.id-G.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,c=o.now();e.unstable_now=function(){return o.now()-c}}var u=[],h=[],d=1,p=null,m=3,v=!1,w=!1,b=!1,_=!1,C=typeof setTimeout=="function"?setTimeout:null,U=typeof clearTimeout=="function"?clearTimeout:null,E=typeof setImmediate<"u"?setImmediate:null;function H(L){for(var G=A(h);G!==null;){if(G.callback===null)n(h);else if(G.startTime<=L)n(h),G.sortIndex=G.expirationTime,t(u,G);else break;G=A(h)}}function F(L){if(b=!1,H(L),!w)if(A(u)!==null)w=!0,D||(D=!0,nt());else{var G=A(h);G!==null&&st(F,G.startTime-L)}}var D=!1,R=-1,z=5,N=-1;function J(){return _?!0:!(e.unstable_now()-NL&&J());){var ct=p.callback;if(typeof ct=="function"){p.callback=null,m=p.priorityLevel;var T=ct(p.expirationTime<=L);if(L=e.unstable_now(),typeof T=="function"){p.callback=T,H(L),G=!0;break e}p===A(u)&&n(u),H(L)}else n(u);p=A(u)}if(p!==null)G=!0;else{var j=A(h);j!==null&&st(F,j.startTime-L),G=!1}}break t}finally{p=null,m=q,v=!1}G=void 0}}finally{G?nt():D=!1}}}var nt;if(typeof E=="function")nt=function(){E(et)};else if(typeof MessageChannel<"u"){var ot=new MessageChannel,ft=ot.port2;ot.port1.onmessage=et,nt=function(){ft.postMessage(null)}}else nt=function(){C(et,0)};function st(L,G){R=C(function(){L(e.unstable_now())},G)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(L){L.callback=null},e.unstable_forceFrameRate=function(L){0>L||125ct?(L.sortIndex=q,t(h,L),A(u)===null&&L===A(h)&&(b?(U(R),R=-1):b=!0,st(F,q-ct))):(L.sortIndex=T,t(u,L),w||v||(w=!0,D||(D=!0,nt()))),L},e.unstable_shouldYield=J,e.unstable_wrapCallback=function(L){var G=m;return function(){var q=m;m=G;try{return L.apply(this,arguments)}finally{m=q}}}}(Tp)),Tp}var my;function LH(){return my||(my=1,Op.exports=MH()),Op.exports}var Dp={exports:{}},hA={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var By;function MH(){if(By)return fA;By=1;var e=Lh();function t(u){var h="https://react.dev/errors/"+u;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Op.exports=MH(),Op.exports}/** + */var vy;function RH(){if(vy)return hA;vy=1;var e=Ih();function t(u){var h="https://react.dev/errors/"+u;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Dp.exports=RH(),Dp.exports}/** * @license React * react-dom-client.production.js * @@ -38,15 +38,15 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var vy;function LH(){if(vy)return ml;vy=1;var e=DH(),t=Lh(),A=BQ();function n(r){var a="https://react.dev/errors/"+r;if(1T||(r.current=ot[T],ot[T]=null,T--)}function tt(r,a){T++,ot[T]=r.current,r.current=a}var Y=j(null),ct=j(null),at=j(null),he=j(null);function Kt(r,a){switch(tt(at,a),tt(ct,r),tt(Y,null),a.nodeType){case 9:case 11:r=(r=a.documentElement)&&(r=r.namespaceURI)?Nb(r):0;break;default:if(r=a.tagName,a=a.namespaceURI)a=Nb(a),r=kb(a,r);else switch(r){case"svg":r=1;break;case"math":r=2;break;default:r=0}}et(Y),tt(Y,r)}function Yt(){et(Y),et(ct),et(at)}function An(r){r.memoizedState!==null&&tt(he,r);var a=Y.current,l=kb(a,r.type);a!==l&&(tt(ct,r),tt(Y,l))}function Pe(r){ct.current===r&&(et(Y),et(ct)),he.current===r&&(et(he),fl._currentValue=q)}var tA=Object.prototype.hasOwnProperty,EA=e.unstable_scheduleCallback,FA=e.unstable_cancelCallback,ea=e.unstable_shouldYield,bA=e.unstable_requestPaint,yA=e.unstable_now,pi=e.unstable_getCurrentPriorityLevel,Pn=e.unstable_ImmediatePriority,re=e.unstable_UserBlockingPriority,jn=e.unstable_NormalPriority,es=e.unstable_LowPriority,Ar=e.unstable_IdlePriority,As=e.log,Aa=e.unstable_setDisableYieldValue,nn=null,_e=null;function SA(r){if(typeof As=="function"&&Aa(r),_e&&typeof _e.setStrictMode=="function")try{_e.setStrictMode(nn,r)}catch{}}var Fe=Math.clz32?Math.clz32:ir,nr=Math.log,yo=Math.LN2;function ir(r){return r>>>=0,r===0?32:31-(nr(r)/yo|0)|0}var rn=256,aA=4194304;function Wt(r){var a=r&42;if(a!==0)return a;switch(r&-r){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return r&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return r&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return r}}function Bi(r,a,l){var f=r.pendingLanes;if(f===0)return 0;var g=0,B=r.suspendedLanes,y=r.pingedLanes;r=r.warmLanes;var x=f&134217727;return x!==0?(f=x&~B,f!==0?g=Wt(f):(y&=x,y!==0?g=Wt(y):l||(l=x&~r,l!==0&&(g=Wt(l))))):(x=f&~B,x!==0?g=Wt(x):y!==0?g=Wt(y):l||(l=f&~r,l!==0&&(g=Wt(l)))),g===0?0:a!==0&&a!==g&&(a&B)===0&&(B=g&-g,l=a&-a,B>=l||B===32&&(l&4194048)!==0)?a:g}function En(r,a){return(r.pendingLanes&~(r.suspendedLanes&~r.pingedLanes)&a)===0}function rr(r,a){switch(r){case 1:case 2:case 4:case 8:case 64:return a+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function sr(){var r=rn;return rn<<=1,(rn&4194048)===0&&(rn=256),r}function mi(){var r=aA;return aA<<=1,(aA&62914560)===0&&(aA=4194304),r}function Gn(r){for(var a=[],l=0;31>l;l++)a.push(r);return a}function sn(r,a){r.pendingLanes|=a,a!==268435456&&(r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0)}function ns(r,a,l,f,g,B){var y=r.pendingLanes;r.pendingLanes=l,r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0,r.expiredLanes&=l,r.entangledLanes&=l,r.errorRecoveryDisabledLanes&=l,r.shellSuspendCounter=0;var x=r.entanglements,O=r.expirationTimes,K=r.hiddenUpdates;for(l=y&~l;0T||(r.current=ct[T],ct[T]=null,T--)}function tt(r,a){T++,ct[T]=r.current,r.current=a}var Y=j(null),ut=j(null),lt=j(null),he=j(null);function Kt(r,a){switch(tt(lt,a),tt(ut,r),tt(Y,null),a.nodeType){case 9:case 11:r=(r=a.documentElement)&&(r=r.namespaceURI)?Kb(r):0;break;default:if(r=a.tagName,a=a.namespaceURI)a=Kb(a),r=zb(a,r);else switch(r){case"svg":r=1;break;case"math":r=2;break;default:r=0}}At(Y),tt(Y,r)}function Yt(){At(Y),At(ut),At(lt)}function An(r){r.memoizedState!==null&&tt(he,r);var a=Y.current,l=zb(a,r.type);a!==l&&(tt(ut,r),tt(Y,l))}function Pe(r){ut.current===r&&(At(Y),At(ut)),he.current===r&&(At(he),fl._currentValue=q)}var eA=Object.prototype.hasOwnProperty,EA=e.unstable_scheduleCallback,FA=e.unstable_cancelCallback,ea=e.unstable_shouldYield,yA=e.unstable_requestPaint,CA=e.unstable_now,pi=e.unstable_getCurrentPriorityLevel,Pn=e.unstable_ImmediatePriority,se=e.unstable_UserBlockingPriority,jn=e.unstable_NormalPriority,es=e.unstable_LowPriority,Ar=e.unstable_IdlePriority,As=e.log,Aa=e.unstable_setDisableYieldValue,nn=null,_e=null;function SA(r){if(typeof As=="function"&&Aa(r),_e&&typeof _e.setStrictMode=="function")try{_e.setStrictMode(nn,r)}catch{}}var Fe=Math.clz32?Math.clz32:ir,nr=Math.log,yo=Math.LN2;function ir(r){return r>>>=0,r===0?32:31-(nr(r)/yo|0)|0}var rn=256,oA=4194304;function Wt(r){var a=r&42;if(a!==0)return a;switch(r&-r){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return r&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return r&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return r}}function Bi(r,a,l){var f=r.pendingLanes;if(f===0)return 0;var g=0,B=r.suspendedLanes,y=r.pingedLanes;r=r.warmLanes;var x=f&134217727;return x!==0?(f=x&~B,f!==0?g=Wt(f):(y&=x,y!==0?g=Wt(y):l||(l=x&~r,l!==0&&(g=Wt(l))))):(x=f&~B,x!==0?g=Wt(x):y!==0?g=Wt(y):l||(l=f&~r,l!==0&&(g=Wt(l)))),g===0?0:a!==0&&a!==g&&(a&B)===0&&(B=g&-g,l=a&-a,B>=l||B===32&&(l&4194048)!==0)?a:g}function Un(r,a){return(r.pendingLanes&~(r.suspendedLanes&~r.pingedLanes)&a)===0}function rr(r,a){switch(r){case 1:case 2:case 4:case 8:case 64:return a+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function sr(){var r=rn;return rn<<=1,(rn&4194048)===0&&(rn=256),r}function mi(){var r=oA;return oA<<=1,(oA&62914560)===0&&(oA=4194304),r}function Gn(r){for(var a=[],l=0;31>l;l++)a.push(r);return a}function sn(r,a){r.pendingLanes|=a,a!==268435456&&(r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0)}function ns(r,a,l,f,g,B){var y=r.pendingLanes;r.pendingLanes=l,r.suspendedLanes=0,r.pingedLanes=0,r.warmLanes=0,r.expiredLanes&=l,r.entangledLanes&=l,r.errorRecoveryDisabledLanes&=l,r.shellSuspendCounter=0;var x=r.entanglements,O=r.expirationTimes,K=r.hiddenUpdates;for(l=y&~l;0)":-1g||O[f]!==K[g]){var X=` -`+O[f].replace(" at new "," at ");return r.displayName&&X.includes("")&&(X=X.replace("",r.displayName)),X}while(1<=f&&0<=g);break}}}finally{yd=!1,Error.prepareStackTrace=l}return(l=r?r.displayName||r.name:"")?ra(l):""}function _S(r){switch(r.tag){case 26:case 27:case 5:return ra(r.type);case 16:return ra("Lazy");case 13:return ra("Suspense");case 19:return ra("SuspenseList");case 0:case 15:return Cd(r.type,!1);case 11:return Cd(r.type.render,!1);case 1:return Cd(r.type,!0);case 31:return ra("Activity");default:return""}}function Tv(r){try{var a="";do a+=_S(r),r=r.return;while(r);return a}catch(l){return` +`+O[f].replace(" at new "," at ");return r.displayName&&X.includes("")&&(X=X.replace("",r.displayName)),X}while(1<=f&&0<=g);break}}}finally{_d=!1,Error.prepareStackTrace=l}return(l=r?r.displayName||r.name:"")?ra(l):""}function QS(r){switch(r.tag){case 26:case 27:case 5:return ra(r.type);case 16:return ra("Lazy");case 13:return ra("Suspense");case 19:return ra("SuspenseList");case 0:case 15:return xd(r.type,!1);case 11:return xd(r.type.render,!1);case 1:return xd(r.type,!0);case 31:return ra("Activity");default:return""}}function Mv(r){try{var a="";do a+=QS(r),r=r.return;while(r);return a}catch(l){return` Error generating stack: `+l.message+` -`+l.stack}}function ln(r){switch(typeof r){case"bigint":case"boolean":case"number":case"string":case"undefined":return r;case"object":return r;default:return""}}function Dv(r){var a=r.type;return(r=r.nodeName)&&r.toLowerCase()==="input"&&(a==="checkbox"||a==="radio")}function xS(r){var a=Dv(r)?"checked":"value",l=Object.getOwnPropertyDescriptor(r.constructor.prototype,a),f=""+r[a];if(!r.hasOwnProperty(a)&&typeof l<"u"&&typeof l.get=="function"&&typeof l.set=="function"){var g=l.get,B=l.set;return Object.defineProperty(r,a,{configurable:!0,get:function(){return g.call(this)},set:function(y){f=""+y,B.call(this,y)}}),Object.defineProperty(r,a,{enumerable:l.enumerable}),{getValue:function(){return f},setValue:function(y){f=""+y},stopTracking:function(){r._valueTracker=null,delete r[a]}}}}function Dc(r){r._valueTracker||(r._valueTracker=xS(r))}function Mv(r){if(!r)return!1;var a=r._valueTracker;if(!a)return!0;var l=a.getValue(),f="";return r&&(f=Dv(r)?r.checked?"true":"false":r.value),r=f,r!==l?(a.setValue(r),!0):!1}function Mc(r){if(r=r||(typeof document<"u"?document:void 0),typeof r>"u")return null;try{return r.activeElement||r.body}catch{return r.body}}var QS=/[\n"\\]/g;function cn(r){return r.replace(QS,function(a){return"\\"+a.charCodeAt(0).toString(16)+" "})}function _d(r,a,l,f,g,B,y,x){r.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?r.type=y:r.removeAttribute("type"),a!=null?y==="number"?(a===0&&r.value===""||r.value!=a)&&(r.value=""+ln(a)):r.value!==""+ln(a)&&(r.value=""+ln(a)):y!=="submit"&&y!=="reset"||r.removeAttribute("value"),a!=null?xd(r,y,ln(a)):l!=null?xd(r,y,ln(l)):f!=null&&r.removeAttribute("value"),g==null&&B!=null&&(r.defaultChecked=!!B),g!=null&&(r.checked=g&&typeof g!="function"&&typeof g!="symbol"),x!=null&&typeof x!="function"&&typeof x!="symbol"&&typeof x!="boolean"?r.name=""+ln(x):r.removeAttribute("name")}function Lv(r,a,l,f,g,B,y,x){if(B!=null&&typeof B!="function"&&typeof B!="symbol"&&typeof B!="boolean"&&(r.type=B),a!=null||l!=null){if(!(B!=="submit"&&B!=="reset"||a!=null))return;l=l!=null?""+ln(l):"",a=a!=null?""+ln(a):l,x||a===r.value||(r.value=a),r.defaultValue=a}f=f??g,f=typeof f!="function"&&typeof f!="symbol"&&!!f,r.checked=x?r.checked:!!f,r.defaultChecked=!!f,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(r.name=y)}function xd(r,a,l){a==="number"&&Mc(r.ownerDocument)===r||r.defaultValue===""+l||(r.defaultValue=""+l)}function sa(r,a,l,f){if(r=r.options,a){a={};for(var g=0;g"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Sd=!1;if(bi)try{var Qo={};Object.defineProperty(Qo,"passive",{get:function(){Sd=!0}}),window.addEventListener("test",Qo,Qo),window.removeEventListener("test",Qo,Qo)}catch{Sd=!1}var lr=null,Hd=null,Rc=null;function Vv(){if(Rc)return Rc;var r,a=Hd,l=a.length,f,g="value"in lr?lr.value:lr.textContent,B=g.length;for(r=0;r=Fo),Yv=" ",Wv=!1;function $v(r,a){switch(r){case"keyup":return t1.indexOf(a.keyCode)!==-1;case"keydown":return a.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Jv(r){return r=r.detail,typeof r=="object"&&"data"in r?r.data:null}var ca=!1;function A1(r,a){switch(r){case"compositionend":return Jv(a);case"keypress":return a.which!==32?null:(Wv=!0,Yv);case"textInput":return r=a.data,r===Yv&&Wv?null:r;default:return null}}function n1(r,a){if(ca)return r==="compositionend"||!Ld&&$v(r,a)?(r=Vv(),Rc=Hd=lr=null,ca=!1,r):null;switch(r){case"paste":return null;case"keypress":if(!(a.ctrlKey||a.altKey||a.metaKey)||a.ctrlKey&&a.altKey){if(a.char&&1=a)return{node:l,offset:a-r};r=f}t:{for(;l;){if(l.nextSibling){l=l.nextSibling;break t}l=l.parentNode}l=void 0}l=s0(l)}}function o0(r,a){return r&&a?r===a?!0:r&&r.nodeType===3?!1:a&&a.nodeType===3?o0(r,a.parentNode):"contains"in r?r.contains(a):r.compareDocumentPosition?!!(r.compareDocumentPosition(a)&16):!1:!1}function l0(r){r=r!=null&&r.ownerDocument!=null&&r.ownerDocument.defaultView!=null?r.ownerDocument.defaultView:window;for(var a=Mc(r.document);a instanceof r.HTMLIFrameElement;){try{var l=typeof a.contentWindow.location.href=="string"}catch{l=!1}if(l)r=a.contentWindow;else break;a=Mc(r.document)}return a}function Nd(r){var a=r&&r.nodeName&&r.nodeName.toLowerCase();return a&&(a==="input"&&(r.type==="text"||r.type==="search"||r.type==="tel"||r.type==="url"||r.type==="password")||a==="textarea"||r.contentEditable==="true")}var u1=bi&&"documentMode"in document&&11>=document.documentMode,ua=null,kd=null,To=null,Kd=!1;function c0(r,a,l){var f=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Kd||ua==null||ua!==Mc(f)||(f=ua,"selectionStart"in f&&Nd(f)?f={start:f.selectionStart,end:f.selectionEnd}:(f=(f.ownerDocument&&f.ownerDocument.defaultView||window).getSelection(),f={anchorNode:f.anchorNode,anchorOffset:f.anchorOffset,focusNode:f.focusNode,focusOffset:f.focusOffset}),To&&Oo(To,f)||(To=f,f=Uu(kd,"onSelect"),0>=y,g-=y,Ci=1<<32-Fe(a)+g|l<B?B:8;var y=R.T,x={};R.T=x,Qg(r,!1,a,l);try{var O=g(),K=R.S;if(K!==null&&K(x,O),O!==null&&typeof O=="object"&&typeof O.then=="function"){var X=w1(O,f);Zo(r,a,X,XA(r))}else Zo(r,a,f,XA(r))}catch($){Zo(r,a,{then:function(){},status:"rejected",reason:$},XA())}finally{G.p=B,R.T=y}}function x1(){}function _g(r,a,l,f){if(r.tag!==5)throw Error(n(476));var g=uw(r).queue;cw(r,g,a,q,l===null?x1:function(){return fw(r),l(f)})}function uw(r){var a=r.memoizedState;if(a!==null)return a;a={memoizedState:q,baseState:q,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ui,lastRenderedState:q},next:null};var l={};return a.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ui,lastRenderedState:l},next:null},r.memoizedState=a,r=r.alternate,r!==null&&(r.memoizedState=a),a}function fw(r){var a=uw(r).next.queue;Zo(r,a,{},XA())}function xg(){return uA(fl)}function hw(){return Ne().memoizedState}function dw(){return Ne().memoizedState}function Q1(r){for(var a=r.return;a!==null;){switch(a.tag){case 24:case 3:var l=XA();r=fr(l);var f=hr(a,r,l);f!==null&&(ZA(f,a,l),zo(f,a,l)),a={cache:eg()},r.payload=a;return}a=a.return}}function U1(r,a,l){var f=XA();l={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null},au(r)?pw(a,l):(l=jd(r,a,l,f),l!==null&&(ZA(l,r,f),Bw(l,a,f)))}function gw(r,a,l){var f=XA();Zo(r,a,l,f)}function Zo(r,a,l,f){var g={lane:f,revertLane:0,action:l,hasEagerState:!1,eagerState:null,next:null};if(au(r))pw(a,g);else{var B=r.alternate;if(r.lanes===0&&(B===null||B.lanes===0)&&(B=a.lastRenderedReducer,B!==null))try{var y=a.lastRenderedState,x=B(y,l);if(g.hasEagerState=!0,g.eagerState=x,zA(x,y))return Pc(r,a,g,0),se===null&&Vc(),!1}catch{}finally{}if(l=jd(r,a,g,f),l!==null)return ZA(l,r,f),Bw(l,a,f),!0}return!1}function Qg(r,a,l,f){if(f={lane:2,revertLane:ip(),action:f,hasEagerState:!1,eagerState:null,next:null},au(r)){if(a)throw Error(n(479))}else a=jd(r,l,f,2),a!==null&&ZA(a,r,2)}function au(r){var a=r.alternate;return r===Et||a!==null&&a===Et}function pw(r,a){ba=eu=!0;var l=r.pending;l===null?a.next=a:(a.next=l.next,l.next=a),r.pending=a}function Bw(r,a,l){if((l&4194048)!==0){var f=a.lanes;f&=r.pendingLanes,l|=f,a.lanes=l,Se(r,l)}}var ou={readContext:uA,use:nu,useCallback:Te,useContext:Te,useEffect:Te,useImperativeHandle:Te,useLayoutEffect:Te,useInsertionEffect:Te,useMemo:Te,useReducer:Te,useRef:Te,useState:Te,useDebugValue:Te,useDeferredValue:Te,useTransition:Te,useSyncExternalStore:Te,useId:Te,useHostTransitionStatus:Te,useFormState:Te,useActionState:Te,useOptimistic:Te,useMemoCache:Te,useCacheRefresh:Te},mw={readContext:uA,use:nu,useCallback:function(r,a){return OA().memoizedState=[r,a===void 0?null:a],r},useContext:uA,useEffect:ew,useImperativeHandle:function(r,a,l){l=l!=null?l.concat([r]):null,su(4194308,4,rw.bind(null,a,r),l)},useLayoutEffect:function(r,a){return su(4194308,4,r,a)},useInsertionEffect:function(r,a){su(4,2,r,a)},useMemo:function(r,a){var l=OA();a=a===void 0?null:a;var f=r();if(ms){SA(!0);try{r()}finally{SA(!1)}}return l.memoizedState=[f,a],f},useReducer:function(r,a,l){var f=OA();if(l!==void 0){var g=l(a);if(ms){SA(!0);try{l(a)}finally{SA(!1)}}}else g=a;return f.memoizedState=f.baseState=g,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:r,lastRenderedState:g},f.queue=r,r=r.dispatch=U1.bind(null,Et,r),[f.memoizedState,r]},useRef:function(r){var a=OA();return r={current:r},a.memoizedState=r},useState:function(r){r=wg(r);var a=r.queue,l=gw.bind(null,Et,a);return a.dispatch=l,[r.memoizedState,l]},useDebugValue:yg,useDeferredValue:function(r,a){var l=OA();return Cg(l,r,a)},useTransition:function(){var r=wg(!1);return r=cw.bind(null,Et,r.queue,!0,!1),OA().memoizedState=r,[!1,r]},useSyncExternalStore:function(r,a,l){var f=Et,g=OA();if(Pt){if(l===void 0)throw Error(n(407));l=l()}else{if(l=a(),se===null)throw Error(n(349));(Lt&124)!==0||N0(f,a,l)}g.memoizedState=l;var B={value:l,getSnapshot:a};return g.queue=B,ew(K0.bind(null,f,B,r),[r]),f.flags|=2048,Ca(9,ru(),k0.bind(null,f,B,l,a),null),l},useId:function(){var r=OA(),a=se.identifierPrefix;if(Pt){var l=_i,f=Ci;l=(f&~(1<<32-Fe(f)-1)).toString(32)+l,a="«"+a+"R"+l,l=Au++,0Ct?(Ze=vt,vt=null):Ze=vt.sibling;var It=V(I,vt,k[Ct],W);if(It===null){vt===null&&(vt=Ze);break}r&&vt&&It.alternate===null&&a(I,vt),M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It,vt=Ze}if(Ct===k.length)return l(I,vt),Pt&&fs(I,Ct),gt;if(vt===null){for(;CtCt?(Ze=vt,vt=null):Ze=vt.sibling;var Sr=V(I,vt,It.value,W);if(Sr===null){vt===null&&(vt=Ze);break}r&&vt&&Sr.alternate===null&&a(I,vt),M=B(Sr,M,Ct),Ft===null?gt=Sr:Ft.sibling=Sr,Ft=Sr,vt=Ze}if(It.done)return l(I,vt),Pt&&fs(I,Ct),gt;if(vt===null){for(;!It.done;Ct++,It=k.next())It=$(I,It.value,W),It!==null&&(M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It);return Pt&&fs(I,Ct),gt}for(vt=f(vt);!It.done;Ct++,It=k.next())It=P(vt,I,Ct,It.value,W),It!==null&&(r&&It.alternate!==null&&vt.delete(It.key===null?Ct:It.key),M=B(It,M,Ct),Ft===null?gt=It:Ft.sibling=It,Ft=It);return r&&vt.forEach(function(FH){return a(I,FH)}),Pt&&fs(I,Ct),gt}function qt(I,M,k,W){if(typeof k=="object"&&k!==null&&k.type===w&&k.key===null&&(k=k.props.children),typeof k=="object"&&k!==null){switch(k.$$typeof){case m:t:{for(var gt=k.key;M!==null;){if(M.key===gt){if(gt=k.type,gt===w){if(M.tag===7){l(I,M.sibling),W=g(M,k.props.children),W.return=I,I=W;break t}}else if(M.elementType===gt||typeof gt=="object"&>!==null&>.$$typeof===z&&ww(gt)===M.type){l(I,M.sibling),W=g(M,k.props),Wo(W,k),W.return=I,I=W;break t}l(I,M);break}else a(I,M);M=M.sibling}k.type===w?(W=cs(k.props.children,I.mode,W,k.key),W.return=I,I=W):(W=Gc(k.type,k.key,k.props,null,I.mode,W),Wo(W,k),W.return=I,I=W)}return y(I);case v:t:{for(gt=k.key;M!==null;){if(M.key===gt)if(M.tag===4&&M.stateNode.containerInfo===k.containerInfo&&M.stateNode.implementation===k.implementation){l(I,M.sibling),W=g(M,k.children||[]),W.return=I,I=W;break t}else{l(I,M);break}else a(I,M);M=M.sibling}W=Zd(k,I.mode,W),W.return=I,I=W}return y(I);case z:return gt=k._init,k=gt(k._payload),qt(I,M,k,W)}if(rt(k))return _t(I,M,k,W);if(nt(k)){if(gt=nt(k),typeof gt!="function")throw Error(n(150));return k=gt.call(k),bt(I,M,k,W)}if(typeof k.then=="function")return qt(I,M,lu(k),W);if(k.$$typeof===E)return qt(I,M,Wc(I,k),W);cu(I,k)}return typeof k=="string"&&k!==""||typeof k=="number"||typeof k=="bigint"?(k=""+k,M!==null&&M.tag===6?(l(I,M.sibling),W=g(M,k),W.return=I,I=W):(l(I,M),W=Xd(k,I.mode,W),W.return=I,I=W),y(I)):l(I,M)}return function(I,M,k,W){try{Yo=0;var gt=qt(I,M,k,W);return _a=null,gt}catch(vt){if(vt===ko||vt===Jc)throw vt;var Ft=VA(29,vt,null,I.mode);return Ft.lanes=W,Ft.return=I,Ft}finally{}}}var xa=bw(!0),yw=bw(!1),gn=j(null),Yn=null;function gr(r){var a=r.alternate;tt(Ke,Ke.current&1),tt(gn,r),Yn===null&&(a===null||wa.current!==null||a.memoizedState!==null)&&(Yn=r)}function Cw(r){if(r.tag===22){if(tt(Ke,Ke.current),tt(gn,r),Yn===null){var a=r.alternate;a!==null&&a.memoizedState!==null&&(Yn=r)}}else pr()}function pr(){tt(Ke,Ke.current),tt(gn,gn.current)}function Ei(r){et(gn),Yn===r&&(Yn=null),et(Ke)}var Ke=j(0);function uu(r){for(var a=r;a!==null;){if(a.tag===13){var l=a.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||l.data==="$?"||pp(l)))return a}else if(a.tag===19&&a.memoizedProps.revealOrder!==void 0){if((a.flags&128)!==0)return a}else if(a.child!==null){a.child.return=a,a=a.child;continue}if(a===r)break;for(;a.sibling===null;){if(a.return===null||a.return===r)return null;a=a.return}a.sibling.return=a.return,a=a.sibling}return null}function Ug(r,a,l,f){a=r.memoizedState,l=l(f,a),l=l==null?a:d({},a,l),r.memoizedState=l,r.lanes===0&&(r.updateQueue.baseState=l)}var Eg={enqueueSetState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueReplaceState:function(r,a,l){r=r._reactInternals;var f=XA(),g=fr(f);g.tag=1,g.payload=a,l!=null&&(g.callback=l),a=hr(r,g,f),a!==null&&(ZA(a,r,f),zo(a,r,f))},enqueueForceUpdate:function(r,a){r=r._reactInternals;var l=XA(),f=fr(l);f.tag=2,a!=null&&(f.callback=a),a=hr(r,f,l),a!==null&&(ZA(a,r,l),zo(a,r,l))}};function _w(r,a,l,f,g,B,y){return r=r.stateNode,typeof r.shouldComponentUpdate=="function"?r.shouldComponentUpdate(f,B,y):a.prototype&&a.prototype.isPureReactComponent?!Oo(l,f)||!Oo(g,B):!0}function xw(r,a,l,f){r=a.state,typeof a.componentWillReceiveProps=="function"&&a.componentWillReceiveProps(l,f),typeof a.UNSAFE_componentWillReceiveProps=="function"&&a.UNSAFE_componentWillReceiveProps(l,f),a.state!==r&&Eg.enqueueReplaceState(a,a.state,null)}function vs(r,a){var l=a;if("ref"in a){l={};for(var f in a)f!=="ref"&&(l[f]=a[f])}if(r=r.defaultProps){l===a&&(l=d({},l));for(var g in r)l[g]===void 0&&(l[g]=r[g])}return l}var fu=typeof reportError=="function"?reportError:function(r){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var a=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof r=="object"&&r!==null&&typeof r.message=="string"?String(r.message):String(r),error:r});if(!window.dispatchEvent(a))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",r);return}console.error(r)};function Qw(r){fu(r)}function Uw(r){console.error(r)}function Ew(r){fu(r)}function hu(r,a){try{var l=r.onUncaughtError;l(a.value,{componentStack:a.stack})}catch(f){setTimeout(function(){throw f})}}function Fw(r,a,l){try{var f=r.onCaughtError;f(l.value,{componentStack:l.stack,errorBoundary:a.tag===1?a.stateNode:null})}catch(g){setTimeout(function(){throw g})}}function Fg(r,a,l){return l=fr(l),l.tag=3,l.payload={element:null},l.callback=function(){hu(r,a)},l}function Sw(r){return r=fr(r),r.tag=3,r}function Hw(r,a,l,f){var g=l.type.getDerivedStateFromError;if(typeof g=="function"){var B=f.value;r.payload=function(){return g(B)},r.callback=function(){Fw(a,l,f)}}var y=l.stateNode;y!==null&&typeof y.componentDidCatch=="function"&&(r.callback=function(){Fw(a,l,f),typeof g!="function"&&(yr===null?yr=new Set([this]):yr.add(this));var x=f.stack;this.componentDidCatch(f.value,{componentStack:x!==null?x:""})})}function F1(r,a,l,f,g){if(l.flags|=32768,f!==null&&typeof f=="object"&&typeof f.then=="function"){if(a=l.alternate,a!==null&&Ro(a,l,g,!0),l=gn.current,l!==null){switch(l.tag){case 13:return Yn===null?qg():l.alternate===null&&Qe===0&&(Qe=3),l.flags&=-257,l.flags|=65536,l.lanes=g,f===ig?l.flags|=16384:(a=l.updateQueue,a===null?l.updateQueue=new Set([f]):a.add(f),ep(r,f,g)),!1;case 22:return l.flags|=65536,f===ig?l.flags|=16384:(a=l.updateQueue,a===null?(a={transitions:null,markerInstances:null,retryQueue:new Set([f])},l.updateQueue=a):(l=a.retryQueue,l===null?a.retryQueue=new Set([f]):l.add(f)),ep(r,f,g)),!1}throw Error(n(435,l.tag))}return ep(r,f,g),qg(),!1}if(Pt)return a=gn.current,a!==null?((a.flags&65536)===0&&(a.flags|=256),a.flags|=65536,a.lanes=g,f!==$d&&(r=Error(n(422),{cause:f}),Lo(un(r,l)))):(f!==$d&&(a=Error(n(423),{cause:f}),Lo(un(a,l))),r=r.current.alternate,r.flags|=65536,g&=-g,r.lanes|=g,f=un(f,l),g=Fg(r.stateNode,f,g),ag(r,g),Qe!==4&&(Qe=2)),!1;var B=Error(n(520),{cause:f});if(B=un(B,l),nl===null?nl=[B]:nl.push(B),Qe!==4&&(Qe=2),a===null)return!0;f=un(f,l),l=a;do{switch(l.tag){case 3:return l.flags|=65536,r=g&-g,l.lanes|=r,r=Fg(l.stateNode,f,r),ag(l,r),!1;case 1:if(a=l.type,B=l.stateNode,(l.flags&128)===0&&(typeof a.getDerivedStateFromError=="function"||B!==null&&typeof B.componentDidCatch=="function"&&(yr===null||!yr.has(B))))return l.flags|=65536,g&=-g,l.lanes|=g,g=Sw(g),Hw(g,r,l,f),ag(l,g),!1}l=l.return}while(l!==null);return!1}var Ow=Error(n(461)),Ge=!1;function eA(r,a,l,f){a.child=r===null?yw(a,null,l,f):xa(a,r.child,l,f)}function Tw(r,a,l,f,g){l=l.render;var B=a.ref;if("ref"in f){var y={};for(var x in f)x!=="ref"&&(y[x]=f[x])}else y=f;return ps(a),f=fg(r,a,l,y,B,g),x=hg(),r!==null&&!Ge?(dg(r,a,g),Fi(r,a,g)):(Pt&&x&&Yd(a),a.flags|=1,eA(r,a,f,g),a.child)}function Dw(r,a,l,f,g){if(r===null){var B=l.type;return typeof B=="function"&&!Gd(B)&&B.defaultProps===void 0&&l.compare===null?(a.tag=15,a.type=B,Mw(r,a,B,f,g)):(r=Gc(l.type,null,f,a,a.mode,g),r.ref=a.ref,r.return=a,a.child=r)}if(B=r.child,!Rg(r,g)){var y=B.memoizedProps;if(l=l.compare,l=l!==null?l:Oo,l(y,f)&&r.ref===a.ref)return Fi(r,a,g)}return a.flags|=1,r=yi(B,f),r.ref=a.ref,r.return=a,a.child=r}function Mw(r,a,l,f,g){if(r!==null){var B=r.memoizedProps;if(Oo(B,f)&&r.ref===a.ref)if(Ge=!1,a.pendingProps=f=B,Rg(r,g))(r.flags&131072)!==0&&(Ge=!0);else return a.lanes=r.lanes,Fi(r,a,g)}return Sg(r,a,l,f,g)}function Lw(r,a,l){var f=a.pendingProps,g=f.children,B=r!==null?r.memoizedState:null;if(f.mode==="hidden"){if((a.flags&128)!==0){if(f=B!==null?B.baseLanes|l:l,r!==null){for(g=a.child=r.child,B=0;g!==null;)B=B|g.lanes|g.childLanes,g=g.sibling;a.childLanes=B&~f}else a.childLanes=0,a.child=null;return Rw(r,a,f,l)}if((l&536870912)!==0)a.memoizedState={baseLanes:0,cachePool:null},r!==null&&$c(a,B!==null?B.cachePool:null),B!==null?M0(a,B):lg(),Cw(a);else return a.lanes=a.childLanes=536870912,Rw(r,a,B!==null?B.baseLanes|l:l,l)}else B!==null?($c(a,B.cachePool),M0(a,B),pr(),a.memoizedState=null):(r!==null&&$c(a,null),lg(),pr());return eA(r,a,g,l),a.child}function Rw(r,a,l,f){var g=ng();return g=g===null?null:{parent:ke._currentValue,pool:g},a.memoizedState={baseLanes:l,cachePool:g},r!==null&&$c(a,null),lg(),Cw(a),r!==null&&Ro(r,a,f,!0),null}function du(r,a){var l=a.ref;if(l===null)r!==null&&r.ref!==null&&(a.flags|=4194816);else{if(typeof l!="function"&&typeof l!="object")throw Error(n(284));(r===null||r.ref!==l)&&(a.flags|=4194816)}}function Sg(r,a,l,f,g){return ps(a),l=fg(r,a,l,f,void 0,g),f=hg(),r!==null&&!Ge?(dg(r,a,g),Fi(r,a,g)):(Pt&&f&&Yd(a),a.flags|=1,eA(r,a,l,g),a.child)}function Iw(r,a,l,f,g,B){return ps(a),a.updateQueue=null,l=R0(a,f,l,g),L0(r),f=hg(),r!==null&&!Ge?(dg(r,a,B),Fi(r,a,B)):(Pt&&f&&Yd(a),a.flags|=1,eA(r,a,l,B),a.child)}function Nw(r,a,l,f,g){if(ps(a),a.stateNode===null){var B=ga,y=l.contextType;typeof y=="object"&&y!==null&&(B=uA(y)),B=new l(f,B),a.memoizedState=B.state!==null&&B.state!==void 0?B.state:null,B.updater=Eg,a.stateNode=B,B._reactInternals=a,B=a.stateNode,B.props=f,B.state=a.memoizedState,B.refs={},rg(a),y=l.contextType,B.context=typeof y=="object"&&y!==null?uA(y):ga,B.state=a.memoizedState,y=l.getDerivedStateFromProps,typeof y=="function"&&(Ug(a,l,y,f),B.state=a.memoizedState),typeof l.getDerivedStateFromProps=="function"||typeof B.getSnapshotBeforeUpdate=="function"||typeof B.UNSAFE_componentWillMount!="function"&&typeof B.componentWillMount!="function"||(y=B.state,typeof B.componentWillMount=="function"&&B.componentWillMount(),typeof B.UNSAFE_componentWillMount=="function"&&B.UNSAFE_componentWillMount(),y!==B.state&&Eg.enqueueReplaceState(B,B.state,null),Po(a,f,B,g),Vo(),B.state=a.memoizedState),typeof B.componentDidMount=="function"&&(a.flags|=4194308),f=!0}else if(r===null){B=a.stateNode;var x=a.memoizedProps,O=vs(l,x);B.props=O;var K=B.context,X=l.contextType;y=ga,typeof X=="object"&&X!==null&&(y=uA(X));var $=l.getDerivedStateFromProps;X=typeof $=="function"||typeof B.getSnapshotBeforeUpdate=="function",x=a.pendingProps!==x,X||typeof B.UNSAFE_componentWillReceiveProps!="function"&&typeof B.componentWillReceiveProps!="function"||(x||K!==y)&&xw(a,B,f,y),ur=!1;var V=a.memoizedState;B.state=V,Po(a,f,B,g),Vo(),K=a.memoizedState,x||V!==K||ur?(typeof $=="function"&&(Ug(a,l,$,f),K=a.memoizedState),(O=ur||_w(a,l,O,f,V,K,y))?(X||typeof B.UNSAFE_componentWillMount!="function"&&typeof B.componentWillMount!="function"||(typeof B.componentWillMount=="function"&&B.componentWillMount(),typeof B.UNSAFE_componentWillMount=="function"&&B.UNSAFE_componentWillMount()),typeof B.componentDidMount=="function"&&(a.flags|=4194308)):(typeof B.componentDidMount=="function"&&(a.flags|=4194308),a.memoizedProps=f,a.memoizedState=K),B.props=f,B.state=K,B.context=y,f=O):(typeof B.componentDidMount=="function"&&(a.flags|=4194308),f=!1)}else{B=a.stateNode,sg(r,a),y=a.memoizedProps,X=vs(l,y),B.props=X,$=a.pendingProps,V=B.context,K=l.contextType,O=ga,typeof K=="object"&&K!==null&&(O=uA(K)),x=l.getDerivedStateFromProps,(K=typeof x=="function"||typeof B.getSnapshotBeforeUpdate=="function")||typeof B.UNSAFE_componentWillReceiveProps!="function"&&typeof B.componentWillReceiveProps!="function"||(y!==$||V!==O)&&xw(a,B,f,O),ur=!1,V=a.memoizedState,B.state=V,Po(a,f,B,g),Vo();var P=a.memoizedState;y!==$||V!==P||ur||r!==null&&r.dependencies!==null&&Yc(r.dependencies)?(typeof x=="function"&&(Ug(a,l,x,f),P=a.memoizedState),(X=ur||_w(a,l,X,f,V,P,O)||r!==null&&r.dependencies!==null&&Yc(r.dependencies))?(K||typeof B.UNSAFE_componentWillUpdate!="function"&&typeof B.componentWillUpdate!="function"||(typeof B.componentWillUpdate=="function"&&B.componentWillUpdate(f,P,O),typeof B.UNSAFE_componentWillUpdate=="function"&&B.UNSAFE_componentWillUpdate(f,P,O)),typeof B.componentDidUpdate=="function"&&(a.flags|=4),typeof B.getSnapshotBeforeUpdate=="function"&&(a.flags|=1024)):(typeof B.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof B.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),a.memoizedProps=f,a.memoizedState=P),B.props=f,B.state=P,B.context=O,f=X):(typeof B.componentDidUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=4),typeof B.getSnapshotBeforeUpdate!="function"||y===r.memoizedProps&&V===r.memoizedState||(a.flags|=1024),f=!1)}return B=f,du(r,a),f=(a.flags&128)!==0,B||f?(B=a.stateNode,l=f&&typeof l.getDerivedStateFromError!="function"?null:B.render(),a.flags|=1,r!==null&&f?(a.child=xa(a,r.child,null,g),a.child=xa(a,null,l,g)):eA(r,a,l,g),a.memoizedState=B.state,r=a.child):r=Fi(r,a,g),r}function kw(r,a,l,f){return Mo(),a.flags|=256,eA(r,a,l,f),a.child}var Hg={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Og(r){return{baseLanes:r,cachePool:U0()}}function Tg(r,a,l){return r=r!==null?r.childLanes&~l:0,a&&(r|=pn),r}function Kw(r,a,l){var f=a.pendingProps,g=!1,B=(a.flags&128)!==0,y;if((y=B)||(y=r!==null&&r.memoizedState===null?!1:(Ke.current&2)!==0),y&&(g=!0,a.flags&=-129),y=(a.flags&32)!==0,a.flags&=-33,r===null){if(Pt){if(g?gr(a):pr(),Pt){var x=xe,O;if(O=x){t:{for(O=x,x=Zn;O.nodeType!==8;){if(!x){x=null;break t}if(O=Hn(O.nextSibling),O===null){x=null;break t}}x=O}x!==null?(a.memoizedState={dehydrated:x,treeContext:us!==null?{id:Ci,overflow:_i}:null,retryLane:536870912,hydrationErrors:null},O=VA(18,null,null,0),O.stateNode=x,O.return=a,a.child=O,_A=a,xe=null,O=!0):O=!1}O||ds(a)}if(x=a.memoizedState,x!==null&&(x=x.dehydrated,x!==null))return pp(x)?a.lanes=32:a.lanes=536870912,null;Ei(a)}return x=f.children,f=f.fallback,g?(pr(),g=a.mode,x=gu({mode:"hidden",children:x},g),f=cs(f,g,l,null),x.return=a,f.return=a,x.sibling=f,a.child=x,g=a.child,g.memoizedState=Og(l),g.childLanes=Tg(r,y,l),a.memoizedState=Hg,f):(gr(a),Dg(a,x))}if(O=r.memoizedState,O!==null&&(x=O.dehydrated,x!==null)){if(B)a.flags&256?(gr(a),a.flags&=-257,a=Mg(r,a,l)):a.memoizedState!==null?(pr(),a.child=r.child,a.flags|=128,a=null):(pr(),g=f.fallback,x=a.mode,f=gu({mode:"visible",children:f.children},x),g=cs(g,x,l,null),g.flags|=2,f.return=a,g.return=a,f.sibling=g,a.child=f,xa(a,r.child,null,l),f=a.child,f.memoizedState=Og(l),f.childLanes=Tg(r,y,l),a.memoizedState=Hg,a=g);else if(gr(a),pp(x)){if(y=x.nextSibling&&x.nextSibling.dataset,y)var K=y.dgst;y=K,f=Error(n(419)),f.stack="",f.digest=y,Lo({value:f,source:null,stack:null}),a=Mg(r,a,l)}else if(Ge||Ro(r,a,l,!1),y=(l&r.childLanes)!==0,Ge||y){if(y=se,y!==null&&(f=l&-l,f=(f&42)!==0?1:oA(f),f=(f&(y.suspendedLanes|l))!==0?0:f,f!==0&&f!==O.retryLane))throw O.retryLane=f,da(r,f),ZA(y,r,f),Ow;x.data==="$?"||qg(),a=Mg(r,a,l)}else x.data==="$?"?(a.flags|=192,a.child=r.child,a=null):(r=O.treeContext,xe=Hn(x.nextSibling),_A=a,Pt=!0,hs=null,Zn=!1,r!==null&&(hn[dn++]=Ci,hn[dn++]=_i,hn[dn++]=us,Ci=r.id,_i=r.overflow,us=a),a=Dg(a,f.children),a.flags|=4096);return a}return g?(pr(),g=f.fallback,x=a.mode,O=r.child,K=O.sibling,f=yi(O,{mode:"hidden",children:f.children}),f.subtreeFlags=O.subtreeFlags&65011712,K!==null?g=yi(K,g):(g=cs(g,x,l,null),g.flags|=2),g.return=a,f.return=a,f.sibling=g,a.child=f,f=g,g=a.child,x=r.child.memoizedState,x===null?x=Og(l):(O=x.cachePool,O!==null?(K=ke._currentValue,O=O.parent!==K?{parent:K,pool:K}:O):O=U0(),x={baseLanes:x.baseLanes|l,cachePool:O}),g.memoizedState=x,g.childLanes=Tg(r,y,l),a.memoizedState=Hg,f):(gr(a),l=r.child,r=l.sibling,l=yi(l,{mode:"visible",children:f.children}),l.return=a,l.sibling=null,r!==null&&(y=a.deletions,y===null?(a.deletions=[r],a.flags|=16):y.push(r)),a.child=l,a.memoizedState=null,l)}function Dg(r,a){return a=gu({mode:"visible",children:a},r.mode),a.return=r,r.child=a}function gu(r,a){return r=VA(22,r,null,a),r.lanes=0,r.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},r}function Mg(r,a,l){return xa(a,r.child,null,l),r=Dg(a,a.pendingProps.children),r.flags|=2,a.memoizedState=null,r}function zw(r,a,l){r.lanes|=a;var f=r.alternate;f!==null&&(f.lanes|=a),qd(r.return,a,l)}function Lg(r,a,l,f,g){var B=r.memoizedState;B===null?r.memoizedState={isBackwards:a,rendering:null,renderingStartTime:0,last:f,tail:l,tailMode:g}:(B.isBackwards=a,B.rendering=null,B.renderingStartTime=0,B.last=f,B.tail=l,B.tailMode=g)}function Vw(r,a,l){var f=a.pendingProps,g=f.revealOrder,B=f.tail;if(eA(r,a,f.children,l),f=Ke.current,(f&2)!==0)f=f&1|2,a.flags|=128;else{if(r!==null&&(r.flags&128)!==0)t:for(r=a.child;r!==null;){if(r.tag===13)r.memoizedState!==null&&zw(r,l,a);else if(r.tag===19)zw(r,l,a);else if(r.child!==null){r.child.return=r,r=r.child;continue}if(r===a)break t;for(;r.sibling===null;){if(r.return===null||r.return===a)break t;r=r.return}r.sibling.return=r.return,r=r.sibling}f&=1}switch(tt(Ke,f),g){case"forwards":for(l=a.child,g=null;l!==null;)r=l.alternate,r!==null&&uu(r)===null&&(g=l),l=l.sibling;l=g,l===null?(g=a.child,a.child=null):(g=l.sibling,l.sibling=null),Lg(a,!1,g,l,B);break;case"backwards":for(l=null,g=a.child,a.child=null;g!==null;){if(r=g.alternate,r!==null&&uu(r)===null){a.child=g;break}r=g.sibling,g.sibling=l,l=g,g=r}Lg(a,!0,l,null,B);break;case"together":Lg(a,!1,null,null,void 0);break;default:a.memoizedState=null}return a.child}function Fi(r,a,l){if(r!==null&&(a.dependencies=r.dependencies),br|=a.lanes,(l&a.childLanes)===0)if(r!==null){if(Ro(r,a,l,!1),(l&a.childLanes)===0)return null}else return null;if(r!==null&&a.child!==r.child)throw Error(n(153));if(a.child!==null){for(r=a.child,l=yi(r,r.pendingProps),a.child=l,l.return=a;r.sibling!==null;)r=r.sibling,l=l.sibling=yi(r,r.pendingProps),l.return=a;l.sibling=null}return a.child}function Rg(r,a){return(r.lanes&a)!==0?!0:(r=r.dependencies,!!(r!==null&&Yc(r)))}function S1(r,a,l){switch(a.tag){case 3:Kt(a,a.stateNode.containerInfo),cr(a,ke,r.memoizedState.cache),Mo();break;case 27:case 5:An(a);break;case 4:Kt(a,a.stateNode.containerInfo);break;case 10:cr(a,a.type,a.memoizedProps.value);break;case 13:var f=a.memoizedState;if(f!==null)return f.dehydrated!==null?(gr(a),a.flags|=128,null):(l&a.child.childLanes)!==0?Kw(r,a,l):(gr(a),r=Fi(r,a,l),r!==null?r.sibling:null);gr(a);break;case 19:var g=(r.flags&128)!==0;if(f=(l&a.childLanes)!==0,f||(Ro(r,a,l,!1),f=(l&a.childLanes)!==0),g){if(f)return Vw(r,a,l);a.flags|=128}if(g=a.memoizedState,g!==null&&(g.rendering=null,g.tail=null,g.lastEffect=null),tt(Ke,Ke.current),f)break;return null;case 22:case 23:return a.lanes=0,Lw(r,a,l);case 24:cr(a,ke,r.memoizedState.cache)}return Fi(r,a,l)}function Pw(r,a,l){if(r!==null)if(r.memoizedProps!==a.pendingProps)Ge=!0;else{if(!Rg(r,l)&&(a.flags&128)===0)return Ge=!1,S1(r,a,l);Ge=(r.flags&131072)!==0}else Ge=!1,Pt&&(a.flags&1048576)!==0&&w0(a,Zc,a.index);switch(a.lanes=0,a.tag){case 16:t:{r=a.pendingProps;var f=a.elementType,g=f._init;if(f=g(f._payload),a.type=f,typeof f=="function")Gd(f)?(r=vs(f,r),a.tag=1,a=Nw(null,a,f,r,l)):(a.tag=0,a=Sg(null,a,f,r,l));else{if(f!=null){if(g=f.$$typeof,g===H){a.tag=11,a=Tw(null,a,f,r,l);break t}else if(g===L){a.tag=14,a=Dw(null,a,f,r,l);break t}}throw a=ut(f)||f,Error(n(306,a,""))}}return a;case 0:return Sg(r,a,a.type,a.pendingProps,l);case 1:return f=a.type,g=vs(f,a.pendingProps),Nw(r,a,f,g,l);case 3:t:{if(Kt(a,a.stateNode.containerInfo),r===null)throw Error(n(387));f=a.pendingProps;var B=a.memoizedState;g=B.element,sg(r,a),Po(a,f,null,l);var y=a.memoizedState;if(f=y.cache,cr(a,ke,f),f!==B.cache&&tg(a,[ke],l,!0),Vo(),f=y.element,B.isDehydrated)if(B={element:f,isDehydrated:!1,cache:y.cache},a.updateQueue.baseState=B,a.memoizedState=B,a.flags&256){a=kw(r,a,f,l);break t}else if(f!==g){g=un(Error(n(424)),a),Lo(g),a=kw(r,a,f,l);break t}else{switch(r=a.stateNode.containerInfo,r.nodeType){case 9:r=r.body;break;default:r=r.nodeName==="HTML"?r.ownerDocument.body:r}for(xe=Hn(r.firstChild),_A=a,Pt=!0,hs=null,Zn=!0,l=yw(a,null,f,l),a.child=l;l;)l.flags=l.flags&-3|4096,l=l.sibling}else{if(Mo(),f===g){a=Fi(r,a,l);break t}eA(r,a,f,l)}a=a.child}return a;case 26:return du(r,a),r===null?(l=Zb(a.type,null,a.pendingProps,null))?a.memoizedState=l:Pt||(l=a.type,r=a.pendingProps,f=Fu(at.current).createElement(l),f[it]=a,f[pt]=r,nA(f,l,r),Oe(f),a.stateNode=f):a.memoizedState=Zb(a.type,r.memoizedProps,a.pendingProps,r.memoizedState),null;case 27:return An(a),r===null&&Pt&&(f=a.stateNode=jb(a.type,a.pendingProps,at.current),_A=a,Zn=!0,g=xe,xr(a.type)?(Bp=g,xe=Hn(f.firstChild)):xe=g),eA(r,a,a.pendingProps.children,l),du(r,a),r===null&&(a.flags|=4194304),a.child;case 5:return r===null&&Pt&&((g=f=xe)&&(f=iH(f,a.type,a.pendingProps,Zn),f!==null?(a.stateNode=f,_A=a,xe=Hn(f.firstChild),Zn=!1,g=!0):g=!1),g||ds(a)),An(a),g=a.type,B=a.pendingProps,y=r!==null?r.memoizedProps:null,f=B.children,hp(g,B)?f=null:y!==null&&hp(g,y)&&(a.flags|=32),a.memoizedState!==null&&(g=fg(r,a,y1,null,null,l),fl._currentValue=g),du(r,a),eA(r,a,f,l),a.child;case 6:return r===null&&Pt&&((r=l=xe)&&(l=rH(l,a.pendingProps,Zn),l!==null?(a.stateNode=l,_A=a,xe=null,r=!0):r=!1),r||ds(a)),null;case 13:return Kw(r,a,l);case 4:return Kt(a,a.stateNode.containerInfo),f=a.pendingProps,r===null?a.child=xa(a,null,f,l):eA(r,a,f,l),a.child;case 11:return Tw(r,a,a.type,a.pendingProps,l);case 7:return eA(r,a,a.pendingProps,l),a.child;case 8:return eA(r,a,a.pendingProps.children,l),a.child;case 12:return eA(r,a,a.pendingProps.children,l),a.child;case 10:return f=a.pendingProps,cr(a,a.type,f.value),eA(r,a,f.children,l),a.child;case 9:return g=a.type._context,f=a.pendingProps.children,ps(a),g=uA(g),f=f(g),a.flags|=1,eA(r,a,f,l),a.child;case 14:return Dw(r,a,a.type,a.pendingProps,l);case 15:return Mw(r,a,a.type,a.pendingProps,l);case 19:return Vw(r,a,l);case 31:return f=a.pendingProps,l=a.mode,f={mode:f.mode,children:f.children},r===null?(l=gu(f,l),l.ref=a.ref,a.child=l,l.return=a,a=l):(l=yi(r.child,f),l.ref=a.ref,a.child=l,l.return=a,a=l),a;case 22:return Lw(r,a,l);case 24:return ps(a),f=uA(ke),r===null?(g=ng(),g===null&&(g=se,B=eg(),g.pooledCache=B,B.refCount++,B!==null&&(g.pooledCacheLanes|=l),g=B),a.memoizedState={parent:f,cache:g},rg(a),cr(a,ke,g)):((r.lanes&l)!==0&&(sg(r,a),Po(a,null,null,l),Vo()),g=r.memoizedState,B=a.memoizedState,g.parent!==f?(g={parent:f,cache:f},a.memoizedState=g,a.lanes===0&&(a.memoizedState=a.updateQueue.baseState=g),cr(a,ke,f)):(f=B.cache,cr(a,ke,f),f!==g.cache&&tg(a,[ke],l,!0))),eA(r,a,a.pendingProps.children,l),a.child;case 29:throw a.pendingProps}throw Error(n(156,a.tag))}function Si(r){r.flags|=4}function jw(r,a){if(a.type!=="stylesheet"||(a.state.loading&4)!==0)r.flags&=-16777217;else if(r.flags|=16777216,!qb(a)){if(a=gn.current,a!==null&&((Lt&4194048)===Lt?Yn!==null:(Lt&62914560)!==Lt&&(Lt&536870912)===0||a!==Yn))throw Ko=ig,E0;r.flags|=8192}}function pu(r,a){a!==null&&(r.flags|=4),r.flags&16384&&(a=r.tag!==22?mi():536870912,r.lanes|=a,Fa|=a)}function $o(r,a){if(!Pt)switch(r.tailMode){case"hidden":a=r.tail;for(var l=null;a!==null;)a.alternate!==null&&(l=a),a=a.sibling;l===null?r.tail=null:l.sibling=null;break;case"collapsed":l=r.tail;for(var f=null;l!==null;)l.alternate!==null&&(f=l),l=l.sibling;f===null?a||r.tail===null?r.tail=null:r.tail.sibling=null:f.sibling=null}}function ye(r){var a=r.alternate!==null&&r.alternate.child===r.child,l=0,f=0;if(a)for(var g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags&65011712,f|=g.flags&65011712,g.return=r,g=g.sibling;else for(g=r.child;g!==null;)l|=g.lanes|g.childLanes,f|=g.subtreeFlags,f|=g.flags,g.return=r,g=g.sibling;return r.subtreeFlags|=f,r.childLanes=l,a}function H1(r,a,l){var f=a.pendingProps;switch(Wd(a),a.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ye(a),null;case 1:return ye(a),null;case 3:return l=a.stateNode,f=null,r!==null&&(f=r.memoizedState.cache),a.memoizedState.cache!==f&&(a.flags|=2048),Qi(ke),Yt(),l.pendingContext&&(l.context=l.pendingContext,l.pendingContext=null),(r===null||r.child===null)&&(Do(a)?Si(a):r===null||r.memoizedState.isDehydrated&&(a.flags&256)===0||(a.flags|=1024,C0())),ye(a),null;case 26:return l=a.memoizedState,r===null?(Si(a),l!==null?(ye(a),jw(a,l)):(ye(a),a.flags&=-16777217)):l?l!==r.memoizedState?(Si(a),ye(a),jw(a,l)):(ye(a),a.flags&=-16777217):(r.memoizedProps!==f&&Si(a),ye(a),a.flags&=-16777217),null;case 27:Pe(a),l=at.current;var g=a.type;if(r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Si(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return ye(a),null}r=Y.current,Do(a)?b0(a):(r=jb(g,f,l),a.stateNode=r,Si(a))}return ye(a),null;case 5:if(Pe(a),l=a.type,r!==null&&a.stateNode!=null)r.memoizedProps!==f&&Si(a);else{if(!f){if(a.stateNode===null)throw Error(n(166));return ye(a),null}if(r=Y.current,Do(a))b0(a);else{switch(g=Fu(at.current),r){case 1:r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case 2:r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;default:switch(l){case"svg":r=g.createElementNS("http://www.w3.org/2000/svg",l);break;case"math":r=g.createElementNS("http://www.w3.org/1998/Math/MathML",l);break;case"script":r=g.createElement("div"),r.innerHTML=" - + +
diff --git a/vite-app/src/GlobalState.tsx b/vite-app/src/GlobalState.tsx index 94f760c5..69ba2385 100644 --- a/vite-app/src/GlobalState.tsx +++ b/vite-app/src/GlobalState.tsx @@ -22,6 +22,12 @@ const DEFAULT_PAGINATION_CONFIG = { pageSize: 25, }; +// Default sort configuration +const DEFAULT_SORT_CONFIG = { + sortField: "created_at", + sortDirection: "desc" as "asc" | "desc", +}; + export class GlobalState { isConnected: boolean = false; // rollout_id -> EvaluationRow @@ -37,6 +43,9 @@ export class GlobalState { // Pagination configuration currentPage: number; pageSize: number; + // Sort configuration + sortField: string; + sortDirection: "asc" | "desc"; // Loading state isLoading: boolean = true; @@ -64,6 +73,10 @@ export class GlobalState { const paginationConfig = this.loadPaginationConfig(); this.currentPage = paginationConfig.currentPage; this.pageSize = paginationConfig.pageSize; + // Load sort config from localStorage or use defaults + const sortConfig = this.loadSortConfig(); + this.sortField = sortConfig.sortField; + this.sortDirection = sortConfig.sortDirection; makeAutoObservable(this); } @@ -114,6 +127,21 @@ export class GlobalState { return DEFAULT_PAGINATION_CONFIG; } + // Load sort configuration from localStorage + private loadSortConfig() { + try { + const stored = localStorage.getItem("sortConfig"); + if (stored) { + const parsed = JSON.parse(stored); + // Merge with defaults to handle any missing properties + return { ...DEFAULT_SORT_CONFIG, ...parsed }; + } + } catch (error) { + console.warn("Failed to load sort config from localStorage:", error); + } + return DEFAULT_SORT_CONFIG; + } + // Save pivot configuration to localStorage private savePivotConfig() { if (this.savePivotConfigTimer) clearTimeout(this.savePivotConfigTimer); @@ -160,6 +188,24 @@ export class GlobalState { }, 200); } + // Save sort configuration to localStorage + private saveSortConfig() { + if (this.saveFilterConfigTimer) clearTimeout(this.saveFilterConfigTimer); + this.saveFilterConfigTimer = setTimeout(() => { + try { + localStorage.setItem( + "sortConfig", + JSON.stringify({ + sortField: this.sortField, + sortDirection: this.sortDirection, + }) + ); + } catch (error) { + console.warn("Failed to save sort config to localStorage:", error); + } + }, 200); + } + // Update pivot configuration and save to localStorage updatePivotConfig(updates: Partial) { Object.assign(this.pivotConfig, updates); @@ -191,6 +237,29 @@ export class GlobalState { this.savePaginationConfig(); } + // Update sort configuration and save to localStorage + updateSortConfig( + updates: Partial<{ sortField: string; sortDirection: "asc" | "desc" }> + ) { + Object.assign(this, updates); + // Reset to first page when sorting changes + this.currentPage = 1; + this.saveSortConfig(); + } + + // Handle sort field click - toggle direction if same field, set to asc if new field + handleSortFieldClick(field: string) { + if (this.sortField === field) { + // Toggle direction for same field + this.sortDirection = this.sortDirection === "asc" ? "desc" : "asc"; + } else { + // New field, set to ascending + this.sortField = field; + this.sortDirection = "asc"; + } + this.saveSortConfig(); + } + // Reset pivot configuration to defaults resetPivotConfig() { this.pivotConfig = { ...DEFAULT_PIVOT_CONFIG }; @@ -211,6 +280,13 @@ export class GlobalState { this.savePaginationConfig(); } + // Reset sort configuration to defaults + resetSortConfig() { + this.sortField = DEFAULT_SORT_CONFIG.sortField; + this.sortDirection = DEFAULT_SORT_CONFIG.sortDirection; + this.saveSortConfig(); + } + // Set current page setCurrentPage(page: number) { this.currentPage = page; @@ -286,9 +362,48 @@ export class GlobalState { // Computed values following MobX best practices get sortedIds() { - return Object.keys(this.dataset).sort( - (a, b) => (this.createdAtMsById[b] ?? 0) - (this.createdAtMsById[a] ?? 0) - ); + const ids = Object.keys(this.dataset); + + if (this.sortField === "created_at") { + // Special case for created_at - use cached timestamp + return ids.sort((a, b) => { + const aTime = this.createdAtMsById[a] ?? 0; + const bTime = this.createdAtMsById[b] ?? 0; + return this.sortDirection === "asc" ? aTime - bTime : bTime - aTime; + }); + } + + // For other fields, sort by flattened data + return ids.sort((a, b) => { + const aFlat = this.flattenedById[a]; + const bFlat = this.flattenedById[b]; + + if (!aFlat || !bFlat) return 0; + + const aValue = aFlat[this.sortField]; + const bValue = bFlat[this.sortField]; + + // Handle undefined values + if (aValue === undefined && bValue === undefined) return 0; + if (aValue === undefined) return this.sortDirection === "asc" ? -1 : 1; + if (bValue === undefined) return this.sortDirection === "asc" ? 1 : -1; + + // Handle different types + if (typeof aValue === "string" && typeof bValue === "string") { + const comparison = aValue.localeCompare(bValue); + return this.sortDirection === "asc" ? comparison : -comparison; + } + + if (typeof aValue === "number" && typeof bValue === "number") { + return this.sortDirection === "asc" ? aValue - bValue : bValue - aValue; + } + + // Fallback to string comparison + const aStr = String(aValue); + const bStr = String(bValue); + const comparison = aStr.localeCompare(bStr); + return this.sortDirection === "asc" ? comparison : -comparison; + }); } get sortedDataset() { diff --git a/vite-app/src/components/ChartExport.tsx b/vite-app/src/components/ChartExport.tsx index 755f7201..0457df18 100644 --- a/vite-app/src/components/ChartExport.tsx +++ b/vite-app/src/components/ChartExport.tsx @@ -48,6 +48,10 @@ interface ChartExportProps> { * Whether to show column totals */ showColumnTotals?: boolean; + /** + * Whether to hide the component content + */ + hidden?: boolean; } type ChartType = "bar" | "line" | "doughnut" | "pie"; @@ -59,6 +63,7 @@ const ChartExport = >({ valueField, aggregator, chartType = "bar", + hidden = false, }: ChartExportProps) => { const chartRef = useRef(null); const [selectedChartType, setSelectedChartType] = @@ -142,32 +147,12 @@ const ChartExport = >({ const chartData = getChartData(); - // Don't render chart if no data - if (!chartData.labels.length || !chartData.datasets.length) { - return ( -
-
- No data available for chart visualization. Please select row and - column fields. -
-
- ); - } - - // Additional safety check for line charts - if ( - selectedChartType === "line" && - chartData.datasets.some((dataset) => dataset.data.length === 0) - ) { - return ( -
-
- Line charts require data in all datasets. Please check your pivot - configuration. -
-
- ); - } + // Check if we have valid data for rendering + const hasValidData = + chartData.labels.length > 0 && chartData.datasets.length > 0; + const hasValidLineChartData = + selectedChartType !== "line" || + !chartData.datasets.some((dataset) => dataset.data.length === 0); const chartOptions = { responsive: true, @@ -256,48 +241,81 @@ const ChartExport = >({ { value: "pie", label: "Pie Chart" }, ]; + // Always render the component, but conditionally show content return ( -
-
-

Chart Export

-
- - + <> + {hidden && null} + + {!hidden && !hasValidData && ( +
+
+

Chart Export

+
+
+ No data available for chart visualization. Please select row and + column fields. +
+
+ )} + + {!hidden && hasValidData && !hasValidLineChartData && ( +
+
+

Chart Export

+
+
+ Line charts require data in all datasets. Please check your pivot + configuration. +
-
+ )} -
- Visualize your pivot table data as a chart and export it as a - high-resolution PNG image. You can adjust your browser window size to - change the exported image dimensions. -
+ {!hidden && hasValidData && hasValidLineChartData && ( +
+
+

Chart Export

+
+ + +
+
-
- -
-
+
+ Visualize your pivot table data as a chart and export it as a + high-resolution PNG image. You can adjust your browser window size + to change the exported image dimensions. +
+ +
+ +
+
+ )} + ); }; diff --git a/vite-app/src/components/EvaluationRow.tsx b/vite-app/src/components/EvaluationRow.tsx index 346f57d9..581c6fab 100644 --- a/vite-app/src/components/EvaluationRow.tsx +++ b/vite-app/src/components/EvaluationRow.tsx @@ -162,6 +162,38 @@ const RowStatus = observer( ) ); +const ExperimentId = observer( + ({ experimentId: experimentId }: { experimentId?: string }) => { + debugger; + if (!experimentId) { + return null; + } + return ( + + {experimentId} + + ); + } +); + +const RunId = observer(({ runId: runId }: { runId?: string }) => { + if (!runId) { + return null; + } + return ( + {runId} + ); +}); + +const RowId = observer(({ rowId: rowId }: { rowId?: string }) => { + if (!rowId) { + return null; + } + return ( + {rowId} + ); +}); + const RolloutId = observer( ({ rolloutId: rolloutId }: { rolloutId?: string }) => { if (!rolloutId) { @@ -399,6 +431,23 @@ export const EvaluationRow = observer( /> + {/* Experiment ID */} + + + + + {/* Run ID */} + + + + + {/* Row ID */} + + + + {/* Rollout ID */} diff --git a/vite-app/src/components/EvaluationTable.tsx b/vite-app/src/components/EvaluationTable.tsx index 8650000b..e4175eec 100644 --- a/vite-app/src/components/EvaluationTable.tsx +++ b/vite-app/src/components/EvaluationTable.tsx @@ -8,6 +8,7 @@ import { TableHeader, TableHead, TableBody as TableBodyBase, + SortableTableHeader, } from "./TableContainer"; const TableBody = observer( @@ -51,6 +52,10 @@ export const EvaluationTable = observer(() => { state.updateFilterConfig(filters); }; + const handleSort = (field: string) => { + state.handleSortFieldClick(field); + }; + return (
{/* Filter Controls */} @@ -160,14 +165,94 @@ export const EvaluationTable = observer(() => {   - Name - Eval Status - Rollout Status - Invocation ID - Rollout ID - Model - Score - Created + + Name + + + Eval Status + + + Rollout Status + + + Invocation ID + + + Experiment ID + + + Run ID + + + Row ID + + + Rollout ID + + + Model + + + Score + + + Created + diff --git a/vite-app/src/components/PivotTab.tsx b/vite-app/src/components/PivotTab.tsx index 4a928998..27a6259b 100644 --- a/vite-app/src/components/PivotTab.tsx +++ b/vite-app/src/components/PivotTab.tsx @@ -1,4 +1,5 @@ import { observer } from "mobx-react"; +import { useMemo, useCallback } from "react"; import PivotTable from "./PivotTable"; import ChartExport from "./ChartExport"; import SearchableSelect from "./SearchableSelect"; @@ -154,17 +155,38 @@ const PivotTab = observer(() => { showColumnTotals: true, }); - const updateValueField = (value: string) => { + // Memoize field handlers to prevent unnecessary re-renders + const rowFieldHandlers = useMemo( + () => + createFieldHandlerSet(pivotConfig.selectedRowFields, (fields) => + updatePivotConfig({ selectedRowFields: fields }) + ), + [pivotConfig.selectedRowFields] + ); + + const columnFieldHandlers = useMemo( + () => + createFieldHandlerSet(pivotConfig.selectedColumnFields, (fields) => + updatePivotConfig({ selectedColumnFields: fields }) + ), + [pivotConfig.selectedColumnFields] + ); + + const updateValueField = useCallback((value: string) => { updatePivotConfig({ selectedValueField: value }); - }; + }, []); - const updateAggregator = (value: string) => { + const updateAggregator = useCallback((value: string) => { updatePivotConfig({ selectedAggregator: value }); - }; + }, []); - const updateFilters = (filters: FilterGroup[]) => { + const updateFilters = useCallback((filters: FilterGroup[]) => { updateFilterConfig(filters); - }; + }, []); + + // Memoize data and filter function to prevent unnecessary re-renders + const flattenedDataset = useMemo(() => getFlattenedDataset(), []); + const filterFunction = useMemo(() => createFilterFunction(), []); return (
@@ -190,9 +212,7 @@ const PivotTab = observer(() => { - updatePivotConfig({ selectedRowFields: fields }) - )} + {...rowFieldHandlers} availableKeys={availableKeys} variant="row" /> @@ -200,9 +220,7 @@ const PivotTab = observer(() => { - updatePivotConfig({ selectedColumnFields: fields }) - )} + {...columnFieldHandlers} availableKeys={availableKeys} variant="column" /> @@ -237,27 +255,26 @@ const PivotTab = observer(() => { */} {/* Chart Export Component */} - {pivotData.hasValidConfiguration && ( - - )} +
); diff --git a/vite-app/src/components/TableContainer.tsx b/vite-app/src/components/TableContainer.tsx index c2df519c..d2ab76bc 100644 --- a/vite-app/src/components/TableContainer.tsx +++ b/vite-app/src/components/TableContainer.tsx @@ -30,6 +30,25 @@ export interface TableHeaderProps { nowrap?: boolean; } +export interface SortableTableHeaderProps extends TableHeaderProps { + /** + * The field name to sort by + */ + sortField: string; + /** + * Current sort field + */ + currentSortField: string; + /** + * Current sort direction + */ + currentSortDirection: "asc" | "desc"; + /** + * Click handler for sorting + */ + onSort: (field: string) => void; +} + export interface TableCellProps { /** * The cell content @@ -186,6 +205,88 @@ export function TableHeader({ ); } +/** + * Sortable table header component with click-to-sort functionality + */ +export function SortableTableHeader({ + children, + className = "", + align = "left", + nowrap = false, + sortField, + currentSortField, + currentSortDirection, + onSort, +}: SortableTableHeaderProps) { + const alignClasses = { + left: "text-left", + center: "text-center", + right: "text-right", + }; + + const isActive = currentSortField === sortField; + const sortIcon = isActive ? ( + currentSortDirection === "asc" ? ( + + + + ) : ( + + + + ) + ) : ( + + + + ); + + return ( + onSort(sortField)} + style={{ cursor: "pointer" }} + > +
+ {children} + {sortIcon} +
+ + ); +} + /** * Table row component with consistent styling */ diff --git a/vite-app/src/util/pivot.ts b/vite-app/src/util/pivot.ts index 45473243..aaa22e0c 100644 --- a/vite-app/src/util/pivot.ts +++ b/vite-app/src/util/pivot.ts @@ -277,7 +277,9 @@ export function computePivot>({ // Deterministic ordering rowKeyTuples.sort((a, b) => toKey(a).localeCompare(toKey(b))); - colKeyTuples.sort((a, b) => toKey(a).localeCompare(toKey(b))); + + // Sort columns by aggregate score (largest to smallest) instead of alphabetically + // We'll sort after calculating column totals, so we'll do it later type CellAgg = { value: number; records: T[] }; const cells: Record> = {}; @@ -357,6 +359,16 @@ export function computePivot>({ colTotals[cKey] = aggregate(columnValues, columnRecords, aggregator); } + // Sort columns by aggregate score (largest to smallest) based on column totals + colKeyTuples.sort((a, b) => { + const aKey = toKey(a); + const bKey = toKey(b); + const aTotal = colTotals[aKey] ?? 0; + const bTotal = colTotals[bKey] ?? 0; + // Sort from largest to smallest (descending order) + return bTotal - aTotal; + }); + // Grand total should follow the same aggregation semantics over the entire dataset // rather than summing per-row/per-column aggregates (which can be incorrect for // non-additive aggregations like "avg").