aauss commited on
Commit
78587a7
·
1 Parent(s): cc33222

Add first version of TCP metric.

Browse files
Files changed (7) hide show
  1. .gitignore +12 -0
  2. .python-version +1 -0
  3. README.md +1 -1
  4. pyproject.toml +11 -0
  5. tcp_accuracy.py +26 -12
  6. tests/test_metric.py +25 -0
  7. uv.lock +309 -0
.gitignore ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ .DS_Store
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.12
README.md CHANGED
@@ -1,7 +1,7 @@
1
  ---
2
  title: TCP Accuracy
3
  datasets:
4
- -
5
  tags:
6
  - evaluate
7
  - metric
 
1
  ---
2
  title: TCP Accuracy
3
  datasets:
4
+ - Beanbagdzf/TCP
5
  tags:
6
  - evaluate
7
  - metric
pyproject.toml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "tcp-accuracy"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ dependencies = [
8
+ "huggingface-hub<0.25",
9
+ "pytest>=9.0.2",
10
+ "ruff>=0.14.13",
11
+ ]
tcp_accuracy.py CHANGED
@@ -13,6 +13,8 @@
13
  # limitations under the License.
14
  """TODO: Add a description here."""
15
 
 
 
16
  import evaluate
17
  import datasets
18
 
@@ -61,6 +63,8 @@ BAD_WORDS_URL = "http://url/to/external/resource/bad_words.txt"
61
  class TCPAccuracy(evaluate.Metric):
62
  """TODO: Short description of my evaluation module."""
63
 
 
 
64
  def _info(self):
65
  # TODO: Specifies the evaluate.EvaluationModuleInfo object
66
  return evaluate.MetricInfo(
@@ -70,26 +74,36 @@ class TCPAccuracy(evaluate.Metric):
70
  citation=_CITATION,
71
  inputs_description=_KWARGS_DESCRIPTION,
72
  # This defines the format of each prediction and reference
73
- features=datasets.Features({
74
- 'predictions': datasets.Value('int64'),
75
- 'references': datasets.Value('int64'),
76
- }),
 
 
77
  # Homepage of the module for documentation
78
  homepage="http://module.homepage",
79
  # Additional links to the codebase or references
80
  codebase_urls=["http://github.com/path/to/codebase/of/new_module"],
81
- reference_urls=["http://path.to.reference.url/new_module"]
82
  )
83
 
84
- def _download_and_prepare(self, dl_manager):
85
- """Optional: download external resources useful to compute the scores"""
86
- # TODO: Download external resources if needed
87
- pass
 
88
 
89
- def _compute(self, predictions, references):
90
  """Returns the scores"""
91
  # TODO: Compute the different scores of the module
92
- accuracy = sum(i == j for i, j in zip(predictions, references)) / len(predictions)
 
 
 
 
 
 
 
93
  return {
94
  "accuracy": accuracy,
95
- }
 
13
  # limitations under the License.
14
  """TODO: Add a description here."""
15
 
16
+ import re
17
+
18
  import evaluate
19
  import datasets
20
 
 
63
  class TCPAccuracy(evaluate.Metric):
64
  """TODO: Short description of my evaluation module."""
65
 
66
+ BOXED_ANSWER_PATTERN = r"\\boxed\{([^}]*)\}"
67
+
68
  def _info(self):
69
  # TODO: Specifies the evaluate.EvaluationModuleInfo object
70
  return evaluate.MetricInfo(
 
74
  citation=_CITATION,
75
  inputs_description=_KWARGS_DESCRIPTION,
76
  # This defines the format of each prediction and reference
77
+ features=datasets.Features(
78
+ {
79
+ "predictions": datasets.Value("string"),
80
+ "references": datasets.Value("string"),
81
+ }
82
+ ),
83
  # Homepage of the module for documentation
84
  homepage="http://module.homepage",
85
  # Additional links to the codebase or references
86
  codebase_urls=["http://github.com/path/to/codebase/of/new_module"],
87
+ reference_urls=["http://path.to.reference.url/new_module"],
88
  )
89
 
90
+ def extract_boxed_answer(self, predictions):
91
+ match = re.search(self.BOXED_ANSWER_PATTERN, predictions, re.DOTALL)
92
+ if match:
93
+ return match.group(1).replace("GMT", "").strip()
94
+ return None
95
 
96
+ def _compute(self, predictions, references, subset: str | list[str]):
97
  """Returns the scores"""
98
  # TODO: Compute the different scores of the module
