adobe-cc-font-extractor 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,154 @@
1
+ # File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
2
+
3
+ # Created by https://www.gitignore.io/api/windows,visualstudiocode,python
4
+ # Edit at https://www.gitignore.io/?templates=windows,visualstudiocode,python
5
+
6
+ ### Python ###
7
+ # Byte-compiled / optimized / DLL files
8
+ __pycache__/
9
+ *.py[cod]
10
+ *$py.class
11
+
12
+ # C extensions
13
+ *.so
14
+
15
+ # Distribution / packaging
16
+ .Python
17
+ build/
18
+ develop-eggs/
19
+ dist/
20
+ downloads/
21
+ eggs/
22
+ .eggs/
23
+ lib/
24
+ lib64/
25
+ parts/
26
+ sdist/
27
+ var/
28
+ wheels/
29
+ pip-wheel-metadata/
30
+ share/python-wheels/
31
+ *.egg-info/
32
+ .installed.cfg
33
+ *.egg
34
+ MANIFEST
35
+
36
+ # PyInstaller
37
+ # Usually these files are written by a python script from a template
38
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
39
+ *.manifest
40
+ *.spec
41
+
42
+ # Installer logs
43
+ pip-log.txt
44
+ pip-delete-this-directory.txt
45
+
46
+ # Unit test / coverage reports
47
+ htmlcov/
48
+ .tox/
49
+ .nox/
50
+ .coverage
51
+ .coverage.*
52
+ .cache
53
+ nosetests.xml
54
+ coverage.xml
55
+ *.cover
56
+ .hypothesis/
57
+ .pytest_cache/
58
+
59
+ # Translations
60
+ *.mo
61
+ *.pot
62
+
63
+ # Scrapy stuff:
64
+ .scrapy
65
+
66
+ # Sphinx documentation
67
+ docs/_build/
68
+
69
+ # PyBuilder
70
+ target/
71
+
72
+ # pyenv
73
+ .python-version
74
+
75
+ # pipenv
76
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
77
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
78
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
79
+ # install all needed dependencies.
80
+ #Pipfile.lock
81
+
82
+ # celery beat schedule file
83
+ celerybeat-schedule
84
+
85
+ # SageMath parsed files
86
+ *.sage.py
87
+
88
+ # Spyder project settings
89
+ .spyderproject
90
+ .spyproject
91
+
92
+ # Rope project settings
93
+ .ropeproject
94
+
95
+ # Mr Developer
96
+ .mr.developer.cfg
97
+ .project
98
+ .pydevproject
99
+
100
+ # mkdocs documentation
101
+ /site
102
+
103
+ # mypy
104
+ .mypy_cache/
105
+ .dmypy.json
106
+ dmypy.json
107
+
108
+ # Pyre type checker
109
+ .pyre/
110
+
111
+ ### VisualStudioCode ###
112
+ .vscode/*
113
+ !.vscode/settings.json
114
+ !.vscode/tasks.json
115
+ !.vscode/launch.json
116
+ !.vscode/extensions.json
117
+
118
+ ### VisualStudioCode Patch ###
119
+ # Ignore all local history of files
120
+ .history
121
+
122
+ ### Windows ###
123
+ # Windows thumbnail cache files
124
+ Thumbs.db
125
+ Thumbs.db:encryptable
126
+ ehthumbs.db
127
+ ehthumbs_vista.db
128
+
129
+ # Dump file
130
+ *.stackdump
131
+
132
+ # Folder config file
133
+ [Dd]esktop.ini
134
+
135
+ # Recycle Bin used on file shares
136
+ $RECYCLE.BIN/
137
+
138
+ # Windows Installer files
139
+ *.cab
140
+ *.msi
141
+ *.msix
142
+ *.msm
143
+ *.msp
144
+
145
+ # Windows shortcuts
146
+ *.lnk
147
+
148
+ # End of https://www.gitignore.io/api/windows,visualstudiocode,python
149
+
150
+ # Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
151
+
152
+ .venv/
153
+ output/*
154
+ .vscode
@@ -0,0 +1,3 @@
1
+ {
2
+ "python.pythonPath": "d:\\projects\\adobe-cc-font-extractor\\venv\\Scripts\\python.exe"
3
+ }
@@ -0,0 +1,8 @@
1
+ Metadata-Version: 2.4
2
+ Name: adobe-cc-font-extractor
3
+ Version: 1.0.0
4
+ Summary: Extract Adobe CC fonts to local OTF files organized by family
5
+ Requires-Python: >=3.10
6
+ Requires-Dist: fonttools>=4.54.0
7
+ Requires-Dist: rich>=13.0.0
8
+ Requires-Dist: typer>=0.12.0
@@ -0,0 +1,65 @@
1
+ # adobe-cc-font-extractor
2
+
3
+ Extracts Adobe CC fonts from the local CoreSync cache into named OTF files organized by family.
4
+
5
+ ## Requirements
6
+
7
+ - [uv](https://docs.astral.sh/uv/)
8
+ - Adobe Creative Cloud with fonts synced via Adobe Fonts
9
+
10
+ ## Installation
11
+
12
+ ```sh
13
+ uv sync
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```sh
19
+ uv run adobe-cc-font-extractor [OPTIONS]
20
+ ```
21
+
22
+ | Option | Short | Description |
23
+ |---|---|---|
24
+ | `--output PATH` | `-o` | Output directory (default: `output/`) |
25
+ | `--dry-run` | `-n` | Preview what would be extracted without copying |
26
+ | `--family TEXT` | `-f` | Filter by family name — repeatable |
27
+ | `--force` | | Overwrite existing files |
28
+ | `--flat` | | Disable per-family subdirectories |
29
+ | `--zip-files` | `-z` | Create one zip archive per family |
30
+ | `--font-dir PATH` | | Override the Adobe CoreSync directory |
31
+
32
+ ### Examples
33
+
34
+ Extract all fonts:
35
+ ```sh
36
+ uv run adobe-cc-font-extractor
37
+ ```
38
+
39
+ Preview a specific family:
40
+ ```sh
41
+ uv run adobe-cc-font-extractor --dry-run --family "Proxima Nova"
42
+ ```
43
+
44
+ Extract multiple families and zip each one:
45
+ ```sh
46
+ uv run adobe-cc-font-extractor -f "Proxima Nova" -f "Museo Sans" --zip-files
47
+ ```
48
+
49
+ ## Output structure
50
+
51
+ ```
52
+ output/
53
+ Proxima Nova/
54
+ Proxima Nova Regular.otf
55
+ Proxima Nova Bold.otf
56
+ ...
57
+ Museo Sans/
58
+ Museo Sans 300.otf
59
+ ...
60
+ Proxima Nova.zip # with --zip-files
61
+ ```
62
+
63
+ ## Supported platforms
64
+
65
+ Windows and macOS.
@@ -0,0 +1,224 @@
1
+ import os
2
+ import platform
3
+ import re
4
+ import shutil
5
+ import zipfile
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+ from typing import Optional
9
+ from xml.etree import ElementTree
10
+
11
+ import typer
12
+ from fontTools.ttLib import TTFont
13
+ from rich.console import Console
14
+ from rich.progress import BarColumn, Progress, SpinnerColumn, TaskProgressColumn, TextColumn
15
+ from rich.table import Table
16
+
17
+ FONT_SPECIFIER_VARIATION_ID = 4
18
+ FONT_SPECIFIER_NAME_ID = 1
19
+
20
+ console = Console()
21
+ app = typer.Typer(
22
+ help="Extract Adobe CC fonts to OTF files organized by family folder.",
23
+ no_args_is_help=True,
24
+ )
25
+
26
+
27
+ @dataclass
28
+ class FontEntry:
29
+ font_id: str
30
+ full_name: str
31
+ family_name: str
32
+ variation_name: str
33
+ is_variable: bool
34
+ install_state: str
35
+
36
+
37
+ @dataclass
38
+ class ExtractionStats:
39
+ extracted: int = 0
40
+ skipped: int = 0
41
+ missing: int = 0
42
+ errors: int = 0
43
+ families: dict[str, list[str]] = field(default_factory=dict)
44
+ family_files: dict[str, list[Path]] = field(default_factory=dict)
45
+
46
+
47
+ def get_adobe_font_path() -> Path:
48
+ if platform.system() == "Windows":
49
+ return Path(os.path.expandvars(r"%APPDATA%\Adobe\CoreSync\plugins\livetype"))
50
+ elif platform.system() == "Darwin":
51
+ return Path(os.path.expandvars("$HOME/Library/Application Support/Adobe/CoreSync/plugins/livetype"))
52
+ else:
53
+ console.print(f"[red]Unsupported platform:[/red] {platform.system()}")
54
+ raise typer.Exit(1)
55
+
56
+
57
+ def sanitize_path_component(name: str) -> str:
58
+ return re.sub(r'[<>:"/\\|?*]', "_", name).strip(". ")
59
+
60
+
61
+ def parse_entitlements(manifest: Path) -> list[FontEntry]:
62
+ root = ElementTree.parse(manifest).getroot()
63
+ entries = []
64
+ for font in root.find("fonts").findall("font"):
65
+ font_id = font.find("id").text
66
+ props = font.find("properties")
67
+ entries.append(
68
+ FontEntry(
69
+ font_id=font_id,
70
+ full_name=props.findtext("fullName", "").strip(),
71
+ family_name=props.findtext("familyName", "").strip(),
72
+ variation_name=props.findtext("variationName", "").strip(),
73
+ is_variable=props.findtext("isVariable", "false").lower() == "true",
74
+ install_state=props.findtext("installState", ""),
75
+ )
76
+ )
77
+ return entries
78
+
79
+
80
+ def find_font_file(font_id: str, font_path: Path) -> Optional[Path]:
81
+ for candidate in ("r", "t", "w"):
82
+ source = font_path / candidate / font_id
83
+ if source.exists():
84
+ return source
85
+ return None
86
+
87
+
88
+ @app.command()
89
+ def extract(
90
+ output: Path = typer.Option(Path("output"), "--output", "-o", help="Output directory"),
91
+ dry_run: bool = typer.Option(False, "--dry-run", "-n", help="Show what would be extracted without copying files"),
92
+ family: Optional[list[str]] = typer.Option(None, "--family", "-f", help="Filter by family name (repeatable)"),
93
+ force: bool = typer.Option(False, "--force", help="Overwrite existing files"),
94
+ flat: bool = typer.Option(False, "--flat", help="Put all fonts in output dir without family subdirectories"),
95
+ zip_files: bool = typer.Option(False, "--zip-files", "-z", help="Create one zip archive per family in the output directory"),
96
+ font_dir: Optional[Path] = typer.Option(None, "--font-dir", help="Override the Adobe CoreSync font directory"),
97
+ ) -> None:
98
+ """Extract Adobe CC fonts to OTF files, organized in per-family subdirectories."""
99
+ font_path = font_dir or get_adobe_font_path()
100
+ manifest = font_path / "c" / "entitlements.xml"
101
+
102
+ if not manifest.exists():
103
+ console.print(f"[red]Manifest not found:[/red] {manifest}")
104
+ raise typer.Exit(1)
105
+
106
+ console.print(f"[dim]Reading entitlements from[/dim] {manifest}")
107
+ entries = parse_entitlements(manifest)
108
+
109
+ if family:
110
+ filter_set = {f.lower() for f in family}
111
+ entries = [e for e in entries if e.family_name.lower() in filter_set]
112
+
113
+ if not entries:
114
+ console.print("[yellow]No fonts matched the given filters.[/yellow]")
115
+ raise typer.Exit(0)
116
+
117
+ if not dry_run:
118
+ output.mkdir(parents=True, exist_ok=True)
119
+
120
+ stats = ExtractionStats()
121
+
122
+ with Progress(
123
+ SpinnerColumn(),
124
+ TextColumn("[progress.description]{task.description}"),
125
+ BarColumn(),
126
+ TaskProgressColumn(),
127
+ console=console,
128
+ transient=True,
129
+ ) as progress:
130
+ task = progress.add_task("Processing...", total=len(entries))
131
+
132
+ for entry in entries:
133
+ progress.update(task, description=f"[dim]{entry.full_name[:50]}[/dim]")
134
+
135
+ source = find_font_file(entry.font_id, font_path)
136
+ if source is None:
137
+ stats.missing += 1
138
+ progress.advance(task)
139
+ continue
140
+
141
+ safe_family = sanitize_path_component(entry.family_name)
142
+ safe_full = sanitize_path_component(entry.full_name)
143
+ dest_dir = output if flat else output / safe_family
144
+ destination = dest_dir / f"{safe_full}.otf"
145
+
146
+ stats.families.setdefault(entry.family_name, [])
147
+ stats.family_files.setdefault(entry.family_name, [])
148
+
149
+ if destination.exists() and not force:
150
+ stats.skipped += 1
151
+ progress.advance(task)
152
+ continue
153
+
154
+ try:
155
+ TTFont(file=source)
156
+ except Exception as exc:
157
+ console.print(f"[yellow] Invalid font file:[/yellow] {entry.full_name} — {exc}")
158
+ stats.errors += 1
159
+ progress.advance(task)
160
+ continue
161
+
162
+ if not dry_run:
163
+ dest_dir.mkdir(parents=True, exist_ok=True)
164
+ shutil.copy(source, destination)
165
+
166
+ stats.families[entry.family_name].append(entry.variation_name)
167
+ stats.family_files[entry.family_name].append(destination)
168
+ stats.extracted += 1
169
+ progress.advance(task)
170
+
171
+ zipped = 0
172
+ if zip_files and not dry_run:
173
+ zipped = _zip_families(stats.family_files, output)
174
+
175
+ _print_report(stats, dry_run, zipped)
176
+
177
+
178
+ def _zip_families(family_files: dict[str, list[Path]], output: Path) -> int:
179
+ zipped = 0
180
+ for family_name, paths in family_files.items():
181
+ if not paths:
182
+ continue
183
+ zip_path = output / f"{sanitize_path_component(family_name)}.zip"
184
+ with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
185
+ for p in paths:
186
+ zf.write(p, arcname=p.name)
187
+ zipped += 1
188
+ return zipped
189
+
190
+
191
+ def _print_report(stats: ExtractionStats, dry_run: bool, zipped: int = 0) -> None:
192
+ extracted_families = {fam: vars for fam, vars in stats.families.items() if vars}
193
+
194
+ if extracted_families:
195
+ table = Table(title="Fonts Extracted by Family", show_header=True, header_style="bold")
196
+ table.add_column("Family", style="cyan", no_wrap=True)
197
+ table.add_column("Variations", style="green")
198
+ table.add_column("#", justify="right", style="bold")
199
+
200
+ for fam_name, variations in sorted(extracted_families.items()):
201
+ table.add_row(fam_name, ", ".join(sorted(variations)), str(len(variations)))
202
+
203
+ console.print()
204
+ console.print(table)
205
+
206
+ console.print()
207
+ action = "Would extract" if dry_run else "Extracted"
208
+ console.print(f"[bold green]{action}:[/bold green] {stats.extracted} fonts across {len(extracted_families)} families")
209
+ if stats.skipped:
210
+ console.print(f"[yellow]Skipped (already exist):[/yellow] {stats.skipped}")
211
+ if stats.missing:
212
+ console.print(f"[red]Missing from filesystem:[/red] {stats.missing}")
213
+ if stats.errors:
214
+ console.print(f"[red]Errors:[/red] {stats.errors}")
215
+ if zipped:
216
+ console.print(f"[bold cyan]Zipped:[/bold cyan] {zipped} family archives created")
217
+
218
+
219
+ def main() -> None:
220
+ app()
221
+
222
+
223
+ if __name__ == "__main__":
224
+ main()
@@ -0,0 +1,17 @@
1
+ [project]
2
+ name = "adobe-cc-font-extractor"
3
+ version = "1.0.0"
4
+ description = "Extract Adobe CC fonts to local OTF files organized by family"
5
+ requires-python = ">=3.10"
6
+ dependencies = [
7
+ "fonttools>=4.54.0",
8
+ "typer>=0.12.0",
9
+ "rich>=13.0.0",
10
+ ]
11
+
12
+ [project.scripts]
13
+ adobe-cc-font-extractor = "adobe_cc_font_extractor.main:main"
14
+
15
+ [build-system]
16
+ requires = ["hatchling"]
17
+ build-backend = "hatchling.build"
@@ -0,0 +1,162 @@
1
+ version = 1
2
+ revision = 3
3
+ requires-python = ">=3.10"
4
+
5
+ [[package]]
6
+ name = "adobe-cc-font-extractor"
7
+ version = "1.0.0"
8
+ source = { editable = "." }
9
+ dependencies = [
10
+ { name = "fonttools" },
11
+ { name = "rich" },
12
+ { name = "typer" },
13
+ ]
14
+
15
+ [package.metadata]
16
+ requires-dist = [
17
+ { name = "fonttools", specifier = ">=4.54.0" },
18
+ { name = "rich", specifier = ">=13.0.0" },
19
+ { name = "typer", specifier = ">=0.12.0" },
20
+ ]
21
+
22
+ [[package]]
23
+ name = "annotated-doc"
24
+ version = "0.0.4"
25
+ source = { registry = "https://pypi.org/simple" }
26
+ sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
27
+ wheels = [
28
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
29
+ ]
30
+
31
+ [[package]]
32
+ name = "colorama"
33
+ version = "0.4.6"
34
+ source = { registry = "https://pypi.org/simple" }
35
+ 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" }
36
+ wheels = [
37
+ { 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" },
38
+ ]
39
+
40
+ [[package]]
41
+ name = "fonttools"
42
+ version = "4.63.0"
43
+ source = { registry = "https://pypi.org/simple" }
44
+ sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" }
45
+ wheels = [
46
+ { url = "https://files.pythonhosted.org/packages/f2/c9/4141c90a90db20f807c7e10bfd689fe53eb8f7f4caff58ee4d4dfe46919f/fonttools-4.63.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e3297a6a4059b4acc3a1e9a8b04741f240a80044eef08ebd32e8b5bcdddce75b", size = 2884632, upload-time = "2026-05-14T12:02:38.56Z" },
47
+ { url = "https://files.pythonhosted.org/packages/b8/46/ad12b5c10eae602d7ef814b02afa08aacbf89da917fed5b071282b7eadc2/fonttools-4.63.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1cd75a03ad8cb5bc40c90bfde68c0c47de423aa19e5c0f362b43520645eea94", size = 2429441, upload-time = "2026-05-14T12:02:41.162Z" },
48
+ { url = "https://files.pythonhosted.org/packages/90/8f/bdca24a84c81d56fffed052229cdcff368f6e05882e526f4558891481f65/fonttools-4.63.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0425b277a59cff3d80ca42162a8de360f318438a2ac83570842a678d826d579", size = 4946346, upload-time = "2026-05-14T12:02:43.41Z" },
49
+ { url = "https://files.pythonhosted.org/packages/04/59/a639c0e136441ee91a65b56fdf89e5d075927e7a09c559d1b0f5276577db/fonttools-4.63.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d7e5c9973aa04c95650c96e5f5ad865fbf42d62079163ecfab1e01cbc2504c22", size = 4903184, upload-time = "2026-05-14T12:02:45.742Z" },
50
+ { url = "https://files.pythonhosted.org/packages/e6/53/91b7e0cb45b536f3da1b29ba8cbab89f27e8b986809e0b1982303a3f4eca/fonttools-4.63.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cb014d58140a38135f16064c74c652ed57aa0b75cbf8bb59cac821f7edb5334e", size = 4922967, upload-time = "2026-05-14T12:02:48.386Z" },
51
+ { url = "https://files.pythonhosted.org/packages/c7/b7/87439bf44e6b97c5538cd29d0b7e366a5b8ce2cc132a4134fb67fa3f2fa2/fonttools-4.63.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:032038247a96c1690f9f31e377c389383c902531b085aa4e4dabd6f57f870e69", size = 5042799, upload-time = "2026-05-14T12:02:50.424Z" },
52
+ { url = "https://files.pythonhosted.org/packages/ad/7c/8b96c3263b89ef99cded544c0f0636686f85dbd3c211c4dceef0231fca23/fonttools-4.63.0-cp310-cp310-win32.whl", hash = "sha256:a8b33a82979e0a6a34ff435cc81317be1f95ec1ebb7a3a2d1c8a6a54f02ae44e", size = 1519704, upload-time = "2026-05-14T12:02:52.523Z" },
53
+ { url = "https://files.pythonhosted.org/packages/e5/4d/2c2f0069970b6907de8fb5b05c5c0193cc22f717df151d1c7aef1c738f58/fonttools-4.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c18358a155d75034911c5ee397a5b44cd19dd325dbb8b35fb60bf421d6a72ac", size = 1568666, upload-time = "2026-05-14T12:02:54.917Z" },
54
+ { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" },
55
+ { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" },
56
+ { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" },
57
+ { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" },
58
+ { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" },
59
+ { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" },
60
+ { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" },
61
+ { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" },
62
+ { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" },
63
+ { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" },
64
+ { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" },
65
+ { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" },
66
+ { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" },
67
+ { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" },
68
+ { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" },
69
+ { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" },
70
+ { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" },
71
+ { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" },
72
+ { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" },
73
+ { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" },
74
+ { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" },
75
+ { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" },
76
+ { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" },
77
+ { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" },
78
+ { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" },
79
+ { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" },
80
+ { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" },
81
+ { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" },
82
+ { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" },
83
+ { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" },
84
+ { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" },
85
+ { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" },
86
+ { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" },
87
+ { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" },
88
+ { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" },
89
+ { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" },
90
+ { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" },
91
+ { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" },
92
+ { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" },
93
+ { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" },
94
+ { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" },
95
+ ]
96
+
97
+ [[package]]
98
+ name = "markdown-it-py"
99
+ version = "4.2.0"
100
+ source = { registry = "https://pypi.org/simple" }
101
+ dependencies = [
102
+ { name = "mdurl" },
103
+ ]
104
+ sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
105
+ wheels = [
106
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
107
+ ]
108
+
109
+ [[package]]
110
+ name = "mdurl"
111
+ version = "0.1.2"
112
+ source = { registry = "https://pypi.org/simple" }
113
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
114
+ wheels = [
115
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
116
+ ]
117
+
118
+ [[package]]
119
+ name = "pygments"
120
+ version = "2.20.0"
121
+ source = { registry = "https://pypi.org/simple" }
122
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
123
+ wheels = [
124
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
125
+ ]
126
+
127
+ [[package]]
128
+ name = "rich"
129
+ version = "15.0.0"
130
+ source = { registry = "https://pypi.org/simple" }
131
+ dependencies = [
132
+ { name = "markdown-it-py" },
133
+ { name = "pygments" },
134
+ ]
135
+ sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
136
+ wheels = [
137
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
138
+ ]
139
+
140
+ [[package]]
141
+ name = "shellingham"
142
+ version = "1.5.4"
143
+ source = { registry = "https://pypi.org/simple" }
144
+ sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
145
+ wheels = [
146
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
147
+ ]
148
+
149
+ [[package]]
150
+ name = "typer"
151
+ version = "0.26.8"
152
+ source = { registry = "https://pypi.org/simple" }
153
+ dependencies = [
154
+ { name = "annotated-doc" },
155
+ { name = "colorama", marker = "sys_platform == 'win32'" },
156
+ { name = "rich" },
157
+ { name = "shellingham" },
158
+ ]
159
+ sdist = { url = "https://files.pythonhosted.org/packages/7c/f7/68adc395201b20b872d68e975386832e8005ffeacedd43a1d837a32815be/typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e", size = 202097, upload-time = "2026-06-26T09:22:45.705Z" }
160
+ wheels = [
161
+ { url = "https://files.pythonhosted.org/packages/80/87/b9fd69c92c6102a066e1b86a35243f53e70bd4c709f2a26d9f4fee4f4dc0/typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c", size = 122564, upload-time = "2026-06-26T09:22:44.72Z" },
162
+ ]