99
+ if isinstance(subset, str):
100
+ subset = [subset] * len(predictions)
101
+ predictions = [self.extract_boxed_answer(p) for p in predictions]
102
+ references = [
103
+ r.replace("GMT", "").strip() if s == "tcp_short" else r
104
+ for r, s in zip(references, subset)
105
+ ]
106
+ accuracy = [int(i == j) for i, j in zip(predictions, references)]
107
  return {
108
  "accuracy": accuracy,
109
+ }
tests/test_metric.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from textwrap import dedent
2
+ from tcp_accuracy import TCPAccuracy
3
+
4
+ response_1 = dedent("""\
5
+ 'We are given a project with three phases:\n\n1. **Develop Stimuli and Decision Protocol** – 1 day \n2. **Recruit Participants and Conduct Experimental Sessions** – 2 days \n3. **Analyze Data and Summarize Findings** – 2 days \n\nConstraints:\n\n- The project starts **next Tuesday** after the conversation on **2012-10-26**.\n- Dr. Vance (the lead) can work **no more than 2 consecutive days**, and must take **at least 2 days off** after every 2-day work block.\n- Ben Carter can also work **no more than 2 consecutive days**, and must take **at least 1 day off** after that (to work on coursework).\n- Dr. Vance is **unavailable on next Saturday** (i.e., 2012-11-02).\n- Tasks must be done in sequence:\n - Phase 1 → Phase 2 → Phase 3\n- Each task must be completed **before** the next one starts.\n- Only one person can work on a phase at a time.\n\nWe are to find the **earliest date** the project can be **completed**, i.e., when the final phase (data analysis and summarization) ends.\n\n---\n\n### Step 1: Determine the start date\n\nThe conversation is on **2012-10-26**.\n\nNext Tuesday is **2012-11-01**.\n\n✅ So, the project starts on **2012-11-01**.\n\n---\n\n### Step 2: Assign tasks in sequence\n\nWe must assign the phases in order:\n\n1. **Develop Stimuli and Decision Protocol** – 1 day (assigned to either Ben or Dr. Vance)\n2. **Recruit Participants and Conduct Experimental Sessions** – 2 days\n3. **Analyze Data and Summarize Findings** – 2 days\n\nEach person can work only up to 2 consecutive days, and must take a break after.\n\nWe want to **minimize total time**, so we should assign tasks to the person who can work more efficiently or with fewer breaks.\n\nBut both have constraints:\n\n- Dr. Vance: max 2 consecutive days, then **2 days off**.\n- Ben: max 2 consecutive days, then **1 day off**.\n\nAlso, Dr. Vance is **unavailable on 2012-11-02** (next Saturday).\n\n---\n\nLet’s try to assign the phases to minimize delays.\n\nWe have to do:\n\n- Phase 1: 1 day\n- Phase 2: 2 days\n- Phase 3: 2 days\n\nTotal work: 5 days.\n\nWe need to schedule these in sequence, with breaks as needed.\n\nLet’s consider who should do which phase.\n\n---\n\n### Option: Assign Phase 1 to Dr. Vance\n\nPhase 1: Dr. Vance works on **2012-11-01** (Day 1)\n\n→ Done on 2012-11-01\n\nNow, Phase 2: 2 days\n\nDr. Vance cannot work more than 2 consecutive days, and she is unavailable on 2012-11-02.\n\nSo she **cannot work on 2012-11-02**.\n\nTherefore, she **cannot work on both 2012-11-02 and 2012-11-03** (since 2012-11-02 is blocked).\n\nSo she **cannot do Phase 2**.\n\nBen can do Phase 2.\n\nBen can work up to 2 consecutive days, and needs 1 day off after.\n\nSo Ben can work on:\n\n- 2012-11-02 and 2012-11-03 → then must take 1 day off (2012-11-04)\n\nBut Dr. Vance is unavailable on 2012-11-02 → so Ben can work on 2012-11-02 and 2012-11-03.\n\nSo Phase 2: Ben works on **2012-11-02, 2012-11-03**\n\n→ Phase 2 ends on **2012-11-03**\n\nNow, Phase 3: 2 days\n\nWho can do it?\n\nDr. Vance: she worked on 2012-11-01 (1 day), so she has 1 day of work. She can work up to 2 consecutive days, so she can work on 2012-11-04 and 2012-11-05 — **but only if she is available**.\n\nDr. Vance is **unavailable on 2012-11-02**, but **available on 2012-11-04**.\n\nSo she can work on 2012-11-04 and 2012-11-05.\n\nBut she must take **2 days off after 2 consecutive days**.\n\nSo if she works on 2012-11-04 and 2012-11-05, she must take **2 days off** after — i.e., not work on 2012-11-06 or 2012-11-07.\n\nBut we only need 2 days for Phase 3, so that’s fine.\n\nBen: he worked on 2012-11-02–03, so he must take **1 day off** after → so he can work on 2012-11-04? Only if he takes off on 2012-11-04.\n\nWait: Ben can work **only 2 consecutive days**, then must take **1 day off**.\n\nSo if he works on 2012-11-02 and 2012-11-03, he **must take off on 2012-11-04**.\n\nSo he **cannot work on 2012-11-04**.\n\nTherefore, **Ben cannot do Phase 3**.\n\nSo only **Dr. Vance** can do Phase 3.\n\nShe can work on 2012-11-04 and 2012-11-05.\n\nIs she available?\n\n- 2012-11-01: worked (Phase 1)\n- 2012-11-02: unavailable (family reunion)\n- 2012-11-03: not working (Ben is doing Phase 2)\n- 2012-11-04: available\n- 2012-11-05: available\n\nShe worked on 2012-11-01 → that’s only 1 day. So she can work on 2012-11-04 and 2012-11-05 — that’s a new block of 2 days.\n\nShe can do that — no violation of 2-day max, and she only works 2 days in a row.\n\nAfter that, she must take 2 days off — but we don’t need that.\n\nSo Phase 3: Dr. Vance works on **2012-11-04 and 2012-11-05**\n\n✅ Project ends on **2012-11-05**\n\nNow, check if any constraints are violated:\n\n- Dr. Vance:\n - Worked on 2012-11-01 → 1 day → fine\n - Worked on 2012-11-04–05 → 2 days → fine\n - No 3-day work blocks\n - No work on 2012-11-02 → correct (family reunion)\n - After 2012-11-04–05, she takes 2 days off — not needed, but allowed\n\n- Ben:\n - Worked on 2012-11-02–03 → 2 days → fine\n - Then takes 1 day off → 2012-11-04 → so not working on 2012-11-04 → fine\n\n- Tasks in sequence:\n - Phase 1: 2012-11-01\n - Phase 2: 2012-11-02–03\n - Phase 3: 2012-11-04–05\n\nAll tasks completed in order.\n\nNo overlap.\n\nAll constraints respected.\n\nIs there a way to finish earlier?\n\nLet’s try to assign Phase 1 to **Ben** instead.\n\n---\n\n### Option: Assign Phase 1 to Ben\n\nPhase 1: Ben works on **2012-11-01**\n\n→ Done on 2012-11-01\n\nBen worked 1 day → can work up to 2 consecutive days → so can work on 2012-11-02 and 2012-11-03 → then must take 1 day off (2012-11-04)\n\nPhase 2: 2 days → can be done by Ben or Dr. Vance.\n\nDr. Vance is unavailable on 2012-11-02 → so cannot work on 2012-11-02.\n\nSo Dr. Vance cannot do Phase 2 on 2012-11-02.\n\nSo only Ben can do Phase 2.\n\nBen can work on 2012-11-02 and 2012-11-03 → then must take off on 2012-11-04.\n\nSo Phase 2: 2012-11-02–03\n\n→ Phase 2 ends on 2012-11-03\n\nNow Phase 3: 2 days\n\nBen: worked on 2012-11-01, 2012-11-02, 2012-11-03 → that’s **3 days** in a row → violates his constraint (max 2 consecutive days).\n\nSo Ben **cannot** work on Phase 3.\n\nDr. Vance: available on 2012-11-04 and 2012-11-05 → can work on those.\n\nShe has not worked in a block before → can work on 2012-11-04 and 2012-11-05 → fine.\n\nSo Phase 3: Dr. Vance on 2012-11-04–05\n\n→ Project ends on **2012-11-05**\n\nSame end date.\n\nSo both options lead to **2012-11-05**\n\nCan we do Phase 3 earlier?\n\nOnly if we can start Phase 2 earlier or finish earlier.\n\nBut Phase 1 must start on 2012-11-01.\n\nPhase 2 must start after Phase 1 is done.\n\nPhase 1 is 1 day → so Phase 2 can start on 2012-11-02.\n\nDr. Vance cannot work on 2012-11-02 → so Phase 2 must be done by Ben.\n\nBen can work on 2012-11-02 and 2012-11-03 → that’s the earliest possible.\n\nThen Phase 3 starts on 2012-11-04.\n\nDr. Vance is available from 2012-11-04 onward.\n\nSo Phase 3 must start on 2012-11-04.\n\nShe can work 2 days → ends on 2012-11-05.\n\nNo earlier possibility.\n\nCould we assign Phase 1 to Dr. Vance on 2012-11-01, then Phase 2 to Ben on 2012-11-02–03, then Phase 3 to Dr. Vance on 2012-11-04–05 → same as before.\n\nNo way to skip days.\n\nIs there a way to have Phase 3 start earlier?\n\nOnly if Phase 2 ends earlier — but Phase 2 is 2 days, and must start on 2012-11-02.\n\nSo earliest Phase 2 ends on 2012-11-03.\n\nSo Phase 3 must start on 2012-11-04.\n\nNo earlier.\n\nDr. Vance is unavailable on 2012-11-02 — so no one can work on that day.\n\nSo 2012-11-02 is a **blocked day**.\n\nTherefore, no work can happen on 2012-11-02.\n\nSo Phase 2 cannot start on 2012-11-02 — because that day is blocked.\n\nWait — is that true?\n\nDr. Vance is unavailable on 2012-11-02 — but **Ben** is available.\n\nSo Ben **can** work on 2012-11-02.\n\nSo Phase 2 **can** start on 2012-11-02.\n\nDr. Vance is unavailable — but Ben is available.\n\nSo Ben can work on 2012-11-02 and 2012-11-03.\n\nSo that’s fine.\n\nSo no issue.\n\nBut the **only constraint** is that Dr. Vance cannot work on 2012-11-02.\n\nSo the schedule is valid.\n\nThus, the **earliest possible completion date** is **2012-11-05**.\n\n---\n\n### Final Answer:\n\n\\boxed{2012-11-05}'""")
6
+
7
+ response_2 = dedent("""\
8
+ 'We are given a project with three tasks, dependencies, time estimates, and constraints on availability and breaks for both Sarah and Michael. We need to determine the **earliest date** the project can be **completed**, assuming the project starts **next Thursday** after the conversation on **2020-12-31**.\n\n---\n\n### Step 1: Determine the project start date\n\nThe conversation happens on **2020-12-31**.\n\n"Next Thursday" is **January 7, 2021**.\n\n✅ **Project start date: 2021-01-07**\n\n---\n\n### Step 2: List the tasks with durations and dependencies\n\n| Task | Duration | Dependencies |\n|------|----------|-------------|\n| T1: Review Last Year\'s Marketing Spend | 1 day | None (start first) |\n| T2: Draft Budget Submission Guidelines & Approval Workflow | 2 days | Must wait for T1 to complete |\n| T3: Design & Finalize Excel Budget Proposal Template | 1 day | Must wait for T2 to complete |\n\nSo the **sequence is linear**:\n- T1 → T2 → T3\n\nTotal duration: 1 + 2 + 1 = **4 days** of work, in sequence.\n\nBut we have **person availability constraints** and **break rules**.\n\n---\n\n### Step 3: Understand availability and break rules\n\n#### Sarah:\n- Can only work on **weekdays** (Mon–Fri).\n- Can work **up to 3 consecutive days**, then must take a **2-day break** (for leadership workshop).\n- After the break, she can resume work.\n\n> So Sarah\'s work pattern: max 3 days → 2-day break → can resume.\n\n#### Michael:\n- Can work any day (no weekday restriction).\n- Needs **at least a 2-day break** between any tasks he handles.\n- So if he works on a task, he must take **2 days off** before starting the next task.\n\n> Michael\'s work pattern: task → 2-day break → next task.\n\n---\n\n### Step 4: Assign tasks to people\n\nWe are to assign each task to one person (Sarah or Michael), with the goal of **minimizing total project duration**.\n\nWe want to **complete the project as early as possible**, so we should assign tasks to the person who can work more efficiently given their constraints.\n\nLet’s evaluate both options:\n\n---\n\n## Option 1: Assign tasks to Sarah\n\nSarah does all tasks.\n\n- T1: 1 day → 1 day\n- T2: 2 days → 2 days\n- T3: 1 day → 1 day\n\nTotal work: 4 days\n\nBut Sarah can only work **3 consecutive days**, then must take a **2-day break**.\n\nSo we need to check if she can do 4 days of work without violating her break rule.\n\nShe can work up to 3 days → then 2-day break → then resume.\n\nSo if she works 3 days, then breaks 2 days, then works 1 more day → total work: 4 days, but with a 2-day break in between.\n\nBut the **break must be after 3 consecutive days**.\n\nSo possible schedule:\n\n- Day 1: work\n- Day 2: work\n- Day 3: work\n- Day 4: break\n- Day 5: break\n- Day 6: work (T3)\n\nBut T3 is only 1 day, and T2 is 2 days.\n\nSo we need to assign the 4 days of work in sequence.\n\nCan Sarah do 4 days of work without violating her break rule?\n\nYes, **if** she works 3 days, then takes 2-day break, then works 1 day.\n\nBut the **break must come after 3 consecutive days of work**.\n\nSo the work days must be grouped as:\n\n- Work 3 days → break 2 days → work 1 day\n\nTotal time: 3 + 2 + 1 = 6 days\n\nBut the work is only 4 days, so the break is **not needed** if she can do 3 days and then 1 day without violating the rule.\n\nWait — the rule says: "I can work up to 3 consecutive days, then I\'ll need a 2-day break for the workshop and a breather before diving back in."\n\nSo **after 3 consecutive days**, she must take a 2-day break.\n\nShe **does not** need to take a break after 1 or 2 days.\n\nSo if she works 3 days, then 1 day, that’s **4 days**, but only if the 4th day is **after a 2-day break**.\n\nSo she **cannot** work on day 4 without a 2-day break after day 3.\n\nSo the work sequence must be:\n\n- Days 1–3: work (T1, part of T2)\n- Days 4–5: break\n- Day 6: work (T3)\n\nBut T2 is 2 days — so she needs to do 2 days of T2 after T1.\n\nSo let\'s assign:\n\n- T1: Day 1 (1 day)\n- T2: Days 2–3 (2 days)\n- T3: Day 4 (1 day)\n\nBut after T2 (Day 3), she has only worked 3 days (Day 1–3), so she must take a **2-day break** after Day 3.\n\nSo she **cannot** work on Day 4.\n\nThus, **Sarah cannot do T3 on Day 4**.\n\nShe must take a break after Day 3.\n\nSo T3 must be scheduled **after Day 5** (Day 4 and 5 are break).\n\nSo T3 would be on **Day 6**.\n\nThus, total project duration: **6 days** from start (2021-01-07)\n\nLet’s compute the date:\n\n- Start: 2021-01-07\n- Day 1: 2021-01-07 → T1\n- Day 2: 2021-01-08 → T2\n- Day 3: 2021-01-09 → T2\n- Day 4: 2021-01-10 → break\n- Day 5: 2021-01-11 → break\n- Day 6: 2021-01-12 → T3\n\n✅ T3 completed on **2021-01-12**\n\nBut is this the earliest?\n\n---\n\n## Option 2: Assign tasks to Michael\n\nMichael can work any day, but needs **at least 2-day break between tasks**.\n\nSo if he does a task, he must take 2 days off before starting the next.\n\nTasks:\n\n- T1: 1 day\n- T2: 2 days\n- T3: 1 day\n\nSequence: T1 → T2 → T3\n\nSo:\n\n- T1: 1 day\n- Then 2-day break\n- T2: 2 days\n- Then 2-day break\n- T3: 1 day\n\nTotal time: 1 + 2 + 2 + 2 + 1 = **8 days**\n\nSo:\n\n- Day 1: T1 → 2021-01-07\n- Day 2: break\n- Day 3: break\n- Day 4: T2\n- Day 5: T2\n- Day 6: break\n- Day 7: break\n- Day 8: T3\n\nSo T3 completed on **2021-01-08 + 7 days = 2021-01-14**\n\nWait:\n\n- Start: 2021-01-07\n- T1: 2021-01-07\n- Break: 2021-01-08, 2021-01-09\n- T2: 2021-01-10, 2021-01-11\n- Break: 2021-01-12, 2021-01-13\n- T3: 2021-01-14\n\n✅ T3 completed on **2021-01-14**\n\nThis is **later** than Sarah’s option.\n\nSo **Option 1 (Sarah)** is better.\n\n---\n\n## Option 3: Split tasks between Sarah and Michael\n\nCan we assign tasks to minimize total time?\n\nLet’s try to assign T1 and T3 to Sarah, and T2 to Michael — or other combinations.\n\nWe want to minimize total time, so we should assign tasks to the person who can do them with **fewer breaks**.\n\nSarah has a **3-day work limit**, then 2-day break.\n\nMichael has **2-day breaks between tasks**.\n\nSo if we assign a task to Michael, we must have a 2-day gap between tasks.\n\nIf we assign to Sarah, we can do 3 days, then break, then resume — but only if we exceed 3 days.\n\nBut we can **avoid breaks** if we don’t exceed 3 consecutive days.\n\nSo perhaps we can assign **T1 and T3 to Sarah**, and **T2 to Michael**.\n\nLet’s try that.\n\n---\n\n### Option 3a: T1 → Sarah, T2 → Michael, T3 → Sarah\n\nSequence:\n\n- T1: Sarah → 1 day\n- Then T2: Michael → 2 days\n- Then T3: Sarah → 1 day\n\nBut **Michael** must take a 2-day break between tasks — but he only does one task (T2), so no break needed.\n\nSarah does T1 (1 day), then T3 (1 day) — but only if she can do them without violating her 3-day rule.\n\nCan Sarah do T1 and T3 on separate days?\n\nYes — as long as she doesn’t work more than 3 consecutive days.\n\nSo:\n\n- T1: Day 1 → 2021-01-07\n- Then Michael does T2: Day 2–3 → 2021-01-08, 2021-01-09\n- Then Sarah does T3: Day 4 → 2021-01-10\n\nBut is there a break required?\n\nSarah only works on Day 1 and Day 4.\n\nShe works on Day 1 → then breaks (no requirement to break after 1 day), then works on Day 4.\n\nSo she can do that — no violation.\n\nMichael only does one task → no break needed.\n\nSo total time: T3 on **2021-01-10**\n\nIs that possible?\n\nLet’s check:\n\n- Day 1: 2021-01-07 → Sarah: T1 (1 day)\n- Day 2: 2021-01-08 → Michael: T2 (1 day)\n- Day 3: 2021-01-09 → Michael: T2 (2nd day)\n- Day 4: 2021-01-10 → Sarah: T3 (1 day)\n\n✅ All tasks completed by **2021-01-10**\n\nThis is **much earlier** than Option 1 (which ended on 2021-01-12).\n\nIs this valid?\n\nLet’s verify constraints:\n\n- Sarah: works on Day 1 and Day 4 → only 2 days of work, not consecutive → no 3-day block → no break required → ✅\n- Michael: only works on Days 2–3 → one task → no break needed → ✅\n- Dependencies: T1 must finish before T2 → T1 on Day 1, T2 on Day 2–3 → ✅\n- T2 must finish before T3 → T2 ends Day 3, T3 starts Day 4 → ✅\n- All tasks assigned to one person at a time → ✅\n- Sarah only works on weekdays → all days are weekdays → ✅\n- Michael works any day → ✅\n\nSo this schedule is **valid** and **earlier** than previous options.\n\nCan we do even better?\n\n---\n\n### Option 3b: T1 → Michael, T2 → Sarah, T3 → Michael\n\nTry to assign T1 to Michael, T2 to Sarah, T3 to Michael.\n\nSequence:\n\n- T1: Michael → 1 day\n- Then T2: Sarah → 2 days\n- Then T3: Michael → 1 day\n\nMichael does two tasks: T1 and T3.\n\nHe must take a **2-day break between tasks**.\n\nSo:\n\n- T1: Day 1 → 2021-01-07\n- Then Michael must take 2-day break → Days 2–3\n- T3: Day 4 → 2021-01-10\n\nBut T2 must happen **after T1**, and **before T3**.\n\nSo T2 must be scheduled **after T1**, and **before T3**.\n\nSo T2 must be after Day 1, and before Day 4.\n\nBut Michael is not doing T2 — Sarah is.\n\nSo Sarah does T2: 2 days.\n\nSo:\n\n- Day 1: Michael → T1\n- Days 2–3: break\n- Day 4: Sarah → T2 (1 day)\n- Day 5: Sarah → T2 (2nd day)\n- Days 6–7: break\n- Day 8: Michael → T3\n\nT3 on **2021-01-08 + 7 days = 2021-01-15**\n\nThis is **worse** than previous.\n\nSo not better.\n\n---\n\n### Option 3c: T1 → Sarah, T2 → Sarah, T3 → Michael\n\nT1 and T2 to Sarah → 3 days total (T1:1, T2:2)\n\nSarah works 3 consecutive days → must take 2-day break after.\n\nThen T3 → Michael → 1 day\n\nSo:\n\n- T1: Day 1 → 2021-01-07\n- T2: Days 2–3 → 2021-01-08, 2021-01-09\n- Break: Days 4–5 → 2021-01-10, 2021-01-11\n- T3: Day 6 → 2021-01-12\n\nT3 on **2021-01-12** → worse than Option 3a.\n\n---\n\n### Option 3d: T1 → Michael, T2 → Michael, T3 → Sarah\n\nMichael does T1 and T2 → 1 + 2 = 3 days\n\nMichael must take 2-day break between tasks.\n\nSo:\n\n- T1: Day 1 → 2021-01-07\n- Break: Days 2–3\n- T2: Days 4–5 → 2021-01-10, 2021-01-11\n- Then T3: Sarah → Day 6 → 2021-01-12\n\nT3 on **2021-01-12** → worse.\n\n---\n\n### Option 3e: T1 → Sarah, T2 → Michael, T3 → Michael\n\nT1 → Sarah (1 day)\n\nT2 → Michael (2 days)\n\nT3 → Michael (1 day)\n\nMichael does T2 and T3 → must have 2-day break between.\n\nSo:\n\n- T1: Day 1 → 2021-01-07\n- T2: Days 2–3 → 2021-01-08, 2021-01-09\n- Break: Days 4–5\n- T3: Day 6 → 2021-01-12\n\nAgain, T3 on **2021-01-12** → worse.\n\n---\n\n### Best so far: Option 3a → T1 → Sarah, T2 → Michael, T3 → Sarah\n\n- T1: 2021-01-07\n- T2: 2021-01-08, 2021-01-09\n- T3: 2021-01-10\n\n✅ All constraints satisfied.\n\nIs there a way to do it earlier?\n\nCan we start T2 earlier than Day 2?\n\nNo — T1 must finish before T2.\n\nT1 takes 1 day → must finish by end of Day 1.\n\nSo T2 can start on Day 2.\n\nT3 must start after T2 finishes → so after Day 3.\n\nSo T3 must be on **Day 4 or later**.\n\nSo earliest possible T3 is **Day 4**.\n\nIn Option 3a, T3 is on **Day 4** → 2021-01-10\n\nCan we do T3 on Day 4?\n\nYes — as long as T2 finishes by Day 3.\n\nT2 is 2 days → if it starts on Day 2, ends on Day 3 → perfect.\n\nT1 on Day 1 → ends Day 1 → fine.\n\nSarah does T1 and T3 — not consecutive → no break needed.\n\nMichael does T2 — one task → no break needed.\n\nAll constraints satisfied.\n\nSo **earliest possible completion date is 2021-01-10**\n\nBut wait — is **2021-01-10** a weekday?\n\nYes — Monday to Friday.\n\n2021-01-07: Thursday \n2021-01-08: Friday \n2021-01-09: Saturday → ❌\n\nWait! **2021-01-09 is a Saturday**?\n\nLet’s check the calendar.\n\n2021:\n\n- January 1, 2021: Friday\n- January 2: Saturday\n- January 3: Sunday\n- January 4: Monday\n- January 5: Tuesday\n-'""")
9
+
10
+ response_3 = dedent('''\
11
+ "We are tasked with determining the **realistic completion date and time** of a nutrition app evaluation project, based on:\n\n- A clear sequence of tasks with dependencies.\n- Work hours and breaks for both Dr. Vance (CET) and Mark Olsen (CDT).\n- A start time of **May 28th, 2020, 00:00 GMT**.\n- The project must be completed in **GMT**.\n\n---\n\n### Step 1: Understand the Tasks and Dependencies\n\nThe three tasks are:\n\n1. **Task A**: *Draft Detailed Patient Scenarios (Type 2 Diabetes & Celiac Disease) and Document MyFitnessPal's Core Features* \n - Duration: 4 hours \n - Assigned to: Dr. Vance \n - Can only start at 00:00 GMT (project start)\n\n2. **Task B**: *Document Cronometer's Core Features and Unique Selling Points* \n - Duration: 1 hour \n - Assigned to: Mark Olsen \n - Can start **only after Task A is complete**\n\n3. **Task C**: *Write Comparative Analysis and Final Recommendations* \n - Duration: 1 hour \n - Assigned to: Dr. Vance \n - Can start **only after both Task A and Task B are complete**\n\n> So the dependency chain is: \n> **Task A → Task B → Task C**\n\n---\n\n### Step 2: Convert Time Zones to GMT\n\nWe are given:\n\n- Dr. Vance: works in **CET** (Central European Time) \n- Mark Olsen: works in **CDT** (Central Daylight Time) \n- Project starts at **00:00 GMT, May 28, 2020**\n\nWe need to convert all work times to **GMT**.\n\n#### Time Zone Differences:\n\n- CET = UTC+1 \n- CDT = UTC-4 (CDT is Central Daylight Time, which is UTC-4)\n\nSo:\n\n- CET = GMT +1 → to convert to GMT: **subtract 1 hour**\n- CDT = GMT -4 → to convert to GMT: **add 4 hours**\n\n---\n\n### Step 3: Work Schedules (with breaks)\n\nEach person can work **4 consecutive hours**, then must take **at least 1 hour break**.\n\nThey work only during their working hours (8:00–16:00 CET / 10:00–18:00 CDT), and cannot work outside those hours.\n\nWe must schedule tasks within these constraints.\n\n---\n\n### Step 4: Task A – Dr. Vance (CET)\n\n- Duration: 4 hours \n- Must start at 00:00 GMT (project start) \n- Dr. Vance's working hours: 8:00–16:00 CET \n- Convert 00:00 GMT → CET: **00:00 + 1 = 01:00 CET** \n → So she can start at **01:00 CET**, which is **00:00 GMT**\n\nBut she cannot work before 8:00 CET (i.e., 7:00 GMT). \nSo she **cannot start Task A before 8:00 CET = 7:00 GMT**\n\nTherefore, **Task A must start at 7:00 GMT** (8:00 CET)\n\nShe works 4 hours straight → ends at **7:00 + 4 = 11:00 GMT**\n\nThen she needs a **1-hour break** (from 11:00 to 12:00 GMT)\n\nSo Task A ends at **11:00 GMT**\n\n---\n\n### Step 5: Task B – Mark Olsen (CDT)\n\n- Duration: 1 hour \n- Can only start **after Task A is complete** → after 11:00 GMT \n- Mark Olsen's working hours: 10:00–18:00 CDT \n- Convert 11:00 GMT → CDT: 11:00 - 4 = **07:00 CDT** \n → So he can start at 07:00 CDT (which is 11:00 GMT)\n\nHe can work from 10:00 CDT onward. \nSo he **cannot start before 10:00 CDT = 10:00 + 4 = 14:00 GMT**\n\nTherefore, **Task B must start at 14:00 GMT**\n\nHe works 1 hour → ends at **15:00 GMT**\n\nThen he takes a break (but only 1 hour break is required, and he can do it after). \nNo further work needed.\n\n---\n\n### Step 6: Task C – Dr. Vance (CET)\n\n- Duration: 1 hour \n- Can only start **after both Task A and Task B are complete** \n- Task A ends at 11:00 GMT \n- Task B ends at 15:00 GMT \n→ So Task C can start at **15:00 GMT**\n\nDr. Vance's working hours: 8:00–16:00 CET \nConvert 15:00 GMT → CET: 15:00 + 1 = **16:00 CET**\n\nShe can work until 16:00 CET → so she can work from 16:00 CET onward? \nBut her working hours end at 16:00 CET → so she **cannot work after 16:00 CET**\n\nTherefore, **she cannot start Task C at 15:00 GMT** because that would be **16:00 CET**, which is the end of her working day.\n\nShe can only work until 16:00 CET → so the **latest she can start** is **15:00 CET = 14:00 GMT**\n\nBut Task C must start **after 15:00 GMT** (when Task B ends)\n\nSo **there is a conflict**.\n\n---\n\n### Conflict: Task C cannot start after 15:00 GMT\n\nDr. Vance can only work until **16:00 CET = 17:00 GMT**\n\nWait — let's double-check:\n\n- 16:00 CET = 16:00 + 1 = **17:00 GMT**\n\nYes! I made a mistake earlier.\n\nDr. Vance works from **8:00 to 16:00 CET**\n\n- 8:00 CET = 7:00 GMT \n- 16:00 CET = 17:00 GMT\n\nSo she can work until **17:00 GMT**\n\nShe can work **4 hours straight**, then take a break.\n\nBut in Task A, she worked from **7:00 to 11:00 GMT** (4 hours), then took a break until 12:00 GMT.\n\nShe is **not** working during the break.\n\nSo after the break, she can resume work.\n\nBut Task C must start **after Task B ends**, which is **15:00 GMT**\n\nSo she can start Task C at **15:00 GMT**, which is **16:00 CET**\n\nShe can work until **17:00 GMT** (16:00 CET + 1 hour)\n\nSo she can work **1 hour** on Task C from **15:00 to 16:00 GMT**\n\nBut wait — is she available?\n\nShe had a break from 11:00 to 12:00 GMT.\n\nSo from **12:00 GMT onward**, she is free.\n\nShe can work from **12:00 to 17:00 GMT** (5 hours), but only 4 hours at a time.\n\nSo she can work in a block of 4 hours, then take a break.\n\nBut Task C only requires **1 hour**.\n\nSo she can work on Task C **after 15:00 GMT**, as long as she is available.\n\nShe is available from **12:00 GMT onward**.\n\nSo she can start Task C at **15:00 GMT** (16:00 CET), and work for 1 hour until **16:00 GMT**\n\nThat is within her working hours (until 17:00 GMT)\n\nSo **Task C ends at 16:00 GMT**\n\n---\n\n### Final Timeline (in GMT)\n\n| Task | Start | End | Duration |\n|------|------|-----|---------|\n| Task A (Dr. Vance) | 7:00 | 11:00 | 4 hours |\n| Break (Dr. Vance) | 11:00–12:00 | — | 1 hour |\n| Task B (Mark Olsen) | 14:00 | 15:00 | 1 hour |\n| Task C (Dr. Vance) | 15:00 | 16:00 | 1 hour |\n\n> ✅ All tasks completed by **16:00 GMT**\n\n> ✅ All dependencies satisfied \n> ✅ All work within working hours and break rules \n> ✅ No overlapping tasks \n> ✅ No task split or partial work\n\n---\n\n### Final Answer:\n\n$$\n\\boxed{2020-05-28 16:00}\n$$"''')
12
+
13
+ subsets = ["tcp_long", "tcp_long", "tcp_short"]
14
+
15
+ references = ["2012-11-05", "2012-11-05", "2020-05-28 16:00 GMT"]
16
+
17
+
18
+ def test_metric():
19
+ metric = TCPAccuracy()
20
+ results = metric.compute(
21
+ predictions=[response_1, response_2, response_3],
22
+ references=references,
23
+ subset=subsets,
24
+ )
25
+ assert results["accuracy"] == [1, 0, 1]
uv.lock ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.12"
4
+
5
+ [[package]]
6
+ name = "certifi"
7
+ version = "2026.1.4"
8
+ source = { registry = "https://pypi.org/simple" }
9
+ sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" }
10
+ wheels = [
11
+ { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" },
12
+ ]
13
+
14
+ [[package]]
15
+ name = "charset-normalizer"
16
+ version = "3.4.4"
17
+ source = { registry = "https://pypi.org/simple" }
18
+ sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
19
+ wheels = [
20
+ { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
21
+ { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
22
+ { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
23
+ { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
24
+ { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
25
+ { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
26
+ { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
27
+ { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
28
+ { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
29
+ { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
30
+ { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
31
+ { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
32
+ { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
33
+ { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
34
+ { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
35
+ { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
36
+ { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
37
+ { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
38
+ { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
39
+ { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
40
+ { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
41
+ { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
42
+ { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
43
+ { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
44
+ { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
45
+ { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
46
+ { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
47
+ { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
48
+ { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
49
+ { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
50
+ { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
51
+ { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
52
+ { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
53
+ { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
54
+ { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
55
+ { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
56
+ { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
57
+ { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
58
+ { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
59
+ { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
60
+ { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
61
+ { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
62
+ { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
63
+ { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
64
+ { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
65
+ { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
66
+ { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
67
+ { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
68
+ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
69
+ ]
70
+
71
+ [[package]]
72
+ name = "colorama"
73
+ version = "0.4.6"
74
+ source = { registry = "https://pypi.org/simple" }
75
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
76
+ wheels = [
77
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
78
+ ]
79
+
80
+ [[package]]
81
+ name = "filelock"
82
+ version = "3.20.3"
83
+ source = { registry = "https://pypi.org/simple" }
84
+ sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" }
85
+ wheels = [
86
+ { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" },
87
+ ]
88
+
89
+ [[package]]
90
+ name = "fsspec"
91
+ version = "2026.1.0"
92
+ source = { registry = "https://pypi.org/simple" }
93
+ sdist = { url = "https://files.pythonhosted.org/packages/d5/7d/5df2650c57d47c57232af5ef4b4fdbff182070421e405e0d62c6cdbfaa87/fsspec-2026.1.0.tar.gz", hash = "sha256:e987cb0496a0d81bba3a9d1cee62922fb395e7d4c3b575e57f547953334fe07b", size = 310496, upload-time = "2026-01-09T15:21:35.562Z" }
94
+ wheels = [
95
+ { url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl", hash = "sha256:cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc", size = 201838, upload-time = "2026-01-09T15:21:34.041Z" },
96
+ ]
97
+
98
+ [[package]]
99
+ name = "huggingface-hub"
100
+ version = "0.24.7"
101
+ source = { registry = "https://pypi.org/simple" }
102
+ dependencies = [
103
+ { name = "filelock" },
104
+ { name = "fsspec" },
105
+ { name = "packaging" },
106
+ { name = "pyyaml" },
107
+ { name = "requests" },
108
+ { name = "tqdm" },
109
+ { name = "typing-extensions" },
110
+ ]
111
+ sdist = { url = "https://files.pythonhosted.org/packages/af/33/d252098a3b8d910065ad09cf318efb5dbe6c8bb586269bdfb47b7e021020/huggingface_hub-0.24.7.tar.gz", hash = "sha256:0ad8fb756e2831da0ac0491175b960f341fe06ebcf80ed6f8728313f95fc0207", size = 349211, upload-time = "2024-09-12T08:58:24.699Z" }
112
+ wheels = [
113
+ { url = "https://files.pythonhosted.org/packages/57/28/a0b0dd3cca63908045edc300360d6cd8758d4d86eee3fd2b08f00c5a41c4/huggingface_hub-0.24.7-py3-none-any.whl", hash = "sha256:a212c555324c8a7b1ffdd07266bb7e7d69ca71aa238d27b7842d65e9a26ac3e5", size = 417514, upload-time = "2024-09-12T08:58:22.716Z" },
114
+ ]
115
+
116
+ [[package]]
117
+ name = "idna"
118
+ version = "3.11"
119
+ source = { registry = "https://pypi.org/simple" }
120
+ sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
121
+ wheels = [
122
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
123
+ ]
124
+
125
+ [[package]]
126
+ name = "iniconfig"
127
+ version = "2.3.0"
128
+ source = { registry = "https://pypi.org/simple" }
129
+ sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
130
+ wheels = [
131
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
132
+ ]
133
+
134
+ [[package]]
135
+ name = "packaging"
136
+ version = "25.0"
137
+ source = { registry = "https://pypi.org/simple" }
138
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
139
+ wheels = [
140
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
141
+ ]
142
+
143
+ [[package]]
144
+ name = "pluggy"
145
+ version = "1.6.0"
146
+ source = { registry = "https://pypi.org/simple" }
147
+ sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
148
+ wheels = [
149
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
150
+ ]
151
+
152
+ [[package]]
153
+ name = "pygments"
154
+ version = "2.19.2"
155
+ source = { registry = "https://pypi.org/simple" }
156
+ sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
157
+ wheels = [
158
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
159
+ ]
160
+
161
+ [[package]]
162
+ name = "pytest"
163
+ version = "9.0.2"
164
+ source = { registry = "https://pypi.org/simple" }
165
+ dependencies = [
166
+ { name = "colorama", marker = "sys_platform == 'win32'" },
167
+ { name = "iniconfig" },
168
+ { name = "packaging" },
169
+ { name = "pluggy" },
170
+ { name = "pygments" },
171
+ ]
172
+ sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
173
+ wheels = [
174
+ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
175
+ ]
176
+
177
+ [[package]]
178
+ name = "pyyaml"
179
+ version = "6.0.3"
180
+ source = { registry = "https://pypi.org/simple" }
181
+ sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
182
+ wheels = [
183
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
184
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
185
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
186
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
187
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
188
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
189
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
190
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
191
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
192
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
193
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
194
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
195
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
196
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
197
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
198
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
199
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
200
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
201
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
202
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
203
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
204
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
205
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
206
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
207
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
208
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
209
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
210
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
211
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
212
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
213
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
214
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
215
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
216
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
217
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
218
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
219
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
220
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
221
+ ]
222
+
223
+ [[package]]
224
+ name = "requests"
225
+ version = "2.32.5"
226
+ source = { registry = "https://pypi.org/simple" }
227
+ dependencies = [
228
+ { name = "certifi" },
229
+ { name = "charset-normalizer" },
230
+ { name = "idna" },
231
+ { name = "urllib3" },
232
+ ]
233
+ sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
234
+ wheels = [
235
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
236
+ ]
237
+
238
+ [[package]]
239
+ name = "ruff"
240
+ version = "0.14.13"
241
+ source = { registry = "https://pypi.org/simple" }
242
+ sdist = { url = "https://files.pythonhosted.org/packages/50/0a/1914efb7903174b381ee2ffeebb4253e729de57f114e63595114c8ca451f/ruff-0.14.13.tar.gz", hash = "sha256:83cd6c0763190784b99650a20fec7633c59f6ebe41c5cc9d45ee42749563ad47", size = 6059504, upload-time = "2026-01-15T20:15:16.918Z" }
243
+ wheels = [
244
+ { url = "https://files.pythonhosted.org/packages/c3/ae/0deefbc65ca74b0ab1fd3917f94dc3b398233346a74b8bbb0a916a1a6bf6/ruff-0.14.13-py3-none-linux_armv6l.whl", hash = "sha256:76f62c62cd37c276cb03a275b198c7c15bd1d60c989f944db08a8c1c2dbec18b", size = 13062418, upload-time = "2026-01-15T20:14:50.779Z" },
245
+ { url = "https://files.pythonhosted.org/packages/47/df/5916604faa530a97a3c154c62a81cb6b735c0cb05d1e26d5ad0f0c8ac48a/ruff-0.14.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:914a8023ece0528d5cc33f5a684f5f38199bbb566a04815c2c211d8f40b5d0ed", size = 13442344, upload-time = "2026-01-15T20:15:07.94Z" },
246
+ { url = "https://files.pythonhosted.org/packages/4c/f3/e0e694dd69163c3a1671e102aa574a50357536f18a33375050334d5cd517/ruff-0.14.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d24899478c35ebfa730597a4a775d430ad0d5631b8647a3ab368c29b7e7bd063", size = 12354720, upload-time = "2026-01-15T20:15:09.854Z" },
247
+ { url = "https://files.pythonhosted.org/packages/c3/e8/67f5fcbbaee25e8fc3b56cc33e9892eca7ffe09f773c8e5907757a7e3bdb/ruff-0.14.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aaf3870f14d925bbaf18b8a2347ee0ae7d95a2e490e4d4aea6813ed15ebc80e", size = 12774493, upload-time = "2026-01-15T20:15:20.908Z" },
248
+ { url = "https://files.pythonhosted.org/packages/6b/ce/d2e9cb510870b52a9565d885c0d7668cc050e30fa2c8ac3fb1fda15c083d/ruff-0.14.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac5b7f63dd3b27cc811850f5ffd8fff845b00ad70e60b043aabf8d6ecc304e09", size = 12815174, upload-time = "2026-01-15T20:15:05.74Z" },
249
+ { url = "https://files.pythonhosted.org/packages/88/00/c38e5da58beebcf4fa32d0ddd993b63dfacefd02ab7922614231330845bf/ruff-0.14.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2b1097750d90ba82ce4ba676e85230a0ed694178ca5e61aa9b459970b3eb9", size = 13680909, upload-time = "2026-01-15T20:15:14.537Z" },
250
+ { url = "https://files.pythonhosted.org/packages/61/61/cd37c9dd5bd0a3099ba79b2a5899ad417d8f3b04038810b0501a80814fd7/ruff-0.14.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d0bf87705acbbcb8d4c24b2d77fbb73d40210a95c3903b443cd9e30824a5032", size = 15144215, upload-time = "2026-01-15T20:15:22.886Z" },
251
+ { url = "https://files.pythonhosted.org/packages/56/8a/85502d7edbf98c2df7b8876f316c0157359165e16cdf98507c65c8d07d3d/ruff-0.14.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3eb5da8e2c9e9f13431032fdcbe7681de9ceda5835efee3269417c13f1fed5c", size = 14706067, upload-time = "2026-01-15T20:14:48.271Z" },
252
+ { url = "https://files.pythonhosted.org/packages/7e/2f/de0df127feb2ee8c1e54354dc1179b4a23798f0866019528c938ba439aca/ruff-0.14.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:642442b42957093811cd8d2140dfadd19c7417030a7a68cf8d51fcdd5f217427", size = 14133916, upload-time = "2026-01-15T20:14:57.357Z" },
253
+ { url = "https://files.pythonhosted.org/packages/0d/77/9b99686bb9fe07a757c82f6f95e555c7a47801a9305576a9c67e0a31d280/ruff-0.14.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4acdf009f32b46f6e8864af19cbf6841eaaed8638e65c8dac845aea0d703c841", size = 13859207, upload-time = "2026-01-15T20:14:55.111Z" },
254
+ { url = "https://files.pythonhosted.org/packages/7d/46/2bdcb34a87a179a4d23022d818c1c236cb40e477faf0d7c9afb6813e5876/ruff-0.14.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:591a7f68860ea4e003917d19b5c4f5ac39ff558f162dc753a2c5de897fd5502c", size = 14043686, upload-time = "2026-01-15T20:14:52.841Z" },
255
+ { url = "https://files.pythonhosted.org/packages/1a/a9/5c6a4f56a0512c691cf143371bcf60505ed0f0860f24a85da8bd123b2bf1/ruff-0.14.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:774c77e841cc6e046fc3e91623ce0903d1cd07e3a36b1a9fe79b81dab3de506b", size = 12663837, upload-time = "2026-01-15T20:15:18.921Z" },
256
+ { url = "https://files.pythonhosted.org/packages/fe/bb/b920016ece7651fa7fcd335d9d199306665486694d4361547ccb19394c44/ruff-0.14.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:61f4e40077a1248436772bb6512db5fc4457fe4c49e7a94ea7c5088655dd21ae", size = 12805867, upload-time = "2026-01-15T20:14:59.272Z" },
257
+ { url = "https://files.pythonhosted.org/packages/7d/b3/0bd909851e5696cd21e32a8fc25727e5f58f1934b3596975503e6e85415c/ruff-0.14.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6d02f1428357fae9e98ac7aa94b7e966fd24151088510d32cf6f902d6c09235e", size = 13208528, upload-time = "2026-01-15T20:15:03.732Z" },
258
+ { url = "https://files.pythonhosted.org/packages/3b/3b/e2d94cb613f6bbd5155a75cbe072813756363eba46a3f2177a1fcd0cd670/ruff-0.14.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e399341472ce15237be0c0ae5fbceca4b04cd9bebab1a2b2c979e015455d8f0c", size = 13929242, upload-time = "2026-01-15T20:15:11.918Z" },
259
+ { url = "https://files.pythonhosted.org/packages/6a/c5/abd840d4132fd51a12f594934af5eba1d5d27298a6f5b5d6c3be45301caf/ruff-0.14.13-py3-none-win32.whl", hash = "sha256:ef720f529aec113968b45dfdb838ac8934e519711da53a0456038a0efecbd680", size = 12919024, upload-time = "2026-01-15T20:14:43.647Z" },
260
+ { url = "https://files.pythonhosted.org/packages/c2/55/6384b0b8ce731b6e2ade2b5449bf07c0e4c31e8a2e68ea65b3bafadcecc5/ruff-0.14.13-py3-none-win_amd64.whl", hash = "sha256:6070bd026e409734b9257e03e3ef18c6e1a216f0435c6751d7a8ec69cb59abef", size = 14097887, upload-time = "2026-01-15T20:15:01.48Z" },
261
+ { url = "https://files.pythonhosted.org/packages/4d/e1/7348090988095e4e39560cfc2f7555b1b2a7357deba19167b600fdf5215d/ruff-0.14.13-py3-none-win_arm64.whl", hash = "sha256:7ab819e14f1ad9fe39f246cfcc435880ef7a9390d81a2b6ac7e01039083dd247", size = 13080224, upload-time = "2026-01-15T20:14:45.853Z" },
262
+ ]
263
+
264
+ [[package]]
265
+ name = "tcp-accuracy"
266
+ version = "0.1.0"
267
+ source = { virtual = "." }
268
+ dependencies = [
269
+ { name = "huggingface-hub" },
270
+ { name = "pytest" },
271
+ { name = "ruff" },
272
+ ]
273
+
274
+ [package.metadata]
275
+ requires-dist = [
276
+ { name = "huggingface-hub", specifier = "<0.25" },
277
+ { name = "pytest", specifier = ">=9.0.2" },
278
+ { name = "ruff", specifier = ">=0.14.13" },
279
+ ]
280
+
281
+ [[package]]
282
+ name = "tqdm"
283
+ version = "4.67.1"
284
+ source = { registry = "https://pypi.org/simple" }
285
+ dependencies = [
286
+ { name = "colorama", marker = "sys_platform == 'win32'" },
287
+ ]
288
+ sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
289
+ wheels = [
290
+ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
291
+ ]
292
+
293
+ [[package]]
294
+ name = "typing-extensions"
295
+ version = "4.15.0"
296
+ source = { registry = "https://pypi.org/simple" }
297
+ sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
298
+ wheels = [
299
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
300
+ ]
301
+
302
+ [[package]]
303
+ name = "urllib3"
304
+ version = "2.6.3"
305
+ source = { registry = "https://pypi.org/simple" }
306
+ sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
307
+ wheels = [
308
+ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
309
+ ]