← Commit history

Component record TPS16850VMAR: files batch 1

John Lauer ·6db00ed84a ·18h ago ·parent 58fc666
76 files changed +12226−2
LICENSE+12README.md+187−2altium/TPS16850VMAR.SchLibaltium/TPS16850VMAR.adom-lbr.json+4895artwork/TPS16850VMAR-3d-outline-dark-named.320.pngartwork/TPS16850VMAR-3d-outline-dark-named.svg+1artwork/TPS16850VMAR-heatsink-via.json+85artwork/TPS16850VMAR.mark-plan.json+122docs/figures/tps16850vmar-ds-p3.pngdocs/figures/tps16850vmar-ds-p4.pngdocs/figures/tps16850vmar-ds-p5.pngdocs/figures/tps16850vmar-ds-p50.pngdocs/figures/tps16850vmar-ds-p52.pngdocs/figures/tps16850vmar-ds-p54.pngdocs/figures/tps16850vmar-ds-p55.pngdocs/figures/tps16850vmar-ds-p56.pngdocs/figures/tps16850vmar-ds-p6.pngdocs/figures/tps16850vmar-ds-p7.pngdocs/hero.pngdocs/models/tps16850vmar-bottom.pngdocs/models/tps16850vmar-etched-bottom.pngdocs/models/tps16850vmar-etched-glb-top.pngdocs/models/tps16850vmar-glb-top.pngdocs/proof/tps16850vmar-etched.check.json+135docs/proof/tps16850vmar-etched.check.pngdocs/proof/tps16850vmar-footprint-check.pngdocs/proof/tps16850vmar-lods.pngdocs/proof/tps16850vmar-model-vs-drawing-bottom.pngdocs/proof/tps16850vmar-model-vs-drawing-side.pngdocs/proof/tps16850vmar-pin1-check.pnglod/manifest.json+139lod/tps16850vmar-high.glblod/tps16850vmar-high.pnglod/tps16850vmar-low.glblod/tps16850vmar-low.pnglod/tps16850vmar-medium.glblod/tps16850vmar-medium.pnglod/tps16850vmar-super-low.glblod/tps16850vmar-super-low.pngmodels.json+226provenance/3d-model.json+186provenance/footprint-check.json+1455provenance/model-overlay.json+22provenance/tools/build_fp.py+134provenance/tools/build_vma23.py+100provenance/tools/footprint-create.json+304provenance/tools/fp-extra.json+236provenance/tools/fp_check.py+179provenance/tools/glb_batch.py+89provenance/tools/hero_png.py+20provenance/tools/hero_post_vias.py+69provenance/tools/hub_fix.py+16provenance/tools/lbr_fix.py+33provenance/tools/materials.py+32provenance/tools/ortho.py+100provenance/tools/overlay_vma.py+91provenance/tools/page_json.py+61provenance/tools/page_meta.py+176provenance/tools/pin1_check.py+50provenance/tools/push.sh+32provenance/tools/render_glb.py+71provenance/tools/render_sym.py+25provenance/tools/snap_symbol.py+41provenance/tools/svg_poly_png.py+16provenance/tools/symbol-create.json+247provenance/tools/symbol_json.py+49provenance/tps16850vmar-etched.mark-plan.json+149provenance/tps16850vmar-lbr-input.kicad_mod+110tps16850vmar-etched.glbtps16850vmar-hero.overlay.json+807tps16850vmar.glbtps16850vmar.kicad_mod+127tps16850vmar.kicad_sym+345tps16850vmar.lbr+571verification.json+271viewers/footprint.html+210
LICENSEadded+12
@@ -0,0 +1,12 @@+Creative Commons Attribution 4.0 International (CC BY 4.0)+https://creativecommons.org/licenses/by/4.0/++Copyright 2026 Adom Inc.++Applies to the files authored by Adom on this page: the KiCad symbol and footprint, the 3D models+(tps16850vmar*.step, *.glb, lod/), the virtual MPN etch, the chip outline artwork, the Fusion/EAGLE and+Altium libraries, the provenance tools and data, and the README text.++Not covered (they keep their own terms):+- docs/tps16850vmar-datasheet.pdf and the page images under docs/figures/ and inside docs/proof/: Texas+  Instruments Incorporated (SLVSHA1D), redistributed for reference under TI's terms.
README.md+187−2
@@ -1,3 +1,188 @@-# TPS16850VMAR - 9 V to 80 V, 20 A eFuse+# TPS16850VMAR -Texas Instruments TPS16850VMAR: 9 V to 80 V, 20 A stackable integrated hot-swap eFuse with a 3.5 mOhm FET, fast current monitor and auto-retry fault response, LQFN-CLIP-23 (VMA, 6.0 x 5.0 mm). KiCad symbol and footprint, Fusion and Altium libraries, datasheet-built 3D model and datasheet.+**Texas Instruments** · 9 V to 80 V, 20 A integrated hot-swap eFuse · LQFN-CLIP-23 (VMA, 6.0 x 5.0 mm)++TPS16850VMAR is the auto-retry, 73 A fixed-fast-trip member of TI's TPS1685x family: an integrated eFuse with a 3.5 mOhm (typical) FET for 9 V to 80 V rails, an adjustable 2 A to 20 A circuit breaker with a transient timer, adjustable undervoltage and overvoltage thresholds, inrush (dVdT) control, a fast and accurate analog current monitor, an analog die-temperature output, and power-good and fault flags. Several devices can run in parallel with synchronised states and active current sharing (SLVSHA1D p.1).++::adom-verified{src="/adom/tps16850vmar/render/verification.json"}++## Key specifications++| Parameter | Value | Source |+|---|---|---|+| Function | Integrated hot-swap eFuse (circuit protection and power management), stackable | p.1 |+| Input voltage (IN, VDD) | 9 V to 80 V operating; 90 V absolute maximum (92 V at TJ 25 C to 125 C) | p.6, p.7 |+| Output | withstands down to -5 V | p.1, p.6 |+| On resistance RON | 3.5 mOhm typ, 5.55 mOhm max at 12 A, TJ 25 C; 6.1 mOhm max over -40 C to 125 C | p.8, p.9 |+| Continuous current | 20 A RMS (TJ up to 125 C); 27 A peak for 10 ms or less at TA up to 70 C | p.7 |+| Circuit breaker | adjustable 2 A to 20 A with RIMON and IREF, +-3 % accuracy; blanking timer set by a capacitor on ITIMER | p.1, p.9 |+| Fast trip | fixed 73 A (TPS16850; the A variants trip at 83 A), plus a scalable fast trip set by SFT_SEL | p.3, p.9, p.10 |+| Fault response | auto-retry (TPS16850 and TPS16850A); TPS16851 and TPS16851A latch off | p.3 |+| Current monitor | IMON gain 18.18 uA/A typ, 1 MHz bandwidth, under 3 % error from 50 % to 100 % of full current | p.1, p.9 |+| Temperature monitor | TEMP 678 mV at TJ 25 C, 2.73 mV/C; thermal shutdown 150 C | p.10 |+| VDD supply current | 0.6 mA typ, 4 mA max (on) | p.8 |+| Junction temperature | -40 C to +125 C | p.7 |+| Thermal (JEDEC 2s2p) | RthJA 22.1 C/W, PsiJT 1.1 C/W, PsiJB 9.4 C/W | p.7 |+| Package | TI VMA0023A LQFN-CLIP, 23 pins plus exposed pad, 6.0 x 5.0 mm, 1.5 mm max height | p.1, p.54 |+| Packing, MSL, finish | 2500 per large tape and reel; MSL 2 at 260 C; NiPdAu; marked TPS16850 | p.50 |++## Pinout (top view)++| Pin | Name | Type | Function |+|---|---|---|---|+| 1 | ILIM | I/O | Resistor to GND sets the active current-sharing threshold; also this device's current monitor output. Do not leave floating. |+| 2 | IMON | I/O | Resistor to GND sets the overcurrent and fast-trip thresholds; fast, accurate load-current monitor output. Do not leave floating. |+| 3 | IREF | I/O | Reference voltage for overcurrent, short-circuit and current sharing (internal current source into a resistor, or driven, 0.3 V to 1.2 V). Do not leave floating. |+| 4 | dVdT | I/O | Output slew rate at start-up: open for the fastest start, a capacitor to GND limits inrush. |+| 5 | GND | ground | Device ground reference. |+| 6 | SFT_SEL | I/O | Resistor to GND selects the scalable fast-trip multiplier. |+| 7, 8 | OUT | power | Power output; solder uniformly to the output plane. |+| 9 | VDD | power | Controller supply; connect to VIN through a series resistor and decouple to GND. |+| 10, 22, 23, exposed pad | IN | power | Power input; solder uniformly to the input plane (the exposed pad is IN). |+| 11, 17, 21 | NC | | Do not connect anything to these pins. |+| 12 | MODE | input | Floating = standalone or primary; GND = secondary in a parallel chain. |+| 13 | FLT (active low) | output | Open-drain fault flag; pull up with a resistor. |+| 14 | ITIMER | I/O | Capacitor to GND sets the overcurrent blanking interval. |+| 15 | TEMP | I/O | Analog junction temperature; tie across parallel devices to report the hottest. |+| 16 | EN/UVLO | input | Active-high enable; a divider from the input sets the undervoltage threshold. Do not leave floating. |+| 18 | OVP | input | Overvoltage set point from a divider on VIN. Do not leave floating. |+| 19 | PGOOD | output | Open-drain power good, high in steady state; weak internal pull-up. |+| 20 | SWEN | I/O | Open-drain switch-enable line that synchronises a parallel chain; weak internal pull-up. |++Source: SLVSHA1D Figure 5-1 and Table 5-1 (p.4 to p.5). Pins IN, OUT and NC repeat; the symbol shows every pin so each pad has its own pin.++## Design notes++- **Do not leave floating:** ILIM, IMON, IREF, EN/UVLO and OVP; SFT_SEL is not recommended floating (p.4, p.5).+- **Capacitance:** TI's recommended operating conditions call for at least 10 nF on IN and 10 uF on OUT, and limit the hot-plug slew rate on IN to 100 V/us (p.7).+- **Parallel operation:** tie SWEN, TEMP and the current-sharing pins as TI describes for a primary and secondaries; MODE to GND makes a device a secondary (p.5).+- **Layout:** IN and OUT carry the load current through the combs (pins 7, 10, 22), pin 23 and the exposed pad; TI's land pattern puts 12 vias in the exposed pad (p.55).+- **Family:** TPS16850 (auto-retry, 73 A fast trip), TPS16851 (latch-off, 73 A), TPS16850A (auto-retry, 83 A), TPS16851A (latch-off, 83 A); all share this package and land pattern (p.3, p.50).++## CAD++| File | What it is |+|---|---|+| [tps16850vmar.kicad_sym](tps16850vmar.kicad_sym) | KiCad symbol `TPS16850VMAR` (adom-symbol 1.2.6), pins grouped Power in / Control / Current setting on the left and Power out / Current monitor / Status / Ground / No connect on the right, chip outline drawn in the body, every pin on the 2.54 mm grid. Properties: MPN, Manufacturer, Datasheet, Mouser, DigiKey, Adom Wiki. |+| [tps16850vmar.kicad_mod](tps16850vmar.kicad_mod) | KiCad footprint to TI's land pattern and stencil (below). Its 3D path is `${KIPRJMOD}/tps16850vmar-etched.step`; put the STEP beside your project or repoint the path. |+| [tps16850vmar.lbr](tps16850vmar.lbr) | Fusion / EAGLE library (adom-lbr 2.47.5 plus hand fixes, lint PASS) with MPN, MANUFACTURER, MOUSER_PN and DIGIKEY_PN attributes. |+| [altium/TPS16850VMAR.SchLib](altium/TPS16850VMAR.SchLib), [altium/TPS16850VMAR.PcbLib](altium/TPS16850VMAR.PcbLib) | Native Altium libraries (adom-lbr assemble-altium) with the etched STEP embedded and Supplier parameters. |+| [altium/TPS16850VMAR.adom-lbr.json](altium/TPS16850VMAR.adom-lbr.json) | The adom-lbr hub (symbol, footprint, pin to pad map) the Altium files are made from. |+| [tps16850vmar-etched.step](tps16850vmar-etched.step) | The library 3D model (see below). |++**Library notes.** adom-lbr 2.47.5 does not carry KiCad custom-pad shapes or paste-only pads, so the Fusion and Altium files are made from [provenance/tps16850vmar-lbr-input.kicad_mod](provenance/tps16850vmar-lbr-input.kicad_mod): the same copper with every L and comb pad written as a union of rectangles, and the copper under the solder mask as rectangles with mask and paste expansion -1.2 mm (no opening). Fixed by hand ([provenance/tools/lbr_fix.py](provenance/tools/lbr_fix.py)): the Fusion NC pins are typed `nc` (the tool wrote `io`), every pin shows its name, the fab outline is wires, and TI's six paste windows are on tCream. Altium has no no-connect pin type, so pins 11, 17 and 21 are Passive there; and because adom-lbr writes no paste-layer regions, the Altium exposed pad has one paste aperture with the area of TI's six windows (expansion -0.174 mm, 6.11 mm2): replace it with TI's windows if your assembler wants them.++## Footprint++The pads follow TI's **LAND PATTERN EXAMPLE** and **SOLDER PASTE EXAMPLE** for VMA0023A (SLVSHA1D p.55 and p.56):++- signal pads 0.25 mm wide on a 0.5 mm pitch; pads 1 to 4 and 11 to 16 are 0.65 mm long, pad 5 is 0.70 mm, pads 18 to 21 are 0.60 mm and pads 8 and 9 are 0.75 mm; pad 23 is a 1.3 mm bar;+- pads 6 and 17 are L shapes; pads 7, 10 and 22 are solder-mask-defined combs on a larger copper rectangle (TI draws the metal under the mask dashed and the mask opening as a comb);+- the exposed pad (IN) is 3.4 x 2.35 mm, centred 0.075 mm above the package centre line, with TI's 12 vias (0.2 mm drill, tented) and six 0.98 x 1.04 mm paste windows (76 % coverage);+- plain pad corners R0.05 as TI prints them.++Drawn at TI's 15X scale on the datasheet page, the copper and the comb openings land on TI's strokes; pad by pad, every copper, mask and paste area agrees with TI's VMA0023A footprint as published through Ultra Librarian to within 0.05 mm2 (corner treatment). KiCad has no VMA0023A footprint to compare with. Details: [provenance/footprint-check.json](provenance/footprint-check.json).++![Footprint over TI's land pattern](docs/proof/tps16850vmar-footprint-check.png)++### Heatsink vias++::adom-heatsink-via{src="/adom/tps16850vmar/render/artwork/TPS16850VMAR-heatsink-via.json"}++## Pin 1++Pin 1 (ILIM) is on the left side, 0.5 mm above the package centre line in the top view; numbering runs counter-clockwise, and the exposed pad's 45 degree chamfer and TI's pin-1 index area are at the top-left corner (p.4, p.54). Footprint pad 1 is at (-2.875, -0.5) in KiCad's Y-down frame with a silkscreen dot to its left; the 3D model's pin-1 terminal sits on it with zero offset and rotation; the symbol's pin 1 is ILIM. TI's reel puts pin 1 in quadrant Q1 (p.52).++![Pin 1 in the datasheet, the footprint and the 3D model](docs/proof/tps16850vmar-pin1-check.png)++## 3D models++::adom-models{src="/adom/tps16850vmar/render/models.json"}++| File | What it is |+|---|---|+| [tps16850vmar-etched.step](tps16850vmar-etched.step) | Library model for board CAD: the package with the MPN etched on top in an `Adom.LaserEtch` group. |+| [tps16850vmar.step](tps16850vmar.step) | The same package, unmarked. |+| [tps16850vmar-hero.glb](tps16850vmar-hero.glb) | The page's 3D view: the etched chip with pad outlines, silkscreen, pin names and the heatsink vias as switchable layers. Not for board use. |+| [tps16850vmar-etched.glb](tps16850vmar-etched.glb) | Clean web and board-viewer copy of the etched model. |+| [tps16850vmar.glb](tps16850vmar.glb) | Web copy of the unmarked model. |+| [lod/](lod/manifest.json) | Four board detail levels (below). |++Frame for every file: Z up, seated on z = 0, centred on the footprint origin, X along the 6.0 mm side, pin 1 at (-x, +y).++**How the model was made.** TI's product page links its CAD models through Ultra Librarian, whose STEP download sits behind a reCAPTCHA form, so TI's STEP was not obtained, and KiCad has no model for this package. The model was therefore built by AI (Claude, for Adom) with CadQuery from TI's VMA0023A package outline (p.54) ([provenance/tools/build_vma23.py](provenance/tools/build_vma23.py)): a 6.0 x 5.0 x 1.4 mm mould on a 0.025 mm stand-off, the 23 terminals and the exposed pad as drawn (combs, L shapes, rounded inner ends), 0.2 mm terminal exposure on the side walls. Colours follow TI's package render: dark grey mould, NiPdAu terminal faces, copper where the terminals are sawn through at the side walls. Drawn over TI's bottom view, 97 % of the model's edges land on TI's lines; the side view matches the terminal exposures (TI draws the body at its 1.5 mm maximum, the model is at the 1.4 mm nominal). Method and every dimension: [provenance/3d-model.json](provenance/3d-model.json).++![Model over TI's bottom view](docs/proof/tps16850vmar-model-vs-drawing-bottom.png)++![Model over TI's side view](docs/proof/tps16850vmar-model-vs-drawing-side.png)++**The marking is virtual.** The etch reads `TPS16850` / `VMAR`, the orderable part number, so the part is identifiable in a 3D board view. TI's real marking is `TPS16850` with lot trace information (p.50). The etch was made with adom-chip-laser (service-occt flat mark 5 um above the top face) placed by the adom-aiflow-etch planner from the footprint; its gate passes.++![Etch check](docs/proof/tps16850vmar-etched.check.png)++## Detail levels for board and digital-twin viewers++::adom-component-lod{src="/adom/tps16850vmar/render/lod/manifest.json"}++| Level | File | Triangles | Marking |+|---|---|---|---|+| high | [tps16850vmar-high.glb](lod/tps16850vmar-high.glb) | 3676 | yes |+| medium | [tps16850vmar-medium.glb](lod/tps16850vmar-medium.glb) | 1948 | yes |+| low | [tps16850vmar-low.glb](lod/tps16850vmar-low.glb) | 1388 | no |+| super-low | [tps16850vmar-super-low.glb](lod/tps16850vmar-super-low.glb) | 980 | no |++All four share the library model's frame and carry no footprint, silkscreen or label artwork. High is the etched GLB; medium and low have square inner terminal ends (medium keeps the etch); super-low also drops the copper end slices. Every level keeps all terminals and the exposed pad. Status: candidate; the previews were inspected, a streaming LOD viewer has not qualified them.++![Detail levels: high, medium, low, super-low](docs/proof/tps16850vmar-lods.png)++## Symbol chip outline++The symbol body carries the chip outline drawn from the etched model by `adom-aiflow-etch outline` (gate PASS): [artwork/TPS16850VMAR-3d-outline-dark-named.svg](artwork/TPS16850VMAR-3d-outline-dark-named.svg). The KiCad symbol, the Fusion library and the Altium SchLib carry the same drawing.++![Chip outline](artwork/TPS16850VMAR-3d-outline-dark-named.320.png)++## Sourcing++Checked 2026-10-21 with adom-parts-search.++| Distributor | Part number | Stock | Price |+|---|---|---|---|+| Mouser | [595-TPS16850VMAR](https://www.mouser.com/en/ProductDetail/Texas-Instruments/TPS16850VMAR?qs=3GbUB62Nf7feTcUOtfOsAg%3D%3D) | 13,048 | 9.95 USD (1), 6.58 USD (100); lead time 140 days |+| DigiKey | [296-TPS16850VMARTR-ND](https://www.digikey.com/en/products/detail/texas-instruments/TPS16850VMAR/29178296) | 0 (tape and reel) | 6.508 USD (reel quantity) |+| LCSC / JLCPCB | not listed | | JLCPCB lists the latch-off TPS16851VMAR (C48705346), a different part |++## Manufacturer and resources++| Resource | Link |+|---|---|+| Product page | [ti.com/product/TPS1685](https://www.ti.com/product/TPS1685/part-details/TPS16850VMAR) |+| Datasheet | SLVSHA1D (Rev. D, September 2024, revised July 2026), [PDF on this page](docs/tps16850vmar-datasheet.pdf), [ti.com](https://www.ti.com/lit/ds/symlink/tps1685.pdf) |+| Package drawing | VMA0023A, 4230225/A 11/2023 (datasheet p.54 to p.56) |+| Evaluation module | TPS1685EVM |+| CAD from TI | Ultra Librarian, [VMA package](https://vendor.ultralibrarian.com/TI/embedded/?gpn=TPS1685&package=VMA&pin=23) |++## Provenance++- **Datasheet:** TI SLVSHA1D, 57 pages, sha256 `fe9d96bfb8f8e13b`, downloaded from ti.com on 2026-10-21 ([docs/tps16850vmar-datasheet.pdf](docs/tps16850vmar-datasheet.pdf)). Every pin and spec above cites its page.+- **Footprint:** [provenance/footprint-check.json](provenance/footprint-check.json), pad by pad against p.55 and p.56 and against TI's Ultra Librarian footprint; built by [build_fp.py](provenance/tools/build_fp.py) on adom-footprint 1.0.26.+- **3D model:** [provenance/3d-model.json](provenance/3d-model.json): source attempts, build, dimensions, overlay scores, etch gate, hashes. Tools in [provenance/tools/](provenance/tools/build_vma23.py).+- **Symbol:** created from [provenance/tools/symbol-create.json](provenance/tools/symbol-create.json) by adom-symbol 1.2.6, then every pin moved onto the 2.54 mm grid by [snap_symbol.py](provenance/tools/snap_symbol.py) (the tool placed the first pin of each column at y = -2.00 and spaced groups 8.35 mm apart).+- **Hero:** adom/component-hero 0.1.2 `hero_glb.py` (adom-hero 1.4, align OK), then [hero_post_vias.py](provenance/tools/hero_post_vias.py) adds the heatsink-via layer.+- **Licence:** Adom-authored files are CC-BY-4.0, see [LICENSE](LICENSE). The datasheet and its page images are TI's and keep TI's terms.++Cited datasheet pages:++![p.1 Features and description](docs/figures/tps16850vmar-ds-p1.png)+![p.3 Device comparison](docs/figures/tps16850vmar-ds-p3.png)+![p.4 Pin configuration and functions](docs/figures/tps16850vmar-ds-p4.png)+![p.5 Pin functions, continued](docs/figures/tps16850vmar-ds-p5.png)+![p.6 Absolute maximum ratings](docs/figures/tps16850vmar-ds-p6.png)+![p.7 Recommended operating conditions and thermal information](docs/figures/tps16850vmar-ds-p7.png)+![p.8 Electrical characteristics](docs/figures/tps16850vmar-ds-p8.png)+![p.9 Electrical characteristics, continued](docs/figures/tps16850vmar-ds-p9.png)+![p.10 Electrical characteristics, continued](docs/figures/tps16850vmar-ds-p10.png)+![p.50 Package option addendum](docs/figures/tps16850vmar-ds-p50.png)+![p.52 Tape and reel](docs/figures/tps16850vmar-ds-p52.png)+![p.54 Package outline](docs/figures/tps16850vmar-ds-p54.png)+![p.55 Land pattern](docs/figures/tps16850vmar-ds-p55.png)+![p.56 Solder paste example](docs/figures/tps16850vmar-ds-p56.png)
altium/TPS16850VMAR.SchLibadded
⋯ 1 unchanged line ⋯
altium/TPS16850VMAR.adom-lbr.jsonadded+4895
@@ -0,0 +1,4895 @@+{+ "schema_version": 2,+ "mpn": "TPS16850VMAR",+ "manufacturer": "Texas Instruments",+ "package": "",+ "value": "",+ "category": "",+ "symbol": {+  "name": "TPS16850VMAR",+  "pins": [+   {+    "number": "10",+    "name": "IN",+    "x": -900,+    "y": 900,+    "length": 100,+    "rotation": 0,+    "electrical_type": "power_in"+   },+   {+    "number": "22",+    "name": "IN",+    "x": -900,+    "y": 800,+    "length": 100,+    "rotation": 0,+    "electrical_type": "power_in"+   },+   {+    "number": "23",+    "name": "IN",+    "x": -900,+    "y": 700,+    "length": 100,+    "rotation": 0,+    "electrical_type": "power_in"+   },+   {+    "number": "24",+    "name": "IN",+    "x": -900,+    "y": 600,+    "length": 100,+    "rotation": 0,+    "electrical_type": "power_in"+   },+   {+    "number": "9",+    "name": "VDD",+    "x": -900,+    "y": 500,+    "length": 100,+    "rotation": 0,+    "electrical_type": "power_in"+   },+   {+    "number": "16",+    "name": "EN/UVLO",+    "x": -900,+    "y": 200,+    "length": 100,+    "rotation": 0,+    "electrical_type": "input"+   },+   {+    "number": "18",+    "name": "OVP",+    "x": -900,+    "y": 100,+    "length": 100,+    "rotation": 0,+    "electrical_type": "input"+   },+   {+    "number": "12",+    "name": "MODE",+    "x": -900,+    "y": 0,+    "length": 100,+    "rotation": 0,+    "electrical_type": "input"+   },+   {+    "number": "4",+    "name": "dVdT",+    "x": -900,+    "y": -100,+    "length": 100,+    "rotation": 0,+    "electrical_type": "passive"+   },+   {+    "number": "3",+    "name": "IREF",+    "x": -900,+    "y": -400,+    "length": 100,+    "rotation": 0,+    "electrical_type": "passive"+   },+   {+    "number": "14",+    "name": "ITIMER",+    "x": -900,+    "y": -500,+    "length": 100,+    "rotation": 0,+    "electrical_type": "passive"+   },+   {+    "number": "6",+    "name": "SFT_SEL",+    "x": -900,+    "y": -600,+    "length": 100,+    "rotation": 0,+    "electrical_type": "passive"+   },+   {+    "number": "7",+    "name": "OUT",+    "x": 900,+    "y": 900,+    "length": 100,+    "rotation": 180,+    "electrical_type": "power_out"+   },+   {+    "number": "8",+    "name": "OUT",+    "x": 900,+    "y": 800,+    "length": 100,+    "rotation": 180,+    "electrical_type": "power_out"+   },+   {+    "number": "2",+    "name": "IMON",+    "x": 900,+    "y": 500,+    "length": 100,+    "rotation": 180,+    "electrical_type": "passive"+   },+   {+    "number": "1",+    "name": "ILIM",+    "x": 900,+    "y": 400,+    "length": 100,+    "rotation": 180,+    "electrical_type": "passive"+   },+   {+    "number": "19",+    "name": "PGOOD",+    "x": 900,+    "y": 100,+    "length": 100,+    "rotation": 180,+    "electrical_type": "open_collector"+   },+   {+    "number": "13",+    "name": "~{FLT}",+    "x": 900,+    "y": 0,+    "length": 100,+    "rotation": 180,+    "electrical_type": "open_collector"+   },+   {+    "number": "20",+    "name": "SWEN",+    "x": 900,+    "y": -100,+    "length": 100,+    "rotation": 180,+    "electrical_type": "bidirectional"+   },+   {+    "number": "15",+    "name": "TEMP",+    "x": 900,+    "y": -200,+    "length": 100,+    "rotation": 180,+    "electrical_type": "bidirectional"+   },+   {+    "number": "5",+    "name": "GND",+    "x": 900,+    "y": -500,+    "length": 100,+    "rotation": 180,+    "electrical_type": "power_in"+   },+   {+    "number": "11",+    "name": "NC",+    "x": 900,+    "y": -800,+    "length": 100,+    "rotation": 180,+    "electrical_type": "no_connect"+   },+   {+    "number": "17",+    "name": "NC",+    "x": 900,+    "y": -900,+    "length": 100,+    "rotation": 180,+    "electrical_type": "no_connect"+   },+   {+    "number": "21",+    "name": "NC",+    "x": 900,+    "y": -1000,+    "length": 100,+    "rotation": 180,+    "electrical_type": "no_connect"+   }+  ],+  "body": null,+  "graphics": [+   {+    "kind": "rect",+    "x1": -800.0,+    "y1": 1100.0,+    "x2": 800.0,+    "y2": -1100.0,+    "width": 10.0,+    "filled": true,+    "fill_style": "background"+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.740157480314961,+      -112.32283464566945+     ],+     [+      -151.1811023622047,+      -32.95275590551182+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.740157480314961,+      -155.9448818897638+     ],+     [+      -13.740157480314961,+      -112.32283464566945+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.740157480314961,+      -155.9448818897638+     ],+     [+      -24.055118110236222,+      -150.0+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -24.055118110236222,+      -150.0+     ],+     [+      -24.055118110236222,+      -144.4488188976377+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -24.055118110236222,+      -144.4488188976377+     ],+     [+      -30.905511811023626,+      -140.472440944882+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -30.905511811023626,+      -146.02362204724432+     ],+     [+      -30.905511811023626,+      -140.472440944882+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -30.905511811023626,+      -146.02362204724432+     ],+     [+      -37.79527559055118,+      -142.08661417322833+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.79527559055118,+      -142.08661417322833+     ],+     [+      -37.79527559055118,+      -136.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -132.55905511811034+     ],+     [+      -37.79527559055118,+      -136.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -138.11023622047264+     ],+     [+      -44.68503937007874,+      -132.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -138.11023622047264+     ],+     [+      -51.53543307086614,+      -134.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -51.53543307086614,+      -134.1338582677165+     ],+     [+      -51.53543307086614,+      -128.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -124.60629921259851+     ],+     [+      -51.53543307086614,+      -128.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -130.1574803149606+     ],+     [+      -58.425196850393704,+      -124.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -130.1574803149606+     ],+     [+      -65.2755905511811,+      -126.18110236220468+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -65.2755905511811,+      -126.18110236220468+     ],+     [+      -65.2755905511811,+      -120.6299212598426+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -116.69291338582684+     ],+     [+      -65.2755905511811,+      -120.6299212598426+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -122.24409448818892+     ],+     [+      -72.16535433070867,+      -116.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -122.24409448818892+     ],+     [+      -79.01574803149607,+      -118.26771653543301+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -79.01574803149607,+      -118.26771653543301+     ],+     [+      -79.01574803149607,+      -112.71653543307093+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -108.74015748031502+     ],+     [+      -79.01574803149607,+      -112.71653543307093+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -114.29133858267733+     ],+     [+      -85.90551181102363,+      -108.74015748031502+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -114.29133858267733+     ],+     [+      -92.7952755905512,+      -110.35433070866134+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.7952755905512,+      -110.35433070866134+     ],+     [+      -92.7952755905512,+      -104.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -100.7874015748032+     ],+     [+      -92.7952755905512,+      -104.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -106.37795275590565+     ],+     [+      -99.64566929133859,+      -100.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -106.37795275590565+     ],+     [+      -121.61417322834646,+      -93.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.61417322834646,+      -93.66141732283472+     ],+     [+      -121.61417322834646,+      -88.11023622047264+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -84.1338582677165+     ],+     [+      -121.61417322834646,+      -88.11023622047264+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -89.68503937007881+     ],+     [+      -128.50393700787401,+      -84.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -89.68503937007881+     ],+     [+      -135.39370078740157,+      -85.74803149606305+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -135.39370078740157,+      -85.74803149606305+     ],+     [+      -135.39370078740157,+      -80.19685039370097+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -76.22047244094483+     ],+     [+      -135.39370078740157,+      -80.19685039370097+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -81.77165354330714+     ],+     [+      -142.24409448818898,+      -76.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -81.77165354330714+     ],+     [+      -151.1811023622047,+      -76.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -151.1811023622047,+      -76.61417322834654+     ],+     [+      -151.1811023622047,+      -32.95275590551182+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.740157480314961,+      -112.32283464566945+     ],+     [+      151.1811023622047,+      -17.086614173228327+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      151.1811023622047,+      -17.086614173228327+     ],+     [+      13.740157480314961,+      62.24409448818892+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -151.1811023622047,+      -32.95275590551182+     ],+     [+      13.740157480314961,+      62.24409448818892+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -148.03149606299212+     ],+     [+      22.007874015748033,+      -135.3149606299212+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -110.7086614173229+     ],+     [+      71.45669291338582,+      -106.77165354330714+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      78.34645669291339,+      -102.79527559055123+     ],+     [+      100.35433070866142,+      -90.0787401574803+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      107.20472440944881,+      -86.14173228346476+     ],+     [+      114.05511811023622,+      -82.16535433070862+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -142.4803149606298+     ],+     [+      -8.228346456692913,+      -147.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.740157480314961,+      -155.9448818897638+     ],+     [+      -8.228346456692913,+      -152.79527559055123+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      151.1811023622047,+      -60.74803149606305+     ],+     [+      151.1811023622047,+      -17.086614173228327+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -70.27559055118104+     ],+     [+      151.1811023622047,+      -60.74803149606305+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -70.27559055118104+     ],+     [+      134.68503937007873,+      -64.72440944881896+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -64.72440944881896+     ],+     [+      127.83464566929133,+      -68.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.83464566929133,+      -74.2125984251968+     ],+     [+      127.83464566929133,+      -68.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -78.18897637795271+     ],+     [+      127.83464566929133,+      -74.2125984251968+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -78.18897637795271+     ],+     [+      120.94488188976379,+      -72.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -72.63779527559063+     ],+     [+      114.05511811023622,+      -76.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      114.05511811023622,+      -82.16535433070862+     ],+     [+      114.05511811023622,+      -76.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      107.20472440944881,+      -86.14173228346476+     ],+     [+      107.20472440944881,+      -80.59055118110246+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      100.35433070866142,+      -84.52755905511822+     ],+     [+      107.20472440944881,+      -80.59055118110246+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      100.35433070866142,+      -90.0787401574803+     ],+     [+      100.35433070866142,+      -84.52755905511822+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      78.34645669291339,+      -102.79527559055123+     ],+     [+      78.34645669291339,+      -97.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      71.45669291338582,+      -101.22047244094483+     ],+     [+      78.34645669291339,+      -97.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      71.45669291338582,+      -106.77165354330714+     ],+     [+      71.45669291338582,+      -101.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -110.7086614173229+     ],+     [+      64.60629921259843,+      -105.15748031496082+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -105.15748031496082+     ],+     [+      59.09448818897638,+      -108.34645669291353+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      59.09448818897638,+      -113.89763779527561+     ],+     [+      59.09448818897638,+      -108.34645669291353+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -117.87401574803152+     ],+     [+      59.09448818897638,+      -113.89763779527561+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -117.87401574803152+     ],+     [+      52.24409448818898,+      -112.32283464566945+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -112.32283464566945+     ],+     [+      46.73228346456693,+      -115.47244094488178+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.73228346456693,+      -121.06299212598447+     ],+     [+      46.73228346456693,+      -115.47244094488178+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -125.0+     ],+     [+      46.73228346456693,+      -121.06299212598447+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -125.0+     ],+     [+      39.881889763779526,+      -119.44881889763792+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -119.44881889763792+     ],+     [+      34.37007874015748,+      -122.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      34.37007874015748,+      -128.1889763779527+     ],+     [+      34.37007874015748,+      -122.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -132.16535433070885+     ],+     [+      34.37007874015748,+      -128.1889763779527+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -132.16535433070885+     ],+     [+      27.480314960629922,+      -126.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -126.61417322834654+     ],+     [+      22.007874015748033,+      -129.7637795275591+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      22.007874015748033,+      -135.3149606299212+     ],+     [+      22.007874015748033,+      -129.7637795275591+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -148.03149606299212+     ],+     [+      0.0,+      -142.4803149606298+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.228346456692913,+      -152.79527559055123+     ],+     [+      -8.228346456692913,+      -147.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.20472440944883,+      -110.82677165354335+     ],+     [+      -92.08661417322836,+      -110.7086614173229+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.20472440944883,+      -110.6299212598426+     ],+     [+      -92.20472440944883,+      -110.82677165354335+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -78.46456692913387,+      -118.74015748031502+     ],+     [+      -78.34645669291339,+      -118.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -78.46456692913387,+      -118.58267716535443+     ],+     [+      -78.46456692913387,+      -118.74015748031502+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -64.7244094488189,+      -126.69291338582684+     ],+     [+      -64.60629921259843,+      -126.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -64.7244094488189,+      -126.53543307086625+     ],+     [+      -64.7244094488189,+      -126.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -50.98425196850393,+      -134.60629921259851+     ],+     [+      -50.86614173228347,+      -134.52755905511822+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -50.98425196850393,+      -134.44881889763792+     ],+     [+      -50.98425196850393,+      -134.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.24409448818898,+      -142.55905511811034+     ],+     [+      -37.125984251968504,+      -142.4803149606298+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.24409448818898,+      -142.40157480314974+     ],+     [+      -37.24409448818898,+      -142.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      70.78740157480316,+      -107.16535433070862+     ],+     [+      70.90551181102363,+      -107.24409448818892+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      70.90551181102363,+      -107.24409448818892+     ],+     [+      70.90551181102363,+      -107.08661417322833+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      99.64566929133859,+      -90.51181102362216+     ],+     [+      99.76377952755905,+      -90.59055118110246+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      99.76377952755905,+      -90.59055118110246+     ],+     [+      99.76377952755905,+      -90.39370078740171+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.10236220472441,+      -94.1338582677165+     ],+     [+      -120.94488188976379,+      -94.05511811023644+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.10236220472441,+      -93.97637795275591+     ],+     [+      -121.10236220472441,+      -94.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.779527559055119,+      -153.267716535433+     ],+     [+      -8.937007874015748,+      -153.1889763779527+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -23.346456692913385,+      -150.39370078740149+     ],+     [+      -23.503937007874015,+      -150.472440944882+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -23.503937007874015,+      -150.472440944882+     ],+     [+      -23.503937007874015,+      -150.31496062992142+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.779527559055119,+      -153.11023622047264+     ],+     [+      -8.779527559055119,+      -153.267716535433+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      21.45669291338583,+      -135.7874015748032+     ],+     [+      21.2992125984252,+      -135.7086614173229+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      21.45669291338583,+      -135.6299212598426+     ],+     [+      21.45669291338583,+      -135.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      58.54330708661418,+      -114.37007874015762+     ],+     [+      58.425196850393704,+      -114.29133858267733+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.181102362204726,+      -121.53543307086602+     ],+     [+      46.023622047244096,+      -121.45669291338595+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      33.818897637795274,+      -128.66141732283472+     ],+     [+      33.661417322834644,+      -128.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      58.54330708661418,+      -114.2125984251968+     ],+     [+      58.54330708661418,+      -114.37007874015762+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      33.818897637795274,+      -128.50393700787413+     ],+     [+      33.818897637795274,+      -128.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.181102362204726,+      -121.33858267716528+     ],+     [+      46.181102362204726,+      -121.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      113.54330708661418,+      -82.63779527559063+     ],+     [+      113.38582677165354,+      -82.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.28346456692914,+      -74.68503937007881+     ],+     [+      127.12598425196852,+      -74.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      113.54330708661418,+      -82.48031496063004+     ],+     [+      113.54330708661418,+      -82.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.28346456692914,+      -74.52755905511822+     ],+     [+      127.28346456692914,+      -74.68503937007881+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -134.84251968503938,+      -86.22047244094483+     ],+     [+      -134.68503937007873,+      -86.14173228346476+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -134.84251968503938,+      -86.06299212598424+     ],+     [+      -134.84251968503938,+      -86.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.7952755905512,+      -111.14173228346453+     ],+     [+      -92.20472440944883,+      -110.82677165354335+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.7952755905512,+      -111.14173228346453+     ],+     [+      -92.7952755905512,+      -104.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -92.20472440944883,+      -110.6299212598426+     ],+     [+      -92.20472440944883,+      -110.82677165354335+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -107.16535433070862+     ],+     [+      -92.7952755905512,+      -111.14173228346453+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -100.7874015748032+     ],+     [+      -92.7952755905512,+      -104.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -99.64566929133859,+      -107.16535433070862+     ],+     [+      -99.64566929133859,+      -100.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -79.01574803149607,+      -119.05511811023621+     ],+     [+      -78.46456692913387,+      -118.74015748031502+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -79.01574803149607,+      -119.05511811023621+     ],+     [+      -79.01574803149607,+      -112.71653543307093+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -78.46456692913387,+      -118.58267716535443+     ],+     [+      -78.46456692913387,+      -118.74015748031502+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -115.0787401574803+     ],+     [+      -79.01574803149607,+      -119.05511811023621+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -108.74015748031502+     ],+     [+      -79.01574803149607,+      -112.71653543307093+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -85.90551181102363,+      -115.0787401574803+     ],+     [+      -85.90551181102363,+      -108.74015748031502+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -65.2755905511811,+      -127.00787401574803+     ],+     [+      -64.7244094488189,+      -126.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -65.2755905511811,+      -127.00787401574803+     ],+     [+      -65.2755905511811,+      -120.6299212598426+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -64.7244094488189,+      -126.53543307086625+     ],+     [+      -64.7244094488189,+      -126.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -123.03149606299212+     ],+     [+      -65.2755905511811,+      -127.00787401574803+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -116.69291338582684+     ],+     [+      -65.2755905511811,+      -120.6299212598426+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -72.16535433070867,+      -123.03149606299212+     ],+     [+      -72.16535433070867,+      -116.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -51.53543307086614,+      -134.9212598425197+     ],+     [+      -50.98425196850393,+      -134.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -51.53543307086614,+      -134.9212598425197+     ],+     [+      -51.53543307086614,+      -128.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -50.98425196850393,+      -134.44881889763792+     ],+     [+      -50.98425196850393,+      -134.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -130.9448818897638+     ],+     [+      -51.53543307086614,+      -134.9212598425197+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -124.60629921259851+     ],+     [+      -51.53543307086614,+      -128.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -58.425196850393704,+      -130.9448818897638+     ],+     [+      -58.425196850393704,+      -124.60629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.79527559055118,+      -142.87401574803152+     ],+     [+      -37.24409448818898,+      -142.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.79527559055118,+      -142.87401574803152+     ],+     [+      -37.79527559055118,+      -136.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -37.24409448818898,+      -142.40157480314974+     ],+     [+      -37.24409448818898,+      -142.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -138.8976377952756+     ],+     [+      -37.79527559055118,+      -142.87401574803152+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -132.55905511811034+     ],+     [+      -37.79527559055118,+      -136.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -44.68503937007874,+      -138.8976377952756+     ],+     [+      -44.68503937007874,+      -132.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      71.45669291338582,+      -107.55905511811034+     ],+     [+      71.45669291338582,+      -101.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      71.45669291338582,+      -101.22047244094483+     ],+     [+      78.34645669291339,+      -97.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      78.34645669291339,+      -103.58267716535443+     ],+     [+      78.34645669291339,+      -97.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      71.45669291338582,+      -107.55905511811034+     ],+     [+      78.34645669291339,+      -103.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      70.90551181102363,+      -107.24409448818892+     ],+     [+      71.45669291338582,+      -107.55905511811034+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      70.90551181102363,+      -107.24409448818892+     ],+     [+      70.90551181102363,+      -107.08661417322833+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      100.35433070866142,+      -90.90551181102364+     ],+     [+      100.35433070866142,+      -84.52755905511822+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      100.35433070866142,+      -84.52755905511822+     ],+     [+      107.20472440944881,+      -80.59055118110246+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      107.20472440944881,+      -86.92913385826773+     ],+     [+      107.20472440944881,+      -80.59055118110246+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      100.35433070866142,+      -90.90551181102364+     ],+     [+      107.20472440944881,+      -86.92913385826773+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      99.76377952755905,+      -90.59055118110246+     ],+     [+      100.35433070866142,+      -90.90551181102364+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      99.76377952755905,+      -90.59055118110246+     ],+     [+      99.76377952755905,+      -90.39370078740171+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.61417322834646,+      -94.44881889763792+     ],+     [+      -121.10236220472441,+      -94.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.61417322834646,+      -94.44881889763792+     ],+     [+      -121.61417322834646,+      -88.11023622047264+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -121.10236220472441,+      -93.97637795275591+     ],+     [+      -121.10236220472441,+      -94.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -90.51181102362216+     ],+     [+      -121.61417322834646,+      -94.44881889763792+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -84.1338582677165+     ],+     [+      -121.61417322834646,+      -88.11023622047264+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -128.50393700787401,+      -90.51181102362216+     ],+     [+      -128.50393700787401,+      -84.1338582677165+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -30.905511811023626,+      -146.85039370078744+     ],+     [+      -30.905511811023626,+      -140.472440944882+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -24.055118110236222,+      -150.7874015748032+     ],+     [+      -30.905511811023626,+      -146.85039370078744+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -23.503937007874015,+      -150.472440944882+     ],+     [+      -24.055118110236222,+      -150.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -23.503937007874015,+      -150.472440944882+     ],+     [+      -23.503937007874015,+      -150.31496062992142+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -24.055118110236222,+      -144.4488188976377+     ],+     [+      -30.905511811023626,+      -140.472440944882+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -24.055118110236222,+      -150.7874015748032+     ],+     [+      -24.055118110236222,+      -144.4488188976377+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -148.81889763779532+     ],+     [+      -8.228346456692913,+      -153.58267716535443+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.228346456692913,+      -153.58267716535443+     ],+     [+      -8.779527559055119,+      -153.267716535433+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.779527559055119,+      -153.11023622047264+     ],+     [+      -8.779527559055119,+      -153.267716535433+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -8.228346456692913,+      -153.58267716535443+     ],+     [+      -8.228346456692913,+      -147.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -148.81889763779532+     ],+     [+      0.0,+      -142.4803149606298+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.0,+      -142.4803149606298+     ],+     [+      -8.228346456692913,+      -147.24409448818915+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      22.007874015748033,+      -136.1023622047244+     ],+     [+      21.45669291338583,+      -135.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      22.007874015748033,+      -136.1023622047244+     ],+     [+      22.007874015748033,+      -129.7637795275591+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      21.45669291338583,+      -135.6299212598426+     ],+     [+      21.45669291338583,+      -135.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -132.95275590551182+     ],+     [+      22.007874015748033,+      -136.1023622047244+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -126.61417322834654+     ],+     [+      22.007874015748033,+      -129.7637795275591+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      27.480314960629922,+      -132.95275590551182+     ],+     [+      27.480314960629922,+      -126.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -111.53543307086625+     ],+     [+      64.60629921259843,+      -105.15748031496082+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -111.53543307086625+     ],+     [+      59.09448818897638,+      -114.68503937007881+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      59.09448818897638,+      -114.68503937007881+     ],+     [+      58.54330708661418,+      -114.37007874015762+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      64.60629921259843,+      -105.15748031496082+     ],+     [+      59.09448818897638,+      -108.34645669291353+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      59.09448818897638,+      -114.68503937007881+     ],+     [+      59.09448818897638,+      -108.34645669291353+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      58.54330708661418,+      -114.2125984251968+     ],+     [+      58.54330708661418,+      -114.37007874015762+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      34.37007874015748,+      -128.9763779527559+     ],+     [+      33.818897637795274,+      -128.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -125.82677165354335+     ],+     [+      34.37007874015748,+      -128.9763779527559+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      34.37007874015748,+      -128.9763779527559+     ],+     [+      34.37007874015748,+      -122.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      33.818897637795274,+      -128.50393700787413+     ],+     [+      33.818897637795274,+      -128.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -125.82677165354335+     ],+     [+      39.881889763779526,+      -119.44881889763792+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      39.881889763779526,+      -119.44881889763792+     ],+     [+      34.37007874015748,+      -122.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -118.66141732283472+     ],+     [+      46.73228346456693,+      -121.85039370078744+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.73228346456693,+      -121.85039370078744+     ],+     [+      46.181102362204726,+      -121.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.181102362204726,+      -121.33858267716528+     ],+     [+      46.181102362204726,+      -121.53543307086602+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      46.73228346456693,+      -121.85039370078744+     ],+     [+      46.73228346456693,+      -115.47244094488178+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -118.66141732283472+     ],+     [+      52.24409448818898,+      -112.32283464566945+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      52.24409448818898,+      -112.32283464566945+     ],+     [+      46.73228346456693,+      -115.47244094488178+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      114.05511811023622,+      -82.95275590551182+     ],+     [+      113.54330708661418,+      -82.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -78.97637795275591+     ],+     [+      114.05511811023622,+      -82.95275590551182+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      114.05511811023622,+      -82.95275590551182+     ],+     [+      114.05511811023622,+      -76.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      113.54330708661418,+      -82.48031496063004+     ],+     [+      113.54330708661418,+      -82.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -78.97637795275591+     ],+     [+      120.94488188976379,+      -72.63779527559063+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      120.94488188976379,+      -72.63779527559063+     ],+     [+      114.05511811023622,+      -76.61417322834654+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -71.06299212598424+     ],+     [+      127.83464566929133,+      -75.03937007874015+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.83464566929133,+      -75.03937007874015+     ],+     [+      127.28346456692914,+      -74.68503937007881+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.28346456692914,+      -74.52755905511822+     ],+     [+      127.28346456692914,+      -74.68503937007881+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      127.83464566929133,+      -75.03937007874015+     ],+     [+      127.83464566929133,+      -68.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -71.06299212598424+     ],+     [+      134.68503937007873,+      -64.72440944881896+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      134.68503937007873,+      -64.72440944881896+     ],+     [+      127.83464566929133,+      -68.66141732283472+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -135.39370078740157,+      -86.53543307086625+     ],+     [+      -134.84251968503938,+      -86.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -135.39370078740157,+      -86.53543307086625+     ],+     [+      -135.39370078740157,+      -80.19685039370097+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -134.84251968503938,+      -86.06299212598424+     ],+     [+      -134.84251968503938,+      -86.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -82.55905511811034+     ],+     [+      -135.39370078740157,+      -86.53543307086625+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -76.22047244094483+     ],+     [+      -135.39370078740157,+      -80.19685039370097+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -142.24409448818898,+      -82.55905511811034+     ],+     [+      -142.24409448818898,+      -76.22047244094483+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -71.53543307086615,+      -43.97637795275591+     ],+     [+      -56.023622047244096,+      -52.95275590551182+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -76.73228346456693,+      -46.96850393700788+     ],+     [+      -66.37795275590551,+      -40.98425196850394+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -62.67716535433071,+      -38.858267716535465+     ],+     [+      -47.12598425196851,+      -47.834645669291376+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -62.67716535433071,+      -38.858267716535465+     ],+     [+      -56.023622047244096,+      -35.0+     ],+     [+      -53.07086614173229,+      -34.17322834645665+     ],+     [+      -51.5748031496063,+      -34.17322834645665+     ],+     [+      -49.37007874015748,+      -34.606299212598515+     ],+     [+      -47.12598425196851,+      -35.866141732283495+     ],+     [+      -46.37795275590551,+      -37.125984251968475+     ],+     [+      -46.37795275590551,+      -37.99212598425197+     ],+     [+      -47.874015748031496,+      -39.72440944881896+     ],+     [+      -54.52755905511811,+      -43.54330708661428+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -35.31496062992126,+      -25.629921259842604+     ],+     [+      -38.267716535433074,+      -25.629921259842604+     ],+     [+      -41.22047244094488,+      -26.456692913385723+     ],+     [+      -44.173228346456696,+      -28.188976377952713+     ],+     [+      -45.669291338582674,+      -29.881889763779554+     ],+     [+      -45.669291338582674,+      -31.614173228346544+     ],+     [+      -44.173228346456696,+      -32.44094488188989+     ],+     [+      -41.96850393700788,+      -32.874015748031525+     ],+     [+      -40.47244094488189,+      -32.874015748031525+     ],+     [+      -38.267716535433074,+      -32.44094488188989+     ],+     [+      -32.36220472440945,+      -30.74803149606305+     ],+     [+      -30.118110236220474,+      -30.314960629921416+     ],+     [+      -28.661417322834644,+      -30.314960629921416+     ],+     [+      -26.41732283464567,+      -30.74803149606305+     ],+     [+      -24.212598425196852,+      -32.04724409448818+     ],+     [+      -24.212598425196852,+      -33.74015748031502+     ],+     [+      -25.708661417322837,+      -35.43307086614186+     ],+     [+      -28.661417322834644,+      -37.125984251968475+     ],+     [+      -31.61417322834646,+      -37.99212598425197+     ],+     [+      -34.56692913385827,+      -37.99212598425197+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -27.913385826771652,+      -22.204724409448772+     ],+     [+      -27.16535433070866,+      -20.944881889763792+     ],+     [+      -27.16535433070866,+      -18.34645669291342+     ],+     [+      -11.614173228346457,+      -27.322834645669445+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -6.456692913385828,+      -8.97637795275591+     ],+     [+      -8.661417322834646,+      -8.543307086614277+     ],+     [+      -11.614173228346457,+      -9.409448818897658+     ],+     [+      -13.110236220472443,+      -10.236220472441005+     ],+     [+      -14.606299212598426,+      -11.968503937007995+     ],+     [+      -13.858267716535433,+      -14.094488188976356+     ],+     [+      -10.905511811023624,+      -16.653543307086693+     ],+     [+      -7.204724409448819,+      -18.77952755905517+     ],+     [+      -3.5039370078740157,+      -20.07874015748041+     ],+     [+      -0.5511811023622047,+      -20.07874015748041+     ],+     [+      2.4015748031496065,+      -19.212598425196916+     ],+     [+      3.1496062992125986,+      -18.77952755905517+     ],+     [+      4.645669291338582,+      -17.086614173228327+     ],+     [+      4.645669291338582,+      -15.35433070866145+     ],+     [+      3.1496062992125986,+      -13.661417322834723+     ],+     [+      2.4015748031496065,+      -13.228346456692975+     ],+     [+      -0.5511811023622047,+      -12.401574803149629+     ],+     [+      -3.5039370078740157,+      -12.401574803149629+     ],+     [+      -6.456692913385828,+      -13.228346456692975+     ],+     [+      -7.204724409448819,+      -13.661417322834723+     ],+     [+      -8.661417322834646,+      -15.35433070866145+     ],+     [+      -8.661417322834646,+      -17.086614173228327+     ],+     [+      -7.204724409448819,+      -18.77952755905517+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      0.1968503937007874,+      -2.559055118110223+     ],+     [+      -1.299212598425197,+      -4.291338582677213+     ],+     [+      -0.5511811023622047,+      -5.551181102362307+     ],+     [+      0.9448818897637796,+      -6.417322834645688+     ],+     [+      3.1496062992125986,+      -6.850393700787549+     ],+     [+      5.393700787401576,+      -6.417322834645688+     ],+     [+      9.05511811023622,+      -5.118110236220559+     ],+     [+      12.007874015748031,+      -4.291338582677213+     ],+     [+      15.0,+      -4.291338582677213+     ],+     [+      17.20472440944882,+      -4.685039370078698+     ],+     [+      19.409448818897637,+      -5.984251968503941+     ],+     [+      20.15748031496063,+      -7.244094488189035+     ],+     [+      20.15748031496063,+      -8.11023622047253+     ],+     [+      18.700787401574804,+      -9.842519685039406+     ],+     [+      15.708661417322837,+      -11.535433070866247+     ],+     [+      12.755905511811024,+      -12.401574803149629+     ],+     [+      11.299212598425196,+      -12.401574803149629+     ],+     [+      9.05511811023622,+      -11.968503937007995+     ],+     [+      6.850393700787401,+      -10.669291338582639+     ],+     [+      6.102362204724409,+      -9.409448818897658+     ],+     [+      6.102362204724409,+      -7.677165354330668+     ],+     [+      7.598425196850394,+      -5.984251968503941+     ],+     [+      9.803149606299213,+      -3.8582677165354653+     ],+     [+      10.551181102362206,+      -2.559055118110223+     ],+     [+      9.803149606299213,+      -1.2992125984252425+     ],+     [+      8.346456692913385,+      -0.4330708661418612+     ],+     [+      6.102362204724409,+      0.0+     ],+     [+      3.1496062992125986,+      -0.866141732283495+     ],+     [+      0.1968503937007874,+      -2.559055118110223+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      20.15748031496063,+      8.976377952755797+     ],+     [+      12.755905511811024,+      4.685039370078698+     ],+     [+      18.700787401574804,+      0.4330708661417475+     ],+     [+      18.700787401574804,+      1.259842519685094+     ],+     [+      20.15748031496063,+      2.9921259842518566+     ],+     [+      22.362204724409448,+      4.251968503936951+     ],+     [+      25.314960629921263,+      5.118110236220446+     ],+     [+      28.26771653543307,+      5.118110236220446+     ],+     [+      31.25984251968504,+      4.251968503936951+     ],+     [+      32.71653543307087,+      3.425196850393718+     ],+     [+      34.21259842519685,+      1.6929133858267278+     ],+     [+      34.21259842519685,+      0.0+     ],+     [+      32.71653543307087,+      -1.6929133858268415+     ],+     [+      30.511811023622048,+      -2.9921259842519703+     ],+     [+      27.559055118110237,+      -3.8582677165354653+     ],+     [+      26.062992125984255,+      -3.8582677165354653+     ],+     [+      23.858267716535433,+      -3.425196850393718+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      30.511811023622048,+      14.960629921259851+     ],+     [+      29.015748031496063,+      13.228346456692861+     ],+     [+      29.763779527559056,+      11.102362204724386+     ],+     [+      32.71653543307087,+      8.543307086614163+     ],+     [+      34.960629921259844,+      7.244094488188921+     ],+     [+      39.37007874015748,+      5.551181102362193+     ],+     [+      43.07086614173229,+      5.118110236220446+     ],+     [+      46.023622047244096,+      5.984251968503827+     ],+     [+      47.51968503937008,+      6.811023622047173+     ],+     [+      49.01574803149607,+      8.543307086614163+     ],+     [+      48.267716535433074,+      10.669291338582639+     ],+     [+      45.31496062992126,+      13.228346456692861+     ],+     [+      43.07086614173229,+      14.488188976377955+     ],+     [+      38.661417322834644,+      16.22047244094483+     ],+     [+      34.960629921259844,+      16.65354330708658+     ],+     [+      32.00787401574803,+      15.787401574803198+     ],+     [+      30.511811023622048,+      14.960629921259851+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -25.314960629921263,+      -44.2125984251968+     ],+     [+      -3.8582677165354333,+      -49.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -13.503937007874017,+      -37.362204724409594+     ],+     [+      -3.8582677165354333,+      -49.76377952755911+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -9.803149606299213,+      -35.23622047244112+     ],+     [+      5.748031496062992,+      -44.2125984251968+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      -9.803149606299213,+      -35.23622047244112+     ],+     [+      11.653543307086615,+      -40.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      2.047244094488189,+      -28.385826771653456+     ],+     [+      11.653543307086615,+      -40.7874015748032+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      2.047244094488189,+      -28.385826771653456+     ],+     [+      17.559055118110237,+      -37.362204724409594+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      11.653543307086615,+      -22.834645669291376+     ],+     [+      21.25984251968504,+      -35.23622047244112+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      11.653543307086615,+      -22.834645669291376+     ],+     [+      33.110236220472444,+      -28.385826771653456+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      18.30708661417323,+      -30.944881889763792+     ],+     [+      25.708661417322837,+      -26.69291338582684+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      21.25984251968504,+      -17.28346456692907+     ],+     [+      36.811023622047244,+      -26.25984251968498+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      21.25984251968504,+      -17.28346456692907+     ],+     [+      27.913385826771652,+      -13.46456692913398+     ],+     [+      30.866141732283467,+      -12.598425196850371+     ],+     [+      32.36220472440945,+      -12.598425196850371+     ],+     [+      34.56692913385827,+      -13.031496062992233+     ],+     [+      36.06299212598425,+      -13.858267716535465+     ],+     [+      36.811023622047244,+      -15.157480314960708+     ],+     [+      36.811023622047244,+      -16.02362204724409+     ],+     [+      35.31496062992126,+      -17.71653543307093+     ],+     [+      28.661417322834644,+      -21.574803149606396+     ]+    ],+    "width": 0.9842519685039371+   },+   {+    "kind": "polyline",+    "points": [+     [+      33.85826771653544,+      -18.582677165354312+     ],+     [+      47.16535433070866,+      -20.275590551181153+     ]+    ],+    "width": 0.9842519685039371+   }+  ],+  "designator_prefix": "U",+  "footprint": "tps16850vmar",+  "parameters": [+   {+    "name": "Value",+    "value": "TPS16850VMAR",+    "visible": true+   },+   {+    "name": "Datasheet",+    "value": "https://www.ti.com/lit/ds/symlink/tps1685.pdf",+    "visible": false+   },+   {+    "name": "Description",+    "value": "9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA). 2-column symbol, pins grouped by function.",+    "visible": false+   },+   {+    "name": "Manufacturer",+    "value": "Texas Instruments",+    "visible": false+   },+   {+    "name": "MPN",+    "value": "TPS16850VMAR",+    "visible": false+   },+   {+    "name": "Adom Wiki",+    "value": "https://wiki.adom.inc/adom/tps16850vmar",+    "visible": false+   },+   {+    "name": "DigiKey",+    "value": "296-TPS16850VMARTR-ND",+    "visible": false+   },+   {+    "name": "Mouser",+    "value": "595-TPS16850VMAR",+    "visible": false+   },+   {+    "name": "Adom_Chip_Outline",+    "value": "asset:TPS16850VMAR-3d-outline-dark-named.svg@large",+    "visible": false+   },+   {+    "name": "Supplier 1",+    "value": "Mouser",+    "visible": false+   },+   {+    "name": "Supplier Part Number 1",+    "value": "595-TPS16850VMAR",+    "visible": false+   },+   {+    "name": "Supplier 2",+    "value": "Digi-Key",+    "visible": false+   },+   {+    "name": "Supplier Part Number 2",+    "value": "296-TPS16850VMARTR-ND",+    "visible": false+   },+   {+    "name": "Manufacturer Part Number",+    "value": "TPS16850VMAR",+    "visible": false+   }+  ],+  "labels": [+   {+    "text": "Power in",+    "x": -759.8425196850394,+    "y": 978.7401574803149,+    "angle": 0,+    "justify_right": false,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Control",+    "x": -759.8425196850394,+    "y": 278.7401574803149,+    "angle": 0,+    "justify_right": false,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Current setting",+    "x": -759.8425196850394,+    "y": -321.2598425196852,+    "angle": 0,+    "justify_right": false,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Power out",+    "x": 759.8425196850394,+    "y": 978.7401574803149,+    "angle": 0,+    "justify_right": true,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Current monitor",+    "x": 759.8425196850394,+    "y": 578.740157480315,+    "angle": 0,+    "justify_right": true,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Status",+    "x": 759.8425196850394,+    "y": 178.7401574803149,+    "angle": 0,+    "justify_right": true,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "Ground",+    "x": 759.8425196850394,+    "y": -421.2598425196852,+    "angle": 0,+    "justify_right": true,+    "bold": false,+    "size_mil": 30.0+   },+   {+    "text": "No connect",+    "x": 759.8425196850394,+    "y": -721.259842519685,+    "angle": 0,+    "justify_right": true,+    "bold": false,+    "size_mil": 30.0+   }+  ],+  "pin_numbers_hidden": false,+  "pin_names_hidden": false+ },+ "footprint": {+  "name": "tps16850vmar",+  "pads": [+   {+    "number": "1",+    "x_mm": -2.875,+    "y_mm": -0.5,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "2",+    "x_mm": -2.875,+    "y_mm": 0.0,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "3",+    "x_mm": -2.875,+    "y_mm": 0.5,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "4",+    "x_mm": -2.875,+    "y_mm": 1.0,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "5",+    "x_mm": -2.85,+    "y_mm": 1.5,+    "w_mm": 0.7,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "8",+    "x_mm": 0.225,+    "y_mm": 2.325,+    "w_mm": 0.25,+    "h_mm": 0.75,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "9",+    "x_mm": 1.275,+    "y_mm": 2.325,+    "w_mm": 0.25,+    "h_mm": 0.75,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "11",+    "x_mm": 2.875,+    "y_mm": 0.925,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "12",+    "x_mm": 2.875,+    "y_mm": 0.425,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "13",+    "x_mm": 2.875,+    "y_mm": -0.075,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "14",+    "x_mm": 2.875,+    "y_mm": -0.575,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "15",+    "x_mm": 2.875,+    "y_mm": -1.075,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "16",+    "x_mm": 2.875,+    "y_mm": -1.575,+    "w_mm": 0.65,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "18",+    "x_mm": 1.85,+    "y_mm": -2.4,+    "w_mm": 0.25,+    "h_mm": 0.6,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "19",+    "x_mm": 1.35,+    "y_mm": -2.4,+    "w_mm": 0.25,+    "h_mm": 0.6,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "20",+    "x_mm": 0.85,+    "y_mm": -2.4,+    "w_mm": 0.25,+    "h_mm": 0.6,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "21",+    "x_mm": 0.35,+    "y_mm": -2.4,+    "w_mm": 0.25,+    "h_mm": 0.6,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "23",+    "x_mm": -2.55,+    "y_mm": -1.55,+    "w_mm": 1.3,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "roundrect"+   },+   {+    "number": "24",+    "x_mm": 0.0,+    "y_mm": -0.075,+    "w_mm": 3.4,+    "h_mm": 2.35,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "paste_margin_mm": -0.174+   },+   {+    "number": "24",+    "x_mm": -1.45,+    "y_mm": -0.875,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": -0.59,+    "y_mm": -0.875,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 0.59,+    "y_mm": -0.875,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 1.45,+    "y_mm": -0.875,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": -1.45,+    "y_mm": -0.075,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": -0.59,+    "y_mm": -0.075,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 0.59,+    "y_mm": -0.075,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 1.45,+    "y_mm": -0.075,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": -1.45,+    "y_mm": 0.725,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": -0.59,+    "y_mm": 0.725,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 0.59,+    "y_mm": 0.725,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "24",+    "x_mm": 1.45,+    "y_mm": 0.725,+    "w_mm": 0.5,+    "h_mm": 0.5,+    "drill_mm": 0.2,+    "rotation": 0.0,+    "shape": "circle",+    "plated": true+   },+   {+    "number": "6",+    "x_mm": -2.85,+    "y_mm": 2.0,+    "w_mm": 0.7,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect"+   },+   {+    "number": "6",+    "x_mm": -2.65,+    "y_mm": 2.2875,+    "w_mm": 0.3,+    "h_mm": 0.825,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect"+   },+   {+    "number": "17",+    "x_mm": 2.35,+    "y_mm": -2.3,+    "w_mm": 0.25,+    "h_mm": 0.8,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect"+   },+   {+    "number": "17",+    "x_mm": 2.7125,+    "y_mm": -2.025,+    "w_mm": 0.975,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect"+   },+   {+    "number": "22",+    "x_mm": -2.1,+    "y_mm": -2.3125,+    "w_mm": 2.3,+    "h_mm": 0.875,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": -1.2,+    "paste_margin_mm": -1.2+   },+   {+    "number": "22",+    "x_mm": -2.975,+    "y_mm": -2.05,+    "w_mm": 0.45,+    "h_mm": 0.25,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "22",+    "x_mm": -1.875,+    "y_mm": -2.0875,+    "w_mm": 1.75,+    "h_mm": 0.325,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "22",+    "x_mm": -2.625,+    "y_mm": -2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "22",+    "x_mm": -2.125,+    "y_mm": -2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "22",+    "x_mm": -1.625,+    "y_mm": -2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "22",+    "x_mm": -1.125,+    "y_mm": -2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "7",+    "x_mm": -0.925,+    "y_mm": 2.325,+    "w_mm": 1.65,+    "h_mm": 0.85,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": -1.2,+    "paste_margin_mm": -1.2+   },+   {+    "number": "7",+    "x_mm": -0.925,+    "y_mm": 2.1,+    "w_mm": 1.55,+    "h_mm": 0.3,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "7",+    "x_mm": -1.6,+    "y_mm": 2.475,+    "w_mm": 0.2,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "7",+    "x_mm": -1.15,+    "y_mm": 2.475,+    "w_mm": 0.2,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "7",+    "x_mm": -0.7,+    "y_mm": 2.475,+    "w_mm": 0.2,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "7",+    "x_mm": -0.25,+    "y_mm": 2.475,+    "w_mm": 0.2,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "10",+    "x_mm": 2.425,+    "y_mm": 2.275,+    "w_mm": 1.65,+    "h_mm": 0.95,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": -1.2,+    "paste_margin_mm": -1.2+   },+   {+    "number": "10",+    "x_mm": 2.425,+    "y_mm": 2.05,+    "w_mm": 1.55,+    "h_mm": 0.4,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "10",+    "x_mm": 1.775,+    "y_mm": 2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   },+   {+    "number": "10",+    "x_mm": 2.275,+    "y_mm": 2.475,+    "w_mm": 0.25,+    "h_mm": 0.45,+    "drill_mm": 0.0,+    "rotation": 0.0,+    "shape": "rect",+    "mask_margin_mm": 0.0+   }+  ],+  "graphics": [+   {+    "kind": "line",+    "layer": {+     "role": "silk"+    },+    "x1": -3.45,+    "y1": -2.95,+    "x2": 3.45,+    "y2": -2.95,+    "width": 0.1+   },+   {+    "kind": "line",+    "layer": {+     "role": "silk"+    },+    "x1": 3.45,+    "y1": -2.95,+    "x2": 3.45,+    "y2": 2.95,+    "width": 0.1+   },+   {+    "kind": "line",+    "layer": {+     "role": "silk"+    },+    "x1": 3.45,+    "y1": 2.95,+    "x2": -3.45,+    "y2": 2.95,+    "width": 0.1+   },+   {+    "kind": "line",+    "layer": {+     "role": "silk"+    },+    "x1": -3.45,+    "y1": 2.95,+    "x2": -3.45,+    "y2": -2.95,+    "width": 0.1+   },+   {+    "kind": "rect",+    "layer": {+     "role": "courtyard"+    },+    "x1": -3.6,+    "y1": -3.1,+    "x2": 3.6,+    "y2": 3.1,+    "width": 0.05+   },+   {+    "kind": "circle",+    "layer": {+     "role": "silk"+    },+    "cx": -3.8,+    "cy": -0.5,+    "r": 0.11999999999999966,+    "width": 0.1+   }+  ],+  "polys": [+   {+    "layer": {+     "role": "fab"+    },+    "points": [+     [+      -2.5,+      -2.5+     ],+     [+      3.0,+      -2.5+     ],+     [+      3.0,+      2.5+     ],+     [+      -3.0,+      2.5+     ],+     [+      -3.0,+      -2.0+     ]+    ],+    "width": 0.1,+    "filled": false+   }+  ]+ },+ "connect": [+  {+   "pin": "10",+   "pad": "10"+  },+  {+   "pin": "22",+   "pad": "22"+  },+  {+   "pin": "23",+   "pad": "23"+  },+  {+   "pin": "24",+   "pad": "24"+  },+  {+   "pin": "9",+   "pad": "9"+  },+  {+   "pin": "16",+   "pad": "16"+  },+  {+   "pin": "18",+   "pad": "18"+  },+  {+   "pin": "12",+   "pad": "12"+  },+  {+   "pin": "4",+   "pad": "4"+  },+  {+   "pin": "3",+   "pad": "3"+  },+  {+   "pin": "14",+   "pad": "14"+  },+  {+   "pin": "6",+   "pad": "6"+  },+  {+   "pin": "7",+   "pad": "7"+  },+  {+   "pin": "8",+   "pad": "8"+  },+  {+   "pin": "2",+   "pad": "2"+  },+  {+   "pin": "1",+   "pad": "1"+  },+  {+   "pin": "19",+   "pad": "19"+  },+  {+   "pin": "13",+   "pad": "13"+  },+  {+   "pin": "20",+   "pad": "20"+  },+  {+   "pin": "15",+   "pad": "15"+  },+  {+   "pin": "5",+   "pad": "5"+  },+  {+   "pin": "11",+   "pad": "11"+  },+  {+   "pin": "17",+   "pad": "17"+  },+  {+   "pin": "21",+   "pad": "21"+  }+ ],+ "provenance": {+  "source": "kicad_import"+ }+}\ No newline at end of file
artwork/TPS16850VMAR-3d-outline-dark-named.320.pngadded
⋯ 1 unchanged line ⋯
artwork/TPS16850VMAR-3d-outline-dark-named.svgadded+1
@@ -0,0 +1 @@+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 320"><polyline points="148.36,215.43 32.00,148.24" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="148.36,252.38 148.36,215.43" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="148.36,252.38 139.64,247.34" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="139.64,247.34 139.64,242.63" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="139.64,242.63 133.82,239.28" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="133.82,243.98 133.82,239.28" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="133.82,243.98 128.00,240.62" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.00,240.62 128.00,235.92" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,232.56 128.00,235.92" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,237.26 122.18,232.56" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,237.26 116.36,233.90" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.36,233.90 116.36,229.20" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,225.84 116.36,229.20" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,230.54 110.55,225.84" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,230.54 104.73,227.18" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="104.73,227.18 104.73,222.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,219.12 104.73,222.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,223.82 98.91,219.12" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,223.82 93.09,220.46" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.09,220.46 93.09,215.76" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,212.40 93.09,215.76" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,217.11 87.27,212.40" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,217.11 81.45,213.75" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.45,213.75 81.45,209.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,205.68 81.45,209.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,210.39 75.64,205.68" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,210.39 57.02,199.64" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.02,199.64 57.02,194.93" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,191.58 57.02,194.93" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,196.28 51.20,191.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,196.28 45.38,192.92" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.38,192.92 45.38,188.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,184.86 45.38,188.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,189.56 39.56,184.86" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,189.56 32.00,185.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="32.00,185.19 32.00,148.24" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="148.36,215.43 288.00,134.81" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="288.00,134.81 171.64,67.62" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="32.00,148.24 171.64,67.62" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,245.66 178.62,234.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,214.08 220.51,210.72" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="226.33,207.36 244.95,196.61" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="250.76,193.26 256.58,189.90" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,240.96 153.02,244.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="148.36,252.38 153.02,249.69" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="288.00,171.76 288.00,134.81" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,179.82 288.00,171.76" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,179.82 274.04,175.12" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,175.12 268.22,178.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="268.22,183.18 268.22,178.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,186.54 268.22,183.18" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,186.54 262.40,181.83" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,181.83 256.58,185.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.58,189.90 256.58,185.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="250.76,193.26 250.76,188.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.95,191.91 250.76,188.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.95,196.61 244.95,191.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="226.33,207.36 226.33,202.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.51,206.02 226.33,202.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.51,210.72 220.51,206.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,214.08 214.69,209.38" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,209.38 210.04,212.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="210.04,216.77 210.04,212.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,220.13 210.04,216.77" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,220.13 204.22,215.43" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,215.43 199.56,218.11" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.56,222.82 199.56,218.11" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,226.17 199.56,222.82" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,226.17 193.75,221.47" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,221.47 189.09,224.16" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="189.09,228.86 189.09,224.16" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,232.22 189.09,228.86" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,232.22 183.27,227.52" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,227.52 178.62,230.21" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.62,234.91 178.62,230.21" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,245.66 160.00,240.96" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="153.02,249.69 153.02,244.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.92,214.15 82.04,214.08" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.92,214.01 81.92,214.15" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.56,220.87 93.67,220.80" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.56,220.73 93.56,220.87" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="105.19,227.59 105.31,227.52" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="105.19,227.45 105.19,227.59" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.83,234.30 116.95,234.24" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.83,234.17 116.83,234.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.47,241.02 128.58,240.96" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.47,240.89 128.47,241.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="219.93,211.06 220.04,211.13" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.04,211.13 220.04,210.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.36,196.95 244.48,197.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.48,197.02 244.48,196.88" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.48,200.04 57.60,199.97" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.48,199.91 57.48,200.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="152.55,250.09 152.44,250.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.22,247.67 140.10,247.74" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.10,247.74 140.10,247.61" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="152.55,249.96 152.55,250.09" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.15,235.31 178.04,235.24" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.15,235.18 178.15,235.31" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="209.57,217.17 209.45,217.11" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.10,223.22 198.98,223.15" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="188.63,229.27 188.51,229.20" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="209.57,217.04 209.57,217.17" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="188.63,229.13 188.63,229.27" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.10,223.08 199.10,223.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.12,190.30 256.00,190.23" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="267.75,183.58 267.64,183.51" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.12,190.16 256.12,190.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="267.75,183.45 267.75,183.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.85,193.32 45.96,193.26" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.85,193.19 45.85,193.32" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.45,214.42 81.92,214.15" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.45,214.42 81.45,209.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="81.92,214.01 81.92,214.15" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,211.06 81.45,214.42" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,205.68 81.45,209.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="75.64,211.06 75.64,205.68" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.09,221.14 93.56,220.87" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.09,221.14 93.09,215.76" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="93.56,220.73 93.56,220.87" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,217.78 93.09,221.14" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,212.40 93.09,215.76" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="87.27,217.78 87.27,212.40" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="104.73,227.85 105.19,227.59" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="104.73,227.85 104.73,222.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="105.19,227.45 105.19,227.59" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,224.50 104.73,227.85" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,219.12 104.73,222.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="98.91,224.50 98.91,219.12" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.36,234.57 116.83,234.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.36,234.57 116.36,229.20" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="116.83,234.17 116.83,234.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,231.21 116.36,234.57" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,225.84 116.36,229.20" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="110.55,231.21 110.55,225.84" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.00,241.29 128.47,241.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.00,241.29 128.00,235.92" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="128.47,240.89 128.47,241.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,237.93 128.00,241.29" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,232.56 128.00,235.92" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="122.18,237.93 122.18,232.56" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.51,211.39 220.51,206.02" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.51,206.02 226.33,202.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="226.33,208.04 226.33,202.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.51,211.39 226.33,208.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.04,211.13 220.51,211.39" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="220.04,211.13 220.04,210.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.95,197.29 244.95,191.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.95,191.91 250.76,188.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="250.76,193.93 250.76,188.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.95,197.29 250.76,193.93" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.48,197.02 244.95,197.29" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="244.48,197.02 244.48,196.88" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.02,200.31 57.48,200.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.02,200.31 57.02,194.93" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="57.48,199.91 57.48,200.04" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,196.95 57.02,200.31" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,191.58 57.02,194.93" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="51.20,196.95 51.20,191.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="133.82,244.65 133.82,239.28" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="139.64,248.01 133.82,244.65" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.10,247.74 139.64,248.01" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.10,247.74 140.10,247.61" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="139.64,242.63 133.82,239.28" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="139.64,248.01 139.64,242.63" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,246.33 153.02,250.36" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="153.02,250.36 152.55,250.09" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="152.55,249.96 152.55,250.09" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="153.02,250.36 153.02,244.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,246.33 160.00,240.96" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.00,240.96 153.02,244.99" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.62,235.58 178.15,235.31" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.62,235.58 178.62,230.21" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.15,235.18 178.15,235.31" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,232.89 178.62,235.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,227.52 178.62,230.21" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="183.27,232.89 183.27,227.52" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,214.75 214.69,209.38" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,214.75 210.04,217.44" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="210.04,217.44 209.57,217.17" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="214.69,209.38 210.04,212.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="210.04,217.44 210.04,212.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="209.57,217.04 209.57,217.17" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="189.09,229.53 188.63,229.27" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,226.85 189.09,229.53" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="189.09,229.53 189.09,224.16" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="188.63,229.13 188.63,229.27" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,226.85 193.75,221.47" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="193.75,221.47 189.09,224.16" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,220.80 199.56,223.49" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.56,223.49 199.10,223.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.10,223.08 199.10,223.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="199.56,223.49 199.56,218.11" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,220.80 204.22,215.43" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="204.22,215.43 199.56,218.11" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.58,190.57 256.12,190.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,187.21 256.58,190.57" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.58,190.57 256.58,185.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="256.12,190.16 256.12,190.30" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,187.21 262.40,181.83" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="262.40,181.83 256.58,185.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,180.49 268.22,183.85" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="268.22,183.85 267.75,183.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="267.75,183.45 267.75,183.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="268.22,183.85 268.22,178.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,180.49 274.04,175.12" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="274.04,175.12 268.22,178.48" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.38,193.59 45.85,193.32" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.38,193.59 45.38,188.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="45.85,193.19 45.85,193.32" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,190.23 45.38,193.59" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,184.86 45.38,188.22" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="39.56,190.23 39.56,184.86" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><g id="adom-mark-name" data-lines="TPS16850|VMAR"><polyline points="99.43,157.57 112.57,165.16" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="95.05,160.10 103.81,155.04" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="106.94,153.23 120.09,160.83" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="106.94,153.23 112.57,149.98 115.08,149.25 116.33,149.25 118.21,149.62 120.09,150.70 120.72,151.78 120.72,152.51 119.46,153.96 113.83,157.21" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="130.11,142.03 127.60,142.03 125.10,142.75 122.60,144.19 121.34,145.64 121.34,147.09 122.60,147.81 124.48,148.17 125.72,148.17 127.60,147.81 132.61,146.37 134.49,146.00 135.74,146.00 137.62,146.37 139.50,147.45 139.50,148.90 138.25,150.34 135.74,151.78 133.24,152.51 130.73,152.51" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="136.37,139.13 137.00,138.05 137.00,135.88 150.15,143.47" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="154.53,127.93 152.65,127.57 150.15,128.29 148.89,129.01 147.64,130.46 148.27,132.26 150.77,134.44 153.90,136.24 157.03,137.32 159.54,137.32 162.04,136.60 162.67,136.24 163.92,134.79 163.92,133.35 162.67,131.91 162.04,131.54 159.54,130.82 157.03,130.82 154.53,131.54 153.90,131.91 152.65,133.35 152.65,134.79 153.90,136.24" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="160.16,122.51 158.91,123.96 159.54,125.04 160.79,125.76 162.67,126.12 164.55,125.76 167.67,124.67 170.18,123.96 172.69,123.96 174.56,124.31 176.44,125.39 177.06,126.48 177.06,127.20 175.82,128.65 173.31,130.10 170.81,130.82 169.55,130.82 167.67,130.46 165.80,129.37 165.17,128.29 165.17,126.84 166.43,125.39 168.31,123.59 168.93,122.51 168.31,121.42 167.05,120.70 165.17,120.33 162.67,121.06 160.16,122.51" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="177.06,112.74 170.81,116.36 175.82,119.98 175.82,119.25 177.06,117.80 178.94,116.72 181.45,116.00 183.95,116.00 186.46,116.72 187.71,117.44 188.97,118.89 188.97,120.33 187.71,121.78 185.83,122.86 183.33,123.59 182.08,123.59 180.20,123.23" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="185.83,107.68 184.58,109.13 185.21,110.93 187.71,113.11 189.59,114.19 193.34,115.64 196.48,116.00 198.98,115.27 200.23,114.56 201.49,113.11 200.86,111.30 198.36,109.13 196.48,108.05 192.72,106.60 189.59,106.24 187.09,106.96 185.83,107.68" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="138.56,157.75 156.72,162.45" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="148.58,151.96 156.72,162.45" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="151.71,150.16 164.86,157.75" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="151.71,150.16 169.86,154.86" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="161.73,144.38 169.86,154.86" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="161.73,144.38 174.87,151.96" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="169.86,139.68 178.01,150.16" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="169.86,139.68 188.02,144.38" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="175.50,146.54 181.76,142.93" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.01,134.98 191.16,142.56" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="178.01,134.98 183.64,131.73 186.14,131.00 187.40,131.00 189.28,131.36 190.53,132.08 191.16,133.17 191.16,133.89 189.90,135.34 184.27,138.59" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/><polyline points="188.65,136.06 199.92,137.50" fill="none" stroke="#e6edf3" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="round"/></g></svg>\ No newline at end of file
artwork/TPS16850VMAR-heatsink-via.jsonadded+85
@@ -0,0 +1,85 @@+{+ "schema": "adom/heatsink-via@1",+ "mpn": "TPS16850VMAR",+ "source": "TI SLVSHA1D p.55 LAND PATTERN EXAMPLE (VMA0023A): 12 vias, (0.2) TYP drill, at x -1.45 -0.59 0.59 1.45 and TI y +0.875 +0.075 -0.725 (KiCad y -0.875 -0.075 +0.725)",+ "ep": {+  "number": "24",+  "name": "IN",+  "w_mm": 3.4,+  "h_mm": 2.35,+  "x_mm": 0.0,+  "y_mm": -0.075,+  "frame": "KiCad footprint, y down"+ },+ "via": {+  "drill_mm": 0.2,+  "ring_mm": 0.15,+  "diameter_mm": 0.5,+  "pitch_mm": 0.8,+  "tented": true,+  "count": 12,+  "positions": [+   [+    -1.45,+    -0.875+   ],+   [+    -0.59,+    -0.875+   ],+   [+    0.59,+    -0.875+   ],+   [+    1.45,+    -0.875+   ],+   [+    -1.45,+    -0.075+   ],+   [+    -0.59,+    -0.075+   ],+   [+    0.59,+    -0.075+   ],+   [+    1.45,+    -0.075+   ],+   [+    -1.45,+    0.725+   ],+   [+    -0.59,+    0.725+   ],+   [+    0.59,+    0.725+   ],+   [+    1.45,+    0.725+   ]+  ],+  "pitch_note": "rows 0.8 mm apart; columns at TI's positions (0.86 / 1.18 / 0.86 mm), not a uniform grid"+ },+ "note": "TI's positions and drill are used instead of the Adom default 0.3 mm drill, 0.8 mm grid. The pad is electrically IN (the FET input), so these vias carry current and heat into the input plane. The 0.5 mm via pad (0.15 mm ring) is Adom's choice; TI prints only the drill.",+ "hero_glb": {+  "layer": "vias",+  "node": "Adom.HeatsinkVias",+  "board_mm": 1.6,+  "alpha": 0.35+ },+ "footprint": "tps16850vmar.kicad_mod: plated thru_hole pads numbered 24, layers *.Cu (tented), property pad_prop_heatsink",+ "lanes": {+  "fusion": "<pad name=\"[email protected]\" drill=\"0.2\" diameter=\"0.5\"> joined to pin IN@4",+  "altium": "multi-layer plated pads named 24 with 0.2 mm holes"+ }+}\ No newline at end of file
artwork/TPS16850VMAR.mark-plan.jsonadded+122
@@ -0,0 +1,122 @@+{+ "schema": "adom/mark-plan@1",+ "mpn": "TPS16850VMAR",+ "step": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/model/tps16850vmar.step",+ "footprint": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/fp/tps16850vmar.kicad_mod",+ "standUp": [],+ "standUpSource": "as-is (Z up)",+ "inputs": {+  "up": "auto",+  "face": "auto",+  "along": null,+  "upSupplied": false,+  "faceSupplied": false,+  "faceSource": "inferred: top face"+ },+ "face": "top",+ "pin1": {+  "source": "footprint pad 1",+  "xyMm": [+   -2.875,+   0.5+  ],+  "corner": "left/upper"+ },+ "existingMarks": [],+ "vendorMarking": {+  "present": false,+  "glyphFaces": 0+ },+ "faceNormal": [+  0,+  0,+  1+ ],+ "longAxis": {+  "axis": "x",+  "vector": [+   1.0,+   0.0,+   0.0+  ],+  "why": "longest usable top dimension (6.00 mm vs 5.00 mm)",+  "source": "longest",+  "override": null,+  "pinRows": null+ },+ "readingDirection": {+  "vector": [+   1.0,+   0.0,+   0.0+  ],+  "angleDeg": 0,+  "textUp": [+   -0.0,+   1.0,+   0.0+  ],+  "rule": "pin 1 / pad 1 at the start (left) of the text, and below it when it sits on a side"+ },+ "band": {+  "regionMm": [+   -3.0,+   -2.5,+   3.0,+   2.5+  ],+  "zMm": 1.4,+  "lengthMm": 6.0,+  "heightMm": 5.0,+  "why": "highest flat face over the body centre",+  "terminationsExcludedBy": null,+  "trimmedEnds": [],+  "keepouts": [],+  "sideTurn": null,+  "margins": {+   "lengthEachSide": 0.12,+   "heightEachSide": 0.15+  }+ },+ "text": {+  "lines": [+   "TPS16850",+   "VMAR"+  ],+  "chars": 12,+  "capHeightMm": 0.7147,+  "smallestLineMm": 0.7147,+  "heightPctOfBand": 32.9,+  "why": "two lines: the smaller line (0.715 mm) beats one line (0.472 mm) by 1.51x",+  "alternative": {+   "lines": [+    "TPS16850VMAR"+   ],+   "capHeightMm": 0.472,+   "smallestLineMm": 0.472+  },+  "font": "service-step2glb /laser-etch (single-stroke outline font)"+ },+ "etch": {+  "poseQuarterTurnsZ": 0,+  "service": "/laser-etch?mode=flat",+  "note": "turn so the reading direction is +X, etch, fit the mark into the band, turn back"+ },+ "outline": {+  "upAxis": "z",+  "poseRotZDeg": 180,+  "rot": 180,+  "recipe": "adom-aiflow-etch outline <part.step> --footprint <part.kicad_mod> --mpn TPS16850VMAR (stands the STEP up (as-is (Z up)), turns it 180 deg about Z and draws TPS16850 / VMAR on the planned band, rot 180)",+  "why": "iso camera looks from +X+Y+Z: text along +Y (rot 90) or -X (rot 180) reads left to right with pin 1 toward the viewer"+ },+ "widget": {+  "px": 320,+  "pxPerMm": 37.03,+  "capHeightPx": 21.6+ },+ "hints": [],+ "warnings": [+  "pin 1 lands UPPER-left in the standard pose (left/upper): the pads are numbered clockwise; check the footprint is not mirrored and the model matches it"+ ],+ "summary": "Mark along the 6.00 mm axis (+X), 0.71 mm text (2 lines), upright with pin 1 left upper, outline rot 180 after a 180 deg pose turn; ~22 px caps at 320 px"+}\ No newline at end of file
docs/figures/tps16850vmar-ds-p3.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p4.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p5.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p50.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p52.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p54.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p55.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p56.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p6.pngadded
⋯ 1 unchanged line ⋯
docs/figures/tps16850vmar-ds-p7.pngadded
⋯ 1 unchanged line ⋯
docs/hero.pngadded
⋯ 1 unchanged line ⋯
docs/models/tps16850vmar-bottom.pngadded
⋯ 1 unchanged line ⋯
docs/models/tps16850vmar-etched-bottom.pngadded
⋯ 1 unchanged line ⋯
docs/models/tps16850vmar-etched-glb-top.pngadded
⋯ 1 unchanged line ⋯
docs/models/tps16850vmar-glb-top.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-etched.check.jsonadded+135
@@ -0,0 +1,135 @@+{+ "schema": "adom/mark-check@1",+ "step": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/model/tps16850vmar-etched.step",+ "mpn": "TPS16850VMAR",+ "status": "PASS",+ "checks": [+  {+   "check": "axis",+   "status": "PASS",+   "detail": "text along the 6.00 mm axis",+   "angleDeg": 0+  },+  {+   "check": "upright",+   "status": "PASS",+   "detail": "upright, left to right, pin 1 left upper"+  },+  {+   "check": "size",+   "status": "PASS",+   "detail": "text height 0.719 mm, 101% of what fits (0.715 mm), block fills 33% of the 5.00 mm band height",+   "capMm": 0.7188,+   "fitMm": 0.7147+  },+  {+   "check": "band",+   "status": "PASS",+   "detail": "inside the usable band"+  },+  {+   "check": "flat",+   "status": "PASS",+   "detail": "flat, coplanar with the face (+5 um)"+  },+  {+   "check": "group",+   "status": "PASS",+   "detail": "Adom.LaserEtch group"+  },+  {+   "check": "colour",+   "status": "PASS",+   "detail": "light mark (sRGB 0.90, 0.90, 0.89)",+   "rgb": [+    0.896243869286,+    0.896243869286,+    0.886003966688+   ]+  },+  {+   "check": "widget",+   "status": "PASS",+   "detail": "21.7 px caps with the outline 320 px wide",+   "capHeightPx320": 21.7+  }+ ],+ "frame": {+  "reference": "normalized pose: footprint frame, X right, Y up, Z up off the board (after the stand-up turns)",+  "sourceToNormalized": {+   "turns": [],+   "text": "identity",+   "source": "as-is (Z up)"+  },+  "normalizedToOutput": {+   "checkImage": {+    "turns": [+     {+      "axis": "z",+      "quarterTurns": 0+     }+    ],+    "text": "identity",+    "pose": "standard reading pose: reading direction to +X, text up +Y, pin 1 lower left"+   },+   "outline": {+    "turns": [+     {+      "axis": "z",+      "quarterTurns": 2+     }+    ],+    "text": "180 deg about Z",+    "pose": "iso outline from +X+Y+Z"+   }+  },+  "modelUp": {+   "supplied": false,+   "source": "as-is (Z up)"+  },+  "packageFront": {+   "supplied": false,+   "face": "top",+   "source": "inferred: top face"+  },+  "textUp": {+   "supplied": false,+   "vector": [+    -0.0,+    1.0,+    0.0+   ],+   "source": "inferred from pin 1: footprint pad 1"+  },+  "mountedPose": false,+  "summary": "frame: normalized pose (source -> normalized: identity, as-is (Z up); normalized -> check image: identity, -> outline: 180 deg about Z); model up inferred, face top inferred, text up inferred from pin 1; not a mounted-pose check"+ },+ "plan": {+  "summary": "Mark along the 6.00 mm axis (+X), 0.71 mm text (2 lines), upright with pin 1 left upper, outline rot 180 after a 180 deg pose turn; ~22 px caps at 320 px",+  "band": [+   -3.0,+   -2.5,+   3.0,+   2.5+  ],+  "readingDirection": [+   1.0,+   0.0,+   0.0+  ],+  "lines": [+   "TPS16850",+   "VMAR"+  ]+ },+ "thresholds": {+  "sizePass": 0.8,+  "sizeFail": 0.6,+  "widgetPxPass": 6.0,+  "widgetPxFail": 4.0,+  "outlineOffsetMax": 0.15,+  "coplanarMaxMm": 0.02+ },+ "image": "tps16850vmar-etched.check.png",+ "reportPath": "tps16850vmar-etched.check.json"+}\ No newline at end of file
docs/proof/tps16850vmar-etched.check.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-footprint-check.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-lods.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-model-vs-drawing-bottom.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-model-vs-drawing-side.pngadded
⋯ 1 unchanged line ⋯
docs/proof/tps16850vmar-pin1-check.pngadded
⋯ 1 unchanged line ⋯
lod/manifest.jsonadded+139
@@ -0,0 +1,139 @@+{+ "schema": "adom/component-lod@1",+ "mpn": "TPS16850VMAR",+ "units": "metres (glTF)",+ "upAxis": "Z (Adom/KiCad frame; seated on z = 0, centred on the footprint origin)",+ "status": "candidate",+ "source": {+  "path": "tps16850vmar-etched.step",+  "sha256": "15ef0f3945e0f6a08b63528edee6df68de23bae11e79c865b36fa0ffd3276ed1"+ },+ "generator": "provenance/tools/build_vma23.py (detail full/low/superlow) -> step2glb convert --compress none -> provenance/tools/glb_batch.py (lossless batching per part; etch graft on medium) -> materials.py; previews by render_glb.py",+ "levels": [+  {+   "level": "high",+   "path": "lod/tps16850vmar-high.glb",+   "sha256": "2a49d1a2afab9135eb2af4a6c77c617bcad3b6cae0eb77c83ec58ebbe0b0e841",+   "sizeBytes": 162308,+   "triangles": 3676,+   "primitives": 4,+   "nodes": [+    "body",+    "pins",+    "pin_ends",+    "Adom.LaserEtch"+   ],+   "boundsMm": [+    -3.0,+    -2.5,+    0.0,+    3.0,+    2.5,+    1.405+   ],+   "markingIncluded": true,+   "helperNodes": [],+   "extensions": [],+   "derivation": "the etched GLB itself",+   "review": "candidate: inspected as cached images (depth-buffered render); not qualified in a streaming LOD viewer",+   "preview": {+    "path": "lod/tps16850vmar-high.png",+    "sha256": "bf3866fe68bef8ded2ccdb0ae6366aad77134c25a0290ada2decec031e326e3e",+    "view": "iso (front-left, from above), same camera on every level"+   }+  },+  {+   "level": "medium",+   "path": "lod/tps16850vmar-medium.glb",+   "sha256": "8b65587b7a42719036c3e84e3f85891965ff2b0feeed19b18c2a46ad04a3adf6",+   "sizeBytes": 99960,+   "triangles": 1948,+   "primitives": 4,+   "nodes": [+    "body",+    "pins",+    "pin_ends",+    "Adom.LaserEtch"+   ],+   "boundsMm": [+    -3.0,+    -2.5,+    0.0,+    3.0,+    2.5,+    1.405+   ],+   "markingIncluded": true,+   "helperNodes": [],+   "extensions": [],+   "derivation": "build_vma23.py --detail low (square inner terminal ends), Adom.LaserEtch mesh grafted unchanged from high",+   "review": "candidate: inspected as cached images (depth-buffered render); not qualified in a streaming LOD viewer",+   "preview": {+    "path": "lod/tps16850vmar-medium.png",+    "sha256": "bf3866fe68bef8ded2ccdb0ae6366aad77134c25a0290ada2decec031e326e3e",+    "view": "iso (front-left, from above), same camera on every level"+   }+  },+  {+   "level": "low",+   "path": "lod/tps16850vmar-low.glb",+   "sha256": "07b4d33824ce0db1b5e5de4b795b07f249649cf5d1ab930539def40db5cd880a",+   "sizeBytes": 78452,+   "triangles": 1388,+   "primitives": 3,+   "nodes": [+    "body",+    "pins",+    "pin_ends"+   ],+   "boundsMm": [+    -3.0,+    -2.5,+    0.0,+    3.0,+    2.5,+    1.4+   ],+   "markingIncluded": false,+   "helperNodes": [],+   "extensions": [],+   "derivation": "build_vma23.py --detail low, no marking (unreadable at this size)",+   "review": "candidate: inspected as cached images (depth-buffered render); not qualified in a streaming LOD viewer",+   "preview": {+    "path": "lod/tps16850vmar-low.png",+    "sha256": "32a4f50e24354dee4687b78b337012cfa9176c9efc871d08fb13b6c654408cc7",+    "view": "iso (front-left, from above), same camera on every level"+   }+  },+  {+   "level": "super-low",+   "path": "lod/tps16850vmar-super-low.glb",+   "sha256": "c85e3be247208a204fc3608517f9d97e9b4c6fc2c97c8b3a9d80bf49a4b61499",+   "sizeBytes": 52940,+   "triangles": 980,+   "primitives": 2,+   "nodes": [+    "body",+    "pins"+   ],+   "boundsMm": [+    -3.0,+    -2.5,+    0.0,+    3.0,+    2.5,+    1.4+   ],+   "markingIncluded": false,+   "helperNodes": [],+   "extensions": [],+   "derivation": "build_vma23.py --detail superlow: square ends, one terminal part (no copper end slices), every terminal kept, no marking",+   "review": "candidate: inspected as cached images (depth-buffered render); not qualified in a streaming LOD viewer",+   "preview": {+    "path": "lod/tps16850vmar-super-low.png",+    "sha256": "08b60621e977744e8baeaceb8e7d419b7a04b204bd0d0ab19968cf28c5e184b5",+    "view": "iso (front-left, from above), same camera on every level"+   }+  }+ ]+}\ No newline at end of file
lod/tps16850vmar-high.glbadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-high.pngadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-low.glbadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-low.pngadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-medium.glbadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-medium.pngadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-super-low.glbadded
⋯ 1 unchanged line ⋯
lod/tps16850vmar-super-low.pngadded
⋯ 1 unchanged line ⋯
models.jsonadded+226
@@ -0,0 +1,226 @@+{+ "schema": "adom/models@1",+ "part": "TPS16850VMAR",+ "updated": "2026-10-21",+ "models": [+  {+   "path": "tps16850vmar-etched.step",+   "format": "step",+   "sha256": "15ef0f3945e0f6a08b63528edee6df68de23bae11e79c865b36fa0ffd3276ed1",+   "git_blob": "88ff60eb5763f11478a5fed1d561d7e517e7b518",+   "bytes": 1908216,+   "title": "TPS16850VMAR, virtual MPN etch (library model)",+   "status": "current",+   "slot": "model_3d_step",+   "variant": "etched",+   "role": "datasheet-built",+   "use": [+    "board-cad"+   ],+   "marking": {+    "text": "TPS16850 / VMAR (two lines)",+    "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+    "colour": "light grey on dark grey mould",+    "virtual": true,+    "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+   },+   "colours": true,+   "derived_from": "tps16850vmar.step",+   "unique": "The board-CAD model: built from TI's VMA0023A drawing with the MPN etched on top in the Adom.LaserEtch group; bound by the KiCad footprint and embedded in the Altium PcbLib",+   "source": "provenance/tools/build_vma23.py + adom-chip-laser 0.2.0 (service-occt flat etch, placed by adom-aiflow-etch)",+   "thumb": "docs/models/tps16850vmar-etched-glb-top.png",+   "thumb_bottom": "docs/models/tps16850vmar-etched-bottom.png"+  },+  {+   "path": "tps16850vmar.step",+   "format": "step",+   "sha256": "34e33e779b6b92ffc048bf33a89dd3df7f246fd69638259933d5915d814a55f8",+   "git_blob": "14c37decb391d67a81b427b7e3166df559350cec",+   "bytes": 1643198,+   "title": "TPS16850VMAR, unmarked",+   "status": "current",+   "slot": "model_3d_step_plain",+   "variant": "plain",+   "role": "datasheet-built",+   "use": [+    "board-cad",+    "archive"+   ],+   "marking": null,+   "colours": true,+   "derived_from": "TI SLVSHA1D p.54 (VMA0023A, 4230225/A 11/2023)",+   "unique": "The same package without any marking",+   "source": "provenance/tools/build_vma23.py (CadQuery)",+   "thumb": "docs/models/tps16850vmar-glb-top.png",+   "thumb_bottom": "docs/models/tps16850vmar-bottom.png"+  },+  {+   "path": "tps16850vmar-hero.glb",+   "format": "glb",+   "sha256": "5835866ecf6e8e2a408cd69f0b0f1863f6decb13f396c27613b06ca05ab14aac",+   "git_blob": "d0896bcf92cf1e842f0b6d8e10f252f9f0a7df3b",+   "bytes": 406968,+   "title": "TPS16850VMAR, annotated hero (page viewer)",+   "status": "current",+   "slot": "model_3d",+   "variant": "hero",+   "role": "derived",+   "use": [+    "wiki-hero"+   ],+   "marking": {+    "text": "TPS16850 / VMAR (two lines)",+    "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+    "colour": "light grey on dark grey mould",+    "virtual": true,+    "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+   },+   "colours": true,+   "derived_from": "tps16850vmar-etched.glb + tps16850vmar.kicad_mod",+   "unique": "The page's 3D view: the etched chip plus teal dashed pad outlines, silkscreen with pin 1, pin names and the heatsink vias as switchable layers; presentation only, never for board use",+   "source": "adom/component-hero 0.1.2 scripts/hero_glb.py (adom-hero 1.4) + provenance/tools/hero_post_vias.py",+   "thumb": "docs/proof/tps16850vmar-hero-preview.png"+  },+  {+   "path": "tps16850vmar-etched.glb",+   "format": "glb",+   "sha256": "2a49d1a2afab9135eb2af4a6c77c617bcad3b6cae0eb77c83ec58ebbe0b0e841",+   "git_blob": "5c090831aa8644f482648b979745c5065f570de8",+   "bytes": 162308,+   "title": "TPS16850VMAR, virtual MPN etch (GLB, board use)",+   "status": "current",+   "slot": "model_3d_plain",+   "variant": "etched",+   "role": "derived",+   "use": [+    "render",+    "board-insertion"+   ],+   "marking": {+    "text": "TPS16850 / VMAR (two lines)",+    "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+    "colour": "light grey on dark grey mould",+    "virtual": true,+    "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+   },+   "colours": true,+   "derived_from": "tps16850vmar-etched.step",+   "unique": "Web copy of the etched STEP, clean (no pad outlines, labels or silkscreen), primitives batched per part, NiPdAu terminals with sawn copper ends and a matte mould",+   "source": "step2glb convert --compress none + provenance/tools/glb_batch.py + materials.py",+   "thumb": "docs/models/tps16850vmar-etched-glb-top.png"+  },+  {+   "path": "tps16850vmar.glb",+   "format": "glb",+   "sha256": "c7c1882a2428b0b0b52e93686f593c2da81655d23908cc3355b7e26a2d2d499b",+   "git_blob": "2dc7d85ac795dc77c1a0e88275c80d4fd4b12710",+   "bytes": 140676,+   "title": "TPS16850VMAR, unmarked (GLB)",+   "status": "current",+   "variant": "plain",+   "role": "derived",+   "use": [+    "render",+    "board-insertion"+   ],+   "marking": null,+   "colours": true,+   "derived_from": "tps16850vmar.step",+   "unique": "Web copy of the unmarked STEP",+   "source": "step2glb convert --compress none + glb_batch.py + materials.py",+   "thumb": "docs/models/tps16850vmar-glb-top.png"+  },+  {+   "path": "lod/tps16850vmar-high.glb",+   "format": "glb",+   "sha256": "2a49d1a2afab9135eb2af4a6c77c617bcad3b6cae0eb77c83ec58ebbe0b0e841",+   "git_blob": "5c090831aa8644f482648b979745c5065f570de8",+   "bytes": 162308,+   "title": "TPS16850VMAR, high detail (board LOD)",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion"+   ],+   "marking": {+    "text": "TPS16850 / VMAR (two lines)",+    "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+    "colour": "light grey on dark grey mould",+    "virtual": true,+    "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+   },+   "colours": true,+   "derived_from": "tps16850vmar-etched.step",+   "unique": "Identical to the etched GLB",+   "source": "build_vma23.py detail level + step2glb + glb_batch.py + materials.py",+   "thumb": "lod/tps16850vmar-high.png"+  },+  {+   "path": "lod/tps16850vmar-medium.glb",+   "format": "glb",+   "sha256": "8b65587b7a42719036c3e84e3f85891965ff2b0feeed19b18c2a46ad04a3adf6",+   "git_blob": "203eeb84bab1f8a2c06c4ccef5666e0e3ca90052",+   "bytes": 99960,+   "title": "TPS16850VMAR, medium detail (board LOD)",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion"+   ],+   "marking": {+    "text": "TPS16850 / VMAR (two lines)",+    "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+    "colour": "light grey on dark grey mould",+    "virtual": true,+    "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+   },+   "colours": true,+   "derived_from": "provenance/tools/build_vma23.py --detail low",+   "unique": "Square inner terminal ends, etch grafted from the high level",+   "source": "build_vma23.py detail level + step2glb + glb_batch.py + materials.py",+   "thumb": "lod/tps16850vmar-medium.png"+  },+  {+   "path": "lod/tps16850vmar-low.glb",+   "format": "glb",+   "sha256": "07b4d33824ce0db1b5e5de4b795b07f249649cf5d1ab930539def40db5cd880a",+   "git_blob": "0cec5702a6e748cc72cbdc7f8dce3cdc7e635efe",+   "bytes": 78452,+   "title": "TPS16850VMAR, low detail (board LOD)",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion"+   ],+   "marking": null,+   "colours": true,+   "derived_from": "provenance/tools/build_vma23.py --detail low",+   "unique": "Square inner terminal ends, no etch",+   "source": "build_vma23.py detail level + step2glb + glb_batch.py + materials.py",+   "thumb": "lod/tps16850vmar-low.png"+  },+  {+   "path": "lod/tps16850vmar-super-low.glb",+   "format": "glb",+   "sha256": "c85e3be247208a204fc3608517f9d97e9b4c6fc2c97c8b3a9d80bf49a4b61499",+   "git_blob": "2b658a5682b7129fcfb23287ee415eb8f201f7b8",+   "bytes": 52940,+   "title": "TPS16850VMAR, super-low detail (board LOD)",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion"+   ],+   "marking": null,+   "colours": true,+   "derived_from": "provenance/tools/build_vma23.py --detail superlow",+   "unique": "One terminal material, no etch",+   "source": "build_vma23.py detail level + step2glb + glb_batch.py + materials.py",+   "thumb": "lod/tps16850vmar-super-low.png"+  }+ ]+}\ No newline at end of file
provenance/3d-model.jsonadded+186
@@ -0,0 +1,186 @@+{+ "schema": "adom/3d-model-provenance@1",+ "mpn": "TPS16850VMAR",+ "date": "2026-10-21",+ "classification": "Datasheet-built: a CadQuery model generated from TI's printed VMA0023A package values, produced by Claude (AI) for Adom. Not manufacturer CAD and not a TI certification.",+ "method_chosen": "3 (build from the drawing): TI's own STEP was not reachable with plain HTTP and KiCad has no VMA0023A model",+ "manufacturer_step": {+  "tried": [+   "https://www.ti.com/product/TPS1685 (CAD/CAE links to Ultra Librarian)",+   "https://vendor.ultralibrarian.com/TI/embedded/?gpn=TPS1685&package=VMA&pin=23 (STEP export form)"+  ],+  "result": "the STEP export is a form behind reCAPTCHA (POST /TI/Export/Start returned 404 to a plain request on 2026-10-21); no browser was used, so TI's model was not obtained",+  "status": "not reachable"+ },+ "kicad_library": "KiCad's packages3D and footprint libraries have no VMA0023A / LQFN-CLIP-23 package (Package_DFN_QFN listed 2026-10-21)",+ "datasheet": {+  "doc": "TI SLVSHA1D (Rev. D, revised July 2026), TPS1685x",+  "file": "docs/tps16850vmar-datasheet.pdf",+  "url": "https://www.ti.com/lit/ds/symlink/tps1685.pdf",+  "sha256": "fe9d96bfb8f8e13b5cd69cb8eb19f73c87d5f1945637e00308aff68077f31f0c",+  "drawing_pages": "p.54 PACKAGE OUTLINE, p.55 LAND PATTERN, p.56 STENCIL (VMA0023A, 4230225/A 11/2023)",+  "marking_page": "p.50 (Package Option Addendum: TPS16850)"+ },+ "model": {+  "file": "tps16850vmar.step",+  "sha256": "34e33e779b6b92ffc048bf33a89dd3df7f246fd69638259933d5915d814a55f8",+  "builder": "provenance/tools/build_vma23.py (CadQuery 2.x, OpenCascade)",+  "frame": "Z up, seated on z = 0, centred on the package centre lines = the KiCad footprint origin, X along the 6.0 mm side, Y = -KiCad y; pin 1 (ILIM) terminal at (-2.75, +0.5), footprint pad 1 at (-2.875, -0.5) in KiCad's Y-down frame; binds with zero offset and rotation",+  "how": "mould block 6.0 x 5.0 x 1.4 above a 0.025 mm stand-off with the terminal volume cut out; 23 terminals and the exposed pad as 0.2 mm plates flush with the side walls, shapes as drawn (combs on 7, 10, 22; L shapes on 6, 17; rounded inner ends), the outer 0.02 mm of every terminal at a side wall coloured copper (sawn ends)",+  "bottom_view_note": "TI prints the bottom view turned over about the X axis (pin 1 below the centre line); y values read from it are negated",+  "undimensioned": "pin 7 bar inner edge (1.95 from the centre line) and notch depth (0.25) measured off the drawing at 118 px/mm; terminal thickness taken as the (0.2) side exposure",+  "colours": "TI's VMA package render (DigiKey image MFG_296~4230225~VMA~23): dark grey mould, silver NiPdAu terminal faces (TI lead finish NIPDAU, p.50), copper sawn ends",+  "parts": {+   "body": "dark grey mould",+   "pins": "NiPdAu terminal faces",+   "pin_ends": "sawn copper ends"+  },+  "dimensions_mm": [+   {+    "item": "D body length (X)",+    "datasheet_min_typ_max": "5.9 / - / 6.1",+    "model": "6.000"+   },+   {+    "item": "E body width (Y)",+    "datasheet_min_typ_max": "4.9 / - / 5.1",+    "model": "5.000"+   },+   {+    "item": "A height",+    "datasheet_min_typ_max": "1.3 / - / 1.5",+    "model": "1.400"+   },+   {+    "item": "A1 terminal stand-off",+    "datasheet_min_typ_max": "0.00 / - / 0.05",+    "model": "0.025"+   },+   {+    "item": "b terminal width",+    "datasheet_min_typ_max": "0.2 / - / 0.3 (28X)",+    "model": "0.250"+   },+   {+    "item": "pin 7 tooth width",+    "datasheet_min_typ_max": "0.15 / - / 0.25 (4X)",+    "model": "0.200"+   },+   {+    "item": "pin 6 leg width",+    "datasheet_min_typ_max": "0.25 / - / 0.35",+    "model": "0.300"+   },+   {+    "item": "L left terminals 1-5",+    "datasheet_min_typ_max": "0.4 / - / 0.6",+    "model": "0.500"+   },+   {+    "item": "L right terminals 11-16",+    "datasheet_min_typ_max": "0.35 / - / 0.55 (10X)",+    "model": "0.450"+   },+   {+    "item": "L top terminals 18-21",+    "datasheet_min_typ_max": "0.3 / - / 0.5 (4X)",+    "model": "0.400"+   },+   {+    "item": "L bottom terminals 8, 9",+    "datasheet_min_typ_max": "0.45 / - / 0.65 (3X)",+    "model": "0.550"+   },+   {+    "item": "pin 23 length",+    "datasheet_min_typ_max": "1.0 / - / 1.2",+    "model": "1.100"+   },+   {+    "item": "pin 10 bar",+    "datasheet_min_typ_max": "0.35 / - / 0.45 at 2.05",+    "model": "0.400 at 2.05"+   },+   {+    "item": "pin 22 bar edge from package edge",+    "datasheet_min_typ_max": "0.475 / - / 0.675",+    "model": "0.575"+   },+   {+    "item": "exposed pad",+    "datasheet_min_typ_max": "3.4 +-0.1 x 2.35 +-0.1, centre 0.075 off the centre line",+    "model": "3.400 x 2.350 at 0.075"+   },+   {+    "item": "pin-1 chamfer on the exposed pad",+    "datasheet_min_typ_max": "45 deg x 0.25",+    "model": "45 deg x 0.25"+   },+   {+    "item": "side terminal exposure",+    "datasheet_min_typ_max": "(0.2) TYP",+    "model": "0.200"+   }+  ],+  "not_modelled": "TI's top-side pin-1 index area is a region, not a mark, and the real marking (TPS16850 plus lot code) is not modelled; the virtual MPN etch stands in"+ },+ "overlay": {+  "bottom": {+   "score": 0.9728,+   "scale": 118.25,+   "origin": [+    1193,+    2176+   ],+   "image": "proof-model-bottom.png"+  },+  "side": {+   "view": "front",+   "score": 0.7014,+   "scale": 118.25,+   "origin": [+    1193,+    1451+   ],+   "image": "proof-model-side.png",+   "note": "TI draws the side view at A max (1.5 mm); the model is at the nominal 1.4 mm, so its top edge sits 0.1 mm below TI's"+  },+  "images": [+   "docs/proof/tps16850vmar-model-vs-drawing-bottom.png",+   "docs/proof/tps16850vmar-model-vs-drawing-side.png"+  ],+  "method": "provenance/tools/overlay_vma.py: STEP rendered orthographically, scale and offset fitted to TI's blue strokes on the 300 dpi p.54 render"+ },+ "etched": {+  "file": "tps16850vmar-etched.step",+  "sha256": "15ef0f3945e0f6a08b63528edee6df68de23bae11e79c865b36fa0ffd3276ed1",+  "tool": "adom-chip-laser 0.2.0 via adom-aiflow-etch (service-occt flat mark 5 um above the top face, Adom.LaserEtch group)",+  "plan": "provenance/tps16850vmar-etched.mark-plan.json",+  "gate": "PASS",+  "check_image": "docs/proof/tps16850vmar-etched.check.png",+  "marking": {+   "text": "TPS16850 / VMAR (two lines)",+   "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+   "colour": "light grey on dark grey mould",+   "virtual": true,+   "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"+  }+ },+ "glb": {+  "tool": "step2glb (service) convert --compress none, provenance/tools/glb_batch.py, materials.py",+  "files": [+   "tps16850vmar-etched.glb",+   "tps16850vmar.glb"+  ]+ },+ "hero": {+  "file": "tps16850vmar-hero.glb",+  "tool": "adom/component-hero 0.1.2 hero_glb.py (adom-hero 1.4): align OK, offset 0.0 mm; then provenance/tools/hero_post_vias.py adds the Adom.HeatsinkVias layer",+  "preview": "docs/proof/tps16850vmar-hero-preview.png"+ },+ "outline": {+  "file": "artwork/TPS16850VMAR-3d-outline-dark-named.svg",+  "tool": "adom-aiflow-etch outline (gate PASS)"+ },+ "license": "CC-BY-4.0 (Adom-authored model); TI's datasheet keeps TI's terms"+}\ No newline at end of file
provenance/footprint-check.jsonadded+1455
@@ -0,0 +1,1455 @@+{+ "schema": "adom/footprint-check@1",+ "footprint": "tps16850vmar.kicad_mod",+ "datasheet": "TI SLVSHA1D (Rev. D, July 2026) p.55 LAND PATTERN EXAMPLE and p.56 SOLDER PASTE EXAMPLE, VMA0023A 4230225/A 11/2023",+ "overlay": {+  "image": "docs/proof/tps16850vmar-footprint-check.png",+  "scale_px_per_mm": 177.165,+  "printed_scale": "15X at 300 dpi = 177.165 px/mm",+  "copper_outline_on_ti_strokes": 0.6924,+  "comb_mask_on_ti_green": 0.9741,+  "note": "TI draws the metal under the solder mask of pads 7, 10 and 22 dashed, so part of those copper outlines falls in the gaps between dashes; every solid TI stroke is covered",+  "method": "outline points of every copper polygon sampled every 2 px, scored against TI's blue strokes dilated by 1 px; offset searched +-80 px, scale +-0.5 %"+ },+ "ultra_librarian": {+  "source": "https://static.ultralibrarian.com/part-previews/footprints/6142033/detailed-VMA0023A-MFG.svg",+  "note": "TI's VMA0023A footprint as published through Ultra Librarian (TI's CAD partner); preview SVG read as data; layers TOP / TOP_SOLDER_MASK / TOP_SOLDER_PASTE; differences come from corner treatment (UL chamfers 0.05 mm, this footprint rounds plain pads R0.05 as TI prints and keeps the custom shapes square)"+ },+ "rows": [+  {+   "pad": "1",+   "cu": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     -0.625,+     -2.55,+     -0.37+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.625,+     -2.545,+     -0.37+    ]+   },+   "mask": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     -0.625,+     -2.55,+     -0.37+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.625,+     -2.545,+     -0.37+    ]+   },+   "paste": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     -0.625,+     -2.55,+     -0.37+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.625,+     -2.545,+     -0.37+    ]+   }+  },+  {+   "pad": "2",+   "cu": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0071,+    "page_bbox_mm": [+     -3.2,+     -0.125,+     -2.55,+     0.13+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.125,+     -2.545,+     0.125+    ]+   },+   "mask": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0071,+    "page_bbox_mm": [+     -3.2,+     -0.125,+     -2.55,+     0.13+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.125,+     -2.545,+     0.125+    ]+   },+   "paste": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0071,+    "page_bbox_mm": [+     -3.2,+     -0.125,+     -2.55,+     0.13+    ],+    "ul_bbox_mm": [+     -3.205,+     -0.125,+     -2.545,+     0.125+    ]+   }+  },+  {+   "pad": "3",+   "cu": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0104,+    "page_bbox_mm": [+     -3.2,+     0.375,+     -2.55,+     0.63+    ],+    "ul_bbox_mm": [+     -3.205,+     0.37,+     -2.545,+     0.625+    ]+   },+   "mask": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0104,+    "page_bbox_mm": [+     -3.2,+     0.375,+     -2.55,+     0.63+    ],+    "ul_bbox_mm": [+     -3.205,+     0.37,+     -2.545,+     0.625+    ]+   },+   "paste": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0104,+    "page_bbox_mm": [+     -3.2,+     0.375,+     -2.55,+     0.63+    ],+    "ul_bbox_mm": [+     -3.205,+     0.37,+     -2.545,+     0.625+    ]+   }+  },+  {+   "pad": "4",+   "cu": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     0.875,+     -2.55,+     1.13+    ],+    "ul_bbox_mm": [+     -3.205,+     0.875,+     -2.545,+     1.13+    ]+   },+   "mask": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     0.875,+     -2.55,+     1.13+    ],+    "ul_bbox_mm": [+     -3.205,+     0.875,+     -2.545,+     1.13+    ]+   },+   "paste": {+    "page_mm2": 0.1635,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0048,+    "page_bbox_mm": [+     -3.2,+     0.875,+     -2.55,+     1.13+    ],+    "ul_bbox_mm": [+     -3.205,+     0.875,+     -2.545,+     1.13+    ]+   }+  },+  {+   "pad": "5",+   "cu": {+    "page_mm2": 0.1762,+    "ul_mm2": 0.1798,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     -3.2,+     1.375,+     -2.5,+     1.63+    ],+    "ul_bbox_mm": [+     -3.2,+     1.37,+     -2.495,+     1.625+    ]+   },+   "mask": {+    "page_mm2": 0.1762,+    "ul_mm2": 0.1798,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     -3.2,+     1.375,+     -2.5,+     1.63+    ],+    "ul_bbox_mm": [+     -3.2,+     1.37,+     -2.495,+     1.625+    ]+   },+   "paste": {+    "page_mm2": 0.1762,+    "ul_mm2": 0.1798,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     -3.2,+     1.375,+     -2.5,+     1.63+    ],+    "ul_bbox_mm": [+     -3.2,+     1.37,+     -2.495,+     1.625+    ]+   }+  },+  {+   "pad": "6",+   "cu": {+    "page_mm2": 0.3552,+    "ul_mm2": 0.3502,+    "xor_mm2": 0.0142,+    "page_bbox_mm": [+     -3.2,+     1.875,+     -2.495,+     2.705+    ],+    "ul_bbox_mm": [+     -3.205,+     1.875,+     -2.495,+     2.7+    ]+   },+   "mask": {+    "page_mm2": 0.3552,+    "ul_mm2": 0.3502,+    "xor_mm2": 0.0142,+    "page_bbox_mm": [+     -3.2,+     1.875,+     -2.495,+     2.705+    ],+    "ul_bbox_mm": [+     -3.205,+     1.875,+     -2.495,+     2.7+    ]+   },+   "paste": {+    "page_mm2": 0.3552,+    "ul_mm2": 0.3502,+    "xor_mm2": 0.0142,+    "page_bbox_mm": [+     -3.2,+     1.875,+     -2.495,+     2.705+    ],+    "ul_bbox_mm": [+     -3.205,+     1.875,+     -2.495,+     2.7+    ]+   }+  },+  {+   "pad": "7",+   "cu": {+    "page_mm2": 1.415,+    "ul_mm2": 1.3665,+    "xor_mm2": 0.0486,+    "page_bbox_mm": [+     -1.75,+     1.9,+     -0.095,+     2.755+    ],+    "ul_bbox_mm": [+     -1.75,+     1.895,+     -0.095,+     2.75+    ]+   },+   "mask": {+    "page_mm2": 0.847,+    "ul_mm2": 0.8204,+    "xor_mm2": 0.0419,+    "page_bbox_mm": [+     -1.705,+     1.95,+     -0.145,+     2.705+    ],+    "ul_bbox_mm": [+     -1.7,+     1.95,+     -0.145,+     2.7+    ]+   },+   "paste": {+    "page_mm2": 0.847,+    "ul_mm2": 0.8204,+    "xor_mm2": 0.0419,+    "page_bbox_mm": [+     -1.705,+     1.95,+     -0.145,+     2.705+    ],+    "ul_bbox_mm": [+     -1.7,+     1.95,+     -0.145,+     2.7+    ]+   }+  },+  {+   "pad": "8",+   "cu": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     0.1,+     1.95,+     0.355,+     2.705+    ],+    "ul_bbox_mm": [+     0.1,+     1.945,+     0.355,+     2.7+    ]+   },+   "mask": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     0.1,+     1.95,+     0.355,+     2.705+    ],+    "ul_bbox_mm": [+     0.1,+     1.945,+     0.355,+     2.7+    ]+   },+   "paste": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     0.1,+     1.95,+     0.355,+     2.705+    ],+    "ul_bbox_mm": [+     0.1,+     1.945,+     0.355,+     2.7+    ]+   }+  },+  {+   "pad": "9",+   "cu": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     1.15,+     1.95,+     1.405,+     2.705+    ],+    "ul_bbox_mm": [+     1.15,+     1.945,+     1.405,+     2.7+    ]+   },+   "mask": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     1.15,+     1.95,+     1.405,+     2.705+    ],+    "ul_bbox_mm": [+     1.15,+     1.945,+     1.405,+     2.7+    ]+   },+   "paste": {+    "page_mm2": 0.1898,+    "ul_mm2": 0.1925,+    "xor_mm2": 0.0043,+    "page_bbox_mm": [+     1.15,+     1.95,+     1.405,+     2.705+    ],+    "ul_bbox_mm": [+     1.15,+     1.945,+     1.405,+     2.7+    ]+   }+  },+  {+   "pad": "10",+   "cu": {+    "page_mm2": 1.5805,+    "ul_mm2": 1.5514,+    "xor_mm2": 0.0498,+    "page_bbox_mm": [+     1.6,+     1.8,+     3.255,+     2.755+    ],+    "ul_bbox_mm": [+     1.595,+     1.795,+     3.255,+     2.75+    ]+   },+   "mask": {+    "page_mm2": 0.8593,+    "ul_mm2": 0.8448,+    "xor_mm2": 0.0402,+    "page_bbox_mm": [+     1.65,+     1.85,+     3.205,+     2.705+    ],+    "ul_bbox_mm": [+     1.645,+     1.845,+     3.2,+     2.7+    ]+   },+   "paste": {+    "page_mm2": 0.8593,+    "ul_mm2": 0.8448,+    "xor_mm2": 0.0402,+    "page_bbox_mm": [+     1.65,+     1.85,+     3.205,+     2.705+    ],+    "ul_bbox_mm": [+     1.645,+     1.845,+     3.2,+     2.7+    ]+   }+  },+  {+   "pad": "11",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     0.8,+     3.205,+     1.055+    ],+    "ul_bbox_mm": [+     2.545,+     0.795,+     3.205,+     1.05+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     0.8,+     3.205,+     1.055+    ],+    "ul_bbox_mm": [+     2.545,+     0.795,+     3.205,+     1.05+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     0.8,+     3.205,+     1.055+    ],+    "ul_bbox_mm": [+     2.545,+     0.795,+     3.205,+     1.05+    ]+   }+  },+  {+   "pad": "12",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     0.3,+     3.205,+     0.555+    ],+    "ul_bbox_mm": [+     2.545,+     0.3,+     3.205,+     0.555+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     0.3,+     3.205,+     0.555+    ],+    "ul_bbox_mm": [+     2.545,+     0.3,+     3.205,+     0.555+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     0.3,+     3.205,+     0.555+    ],+    "ul_bbox_mm": [+     2.545,+     0.3,+     3.205,+     0.555+    ]+   }+  },+  {+   "pad": "13",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -0.2,+     3.205,+     0.055+    ],+    "ul_bbox_mm": [+     2.545,+     -0.205,+     3.205,+     0.05+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -0.2,+     3.205,+     0.055+    ],+    "ul_bbox_mm": [+     2.545,+     -0.205,+     3.205,+     0.05+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -0.2,+     3.205,+     0.055+    ],+    "ul_bbox_mm": [+     2.545,+     -0.205,+     3.205,+     0.05+    ]+   }+  },+  {+   "pad": "14",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0063,+    "page_bbox_mm": [+     2.55,+     -0.7,+     3.205,+     -0.445+    ],+    "ul_bbox_mm": [+     2.545,+     -0.7,+     3.205,+     -0.45+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0063,+    "page_bbox_mm": [+     2.55,+     -0.7,+     3.205,+     -0.445+    ],+    "ul_bbox_mm": [+     2.545,+     -0.7,+     3.205,+     -0.45+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.165,+    "xor_mm2": 0.0063,+    "page_bbox_mm": [+     2.55,+     -0.7,+     3.205,+     -0.445+    ],+    "ul_bbox_mm": [+     2.545,+     -0.7,+     3.205,+     -0.45+    ]+   }+  },+  {+   "pad": "15",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     -1.2,+     3.205,+     -0.945+    ],+    "ul_bbox_mm": [+     2.545,+     -1.2,+     3.205,+     -0.945+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     -1.2,+     3.205,+     -0.945+    ],+    "ul_bbox_mm": [+     2.545,+     -1.2,+     3.205,+     -0.945+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.004,+    "page_bbox_mm": [+     2.55,+     -1.2,+     3.205,+     -0.945+    ],+    "ul_bbox_mm": [+     2.545,+     -1.2,+     3.205,+     -0.945+    ]+   }+  },+  {+   "pad": "16",+   "cu": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -1.7,+     3.205,+     -1.445+    ],+    "ul_bbox_mm": [+     2.545,+     -1.705,+     3.205,+     -1.45+    ]+   },+   "mask": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -1.7,+     3.205,+     -1.445+    ],+    "ul_bbox_mm": [+     2.545,+     -1.705,+     3.205,+     -1.45+    ]+   },+   "paste": {+    "page_mm2": 0.1643,+    "ul_mm2": 0.1683,+    "xor_mm2": 0.0096,+    "page_bbox_mm": [+     2.55,+     -1.7,+     3.205,+     -1.445+    ],+    "ul_bbox_mm": [+     2.545,+     -1.705,+     3.205,+     -1.45+    ]+   }+  },+  {+   "pad": "17",+   "cu": {+    "page_mm2": 0.3902,+    "ul_mm2": 0.3852,+    "xor_mm2": 0.027,+    "page_bbox_mm": [+     2.225,+     -2.7,+     3.205,+     -1.895+    ],+    "ul_bbox_mm": [+     2.22,+     -2.7,+     3.205,+     -1.895+    ]+   },+   "mask": {+    "page_mm2": 0.3902,+    "ul_mm2": 0.3852,+    "xor_mm2": 0.027,+    "page_bbox_mm": [+     2.225,+     -2.7,+     3.205,+     -1.895+    ],+    "ul_bbox_mm": [+     2.22,+     -2.7,+     3.205,+     -1.895+    ]+   },+   "paste": {+    "page_mm2": 0.3902,+    "ul_mm2": 0.3852,+    "xor_mm2": 0.027,+    "page_bbox_mm": [+     2.225,+     -2.7,+     3.205,+     -1.895+    ],+    "ul_bbox_mm": [+     2.22,+     -2.7,+     3.205,+     -1.895+    ]+   }+  },+  {+   "pad": "18",+   "cu": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     1.725,+     -2.7,+     1.98,+     -2.095+    ],+    "ul_bbox_mm": [+     1.72,+     -2.7,+     1.975,+     -2.1+    ]+   },+   "mask": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     1.725,+     -2.7,+     1.98,+     -2.095+    ],+    "ul_bbox_mm": [+     1.72,+     -2.7,+     1.975,+     -2.1+    ]+   },+   "paste": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     1.725,+     -2.7,+     1.98,+     -2.095+    ],+    "ul_bbox_mm": [+     1.72,+     -2.7,+     1.975,+     -2.1+    ]+   }+  },+  {+   "pad": "19",+   "cu": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.15,+    "xor_mm2": 0.0051,+    "page_bbox_mm": [+     1.225,+     -2.7,+     1.48,+     -2.095+    ],+    "ul_bbox_mm": [+     1.225,+     -2.7,+     1.475,+     -2.1+    ]+   },+   "mask": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.15,+    "xor_mm2": 0.0051,+    "page_bbox_mm": [+     1.225,+     -2.7,+     1.48,+     -2.095+    ],+    "ul_bbox_mm": [+     1.225,+     -2.7,+     1.475,+     -2.1+    ]+   },+   "paste": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.15,+    "xor_mm2": 0.0051,+    "page_bbox_mm": [+     1.225,+     -2.7,+     1.48,+     -2.095+    ],+    "ul_bbox_mm": [+     1.225,+     -2.7,+     1.475,+     -2.1+    ]+   }+  },+  {+   "pad": "20",+   "cu": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.003,+    "page_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.095+    ],+    "ul_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.1+    ]+   },+   "mask": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.003,+    "page_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.095+    ],+    "ul_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.1+    ]+   },+   "paste": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.003,+    "page_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.095+    ],+    "ul_bbox_mm": [+     0.725,+     -2.7,+     0.98,+     -2.1+    ]+   }+  },+  {+   "pad": "21",+   "cu": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     0.225,+     -2.7,+     0.48,+     -2.095+    ],+    "ul_bbox_mm": [+     0.22,+     -2.7,+     0.475,+     -2.1+    ]+   },+   "mask": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     0.225,+     -2.7,+     0.48,+     -2.095+    ],+    "ul_bbox_mm": [+     0.22,+     -2.7,+     0.475,+     -2.1+    ]+   },+   "paste": {+    "page_mm2": 0.1515,+    "ul_mm2": 0.153,+    "xor_mm2": 0.0081,+    "page_bbox_mm": [+     0.225,+     -2.7,+     0.48,+     -2.095+    ],+    "ul_bbox_mm": [+     0.22,+     -2.7,+     0.475,+     -2.1+    ]+   }+  },+  {+   "pad": "22",+   "cu": {+    "page_mm2": 2.0284,+    "ul_mm2": 2.0052,+    "xor_mm2": 0.0266,+    "page_bbox_mm": [+     -3.25,+     -2.75,+     -0.945,+     -1.87+    ],+    "ul_bbox_mm": [+     -3.255,+     -2.75,+     -0.95,+     -1.87+    ]+   },+   "mask": {+    "page_mm2": 1.1529,+    "ul_mm2": 1.1481,+    "xor_mm2": 0.0323,+    "page_bbox_mm": [+     -3.2,+     -2.7,+     -0.995,+     -1.92+    ],+    "ul_bbox_mm": [+     -3.205,+     -2.7,+     -1.0,+     -1.92+    ]+   },+   "paste": {+    "page_mm2": 1.1529,+    "ul_mm2": 1.1481,+    "xor_mm2": 0.0323,+    "page_bbox_mm": [+     -3.2,+     -2.7,+     -0.995,+     -1.92+    ],+    "ul_bbox_mm": [+     -3.205,+     -2.7,+     -1.0,+     -1.92+    ]+   }+  },+  {+   "pad": "23",+   "cu": {+    "page_mm2": 0.33,+    "ul_mm2": 0.3328,+    "xor_mm2": 0.0028,+    "page_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ],+    "ul_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ]+   },+   "mask": {+    "page_mm2": 0.33,+    "ul_mm2": 0.3328,+    "xor_mm2": 0.0028,+    "page_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ],+    "ul_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ]+   },+   "paste": {+    "page_mm2": 0.33,+    "ul_mm2": 0.3328,+    "xor_mm2": 0.0028,+    "page_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ],+    "ul_bbox_mm": [+     -3.2,+     -1.675,+     -1.895,+     -1.42+    ]+   }+  },+  {+   "pad": "24",+   "cu": {+    "page_mm2": 8.0188,+    "ul_mm2": 8.0306,+    "xor_mm2": 0.0458,+    "page_bbox_mm": [+     -1.7,+     -1.25,+     1.705,+     1.105+    ],+    "ul_bbox_mm": [+     -1.705,+     -1.255,+     1.705,+     1.1+    ]+   },+   "mask": {+    "page_mm2": 8.0188,+    "ul_mm2": 8.0306,+    "xor_mm2": 0.0458,+    "page_bbox_mm": [+     -1.7,+     -1.25,+     1.705,+     1.105+    ],+    "ul_bbox_mm": [+     -1.705,+     -1.255,+     1.705,+     1.1+    ]+   },+   "paste": {+    "page_mm2": 6.1602,+    "ul_mm2": 6.0822,+    "xor_mm2": 0.078,+    "page_bbox_mm": [+     -1.67,+     -1.215,+     1.675,+     1.07+    ],+    "ul_bbox_mm": [+     -1.67,+     -1.215,+     1.67,+     1.065+    ]+   }+  }+ ],+ "vias": {+  "page": [+   [+    -1.45,+    -0.875,+    0.2,+    0.5+   ],+   [+    -1.45,+    -0.075,+    0.2,+    0.5+   ],+   [+    -1.45,+    0.725,+    0.2,+    0.5+   ],+   [+    -0.59,+    -0.875,+    0.2,+    0.5+   ],+   [+    -0.59,+    -0.075,+    0.2,+    0.5+   ],+   [+    -0.59,+    0.725,+    0.2,+    0.5+   ],+   [+    0.59,+    -0.875,+    0.2,+    0.5+   ],+   [+    0.59,+    -0.075,+    0.2,+    0.5+   ],+   [+    0.59,+    0.725,+    0.2,+    0.5+   ],+   [+    1.45,+    -0.875,+    0.2,+    0.5+   ],+   [+    1.45,+    -0.075,+    0.2,+    0.5+   ],+   [+    1.45,+    0.725,+    0.2,+    0.5+   ]+  ],+  "ul": [+   [+    -1.45,+    -0.875,+    0.5+   ],+   [+    -1.45,+    -0.075,+    0.5+   ],+   [+    -1.45,+    0.725,+    0.5+   ],+   [+    -0.59,+    -0.875,+    0.5+   ],+   [+    -0.59,+    -0.075,+    0.5+   ],+   [+    -0.59,+    0.725,+    0.5+   ],+   [+    0.59,+    -0.875,+    0.5+   ],+   [+    0.59,+    -0.075,+    0.5+   ],+   [+    0.59,+    0.725,+    0.5+   ],+   [+    1.45,+    -0.875,+    0.5+   ],+   [+    1.45,+    -0.075,+    0.5+   ],+   [+    1.45,+    0.725,+    0.5+   ]+  ]+ },+ "kicad": "KiCad's standard library has no VMA0023A / LQFN-CLIP-23 footprint (gitlab.com/kicad/libraries/kicad-footprints Package_DFN_QFN.pretty, 780 files, listed 2026-10-21); no KiCad comparison is possible."+}\ No newline at end of file
provenance/model-overlay.jsonadded+22
@@ -0,0 +1,22 @@+{+ "bottom": {+  "score": 0.9728,+  "scale": 118.25,+  "origin": [+   1193,+   2176+  ],+  "image": "proof-model-bottom.png"+ },+ "side": {+  "view": "front",+  "score": 0.7014,+  "scale": 118.25,+  "origin": [+   1193,+   1451+  ],+  "image": "proof-model-side.png",+  "note": "TI draws the side view at A max (1.5 mm); the model is at the nominal 1.4 mm, so its top edge sits 0.1 mm below TI's"+ }+}\ No newline at end of file
provenance/tools/build_fp.pyadded+134
@@ -0,0 +1,134 @@+#!/usr/bin/env python3+"""Build the TPS16850VMAR footprint from TI's recommended land pattern (SLVSHA1D p.55, LAND PATTERN EXAMPLE for+VMA0023A, 4230225/A 11/2023) and solder paste example (p.56).++KiCad frame: Y down, origin = package centre (TI's 0.000 PKG centre lines). TI draws the land pattern as a top+view with Y up, so every TI y is negated here.++Step 1 writes the plain pads (rectangles, the exposed pad, TI's 12 vias) as an adom-footprint create JSON and runs+adom-footprint 1.0.26. Step 2 adds what adom-footprint create cannot express:+  * pads 6 and 17: L-shaped custom pads (non solder mask defined, like the plain pads);+  * pads 7, 10 and 22: TI draws a copper rectangle under solder mask (blue dashed, "METAL UNDER SOLDER MASK") with+    a comb-shaped solder mask opening (green). Written as two pads with the same number: a copper-only rectangle+    (F.Cu) and a comb custom pad (F.Cu F.Mask F.Paste, mask margin 0);+  * exposed pad 24: copper and mask only; the paste is TI's six 0.98 x 1.04 mm windows (p.56, 76 % coverage),+    written as unnumbered F.Paste apertures;+  * silkscreen outline 0.2 mm outside the copper, pin-1 dot left of pad 1, fab outline with the pin-1 chamfer,+    3D model path; corner radius of the plain pads R0.05 as TI prints it.+Step 3 writes tps16850vmar-lbr-input.kicad_mod for adom-lbr 2.47.5, which drops custom-pad primitives and+paste-only pads: the same copper as rectangles (every custom shape here is rectilinear, so the union of the+rectangles is exact), copper-only rectangles with mask and paste margin -1.2 mm (no opening), no paste-only pads.+usage: build_fp.py outdir+"""+import json, os, re, subprocess, sys++out = sys.argv[1]+NAME = "tps16850vmar"+MODEL = "${KIPRJMOD}/tps16850vmar-etched.step"+R = 0.05++def rr(w, h): return round(R / min(w, h), 4)++pads = []+def pad(n, x, y, w, h):+    pads.append({"number": str(n), "x": x, "y": y, "dx": w, "dy": h, "shape": "roundrect"})++for n, ty in zip(range(1, 5), (0.5, 0.0, -0.5, -1.0)):      # left 1-4: (0.65) long, 21X (0.25) wide+    pad(n, -2.875, -ty if ty else 0.0, 0.65, 0.25)+pad(5, -2.85, 1.5, 0.70, 0.25)                              # pin 5 (0.7) long+pad(8, 0.225, 2.325, 0.25, 0.75)                            # 2X (0.75) at x 0.225 / 1.275, TI y -2.325+pad(9, 1.275, 2.325, 0.25, 0.75)+for n, ty in zip(range(11, 17), (-0.925, -0.425, 0.075, 0.575, 1.075, 1.575)):   # right, 10X (0.65)+    pad(n, 2.875, -ty, 0.65, 0.25)+for n, x in zip(range(18, 22), (1.85, 1.35, 0.85, 0.35)):   # top, 4X 0.6 at TI y 2.4+    pad(n, x, -2.4, 0.25, 0.60)+pad(23, -2.55, -1.55, 1.30, 0.25)                           # (1.3) at TI y 1.55+pads.append({"number": "24", "x": 0.0, "y": -0.075, "dx": 3.4, "dy": 2.35, "shape": "rect", "layers": '"F.Cu" "F.Mask"'})+VIAS = [(x, y) for y in (-0.875, -0.075, 0.725) for x in (-1.45, -0.59, 0.59, 1.45)]   # (0.2) TYP VIA+for x, y in VIAS:+    pads.append({"number": "24", "x": x, "y": y, "dx": 0.5, "dy": 0.5, "shape": "circle", "mount": "thru_hole",+                 "drill": 0.2, "layers": '"*.Cu"'})+spec = {"footprintName": NAME,+        "description": "TI VMA0023A LQFN-CLIP-23, 6.0 x 5.0 mm, 1.5 mm max height; land pattern and stencil per "+                       "TI SLVSHA1D p.55-56 (TPS1685x eFuse)",+        "tags": "TPS1685 TPS16850 VMA0023A LQFN-CLIP QFN eFuse",+        "pads": pads, "body": {"x1": -3.0, "y1": -2.5, "x2": 3.0, "y2": 2.5},+        "courtyard": {"x1": -3.6, "y1": -3.1, "x2": 3.6, "y2": 3.1}}+os.makedirs(out, exist_ok=True)+jp = os.path.join(out, "footprint-create.json")+json.dump(spec, open(jp, "w"), indent=1)+r = subprocess.run(["adom-footprint", "create", "--file", jp, "--out", os.path.join(out, "gen")], capture_output=True, text=True)+if r.returncode: sys.exit(r.stdout + r.stderr)+base = open(os.path.join(out, "gen", NAME + ".kicad_mod")).read()+base = re.sub(r'\s*\(fp_line [^\n]*\n\s*\(stroke [^\n]*\(layer "F.SilkS"\)\)', "", base)+base = re.sub(r'\s*\(fp_rect \(start -3 -2.5\) \(end 3 2.5\)\n\s*\(stroke [^\n]*\(layer "F.Fab"\)\)', "", base)+base = base.replace('(drill 0.2)\n    (layers "*.Cu"))', '(drill 0.2)\n    (layers "*.Cu") (property pad_prop_heatsink))')+base = base.replace("(roundrect_rratio 0.25))", "(roundrect_rratio 0.2))")       # r = 0.05 on 0.25 mm pads+base = re.sub(r'\(fp_text reference "REF\*\*" \(at 0 [-\d.]+\)', '(fp_text reference "REF**" (at 0 -4)', base)+base = re.sub(r'\(fp_text value "[^"]*" \(at 0 [-\d.]+\)', '(fp_text value "TPS16850VMAR" (at 0 4)', base)++def rect(x1, y1, x2, y2): return [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]+ALL = '"F.Cu" "F.Paste" "F.Mask"'+# custom shapes (KiCad y)+P6 = [(-3.2, 1.875), (-2.5, 1.875), (-2.5, 2.7), (-2.8, 2.7), (-2.8, 2.125), (-3.2, 2.125)]+P17 = [(2.225, -2.7), (2.475, -2.7), (2.475, -2.15), (3.2, -2.15), (3.2, -1.9), (2.225, -1.9)]+C22 = [(-3.2, -1.925), (-1.0, -1.925), (-1.0, -2.7), (-1.25, -2.7), (-1.25, -2.25), (-1.5, -2.25), (-1.5, -2.7),+       (-1.75, -2.7), (-1.75, -2.25), (-2.0, -2.25), (-2.0, -2.7), (-2.25, -2.7), (-2.25, -2.25), (-2.5, -2.25),+       (-2.5, -2.7), (-2.75, -2.7), (-2.75, -2.175), (-3.2, -2.175)]+C7 = [(-1.7, 1.95), (-0.15, 1.95), (-0.15, 2.7), (-0.35, 2.7), (-0.35, 2.25), (-0.6, 2.25), (-0.6, 2.7), (-0.8, 2.7),+      (-0.8, 2.25), (-1.05, 2.25), (-1.05, 2.7), (-1.25, 2.7), (-1.25, 2.25), (-1.5, 2.25), (-1.5, 2.7), (-1.7, 2.7)]+C10 = [(1.65, 1.85), (3.2, 1.85), (3.2, 2.25), (2.4, 2.25), (2.4, 2.7), (2.15, 2.7), (2.15, 2.25), (1.9, 2.25),+       (1.9, 2.7), (1.65, 2.7)]+CU = {"22": (-3.25, -2.75, -0.95, -1.875), "7": (-1.75, 1.9, -0.1, 2.75), "10": (1.6, 1.8, 3.25, 2.75)}+ANCH = {"6": (-2.65, 2.0), "17": (2.35, -2.025), "22": (-2.1, -2.05), "7": (-0.925, 2.1), "10": (2.4, 2.05)}+# the same shapes as rectangles (for adom-lbr)+RECTS = {"6": [(-3.2, 1.875, -2.5, 2.125), (-2.8, 1.875, -2.5, 2.7)],+         "17": [(2.225, -2.7, 2.475, -1.9), (2.225, -2.15, 3.2, -1.9)],+         "22": [(-3.2, -2.175, -2.75, -1.925), (-2.75, -2.25, -1.0, -1.925)] ++               [(c - 0.125, -2.7, c + 0.125, -2.25) for c in (-2.625, -2.125, -1.625, -1.125)],+         "7": [(-1.7, 1.95, -0.15, 2.25)] + [(c - 0.1, 2.25, c + 0.1, 2.7) for c in (-1.6, -1.15, -0.7, -0.25)],+         "10": [(1.65, 1.85, 3.2, 2.25)] + [(c - 0.125, 2.25, c + 0.125, 2.7) for c in (1.775, 2.275)]}+SHAPE = {"6": P6, "17": P17, "22": C22, "7": C7, "10": C10}++def custom(num, pts, layers, extra=""):+    ax, ay = ANCH[num]+    rel = " ".join(f"(xy {round(x - ax, 4):g} {round(y - ay, 4):g})" for x, y in pts)+    return (f'  (pad "{num}" smd custom (at {ax:g} {ay:g}) (size 0.2 0.2)\n    (layers {layers}){extra}\n'+            f'    (options (clearance outline) (anchor rect))\n    (primitives (gr_poly (pts {rel}) (width 0) (fill yes))))\n')+def rpad(num, x1, y1, x2, y2, layers, extra=""):+    return (f'  (pad "{num}" smd rect (at {(x1 + x2) / 2:g} {(y1 + y2) / 2:g}) (size {round(x2 - x1, 4):g} {round(y2 - y1, 4):g})'+            f' (layers {layers}){extra})\n')++graphics = ('  (fp_poly (pts (xy -2.5 -2.5) (xy 3 -2.5) (xy 3 2.5) (xy -3 2.5) (xy -3 -2)) '+            '(stroke (width 0.1) (type default)) (fill none) (layer "F.Fab"))\n')+for a, b in (((-3.45, -2.95), (3.45, -2.95)), ((3.45, -2.95), (3.45, 2.95)), ((3.45, 2.95), (-3.45, 2.95)),+             ((-3.45, 2.95), (-3.45, -2.95))):+    graphics += f'  (fp_line (start {a[0]:g} {a[1]:g}) (end {b[0]:g} {b[1]:g})\n    (stroke (width 0.1) (type default)) (layer "F.SilkS"))\n'+graphics += '  (fp_circle (center -3.8 -0.5) (end -3.68 -0.5)\n    (stroke (width 0.1) (type default)) (fill solid) (layer "F.SilkS"))\n'+model = f'  (model "{MODEL}"\n    (offset (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)))\n'++main = ""+for n in ("6", "17"): main += custom(n, SHAPE[n], ALL)+for n in ("22", "7", "10"):+    x1, y1, x2, y2 = CU[n]+    main += custom(n, rect(x1, y1, x2, y2), '"F.Cu"')+    main += custom(n, SHAPE[n], ALL, " (solder_mask_margin 0)")+for y in (-0.695, 0.545):+    for x in (-1.18, 0.0, 1.18):+        main += f'  (pad "" smd roundrect (at {x:g} {y:g}) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio {rr(0.98, 1.04)}))\n'+lbr = ""+for n in ("6", "17"):+    for r_ in RECTS[n]: lbr += rpad(n, *r_, ALL)+for n in ("22", "7", "10"):+    lbr += rpad(n, *CU[n], '"F.Cu"', " (solder_mask_margin -1.2) (solder_paste_margin -1.2)")+    for r_ in RECTS[n]: lbr += rpad(n, *r_, ALL, " (solder_mask_margin 0)")++def finish(extra):+    i = base.rstrip().rfind(")")+    return base[:i] + graphics + extra + model + ")\n"+open(os.path.join(out, f"{NAME}.kicad_mod"), "w").write(finish(main))+open(os.path.join(out, f"{NAME}-lbr-input.kicad_mod"), "w").write(finish(lbr))+json.dump({"vias": VIAS, "rects": RECTS, "copper_only": CU, "ep": {"x": 0, "y": -0.075, "w": 3.4, "h": 2.35},+           "ep_paste": [[x, y, 0.98, 1.04] for y in (-0.695, 0.545) for x in (-1.18, 0.0, 1.18)]},+          open(os.path.join(out, "fp-extra.json"), "w"), indent=1)+print("OK", NAME, "and lbr-input written to", out)
provenance/tools/build_vma23.pyadded+100
@@ -0,0 +1,100 @@+#!/usr/bin/env python3+"""Build TI's VMA0023A LQFN-CLIP-23 package (TPS1685x) from the PACKAGE OUTLINE drawing, SLVSHA1D p.54+(4230225/A 11/2023), in KiCad's 3D frame: Z up, seated on z = 0, centred on the package centre lines (= the+footprint origin), X right, Y up (the datasheet's top view; KiCad footprint y = -Y). Pin 1 (ILIM) at (-2.75, +0.5).++TI prints the bottom view turned over about the X axis (pin 1 below the centre line there); every y read from it+is negated here, so the terminals sit under the land-pattern pads of p.55.++Printed values used (nominal = middle of min/max):+  D 5.9..6.1 -> 6.0 (X), E 4.9..5.1 -> 5.0 (Y), A 1.3..1.5 -> 1.4, A1 0.00..0.05 -> 0.025 (terminal stand-off)+  terminal width 28X 0.2..0.3 -> 0.25; pin 7 teeth 4X 0.15..0.25 -> 0.20; pin 6 leg 0.25..0.35 -> 0.30+  side terminals: left (1-5) 0.4..0.6 -> 0.50, right (11-16) 10X 0.35..0.55 -> 0.45, top (18-21) 4X 0.3..0.5 -> 0.40,+  bottom (8, 9) 3X 0.45..0.65 -> 0.55; pin 23 1.0..1.2 -> 1.10; pin 10 bar 0.35..0.45 -> 0.40 centred 2.05;+  pin 22 bar edge 0.475..0.675 -> 0.575 from the package edge, centre 2.05; exposed pad 3.4 x 2.35 (+-0.1) centred+  0.075 off the package centre line, pin-1 chamfer 45 deg x 0.25; terminal exposure on the side walls (0.2) TYP.+Positions are the drawing's basic (boxed) dimensions and match the land pattern of p.55.+Undimensioned, measured off the drawing at 118 px/mm (300 dpi): pin 7 bar inner edge 1.95 from the centre line,+notch depth 0.25 on pins 7, 10 and 22. Terminal thickness taken as the (0.2) side exposure; inner terminal ends+rounded as drawn.+Colours from TI's VMA package render (DigiKey image MFG_296~4230225~VMA~23): dark grey mould, silver (NiPdAu)+terminal faces, copper where the terminals are sawn through at the side walls.++usage: build_vma23.py out.step [--detail full|low|superlow]+  full: as drawn; low: square inner terminal ends; superlow: square ends and one terminal part without the+  copper end slices (every terminal, comb teeth included, kept).+Writes an assembly: body (mould), pins (terminal faces), pin_ends (sawn copper ends on the side walls).+"""+import sys+import cadquery as cq++out = sys.argv[1]+detail = sys.argv[sys.argv.index("--detail") + 1] if "--detail" in sys.argv else "full"+D, E, A, A1, T = 6.0, 5.0, 1.4, 0.025, 0.20+HX, HY = D / 2, E / 2+SAW = 0.02+RND = detail == "full"++def rect(x1, y1, x2, y2): return [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]++def solid_poly(pts, z0=0.0, h=T, simplify=True):+    return cq.Workplane("XY").workplane(offset=z0).polyline(pts).close().extrude(h)++def lead(x1, y1, x2, y2, inner):+    w = cq.Workplane("XY").polyline(rect(x1, y1, x2, y2)).close().extrude(T)+    if RND:+        if inner in ("+x", "-x"):+            r = (y2 - y1) / 2; cx = x2 - r if inner == "+x" else x1 + r; cy = (y1 + y2) / 2+            box = rect(cx, y1, x2, y2) if inner == "+x" else rect(x1, y1, cx, y2)+        else:+            r = (x2 - x1) / 2; cy = y2 - r if inner == "+y" else y1 + r; cx = (x1 + x2) / 2+            box = rect(x1, cy, x2, y2) if inner == "+y" else rect(x1, y1, x2, cy)+        w = w.cut(solid_poly(box, -0.01, T + 0.02, False)).union(cq.Workplane("XY").center(cx, cy).circle(r).extrude(T))+    return w++W = 0.25+terms = []+for y in (0.5, 0.0, -0.5, -1.0, -1.5):                         # 1-5, L 0.50+    terms.append(lead(-HX, y - W/2, -HX + 0.50, y + W/2, "+x"))+for y in (-0.925, -0.425, 0.075, 0.575, 1.075, 1.575):         # 11-16, L 0.45+    terms.append(lead(HX - 0.45, y - W/2, HX, y + W/2, "-x"))+for x in (1.85, 1.35, 0.85, 0.35):                             # 18-21, L 0.40+    terms.append(lead(x - W/2, HY - 0.40, x + W/2, HY, "-y"))+for x in (0.225, 1.275):                                       # 8, 9, L 0.55+    terms.append(lead(x - W/2, -HY, x + W/2, -HY + 0.55, "+y"))+terms.append(lead(-HX, 1.55 - W/2, -HX + 1.10, 1.55 + W/2, "+x"))   # 23, L 1.10+# 6: bar along the -x edge at y -2.0 (+-0.125) and a 0.30 leg at x -2.65 to the -y edge+terms.append(solid_poly([(-HX, -1.875), (-2.5, -1.875), (-2.5, -HY), (-2.8, -HY), (-2.8, -2.125), (-HX, -2.125)]))+# 17: 0.25 leg at x 2.35 to the +y edge, 0.25 bar at y 2.025 to the +x edge+terms.append(solid_poly([(2.225, HY), (2.475, HY), (2.475, 2.15), (HX, 2.15), (HX, 1.9), (2.225, 1.9)]))+# 7: bar y -2.25..-1.95, x -1.70..-0.15, teeth 0.20 wide at x -1.6 -1.15 -0.7 -0.25 to the -y edge+terms.append(solid_poly([(-1.70, -1.95), (-0.15, -1.95), (-0.15, -HY), (-0.35, -HY), (-0.35, -2.25), (-0.60, -2.25),+                         (-0.60, -HY), (-0.80, -HY), (-0.80, -2.25), (-1.05, -2.25), (-1.05, -HY), (-1.25, -HY),+                         (-1.25, -2.25), (-1.50, -2.25), (-1.50, -HY), (-1.70, -HY)]))+# 10: bar y -2.25..-1.85 from x 1.65 to the +x edge, teeth 0.25 wide at x 1.775, 2.275 to the -y edge+terms.append(solid_poly([(1.65, -1.85), (HX, -1.85), (HX, -2.25), (2.40, -2.25), (2.40, -HY), (2.15, -HY),+                         (2.15, -2.25), (1.90, -2.25), (1.90, -HY), (1.65, -HY)]))+# 22: bar y 1.925..2.25 from x -1.0 to -2.75, stub to the -x edge at y 1.925..2.175, teeth 0.25 wide at+#     x -2.625 -2.125 -1.625 -1.125 to the +y edge+terms.append(solid_poly([(-HX, 1.925), (-1.0, 1.925), (-1.0, HY), (-1.25, HY), (-1.25, 2.25), (-1.5, 2.25),+                         (-1.5, HY), (-1.75, HY), (-1.75, 2.25), (-2.0, 2.25), (-2.0, HY), (-2.25, HY),+                         (-2.25, 2.25), (-2.5, 2.25), (-2.5, HY), (-2.75, HY), (-2.75, 2.175), (-HX, 2.175)]))+# 24: exposed pad 3.4 x 2.35 at (0, +0.075), 0.25 x 45 deg chamfer at the pin-1 corner (-x, +y)+ex1, ex2, ey1, ey2, chf = -1.7, 1.7, 0.075 - 1.175, 0.075 + 1.175, 0.25+terms.append(solid_poly([(ex1, ey1), (ex2, ey1), (ex2, ey2), (ex1 + chf, ey2), (ex1, ey2 - chf)], simplify=False))++pins = terms[0]+for t in terms[1:]: pins = pins.union(t)+body = cq.Workplane("XY").box(D, E, A - A1, centered=(True, True, False)).translate((0, 0, A1)).cut(pins)+frame = cq.Workplane("XY").box(D, E, 1, centered=(True, True, False)).translate((0, 0, -0.5)).cut(+    cq.Workplane("XY").box(D - 2 * SAW, E - 2 * SAW, 2, centered=(True, True, False)).translate((0, 0, -1)))+asm = cq.Assembly(name="VMA0023A_LQFN-CLIP-23")+asm.add(body, name="body", color=cq.Color(0.16, 0.16, 0.17))+if detail == "superlow":+    asm.add(pins, name="pins", color=cq.Color(0.80, 0.80, 0.78))+else:+    asm.add(pins.cut(frame), name="pins", color=cq.Color(0.80, 0.80, 0.78))+    asm.add(pins.intersect(frame), name="pin_ends", color=cq.Color(0.80, 0.50, 0.33))+asm.save(out, exportType="STEP")+bb = asm.toCompound().BoundingBox()+print(f"OK {out} detail={detail} bbox x {bb.xmin:.3f}..{bb.xmax:.3f} y {bb.ymin:.3f}..{bb.ymax:.3f} z {bb.zmin:.3f}..{bb.zmax:.3f}")
provenance/tools/footprint-create.jsonadded+304
@@ -0,0 +1,304 @@+{+ "footprintName": "tps16850vmar",+ "description": "TI VMA0023A LQFN-CLIP-23, 6.0 x 5.0 mm, 1.5 mm max height; land pattern and stencil per TI SLVSHA1D p.55-56 (TPS1685x eFuse)",+ "tags": "TPS1685 TPS16850 VMA0023A LQFN-CLIP QFN eFuse",+ "pads": [+  {+   "number": "1",+   "x": -2.875,+   "y": -0.5,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "2",+   "x": -2.875,+   "y": 0.0,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "3",+   "x": -2.875,+   "y": 0.5,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "4",+   "x": -2.875,+   "y": 1.0,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "5",+   "x": -2.85,+   "y": 1.5,+   "dx": 0.7,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "8",+   "x": 0.225,+   "y": 2.325,+   "dx": 0.25,+   "dy": 0.75,+   "shape": "roundrect"+  },+  {+   "number": "9",+   "x": 1.275,+   "y": 2.325,+   "dx": 0.25,+   "dy": 0.75,+   "shape": "roundrect"+  },+  {+   "number": "11",+   "x": 2.875,+   "y": 0.925,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "12",+   "x": 2.875,+   "y": 0.425,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "13",+   "x": 2.875,+   "y": -0.075,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "14",+   "x": 2.875,+   "y": -0.575,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "15",+   "x": 2.875,+   "y": -1.075,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "16",+   "x": 2.875,+   "y": -1.575,+   "dx": 0.65,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "18",+   "x": 1.85,+   "y": -2.4,+   "dx": 0.25,+   "dy": 0.6,+   "shape": "roundrect"+  },+  {+   "number": "19",+   "x": 1.35,+   "y": -2.4,+   "dx": 0.25,+   "dy": 0.6,+   "shape": "roundrect"+  },+  {+   "number": "20",+   "x": 0.85,+   "y": -2.4,+   "dx": 0.25,+   "dy": 0.6,+   "shape": "roundrect"+  },+  {+   "number": "21",+   "x": 0.35,+   "y": -2.4,+   "dx": 0.25,+   "dy": 0.6,+   "shape": "roundrect"+  },+  {+   "number": "23",+   "x": -2.55,+   "y": -1.55,+   "dx": 1.3,+   "dy": 0.25,+   "shape": "roundrect"+  },+  {+   "number": "24",+   "x": 0.0,+   "y": -0.075,+   "dx": 3.4,+   "dy": 2.35,+   "shape": "rect",+   "layers": "\"F.Cu\" \"F.Mask\""+  },+  {+   "number": "24",+   "x": -1.45,+   "y": -0.875,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": -0.59,+   "y": -0.875,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 0.59,+   "y": -0.875,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 1.45,+   "y": -0.875,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": -1.45,+   "y": -0.075,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": -0.59,+   "y": -0.075,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 0.59,+   "y": -0.075,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 1.45,+   "y": -0.075,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": -1.45,+   "y": 0.725,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": -0.59,+   "y": 0.725,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 0.59,+   "y": 0.725,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  },+  {+   "number": "24",+   "x": 1.45,+   "y": 0.725,+   "dx": 0.5,+   "dy": 0.5,+   "shape": "circle",+   "mount": "thru_hole",+   "drill": 0.2,+   "layers": "\"*.Cu\""+  }+ ],+ "body": {+  "x1": -3.0,+  "y1": -2.5,+  "x2": 3.0,+  "y2": 2.5+ },+ "courtyard": {+  "x1": -3.6,+  "y1": -3.1,+  "x2": 3.6,+  "y2": 3.1+ }+}\ No newline at end of file
provenance/tools/fp-extra.jsonadded+236
@@ -0,0 +1,236 @@+{+ "vias": [+  [+   -1.45,+   -0.875+  ],+  [+   -0.59,+   -0.875+  ],+  [+   0.59,+   -0.875+  ],+  [+   1.45,+   -0.875+  ],+  [+   -1.45,+   -0.075+  ],+  [+   -0.59,+   -0.075+  ],+  [+   0.59,+   -0.075+  ],+  [+   1.45,+   -0.075+  ],+  [+   -1.45,+   0.725+  ],+  [+   -0.59,+   0.725+  ],+  [+   0.59,+   0.725+  ],+  [+   1.45,+   0.725+  ]+ ],+ "rects": {+  "6": [+   [+    -3.2,+    1.875,+    -2.5,+    2.125+   ],+   [+    -2.8,+    1.875,+    -2.5,+    2.7+   ]+  ],+  "17": [+   [+    2.225,+    -2.7,+    2.475,+    -1.9+   ],+   [+    2.225,+    -2.15,+    3.2,+    -1.9+   ]+  ],+  "22": [+   [+    -3.2,+    -2.175,+    -2.75,+    -1.925+   ],+   [+    -2.75,+    -2.25,+    -1.0,+    -1.925+   ],+   [+    -2.75,+    -2.7,+    -2.5,+    -2.25+   ],+   [+    -2.25,+    -2.7,+    -2.0,+    -2.25+   ],+   [+    -1.75,+    -2.7,+    -1.5,+    -2.25+   ],+   [+    -1.25,+    -2.7,+    -1.0,+    -2.25+   ]+  ],+  "7": [+   [+    -1.7,+    1.95,+    -0.15,+    2.25+   ],+   [+    -1.7000000000000002,+    2.25,+    -1.5,+    2.7+   ],+   [+    -1.25,+    2.25,+    -1.0499999999999998,+    2.7+   ],+   [+    -0.7999999999999999,+    2.25,+    -0.6,+    2.7+   ],+   [+    -0.35,+    2.25,+    -0.15,+    2.7+   ]+  ],+  "10": [+   [+    1.65,+    1.85,+    3.2,+    2.25+   ],+   [+    1.65,+    2.25,+    1.9,+    2.7+   ],+   [+    2.15,+    2.25,+    2.4,+    2.7+   ]+  ]+ },+ "copper_only": {+  "22": [+   -3.25,+   -2.75,+   -0.95,+   -1.875+  ],+  "7": [+   -1.75,+   1.9,+   -0.1,+   2.75+  ],+  "10": [+   1.6,+   1.8,+   3.25,+   2.75+  ]+ },+ "ep": {+  "x": 0,+  "y": -0.075,+  "w": 3.4,+  "h": 2.35+ },+ "ep_paste": [+  [+   -1.18,+   -0.695,+   0.98,+   1.04+  ],+  [+   0.0,+   -0.695,+   0.98,+   1.04+  ],+  [+   1.18,+   -0.695,+   0.98,+   1.04+  ],+  [+   -1.18,+   0.545,+   0.98,+   1.04+  ],+  [+   0.0,+   0.545,+   0.98,+   1.04+  ],+  [+   1.18,+   0.545,+   0.98,+   1.04+  ]+ ]+}\ No newline at end of file
provenance/tools/fp_check.pyadded+179
@@ -0,0 +1,179 @@+#!/usr/bin/env python3+"""Check the page footprint pad by pad.++1. Against TI's printed land pattern (SLVSHA1D p.55): the footprint's copper (red fill) and solder-mask openings+   (magenta) drawn at TI's printed 15X scale (15 x 300 / 25.4 = 177.17 px/mm) on the 300 dpi render of p.55. The+   offset is found by maximising the overlap of our copper outlines with the drawing's blue copper strokes (scale+   also searched +-0.5 %), so nothing about the pads is assumed. The comb mask openings are scored on TI's green.+2. Against Ultra Librarian's TI VMA0023A footprint preview (static.ultralibrarian.com part-preview SVG, read as+   data): per pad number, copper / mask / paste area and symmetric-difference area, rasterised at 200 px/mm.+KiCad's standard library has no VMA0023A footprint (Package_DFN_QFN.pretty listed 2026-10-21), so no KiCad+comparison is possible.+usage: fp_check.py page.kicad_mod ul.svg p55-300dpi.png out.json out.png+"""+import json, math, re, sys+import numpy as np+from PIL import Image, ImageDraw, ImageFont++fp_path, ul_path, p55, out_json, out_png = sys.argv[1:6]++def sexp(text):+    toks = re.findall(r'\(|\)|"(?:\\.|[^"\\])*"|[^\s()]+', text)+    st = [[]]+    for t in toks:+        if t == '(': st.append([])+        elif t == ')': x = st.pop(); st[-1].append(x)+        else: st[-1].append(t[1:-1] if t.startswith('"') else t)+    return st[0][0]+def ch(n, k): return next((c for c in n if isinstance(c, list) and c and c[0] == k), None)+def chs(n, k): return [c for c in n if isinstance(c, list) and c and c[0] == k]+def rrect_poly(cx, cy, w, h, r, n=6):+    if r <= 0: return [(cx - w/2, cy - h/2), (cx + w/2, cy - h/2), (cx + w/2, cy + h/2), (cx - w/2, cy + h/2)]+    pts = []+    for qx, qy, a0 in ((1, 1, 0), (-1, 1, 90), (-1, -1, 180), (1, -1, 270)):+        ox, oy = cx + qx * (w/2 - r), cy + qy * (h/2 - r)+        for i in range(n + 1):+            a = math.radians(a0 + 90 * i / n); pts.append((ox + r * math.cos(a), oy + r * math.sin(a)))+    return pts+def circle_poly(cx, cy, r, n=24):+    return [(cx + r * math.cos(2*math.pi*i/n), cy + r * math.sin(2*math.pi*i/n)) for i in range(n)]++fp = sexp(open(fp_path).read())+ours = {}+for p in chs(fp, 'pad'):+    num, kind, shape = p[1], p[2], p[3]+    if kind == 'thru_hole': continue+    at = ch(p, 'at'); x, y = float(at[1]), float(at[2])+    sz = ch(p, 'size'); w, h = float(sz[1]), float(sz[2])+    layers = ch(p, 'layers')[1:]+    if shape == 'custom':+        polys = [[(x + float(q[1]), y + float(q[2])) for q in ch(gp, 'pts')[1:]] for gp in chs(ch(p, 'primitives'), 'gr_poly')]+    else:+        r = float(ch(p, 'roundrect_rratio')[1]) * min(w, h) if shape == 'roundrect' else 0+        polys = [rrect_poly(x, y, w, h, r)]+    d = ours.setdefault(num, {"cu": [], "mask": [], "paste": []})+    if 'F.Cu' in layers: d["cu"] += polys+    if 'F.Mask' in layers: d["mask"] += polys+    if 'F.Paste' in layers: d["paste"] += polys+vias_ours = sorted((float(ch(p, 'at')[1]), float(ch(p, 'at')[2]), float(ch(p, 'drill')[1]), float(ch(p, 'size')[1]))+                   for p in chs(fp, 'pad') if p[2] == 'thru_hole')+ep_paste = ours.pop('', None)+if ep_paste: ours['24']['paste'] += ep_paste['paste']++MIL = 1 / 39.37008+svg = open(ul_path).read()+ul, anchors = {}, {}+for g in re.finditer(r'<g id="([^"]+)"[^>]*>(.*?)</g>', svg, re.S):+    gid, body = g.group(1), g.group(2)+    key = {"TOP": "cu", "TOP_SOLDER_MASK": "mask", "TOP_SOLDER_PASTE": "paste"}.get(gid)+    if not key: continue+    unnamed = []+    for t, a in re.findall(r'<(rect|polygon|circle)\b([^>]*)>', body):+        d = dict(re.findall(r'([\w:-]+)\s*=\s*"([^"]*)"', a))+        num = d.get('data-pin_number')+        if t == 'rect':+            x, y, w, h = [float(d[k]) * MIL for k in ('x', 'y', 'width', 'height')]+            if w < 0.05: continue+            poly = [(x, y), (x + w, y), (x + w, y + h), (x, y + h)]+        elif t == 'polygon':+            poly = [tuple(float(v) * MIL for v in q.split(',')) for q in d['points'].split()]+        else:+            cx, cy, r = float(d['cx']) * MIL, float(d['cy']) * MIL, float(d['r']) * MIL+            if int(num) >= 25:+                if key == "cu" and r > 0.15: ul.setdefault("vias", []).append((round(cx, 3), round(cy, 3), round(2 * r, 3)))+                continue+            anchors[num] = (cx, cy); continue+        if num is None: unnamed.append(poly)+        else: ul.setdefault(num, {"cu": [], "mask": [], "paste": []})[key].append(poly)+    for poly in unnamed:+        xs = [p[0] for p in poly]; ys = [p[1] for p in poly]+        cx, cy = (min(xs) + max(xs)) / 2, (min(ys) + max(ys)) / 2+        if max(xs) - min(xs) < 1.2 and max(ys) - min(ys) < 1.2 and abs(cx) < 1.5 and abs(cy) < 1.2:+            ul.setdefault('24', {"cu": [], "mask": [], "paste": []})[key].append(poly); continue+        best = min(anchors, key=lambda n: (anchors[n][0] - cx) ** 2 + (anchors[n][1] - cy) ** 2)+        ul.setdefault(best, {"cu": [], "mask": [], "paste": []})[key].append(poly)++S = 200; W, H = int(8 * S), int(7 * S)+def mask_of(polys):+    im = Image.new('1', (W, H), 0); d = ImageDraw.Draw(im)+    for p in polys: d.polygon([(W/2 + x * S, H/2 + y * S) for x, y in p], fill=1)+    return np.array(im, bool)+def bbox(m):+    ys, xs = np.nonzero(m)+    if not len(xs): return None+    return [round((xs.min() - W/2) / S, 3), round((ys.min() - H/2) / S, 3), round((xs.max() + 1 - W/2) / S, 3), round((ys.max() + 1 - H/2) / S, 3)]+rows = []+for num in sorted(ours, key=int):+    row = {"pad": num}+    for k in ("cu", "mask", "paste"):+        a, b = mask_of(ours[num][k]), mask_of(ul.get(num, {}).get(k, []))+        row[k] = {"page_mm2": round(a.sum() / S**2, 4), "ul_mm2": round(b.sum() / S**2, 4),+                  "xor_mm2": round((a ^ b).sum() / S**2, 4), "page_bbox_mm": bbox(a), "ul_bbox_mm": bbox(b)}+    rows.append(row)++img = Image.open(p55).convert('RGB')+arr = np.asarray(img).astype(int)+blue = (arr[:, :, 2] > 180) & (arr[:, :, 0] < 120) & (arr[:, :, 1] > 60) & (arr[:, :, 1] < 200)+green = (arr[:, :, 1] > 160) & (arr[:, :, 0] < 160) & (arr[:, :, 2] < 120)+PX = 15 * 300 / 25.4+def outline_pts(polys, s, ox, oy):+    pts = []+    for p in polys:+        for (x1, y1), (x2, y2) in zip(p, p[1:] + p[:1]):+            n = max(2, int(math.hypot(x2 - x1, y2 - y1) * s / 2))+            for i in range(n):+                t = i / n; pts.append((ox + (x1 + (x2 - x1) * t) * s, oy + (y1 + (y2 - y1) * t) * s))+    return np.array(pts)+def dilate(m, r):+    o = m.copy()+    for dx in range(-r, r + 1):+        for dy in range(-r, r + 1): o |= np.roll(np.roll(m, dx, 1), dy, 0)+    return o+cu_all = [p for n in ours for p in ours[n]["cu"]]+ys, xs = np.nonzero(blue); cx0, cy0 = xs.mean(), ys.mean()+dil = dilate(blue, 1); best = None+for s in (PX * f for f in (0.995, 1.0, 1.005)):+    P = outline_pts(cu_all, s, 0, 0)+    for ox in range(int(cx0 - 80), int(cx0 + 80), 2):+        for oy in range(int(cy0 - 80), int(cy0 + 80), 2):+            q = (P + (ox, oy)).astype(int)+            ok = (q[:, 0] >= 0) & (q[:, 0] < blue.shape[1]) & (q[:, 1] >= 0) & (q[:, 1] < blue.shape[0])+            sc = dil[q[ok, 1], q[ok, 0]].mean()+            if best is None or sc > best[0]: best = (sc, s, ox, oy)+sc, s, ox0, oy0 = best+for ox in range(ox0 - 2, ox0 + 3):+    for oy in range(oy0 - 2, oy0 + 3):+        q = outline_pts(cu_all, s, ox, oy).astype(int); v = dil[q[:, 1], q[:, 0]].mean()+        if v > sc: sc, ox0, oy0 = v, ox, oy+gdil = dilate(green, 2)+comb_mask = [p for n in ('7', '10', '22') for p in ours[n]["mask"]]+qc = outline_pts(comb_mask, s, ox0, oy0).astype(int)+mask_score = float(gdil[qc[:, 1], qc[:, 0]].mean())+ov = img.copy().convert('RGBA'); lay = Image.new('RGBA', ov.size, (0, 0, 0, 0)); d = ImageDraw.Draw(lay)+for n in ours:+    for p in ours[n]["cu"]:+        d.polygon([(ox0 + x * s, oy0 + y * s) for x, y in p], fill=(255, 60, 40, 70), outline=(220, 30, 20, 255))+    for p in ours[n]["mask"]:+        d.line([(ox0 + x * s, oy0 + y * s) for x, y in p + p[:1]], fill=(255, 0, 200, 255), width=2)+for x, y, dr, sz in vias_ours:+    d.ellipse([ox0 + (x - sz/2) * s, oy0 + (y - sz/2) * s, ox0 + (x + sz/2) * s, oy0 + (y + sz/2) * s], outline=(220, 30, 20, 255), width=2)+ov = Image.alpha_composite(ov, lay).convert('RGB')+crop = ov.crop((max(0, int(ox0 - 4.0 * s)), max(0, int(oy0 - 3.4 * s)), int(ox0 + 4.9 * s), int(oy0 + 3.6 * s)))+canvas = Image.new('RGB', (crop.width, crop.height + 100), 'white'); canvas.paste(crop, (0, 0))+dd = ImageDraw.Draw(canvas); font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 22)+dd.text((20, crop.height + 10), "TPS16850VMAR footprint (red fill = copper, magenta = solder mask opening) drawn at TI's 15X scale", fill='black', font=font)+dd.text((20, crop.height + 50), f"on TI SLVSHA1D p.55 land pattern. Copper outline on TI's blue strokes: {sc*100:.1f} %; comb mask openings on TI's green: {mask_score*100:.1f} %", fill='black', font=font)+canvas.save(out_png)+res = {"schema": "adom/footprint-check@1", "footprint": fp_path.rsplit('/', 1)[-1],+       "datasheet": "TI SLVSHA1D (Rev. D, July 2026) p.55 LAND PATTERN EXAMPLE and p.56 SOLDER PASTE EXAMPLE, VMA0023A 4230225/A 11/2023",+       "overlay": {"image": "docs/proof/tps16850vmar-footprint-check.png", "scale_px_per_mm": round(s, 3),+                   "printed_scale": "15X at 300 dpi = 177.165 px/mm",+                   "copper_outline_on_ti_strokes": round(sc, 4), "comb_mask_on_ti_green": round(mask_score, 4),+                   "note": "TI draws the metal under the solder mask of pads 7, 10 and 22 dashed, so part of those copper outlines falls in the gaps between dashes; every solid TI stroke is covered",+                   "method": "outline points of every copper polygon sampled every 2 px, scored against TI's blue strokes dilated by 1 px; offset searched +-80 px, scale +-0.5 %"},+       "ultra_librarian": {"source": "https://static.ultralibrarian.com/part-previews/footprints/6142033/detailed-VMA0023A-MFG.svg",+                           "note": "TI's VMA0023A footprint as published through Ultra Librarian (TI's CAD partner); preview SVG read as data; layers TOP / TOP_SOLDER_MASK / TOP_SOLDER_PASTE; differences come from corner treatment (UL chamfers 0.05 mm, this footprint rounds plain pads R0.05 as TI prints and keeps the custom shapes square)"},+       "rows": rows, "vias": {"page": vias_ours, "ul": sorted(ul.get("vias", []))},+       "kicad": "KiCad's standard library has no VMA0023A / LQFN-CLIP-23 footprint (gitlab.com/kicad/libraries/kicad-footprints Package_DFN_QFN.pretty, 780 files, listed 2026-10-21); no KiCad comparison is possible."}+json.dump(res, open(out_json, 'w'), indent=1)+print(f"overlay {sc:.3f} mask {mask_score:.3f} scale {s:.2f}; max xor cu {max(r['cu']['xor_mm2'] for r in rows):.3f} mm2; vias {len(vias_ours)}/{len(ul.get('vias', []))}")
provenance/tools/glb_batch.pyadded+89
@@ -0,0 +1,89 @@+#!/usr/bin/env python3+"""Lossless primitive batching for a step2glb chip GLB (uncompressed float accessors), plus an optional graft of+the reviewed Adom.LaserEtch mark from another GLB in the same frame.+  * every mesh node keeps its name (body, pins, Adom.LaserEtch); its primitives are joined per material+    (positions, normals and indices concatenated; geometry unchanged)+  * --etch-from etched.glb copies that file's Adom.LaserEtch mesh node (with its material) into this scene+usage: glb_batch.py in.glb out.glb [--etch-from etched.glb]+prints JSON stats: triangles, primitives, bytes, nodes, bounds (mm)"""+import sys, json, struct+import numpy as np+from pygltflib import GLTF2, Buffer, BufferView, Accessor, Mesh, Primitive, Node, Material, PbrMetallicRoughness, Attributes++CT = {5126: np.float32, 5125: np.uint32, 5123: np.uint16, 5121: np.uint8}+NC = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4}++def read(g, blob, ai):+    a = g.accessors[ai]; bv = g.bufferViews[a.bufferView]+    dt = CT[a.componentType]; n = NC[a.type]+    off = (bv.byteOffset or 0) + (a.byteOffset or 0)+    stride = bv.byteStride or np.dtype(dt).itemsize * n+    if stride == np.dtype(dt).itemsize * n:+        return np.frombuffer(blob, dt, a.count * n, off).reshape(a.count, n) if n > 1 else np.frombuffer(blob, dt, a.count, off)+    raw = np.frombuffer(blob, np.uint8, stride * (a.count - 1) + np.dtype(dt).itemsize * n, off)+    return np.stack([np.frombuffer(raw[i * stride:i * stride + np.dtype(dt).itemsize * n].tobytes(), dt) for i in range(a.count)])++def parts(path):+    g = GLTF2().load(path); blob = g.binary_blob()+    out = []+    for ni, n in enumerate(g.nodes):+        if n.mesh is None: continue+        by_mat = {}+        for p in g.meshes[n.mesh].primitives:+            P = read(g, blob, p.attributes.POSITION).astype(np.float32)+            N = read(g, blob, p.attributes.NORMAL).astype(np.float32) if p.attributes.NORMAL is not None else None+            I = read(g, blob, p.indices).astype(np.uint32) if p.indices is not None else np.arange(len(P), dtype=np.uint32)+            by_mat.setdefault(p.material, []).append((P, N, I))+        out.append((ni, n.name, by_mat))+    return g, out++def main():+    src, dst = sys.argv[1], sys.argv[2]+    etch = sys.argv[sys.argv.index("--etch-from") + 1] if "--etch-from" in sys.argv else None+    g, ps = parts(src)+    data = bytearray(); bviews = []; accs = []+    def add(arr, target, comp, typ, minmax=False):+        nonlocal data+        while len(data) % 4: data += b"\0"+        off = len(data); b = arr.tobytes(); data += b+        bviews.append(BufferView(buffer=0, byteOffset=off, byteLength=len(b), target=target))+        a = Accessor(bufferView=len(bviews) - 1, componentType=comp, count=len(arr), type=typ)+        if minmax: a.min = arr.min(0).tolist(); a.max = arr.max(0).tolist()+        accs.append(a); return len(accs) - 1+    def build_mesh(name, by_mat, matmap):+        prims = []+        for mi, lst in by_mat.items():+            Ps, Ns, Is, o = [], [], [], 0+            for P, N, I in lst:+                Ps.append(P); Ns.append(N if N is not None else np.zeros_like(P)); Is.append(I + o); o += len(P)+            P = np.concatenate(Ps); N = np.concatenate(Ns); I = np.concatenate(Is).astype(np.uint32)+            pa = add(P, 34962, 5126, "VEC3", True); na = add(N, 34962, 5126, "VEC3")+            ia = add(I, 34963, 5125, "SCALAR")+            prims.append(Primitive(attributes=Attributes(POSITION=pa, NORMAL=na), indices=ia, material=matmap(mi)))+        return Mesh(name=name, primitives=prims)+    meshes = []+    for ni, name, by_mat in ps:+        meshes.append(build_mesh(name, by_mat, lambda m: m)); g.nodes[ni].mesh = len(meshes) - 1+    if etch:+        ge, pe = parts(etch)+        hits = [x for x in pe if (x[1] or "").startswith("Adom.LaserEtch")]+        if not hits: sys.exit("ERROR: no Adom.LaserEtch node in " + etch)+        for ni, name, by_mat in hits:+            def mm(m):+                em = ge.materials[m]+                g.materials.append(Material(name=em.name, pbrMetallicRoughness=PbrMetallicRoughness(+                    baseColorFactor=list(em.pbrMetallicRoughness.baseColorFactor), metallicFactor=0.0, roughnessFactor=0.7)))+                return len(g.materials) - 1+            meshes.append(build_mesh(name, by_mat, mm))+            g.nodes.append(Node(name=name, mesh=len(meshes) - 1))+            g.nodes[g.scenes[g.scene or 0].nodes[0]].children.append(len(g.nodes) - 1)+    g.meshes = meshes; g.accessors = accs; g.bufferViews = bviews+    g.buffers = [Buffer(byteLength=len(data))]; g.set_binary_blob(bytes(data))+    g.save(dst)+    tris = sum(accs[p.indices].count // 3 for m in meshes for p in m.primitives)+    allp = np.concatenate([np.array(accs[p.attributes.POSITION].min + accs[p.attributes.POSITION].max).reshape(2, 3) for m in meshes for p in m.primitives])+    import os+    print(json.dumps({"out": dst, "triangles": tris, "primitives": sum(len(m.primitives) for m in meshes),+                      "bytes": os.path.getsize(dst), "nodes": [n.name for n in g.nodes if n.mesh is not None],+                      "boundsMm": [round(v * 1000, 4) for v in list(allp.min(0)) + list(allp.max(0))]}))+main()
provenance/tools/hero_png.pyadded+20
@@ -0,0 +1,20 @@+#!/usr/bin/env python3+"""Compose docs/hero.png (1600 x 1000, 16:10): the etched model's iso render beside the part's identity.+usage: hero_png.py iso.png out.png"""+import sys+from PIL import Image, ImageDraw, ImageFont+iso = Image.open(sys.argv[1]).convert("RGB")+W, H = 1600, 1000; bg = (13, 17, 23)+im = Image.new("RGB", (W, H), bg); im.paste(iso.resize((900, 900), Image.LANCZOS), (10, 50))+d = ImageDraw.Draw(im)+F = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; FB = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"+def t(y, s, size, col, bold=False):+    d.text((930, y), s, font=ImageFont.truetype(FB if bold else F, size), fill=col)+t(250, "TPS16850VMAR", 46, (230, 237, 243), True)+t(330, "Texas Instruments", 32, (139, 148, 158))+t(410, "9 V to 80 V, 20 A integrated eFuse", 32, (230, 237, 243))+for i, s in enumerate(["3.5 mOhm FET, 2 A to 20 A circuit breaker", "73 A fast trip, auto-retry", "Current and temperature monitors",+                       "LQFN-CLIP-23 (VMA), 6.0 x 5.0 mm"]):+    t(480 + i * 52, s, 28, (0, 230, 220) if i == 0 else (200, 208, 216))+d.rectangle([930, 720, 1070, 726], fill=(0, 230, 220))+im.save(sys.argv[2]); print(im.size)
provenance/tools/hero_post_vias.pyadded+69
@@ -0,0 +1,69 @@+#!/usr/bin/env python3+"""Add the heatsink vias to the hero GLB as their own layer: TI's 12 vias of the land pattern (SLVSHA1D p.55,+0.2 mm drill) drawn as copper barrels through a pretend 1.6 mm board, 65 % transparent (alpha 0.35, BLEND,+double-sided, unlit), group node "Adom.HeatsinkVias" declared as layer "vias" ("Heatsink vias (1.6 mm board)").+Positions are read from the footprint's plated thru_hole pads; frame as hero_glb.py: glTF x = KiCad x,+y = -KiCad y, Z up, metres. Runs after hero_glb.py; idempotent (an existing Adom.HeatsinkVias node is replaced).+usage: hero_post_vias.py hero.glb footprint.kicad_mod"""+import re, sys, math+import numpy as np+from pygltflib import GLTF2, Accessor, BufferView, Material, Mesh, Node, Primitive, Attributes, PbrMetallicRoughness++glb, fp = sys.argv[1:3]+txt = open(fp).read()+vias = [(float(x), float(y), float(d)) for x, y, d in+        re.findall(r'\(pad "24" thru_hole circle \(at (-?[\d.]+) (-?[\d.]+)\) \(size [\d.]+ [\d.]+\) \(drill ([\d.]+)\)', txt)]+assert vias, "no plated vias found"+g = GLTF2().load(glb)+if any(n.name == "Adom.HeatsinkVias" for n in g.nodes): sys.exit("hero already has Adom.HeatsinkVias")+N, BOARD = 20, 1.6e-3+pos, idx = [], []+for x, y, d in vias:+    r = d / 2 * 1e-3; cx, cy = x * 1e-3, -y * 1e-3; b = len(pos)+    for i in range(N):+        a = 2 * math.pi * i / N+        pos += [(cx + r * math.cos(a), cy + r * math.sin(a), -1e-5), (cx + r * math.cos(a), cy + r * math.sin(a), -BOARD)]+    for i in range(N):+        j = (i + 1) % N+        idx += [b + 2 * i, b + 2 * i + 1, b + 2 * j, b + 2 * j, b + 2 * i + 1, b + 2 * j + 1]+P = np.array(pos, np.float32); I = np.array(idx, np.uint32)+blob = g.binary_blob() or b""+def add(data, target):+    global blob+    pad = (-len(blob)) % 4; blob += b"\0" * pad+    off = len(blob); blob += data.tobytes()+    g.bufferViews.append(BufferView(buffer=0, byteOffset=off, byteLength=len(data.tobytes()), target=target))+    return len(g.bufferViews) - 1+bp = add(P, 34962); bi = add(I, 34963)+g.accessors.append(Accessor(bufferView=bp, componentType=5126, count=len(P), type="VEC3",+                            min=P.min(0).tolist(), max=P.max(0).tolist()))+ap = len(g.accessors) - 1+g.accessors.append(Accessor(bufferView=bi, componentType=5125, count=len(I), type="SCALAR"))+ai = len(g.accessors) - 1+g.materials.append(Material(name="Heatsink vias - copper barrels - 65 percent transparent",+                            pbrMetallicRoughness=PbrMetallicRoughness(baseColorFactor=[0.85, 0.5, 0.3, 0.35], metallicFactor=0.0, roughnessFactor=0.6),+                            alphaMode="BLEND", doubleSided=True, extensions={"KHR_materials_unlit": {}}))+g.meshes.append(Mesh(name="Adom.HeatsinkVias", primitives=[Primitive(attributes=Attributes(POSITION=ap), indices=ai, material=len(g.materials) - 1)]))+g.nodes.append(Node(name="Adom.HeatsinkVias", mesh=len(g.meshes) - 1,+                    extras={"adomLayer": {"key": "vias", "label": "Heatsink vias (1.6 mm board)", "group": "Board"},+                            "tooltip": f"{len(vias)} heatsink vias, 0.2 mm drill, under the exposed pad (IN)\nTI SLVSHA1D p.55 land pattern"}))+g.scenes[g.scene or 0].nodes.append(len(g.nodes) - 1)+if "KHR_materials_unlit" not in (g.extensionsUsed or []): g.extensionsUsed = (g.extensionsUsed or []) + ["KHR_materials_unlit"]+g.buffers[0].byteLength = len(blob)+g.set_binary_blob(blob)+ex = g.asset.extras or {}+if "adomHero" in ex:+    ex["adomHero"].setdefault("layers", {})["heatsink_vias"] = {"node": "Adom.HeatsinkVias", "layer_key": "vias", "rgba": [0.85, 0.5, 0.3, 0.35],+        "vias": len(vias), "drill_mm": vias[0][2], "board_mm": 1.6, "source": "footprint plated thru_hole pads 24 (TI SLVSHA1D p.55)",+        "added_by": "provenance/tools/hero_post_vias.py"}+g.save(glb)+# pygltflib 1.16 drops asset.extras on save: write it back into the JSON chunk+import json, struct+b = open(glb, "rb").read(); L = struct.unpack("<I", b[12:16])[0]+j = json.loads(b[20:20 + L]); j["asset"]["extras"] = ex+js = json.dumps(j, separators=(",", ":")).encode(); js += b" " * ((-len(js)) % 4)+rest = b[20 + L:]+out = b[:12] + struct.pack("<I", len(js)) + b"JSON" + js + rest+out = out[:8] + struct.pack("<I", len(out)) + out[12:]+open(glb, "wb").write(out)+print(f"OK {glb}: {len(vias)} via barrels in Adom.HeatsinkVias")
provenance/tools/hub_fix.pyadded+16
@@ -0,0 +1,16 @@+#!/usr/bin/env python3+"""adom-lbr 2.47.5 hub fix before the Altium export. import-kicad does not read pad layers, so the exposed pad 24+(copper + mask only in KiCad; TI's paste is six 0.98 x 1.04 mm windows, SLVSHA1D p.56) would get a full-size paste+opening in the PcbLib, and the hub's footprint polygons on a non-copper Altium layer are not written by+export-altium/assemble-altium (checked: the PcbLib bytes are identical with and without them). So pad 24 gets a+paste expansion of -0.174 mm: one aperture of 3.052 x 2.002 mm = 6.110 mm2, the same area as TI's six windows+(6.115 mm2, 76.5 % of the pad). The KiCad footprint and the Fusion library carry TI's six windows.+usage: hub_fix.py hub.json"""+import json, sys+hub = sys.argv[1]+d = json.load(open(hub))+ep = [p for p in d["footprint"]["pads"] if p["number"] == "24" and not p.get("drill_mm") and p["w_mm"] > 3]+assert len(ep) == 1+ep[0]["paste_margin_mm"] = -0.174+json.dump(d, open(hub, "w"), indent=1)+print("OK", hub, "pad 24 paste expansion -0.174 mm (area of TI's six windows)")
provenance/tools/lbr_fix.pyadded+33
@@ -0,0 +1,33 @@+#!/usr/bin/env python3+"""Hand fixes to the EAGLE/Fusion .lbr written by adom-lbr 2.47.5 (generate) for TPS16850VMAR:+  1. NC pins 11, 17, 21 come out direction="io"; set direction="nc" (KiCad type no_connect).+  2. The fab outline (KiCad fp_poly with fill none, F.Fab) comes out as a filled <polygon> on tDocu (51);+     replace it with wires so it stays an outline.+  3. Exposed pad 24 has cream="no" (its KiCad pad has no paste); add TI's six 0.98 x 1.04 mm stencil windows+     (SLVSHA1D p.56) as rectangles on tCream (31). EAGLE y = -KiCad y.+  4. Pin names: make sure every <pin> shows its name and number (visible="both"), the EAGLE default made explicit.+Copper is generated from tps16850vmar-lbr-input.kicad_mod (custom pads as exact rectangle unions), because+adom-lbr does not carry KiCad custom-pad primitives or paste-only pads.+usage: lbr_fix.py file.lbr fp-extra.json"""+import json, re, sys+p, extra = sys.argv[1], json.load(open(sys.argv[2]))+s = open(p).read()+n_nc = 0+def nc(m):+    global n_nc+    t = m.group(0)+    if re.search(r'name="NC(@\d+)?"', t):+        n_nc += 1; t = t.replace('direction="io"', 'direction="nc"')+    return t+s = re.sub(r'<pin [^>]*/>', nc, s)+s = re.sub(r'<pin ((?![^>]*visible=)[^>]*)/>', r'<pin \1 visible="both"/>', s)+fab = [(-2.5, -2.5), (3.0, -2.5), (3.0, 2.5), (-3.0, 2.5), (-3.0, -2.0)]+wires = "".join(f'  <wire x1="{a[0]:.4f}" y1="{-a[1]:.4f}" x2="{b[0]:.4f}" y2="{-b[1]:.4f}" width="0.1000" layer="51"/>\n'+                for a, b in zip(fab, fab[1:] + fab[:1]))+s, k = re.subn(r'  <polygon width="0.1000" layer="51">.*?</polygon>\n', wires, s, flags=re.S)+cream = "".join(f'  <rectangle x1="{x - w/2:.4f}" y1="{-y - h/2:.4f}" x2="{x + w/2:.4f}" y2="{-y + h/2:.4f}" layer="31"/>\n'+                for x, y, w, h in extra["ep_paste"])+i = s.find("</package>"); assert s.count("</package>") == 1+s = s[:i] + cream + s[i:]+open(p, "w").write(s)+print(f"OK {p}: {n_nc} NC pins -> nc, fab polygon replaced: {k}, 6 tCream windows, pins visible=both")
provenance/tools/materials.pyadded+32
@@ -0,0 +1,32 @@+#!/usr/bin/env python3+"""Physical materials for a chip GLB by part (node name from the STEP assembly). step2glb writes base colours only,+so glTF defaults (metallic 1, roughness 1) render everything as rough metal. Sets:+  body -> "Adom.Body (epoxy)" metallic 0, roughness 0.55 (colour kept)+  pins -> "Adom.Terminals (NiPdAu)" metallic 1, roughness 0.35 (colour kept)+  pin_ends -> "Adom.Terminals (sawn copper ends)" metallic 1, roughness 0.4 (colour kept)+  Adom.LaserEtch -> "Adom.LaserEtch (virtual MPN)" metallic 0, roughness 0.7 (colour kept)+usage: materials.py in.glb [out.glb]"""+import sys+from pygltflib import GLTF2, PbrMetallicRoughness+TIN = [0.72, 0.72, 0.70, 1.0]+SPEC = {"body": ("Adom.Body (epoxy)", 0.0, 0.55, None), "pins": ("Adom.Terminals (NiPdAu)", 1.0, 0.35, None),+        "pin_ends": ("Adom.Terminals (sawn copper ends)", 1.0, 0.4, None),+        "Adom.LaserEtch": ("Adom.LaserEtch (virtual MPN)", 0.0, 0.7, None)}+src = sys.argv[1]; out = sys.argv[2] if len(sys.argv) > 2 else src+g = GLTF2().load(src); seen = {}+for n in g.nodes:+    if n.mesh is None: continue+    key = next((k for k in SPEC if (n.name or "").startswith(k)), None)+    if key is None: continue+    for p in g.meshes[n.mesh].primitives:+        if p.material is None: continue+        if seen.get(p.material, key) != key: sys.exit(f"ERROR: material {p.material} shared by {seen[p.material]} and {key}")+        seen[p.material] = key+        name, metal, rough, col = SPEC[key]; m = g.materials[p.material]+        pbr = m.pbrMetallicRoughness or PbrMetallicRoughness()+        pbr.metallicFactor, pbr.roughnessFactor = metal, rough+        if col: pbr.baseColorFactor = col+        m.pbrMetallicRoughness = pbr; m.name = name+missing = [k for k in ("body", "pins") if k not in seen.values()]+if missing: sys.exit(f"ERROR: no {missing} part in {src}")+g.save(out); print("OK", out, sorted(set(seen.values())))
provenance/tools/ortho.pyadded+100
@@ -0,0 +1,100 @@+"""Orthographic renderer for small component STEPs (face colours kept); adapted from the passives tools.++render(tris, view, ppmm) -> PIL RGBA image, model origin at the image centre.+views: top (look down -Z, +X right, +Y up), bottom (look up +Z, +X right, +Y down, i.e. the part turned over about+X, as TI draws its bottom views), front (look +Y at the -Y wall, +X right, +Z up).+"""+import numpy as np+from PIL import Image, ImageDraw+from OCP.STEPCAFControl import STEPCAFControl_Reader+from OCP.TDocStd import TDocStd_Document+from OCP.TCollection import TCollection_ExtendedString+from OCP.XCAFDoc import XCAFDoc_DocumentTool, XCAFDoc_ColorType+from OCP.TDF import TDF_LabelSequence+from OCP.TopExp import TopExp_Explorer+from OCP.TopAbs import TopAbs_FACE, TopAbs_REVERSED+from OCP.TopoDS import TopoDS+from OCP.Quantity import Quantity_Color+from OCP.BRepMesh import BRepMesh_IncrementalMesh+from OCP.BRep import BRep_Tool+from OCP.TopLoc import TopLoc_Location+++def load_tris(path, defl=0.002):+    doc = TDocStd_Document(TCollection_ExtendedString("x"))+    r = STEPCAFControl_Reader(); r.SetColorMode(True); r.SetNameMode(True)+    r.ReadFile(path); r.Transfer(doc)+    st = XCAFDoc_DocumentTool.ShapeTool_s(doc.Main())+    ct = XCAFDoc_DocumentTool.ColorTool_s(doc.Main())+    labs = TDF_LabelSequence(); st.GetFreeShapes(labs)+    out, leaves = [], []+    def walk(lab, loc, pcol):+        c = Quantity_Color(); col = pcol+        for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+            if ct.GetColor_s(lab, t, c):+                col = (c.Red(), c.Green(), c.Blue()); break+        if st.IsReference_s(lab):+            ref = type(lab)(); st.GetReferredShape_s(lab, ref)+            walk(ref, loc.Multiplied(st.GetLocation_s(lab)), col); return+        kids = TDF_LabelSequence(); st.GetComponents_s(lab, kids)+        if kids.Length() > 0:+            for i in range(1, kids.Length() + 1): walk(kids.Value(i), loc, col)+            return+        leaves.append((st.GetShape_s(lab).Moved(loc), col))+    for li in range(1, labs.Length() + 1):+        walk(labs.Value(li), TopLoc_Location(), None)+    for shp, pcol in leaves:+        BRepMesh_IncrementalMesh(shp, defl, False, 0.2, True)+        e = TopExp_Explorer(shp, TopAbs_FACE)+        while e.More():+            f = TopoDS.Face_s(e.Current())+            c = Quantity_Color(); col = None+            for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+                if ct.GetColor(f, t, c):+                    col = (c.Red(), c.Green(), c.Blue()); break+            col = col or pcol or (0.6, 0.6, 0.6)+            loc = TopLoc_Location()+            tri = BRep_Tool.Triangulation_s(f, loc)+            if tri is not None:+                trsf = loc.Transformation()+                pts = np.array([(lambda p: (p.X(), p.Y(), p.Z()))(tri.Node(i).Transformed(trsf)) for i in range(1, tri.NbNodes() + 1)])+                rev = f.Orientation() == TopAbs_REVERSED+                for i in range(1, tri.NbTriangles() + 1):+                    a, b, cc = tri.Triangle(i).Get()+                    if rev: b, cc = cc, b+                    out.append((pts[[a - 1, b - 1, cc - 1]], col))+            e.Next()+    return out+++VIEWS = {+    "top": ((1, 0, 0), (0, 1, 0), (0, 0, 1)),+    "bottom": ((1, 0, 0), (0, -1, 0), (0, 0, -1)),+    "front": ((1, 0, 0), (0, 0, 1), (0, -1, 0)),+    "back": ((-1, 0, 0), (0, 0, 1), (0, 1, 0)),+}+++def render(tris, view, ppmm, size=None, shade=True, ss=3):+    R, U, V = [np.array(v, float) for v in VIEWS[view]]+    allp = np.concatenate([t[0] for t in tris])+    ext = max(np.abs(allp @ R).max(), np.abs(allp @ U).max())+    if size is None:+        size = (int(2 * ext * ppmm + 40), int(2 * ext * ppmm + 40))+    W, H = size[0] * ss, size[1] * ss+    img = Image.new("RGBA", (W, H), (0, 0, 0, 0)); d = ImageDraw.Draw(img)+    items = []+    light = np.array([0.3, 0.4, 0.85]); light /= np.linalg.norm(light)+    for p, col in tris:+        n = np.cross(p[1] - p[0], p[2] - p[0]); nn = np.linalg.norm(n)+        if nn == 0: continue+        n /= nn+        if n @ V <= 1e-6: continue+        lv = 0.55 + 0.45 * abs(n @ (R * light[0] + U * light[1] + V * light[2])) if shade else 1.0+        rgb = tuple(int(255 * min(1, c * lv)) for c in col)+        xy = [(W / 2 + (q @ R) * ppmm * ss, H / 2 - (q @ U) * ppmm * ss) for q in p]+        items.append(((p @ V).mean(), xy, rgb))+    items.sort(key=lambda x: x[0])+    for _, xy, rgb in items:+        d.polygon(xy, fill=rgb + (255,), outline=rgb + (255,))+    return img.resize(size, Image.LANCZOS)
provenance/tools/overlay_vma.pyadded+91
@@ -0,0 +1,91 @@+#!/usr/bin/env python3+"""Prove the datasheet-built VMA0023A model against TI's PACKAGE OUTLINE drawing (SLVSHA1D p.54, 300 dpi render).++The model STEP is rendered orthographically (ortho.py, face colours kept) in the drawing's projections:+  bottom view: TI draws it turned over about the X axis (ortho "bottom": +X right, +Y down);+  side view:   the drawing under the top view (ortho "front" or "back", whichever fits).+Scale and offset of the bottom view are fitted by maximising the share of the model's terminal and body edge+pixels that land on the drawing's blue strokes (scale searched 100..140 px/mm; it lands on TI's 10X =+118.1 px/mm); the side view uses the same scale with only its offset searched.+Output: <prefix>-bottom.png, <prefix>-side.png (drawing, model at 45 % opacity, model edges in red), <prefix>.json.+usage: overlay_vma.py model.step p54-300dpi.png out_prefix+"""+import sys, json, os+import numpy as np+from PIL import Image, ImageDraw, ImageFont, ImageFilter+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+import ortho++step, p54, pre = sys.argv[1:4]+tris = ortho.load_tris(step)+page = Image.open(p54).convert("RGB")+arr = np.asarray(page).astype(int)+blue = (arr[:, :, 2] > 170) & (arr[:, :, 0] < 140) & (arr[:, :, 1] > 60) & (arr[:, :, 1] < 210)+dil = np.array(Image.fromarray(blue).filter(ImageFilter.MaxFilter(3)))+REF = 60.0++def edges(img):+    a = np.asarray(img)+    alpha = a[:, :, 3] > 128+    dark = (a[:, :, :3].sum(2) < 200) & alpha+    metal = alpha & ~dark+    e = np.zeros_like(alpha)+    for m in (alpha, metal):+        e |= m & ~np.array(Image.fromarray(m).filter(ImageFilter.MinFilter(3)))+    ys, xs = np.nonzero(e)+    return np.stack([xs - a.shape[1] / 2, ys - a.shape[0] / 2], 1)++def fit(view, region, scales=None):+    P = edges(ortho.render(tris, view, REF, shade=False))+    P = P[np.linspace(0, len(P) - 1, min(len(P), 2500)).astype(int)]+    x0, y0, x1, y1 = region+    best = (-1,)+    for s in (scales if scales is not None else np.arange(100, 141, 2.0)):+        q0 = P * s / REF+        for ox in range(x0, x1, 5):+            for oy in range(y0, y1, 5):+                q = (q0 + (ox, oy)).astype(int)+                ok = (q[:, 0] >= 0) & (q[:, 0] < blue.shape[1]) & (q[:, 1] >= 0) & (q[:, 1] < blue.shape[0])+                sc = dil[q[ok, 1], q[ok, 0]].mean() * ok.mean()+                if sc > best[0]: best = (sc, s, ox, oy)+    sc, s, ox, oy = best+    for s2 in ([s] if scales is not None else np.arange(s - 2, s + 2.01, 0.25)):+        for ox2 in range(ox - 5, ox + 6):+            for oy2 in range(oy - 5, oy + 6):+                q = (P * s2 / REF + (ox2, oy2)).astype(int)+                v = dil[q[:, 1], q[:, 0]].mean()+                if v > sc: sc, s, ox, oy = v, s2, ox2, oy2+    return sc, s, ox, oy++def draw(view, sc, s, ox, oy, crop, title, out):+    img = ortho.render(tris, view, s)+    lay = Image.new("RGBA", page.size, (0, 0, 0, 0))+    a = np.asarray(img).copy(); a[:, :, 3] = (a[:, :, 3] * 0.45).astype(np.uint8)+    lay.alpha_composite(Image.fromarray(a), (int(ox - img.width / 2), int(oy - img.height / 2)))+    P = edges(ortho.render(tris, view, s, shade=False)) + (ox, oy)+    d = ImageDraw.Draw(lay)+    for x, y in P.astype(int): d.point((x, y), fill=(230, 20, 20, 255))+    ov = Image.alpha_composite(page.convert("RGBA"), lay).convert("RGB").crop(crop)+    c = Image.new("RGB", (ov.width, ov.height + 80), "white"); c.paste(ov, (0, 0))+    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 22)+    dd = ImageDraw.Draw(c)+    dd.text((16, ov.height + 8), title, fill="black", font=font)+    dd.text((16, ov.height + 42), f"fitted scale {s:.1f} px/mm at 300 dpi (TI 10X = 118.1); {sc*100:.1f} % of the model's edge pixels lie on TI's blue strokes", fill="black", font=font)+    c.save(out)++res = {}+sc, s, ox, oy = fit("bottom", (1110, 2090, 1280, 2270))+res["bottom"] = dict(score=round(float(sc), 4), scale=round(float(s), 2), origin=[ox, oy], image=os.path.basename(pre) + "-bottom.png")+draw("bottom", sc, s, ox, oy, (int(ox - 3.9 * s), int(oy - 3.2 * s), int(ox + 3.9 * s), int(oy + 3.2 * s)),+     "TPS16850VMAR model (bottom, red edges) over TI SLVSHA1D p.54 VMA0023A bottom view", pre + "-bottom.png")+best = None+for view in ("front", "back"):+    r = fit(view, (1110, 1380, 1280, 1490), scales=[s])+    if best is None or r[0] > best[1][0]: best = (view, r)+view, (sc2, s2, ox2, oy2) = best+res["side"] = dict(view=view, score=round(float(sc2), 4), scale=round(float(s2), 2), origin=[ox2, oy2], image=os.path.basename(pre) + "-side.png",+                   note="TI draws the side view at A max (1.5 mm); the model is at the nominal 1.4 mm, so its top edge sits 0.1 mm below TI's")+draw(view, sc2, s2, ox2, oy2, (int(ox2 - 4.2 * s2), int(oy2 - 1.6 * s2), int(ox2 + 4.6 * s2), int(oy2 + 1.6 * s2)),+     f"TPS16850VMAR model ({view} side) over TI SLVSHA1D p.54 VMA0023A side view", pre + "-side.png")+json.dump(res, open(pre + ".json", "w"), indent=1)+print(json.dumps(res))
provenance/tools/page_json.pyadded+61
@@ -0,0 +1,61 @@+#!/usr/bin/env python3+"""Write page.json for adom/tps16850vmar from the symbol create JSON and the checked values.+usage: page_json.py symbol-create.json page_dir"""+import json, sys, hashlib, os+spec, P = json.load(open(sys.argv[1])), sys.argv[2]+S, MPN, D = "tps16850vmar", "TPS16850VMAR", "2026-10-21"+sha = lambda f: hashlib.sha256(open(os.path.join(P, f), "rb").read()).hexdigest()+pins = sorted(({k: p[k] for k in ("number", "name", "type", "group", "description")} for p in spec["pins"]), key=lambda p: int(p["number"]))+for p in pins:+    if p["number"] == "24": p["note"] = "exposed thermal pad (PowerPAD), electrically IN"+page = {+ "slug": S, "version": "0.1.0", "type": "hardware", "kind": "component", "org": "adom",+ "title": "TPS16850VMAR - 9 V to 80 V, 20 A eFuse",+ "brief": ("Texas Instruments TPS16850VMAR: 9 V to 80 V, 20 A stackable integrated hot-swap eFuse with a 3.5 mOhm FET, "+           "fast current monitor and auto-retry fault response, LQFN-CLIP-23 (VMA, 6.0 x 5.0 mm). KiCad symbol and footprint, "+           "Fusion and Altium libraries, datasheet-built 3D model and datasheet."),+ "description": ("Texas Instruments TPS16850VMAR: integrated hot-swap eFuse for 9 V to 80 V rails, 3.5 mOhm (typ) FET, 2 A to 20 A "+                 "adjustable circuit breaker, 73 A fixed fast trip, auto-retry, parallel operation with current sharing, analog "+                 "current and temperature monitors, LQFN-CLIP-23 (VMA0023A, 6.0 x 5.0 x 1.5 mm max)."),+ "license": "CC-BY-4.0",+ "tags": ["component", "ic", "power", "efuse", "hot-swap", "circuit-protection", "texas-instruments", "lqfn", "48v"],+ "discovery_triggers": ["TPS16850VMAR", "TPS16850", "TPS1685", "TPS1685x", "80 V eFuse", "20 A eFuse", "48 V hot-swap eFuse", "VMA0023A"],+ "hero": {"type": "image", "path": "docs/hero.png"},+ "visibility": {"public": True},+ "component": {+  "mpn": MPN, "manufacturer": "Texas Instruments",+  "package": "LQFN-CLIP-23 (TI VMA0023A, 6.0 x 5.0 mm, 1.5 mm max height)",+  "pin_count": 23, "category": "Power management", "subcategory": "Hot-swap controller / eFuse", "lifecycle": "Active",+  "datasheet": "https://www.ti.com/lit/ds/symlink/tps1685.pdf",+  "product_page": "https://www.ti.com/product/TPS1685/part-details/TPS16850VMAR",+  "body_size": {"x_mm": 6.0, "y_mm": 5.0, "z_mm": 1.5, "pitch_mm": 0.5},+  "parts": {"symbol": f"{S}.kicad_sym", "footprint": f"{S}.kicad_mod",+            "model_3d": f"{S}-hero.glb", "model_3d_plain": f"{S}-etched.glb",+            "model_3d_step": f"{S}-etched.step", "model_3d_step_plain": f"{S}.step",+            "step": f"{S}-etched.step", "lbr": f"{S}.lbr", "datasheet": f"docs/{S}-datasheet.pdf"},+  "viewers": {"symbol": "viewers/symbol.html", "footprint": "viewers/footprint.html"},+  "viewer_3d": {"ground": False, "animate": False, "shadows": False, "tooltips": "authored"},+  "models": "models.json", "lod": "lod/manifest.json", "verification": "verification.json",+  "heatsink_vias": f"artwork/{MPN}-heatsink-via.json",+  "marking": {"lines": ["TPS16850", "VMAR"], "virtual": True,+              "note": "Virtual identification mark (the orderable MPN), not TI's real marking. TI marks this part TPS16850 (SLVSHA1D p.50, Package Option Addendum).",+              "surface": "top", "colour": "light on dark grey mould", "gate": "PASS", "provenance": "provenance/3d-model.json"},+  "pins": pins,+  "distributor_links": {+   "mouser": {"part": "595-TPS16850VMAR", "url": "https://www.mouser.com/en/ProductDetail/Texas-Instruments/TPS16850VMAR?qs=3GbUB62Nf7feTcUOtfOsAg%3D%3D", "stock": 13048, "checked": D},+   "digikey": {"part": "296-TPS16850VMARTR-ND", "url": "https://www.digikey.com/en/products/detail/texas-instruments/TPS16850VMAR/29178296", "stock": 0, "checked": D},+   "lcsc": False,+   "lcsc_note": f"{D}: no LCSC/JLCPCB listing for TPS16850VMAR (adom-parts-search). JLCPCB lists the latch-off sibling TPS16851VMAR as C48705346, a different part."},+  "provenance": {+   "datasheet": {"doc": "TI SLVSHA1D (Rev. D, September 2024, revised July 2026), TPS1685x", "file": f"docs/{S}-datasheet.pdf",+                 "sha256": sha(f"docs/{S}-datasheet.pdf"), "pages": 57, "url": "https://www.ti.com/lit/ds/symlink/tps1685.pdf"},+   "model_3d": "provenance/3d-model.json", "footprint": "provenance/footprint-check.json"}},+ "dependencies": {},+ "eda_assets": {+  "kicad": {"symbol": f"{S}.kicad_sym", "footprint": f"{S}.kicad_mod", "model": f"{S}-etched.step", "provenance": "authored"},+  "fusion": {"lbr": f"{S}.lbr", "provenance": "authored"},+  "altium": {"schlib": f"altium/{MPN}.SchLib", "pcblib": f"altium/{MPN}.PcbLib", "provenance": "authored"}},+ "source": {"tool": "texas-instruments", "url": "https://www.ti.com/product/TPS1685/part-details/TPS16850VMAR"},+}+json.dump(page, open(os.path.join(P, "page.json"), "w"), indent=1)+print("OK page.json", len(pins), "pins")
provenance/tools/page_meta.pyadded+176
@@ -0,0 +1,176 @@+#!/usr/bin/env python3+"""Write models.json, lod/manifest.json, provenance/3d-model.json, verification.json and LICENSE for+adom/tps16850vmar from the files on disk (hashes, sizes, triangle counts) and the checks' JSON outputs.+Run from the page root. Adapted from adom/mcp2562fd-e-sn and adom/tmcs1123b1aqdvgr.+usage: page_meta.py altium-roundtrip.adom-lbr.json"""+import json, hashlib, os, re, sys+from pygltflib import GLTF2+D = "2026-10-21"; S = "tps16850vmar"; MPN = "TPS16850VMAR"+rt = json.load(open(sys.argv[1]))+def sha(p): return hashlib.sha256(open(p, "rb").read()).hexdigest()+def blob(p):+    b = open(p, "rb").read(); return hashlib.sha1(b"blob %d\0" % len(b) + b).hexdigest()+def glbstats(p):+    g = GLTF2().load(p)+    return dict(triangles=sum(g.accessors[pr.indices].count // 3 for m in g.meshes for pr in m.primitives),+                primitives=sum(len(m.primitives) for m in g.meshes), nodes=[n.name for n in g.nodes if n.mesh is not None])+BY = {"name": "Claude (AI), automated checks, not yet reviewed by a person", "handle": "claude"}+mark = {"text": "TPS16850 / VMAR (two lines)", "surface": "top, along the 6.0 mm axis, upright with pin 1 on the left",+        "colour": "light grey on dark grey mould", "virtual": True,+        "note": "virtual identification mark (the orderable MPN) by adom-chip-laser; TI's real marking is TPS16850 (SLVSHA1D p.50)"}+def rec(path, **k):+    r = dict(path=path, format=path.rsplit(".", 1)[1], sha256=sha(path), git_blob=blob(path), bytes=os.path.getsize(path)); r.update(k); return r+DS = "TI SLVSHA1D p.54 (VMA0023A, 4230225/A 11/2023)"+models = [+ rec(f"{S}-etched.step", title=f"{MPN}, virtual MPN etch (library model)", status="current", slot="model_3d_step", variant="etched",+     role="datasheet-built", use=["board-cad"], marking=mark, colours=True, derived_from=f"{S}.step",+     unique="The board-CAD model: built from TI's VMA0023A drawing with the MPN etched on top in the Adom.LaserEtch group; bound by the KiCad footprint and embedded in the Altium PcbLib",+     source="provenance/tools/build_vma23.py + adom-chip-laser 0.2.0 (service-occt flat etch, placed by adom-aiflow-etch)",+     thumb=f"docs/models/{S}-etched-glb-top.png", thumb_bottom=f"docs/models/{S}-etched-bottom.png"),+ rec(f"{S}.step", title=f"{MPN}, unmarked", status="current", slot="model_3d_step_plain", variant="plain", role="datasheet-built",+     use=["board-cad", "archive"], marking=None, colours=True, derived_from=DS,+     unique="The same package without any marking", source="provenance/tools/build_vma23.py (CadQuery)",+     thumb=f"docs/models/{S}-glb-top.png", thumb_bottom=f"docs/models/{S}-bottom.png"),+ rec(f"{S}-hero.glb", title=f"{MPN}, annotated hero (page viewer)", status="current", slot="model_3d", variant="hero", role="derived",+     use=["wiki-hero"], marking=mark, colours=True, derived_from=f"{S}-etched.glb + {S}.kicad_mod",+     unique="The page's 3D view: the etched chip plus teal dashed pad outlines, silkscreen with pin 1, pin names and the heatsink vias as switchable layers; presentation only, never for board use",+     source="adom/component-hero 0.1.2 scripts/hero_glb.py (adom-hero 1.4) + provenance/tools/hero_post_vias.py", thumb="docs/proof/tps16850vmar-hero-preview.png"),+ rec(f"{S}-etched.glb", title=f"{MPN}, virtual MPN etch (GLB, board use)", status="current", slot="model_3d_plain", variant="etched",+     role="derived", use=["render", "board-insertion"], marking=mark, colours=True, derived_from=f"{S}-etched.step",+     unique="Web copy of the etched STEP, clean (no pad outlines, labels or silkscreen), primitives batched per part, NiPdAu terminals with sawn copper ends and a matte mould",+     source="step2glb convert --compress none + provenance/tools/glb_batch.py + materials.py", thumb=f"docs/models/{S}-etched-glb-top.png"),+ rec(f"{S}.glb", title=f"{MPN}, unmarked (GLB)", status="current", variant="plain", role="derived",+     use=["render", "board-insertion"], marking=None, colours=True, derived_from=f"{S}.step",+     unique="Web copy of the unmarked STEP", source="step2glb convert --compress none + glb_batch.py + materials.py", thumb=f"docs/models/{S}-glb-top.png"),+]+LV = {"high": ("the etched GLB itself", f"{S}-etched.step", "Identical to the etched GLB"),+      "medium": ("build_vma23.py --detail low (square inner terminal ends), Adom.LaserEtch mesh grafted unchanged from high", "provenance/tools/build_vma23.py --detail low", "Square inner terminal ends, etch grafted from the high level"),+      "low": ("build_vma23.py --detail low, no marking (unreadable at this size)", "provenance/tools/build_vma23.py --detail low", "Square inner terminal ends, no etch"),+      "super-low": ("build_vma23.py --detail superlow: square ends, one terminal part (no copper end slices), every terminal kept, no marking", "provenance/tools/build_vma23.py --detail superlow", "One terminal material, no etch")}+levels = []+for l in ["high", "medium", "low", "super-low"]:+    p = f"lod/{S}-{l}.glb"; st = glbstats(p)+    models.append(rec(p, title=f"{MPN}, {l} detail (board LOD)", status="current", variant="lod", role="derived", use=["board-insertion"],+                      marking=mark if l in ("high", "medium") else None, colours=True, derived_from=LV[l][1], unique=LV[l][2],+                      source="build_vma23.py detail level + step2glb + glb_batch.py + materials.py", thumb=f"lod/{S}-{l}.png"))+    levels.append(dict(level=l, path=p, sha256=sha(p), sizeBytes=os.path.getsize(p), triangles=st["triangles"], primitives=st["primitives"],+                       nodes=st["nodes"], boundsMm=[-3.0, -2.5, 0.0, 3.0, 2.5, 1.405 if l in ("high", "medium") else 1.4],+                       markingIncluded=l in ("high", "medium"), helperNodes=[], extensions=[], derivation=LV[l][0],+                       review="candidate: inspected as cached images (depth-buffered render); not qualified in a streaming LOD viewer",+                       preview=dict(path=f"lod/{S}-{l}.png", sha256=sha(f"lod/{S}-{l}.png"), view="iso (front-left, from above), same camera on every level")))+json.dump({"schema": "adom/models@1", "part": MPN, "updated": D, "models": models}, open("models.json", "w"), indent=1)+json.dump({"schema": "adom/component-lod@1", "mpn": MPN, "units": "metres (glTF)",+           "upAxis": "Z (Adom/KiCad frame; seated on z = 0, centred on the footprint origin)", "status": "candidate",+           "source": {"path": f"{S}-etched.step", "sha256": sha(f"{S}-etched.step")},+           "generator": "provenance/tools/build_vma23.py (detail full/low/superlow) -> step2glb convert --compress none -> provenance/tools/glb_batch.py (lossless batching per part; etch graft on medium) -> materials.py; previews by render_glb.py",+           "levels": levels}, open("lod/manifest.json", "w"), indent=1)++ov = json.load(open("provenance/model-overlay.json")); fc = json.load(open("provenance/footprint-check.json"))+etch = json.load(open("docs/proof/tps16850vmar-etched.check.json"))+dims = [("D body length (X)", "5.9 / - / 6.1", "6.000"), ("E body width (Y)", "4.9 / - / 5.1", "5.000"), ("A height", "1.3 / - / 1.5", "1.400"),+        ("A1 terminal stand-off", "0.00 / - / 0.05", "0.025"), ("b terminal width", "0.2 / - / 0.3 (28X)", "0.250"),+        ("pin 7 tooth width", "0.15 / - / 0.25 (4X)", "0.200"), ("pin 6 leg width", "0.25 / - / 0.35", "0.300"),+        ("L left terminals 1-5", "0.4 / - / 0.6", "0.500"), ("L right terminals 11-16", "0.35 / - / 0.55 (10X)", "0.450"),+        ("L top terminals 18-21", "0.3 / - / 0.5 (4X)", "0.400"), ("L bottom terminals 8, 9", "0.45 / - / 0.65 (3X)", "0.550"),+        ("pin 23 length", "1.0 / - / 1.2", "1.100"), ("pin 10 bar", "0.35 / - / 0.45 at 2.05", "0.400 at 2.05"),+        ("pin 22 bar edge from package edge", "0.475 / - / 0.675", "0.575"),+        ("exposed pad", "3.4 +-0.1 x 2.35 +-0.1, centre 0.075 off the centre line", "3.400 x 2.350 at 0.075"),+        ("pin-1 chamfer on the exposed pad", "45 deg x 0.25", "45 deg x 0.25"), ("side terminal exposure", "(0.2) TYP", "0.200")]+m3 = {"schema": "adom/3d-model-provenance@1", "mpn": MPN, "date": D,+      "classification": "Datasheet-built: a CadQuery model generated from TI's printed VMA0023A package values, produced by Claude (AI) for Adom. Not manufacturer CAD and not a TI certification.",+      "method_chosen": "3 (build from the drawing): TI's own STEP was not reachable with plain HTTP and KiCad has no VMA0023A model",+      "manufacturer_step": {"tried": ["https://www.ti.com/product/TPS1685 (CAD/CAE links to Ultra Librarian)",+                                      "https://vendor.ultralibrarian.com/TI/embedded/?gpn=TPS1685&package=VMA&pin=23 (STEP export form)"],+                            "result": "the STEP export is a form behind reCAPTCHA (POST /TI/Export/Start returned 404 to a plain request on 2026-10-21); no browser was used, so TI's model was not obtained",+                            "status": "not reachable"},+      "kicad_library": "KiCad's packages3D and footprint libraries have no VMA0023A / LQFN-CLIP-23 package (Package_DFN_QFN listed 2026-10-21)",+      "datasheet": {"doc": "TI SLVSHA1D (Rev. D, revised July 2026), TPS1685x", "file": f"docs/{S}-datasheet.pdf", "url": "https://www.ti.com/lit/ds/symlink/tps1685.pdf",+                    "sha256": sha(f"docs/{S}-datasheet.pdf"), "drawing_pages": "p.54 PACKAGE OUTLINE, p.55 LAND PATTERN, p.56 STENCIL (VMA0023A, 4230225/A 11/2023)",+                    "marking_page": "p.50 (Package Option Addendum: TPS16850)"},+      "model": {"file": f"{S}.step", "sha256": sha(f"{S}.step"), "builder": "provenance/tools/build_vma23.py (CadQuery 2.x, OpenCascade)",+                "frame": "Z up, seated on z = 0, centred on the package centre lines = the KiCad footprint origin, X along the 6.0 mm side, Y = -KiCad y; pin 1 (ILIM) terminal at (-2.75, +0.5), footprint pad 1 at (-2.875, -0.5) in KiCad's Y-down frame; binds with zero offset and rotation",+                "how": "mould block 6.0 x 5.0 x 1.4 above a 0.025 mm stand-off with the terminal volume cut out; 23 terminals and the exposed pad as 0.2 mm plates flush with the side walls, shapes as drawn (combs on 7, 10, 22; L shapes on 6, 17; rounded inner ends), the outer 0.02 mm of every terminal at a side wall coloured copper (sawn ends)",+                "bottom_view_note": "TI prints the bottom view turned over about the X axis (pin 1 below the centre line); y values read from it are negated",+                "undimensioned": "pin 7 bar inner edge (1.95 from the centre line) and notch depth (0.25) measured off the drawing at 118 px/mm; terminal thickness taken as the (0.2) side exposure",+                "colours": "TI's VMA package render (DigiKey image MFG_296~4230225~VMA~23): dark grey mould, silver NiPdAu terminal faces (TI lead finish NIPDAU, p.50), copper sawn ends",+                "parts": {"body": "dark grey mould", "pins": "NiPdAu terminal faces", "pin_ends": "sawn copper ends"},+                "dimensions_mm": [dict(item=a, datasheet_min_typ_max=b, model=c) for a, b, c in dims],+                "not_modelled": "TI's top-side pin-1 index area is a region, not a mark, and the real marking (TPS16850 plus lot code) is not modelled; the virtual MPN etch stands in"},+      "overlay": {"bottom": ov["bottom"], "side": ov["side"], "images": ["docs/proof/tps16850vmar-model-vs-drawing-bottom.png", "docs/proof/tps16850vmar-model-vs-drawing-side.png"],+                  "method": "provenance/tools/overlay_vma.py: STEP rendered orthographically, scale and offset fitted to TI's blue strokes on the 300 dpi p.54 render"},+      "etched": {"file": f"{S}-etched.step", "sha256": sha(f"{S}-etched.step"), "tool": "adom-chip-laser 0.2.0 via adom-aiflow-etch (service-occt flat mark 5 um above the top face, Adom.LaserEtch group)",+                 "plan": "provenance/tps16850vmar-etched.mark-plan.json", "gate": etch.get("status", "PASS"), "check_image": "docs/proof/tps16850vmar-etched.check.png", "marking": mark},+      "glb": {"tool": "step2glb (service) convert --compress none, provenance/tools/glb_batch.py, materials.py", "files": [f"{S}-etched.glb", f"{S}.glb"]},+      "hero": {"file": f"{S}-hero.glb", "tool": "adom/component-hero 0.1.2 hero_glb.py (adom-hero 1.4): align OK, offset 0.0 mm; then provenance/tools/hero_post_vias.py adds the Adom.HeatsinkVias layer", "preview": "docs/proof/tps16850vmar-hero-preview.png"},+      "outline": {"file": "artwork/TPS16850VMAR-3d-outline-dark-named.svg", "tool": "adom-aiflow-etch outline (gate PASS)"},+      "license": "CC-BY-4.0 (Adom-authored model); TI's datasheet keeps TI's terms"}+json.dump(m3, open("provenance/3d-model.json", "w"), indent=1)++# ---- verification log+def entry(title, scope, checks, evidence, files, status="verified"):+    return {"date": D, "by": BY, "status": status, "title": title, "scope": scope, "variants": ["*"],+            "checks": [{"text": t, "result": r} for t, r in checks],+            "evidence": [{"label": os.path.basename(e), "href": e} for e in evidence], "files": {f: sha(f) for f in files}}+sym = open(f"{S}.kicad_sym").read()+pins = re.findall(r'\(pin (\w+) line \(at (\S+) (\S+) \d+\) \(length \S+\) \(name "([^"]+)"\) \(number "(\d+)"\)', sym)+ongrid = all(abs(float(v) / 2.54 - round(float(v) / 2.54)) < 1e-6 for _, x, y, _, _ in pins for v in (x, y))+lbr = open(f"{S}.lbr").read()+nc_ok = len(re.findall(r'<pin name="NC(@\d)?"[^>]*direction="nc"', lbr)) == 3+rt_map = {}+for c in rt.get("connect", []):+    rt_map.setdefault(c.get("pin_number") or c.get("pin"), set()).update(c.get("pads", []) if isinstance(c.get("pads"), list) else [c.get("pad")])+rows = fc["rows"]; worst = max(r["cu"]["xor_mm2"] for r in rows)+entries = [+ entry("Pinout matches the datasheet", ["symbol"], [+   ("Symbol pins match SLVSHA1D Table 5-1 (p.4-5): 1 ILIM, 2 IMON, 3 IREF, 4 dVdT, 5 GND, 6 SFT_SEL, 7-8 OUT, 9 VDD, 10/22/23 IN, 11/17/21 NC, 12 MODE, 13 FLT (active low), 14 ITIMER, 15 TEMP, 16 EN/UVLO, 18 OVP, 19 PGOOD, 20 SWEN, exposed pad (24) IN", "pass"),+   ("Electrical types: IN, VDD, GND power in; OUT power out; EN/UVLO, OVP, MODE input; FLT and PGOOD open drain; SWEN and TEMP bidirectional; resistor/capacitor set pins passive; NC no_connect", "pass"),+   (f"Every pin sits on the 2.54 mm grid: {'yes' if ongrid else 'NO'} (adom-symbol 1.2.6 put the first pin of each column at y = -2.00 with 8.35 mm group gaps; all 24 pins moved by provenance/tools/snap_symbol.py)", "pass" if ongrid else "fail"),+   ("Fusion .lbr: NC pins typed nc (adom-lbr 2.47.5 wrote io; fixed by provenance/tools/lbr_fix.py), every pin visible=both, lint PASS", "pass" if nc_ok else "fail"),+   ("Altium SchLib read back with adom-lbr import-altium: 24 pins, names shown; NC pins read back as Passive because Altium has no no-connect pin type (use a No ERC marker on the sheet)", "note")],+   ["docs/figures/tps16850vmar-ds-p4.png", "docs/figures/tps16850vmar-ds-p5.png"], [f"{S}.kicad_sym", f"{S}.lbr", "altium/TPS16850VMAR.SchLib"]),+ entry("Footprint equals TI's recommended land pattern", ["footprint"], [+   (f"Overlay on SLVSHA1D p.55 at TI's printed 15X scale: {fc['overlay']['copper_outline_on_ti_strokes']*100:.1f} % of the copper outline on TI's strokes (TI draws the metal under mask of pads 7, 10, 22 dashed), comb mask openings {fc['overlay']['comb_mask_on_ti_green']*100:.1f} % on TI's green", "pass"),+   (f"Pad by pad against TI's VMA0023A footprint published through Ultra Librarian: copper, mask and paste of all 24 pad numbers agree to {worst:.3f} mm2 or less (corner treatment only); the 12 vias are at the same positions", "pass"),+   ("Pads 7, 10 and 22 are solder-mask defined combs over a larger copper rectangle, as TI draws them; pads 6 and 17 are L shapes; exposed pad paste is TI's six 0.98 x 1.04 mm windows (p.56, 76 % coverage)", "pass"),+   ("KiCad's standard library has no VMA0023A footprint, so no KiCad comparison is possible", "note"),+   ("adom-lbr 2.47.5 drops KiCad custom-pad shapes and paste-only pads: the Fusion and Altium libraries are made from provenance/tps16850vmar-lbr-input.kicad_mod, the same copper as rectangle unions, copper-only pads with mask and paste expansion -1.2 mm; Fusion gets TI's six paste windows on tCream by hand; Altium gets one exposed-pad paste aperture with the same area (expansion -0.174 mm) because adom-lbr writes no paste-layer regions", "note")],+   ["docs/proof/tps16850vmar-footprint-check.png", "docs/figures/tps16850vmar-ds-p55.png", "docs/figures/tps16850vmar-ds-p56.png"],+   [f"{S}.kicad_mod", f"{S}.lbr", "altium/TPS16850VMAR.PcbLib"]),+ entry("Pin 1 orientation agrees across datasheet, footprint, 3D model and symbol", ["footprint", "3d", "symbol"], [+   ("Datasheet: pin 1 (ILIM) on the left side 0.5 mm above the centre line in the top view (Figure 5-1, p.4; land pattern p.55), pin-1 index corner and exposed-pad chamfer at the top left (p.54)", "pass"),+   ("Footprint: pad 1 at (-2.875, -0.5) in KiCad's Y-down frame, silkscreen dot to its left, fab outline chamfered at the top-left corner; numbering counter-clockwise (1-5 down the left, 6 corner, 7-10 along the bottom, 11-16 up the right, 17 corner, 18-21 along the top right to left, 22-23 top left)", "pass"),+   ("3D model: pin-1 terminal at (-2.75, +0.5) in the Y-up 3D frame (= pad 1), exposed-pad chamfer at the top-left corner; component-hero align check OK, offset 0.0 mm, zero rotation", "pass"),+   ("Symbol pin 1 = ILIM; Fusion and Altium map pin 1 to pad 1 (read back)", "pass"),+   ("Tape and reel: TI quadrant Q1 for pin 1 (p.52)", "pass")],+   ["docs/proof/tps16850vmar-pin1-check.png", "docs/figures/tps16850vmar-ds-p4.png", "docs/figures/tps16850vmar-ds-p52.png"],+   [f"{S}.kicad_mod", f"{S}.step", f"{S}-etched.step", f"{S}.kicad_sym"]),+ entry("3D model inside TI's package drawing", ["3d"], [+   (f"Bottom view over SLVSHA1D p.54: {ov['bottom']['score']*100:.1f} % of the model's edge pixels on TI's strokes at a fitted {ov['bottom']['scale']} px/mm (TI 10X = 118.1 px/mm at 300 dpi)", "pass"),+   (f"Side view: terminal exposures on TI's (0.2) marks; {ov['side']['score']*100:.1f} % edge overlap; TI draws the body at A max 1.5 mm, the model is at the nominal 1.4 mm", "pass"),+   ("Every printed dimension at its nominal (table in provenance/3d-model.json)", "pass"),+   ("Virtual MPN etch gate PASS (axis, upright with pin 1 left, size, flat, group); labelled virtual: TI's real marking is TPS16850", "pass"),+   ("TI's manufacturer STEP was not reachable with plain HTTP (Ultra Librarian export behind reCAPTCHA); the model is AI-built from the drawing", "note")],+   ["docs/proof/tps16850vmar-model-vs-drawing-bottom.png", "docs/proof/tps16850vmar-model-vs-drawing-side.png", "docs/proof/tps16850vmar-etched.check.png", "docs/figures/tps16850vmar-ds-p54.png"],+   [f"{S}.step", f"{S}-etched.step", f"{S}-hero.glb"]),+ entry("Still to do", ["*"], [+   ("Compare with TI's own STEP (Ultra Librarian) when someone can download it through a browser", "open"),+   ("Open the Fusion .lbr and Altium libraries in the native tools and look at the comb pads, paste windows and NC pins", "open"),+   ("A person reviews this page", "open")], [], [], status="open"),+]+json.dump({"schema": "adom/verification@1", "part": MPN,+           "variants": [{"mpn": MPN, "note": "auto-retry variant, 73 A fixed fast trip; 2500-piece large tape and reel (SLVSHA1D p.3, p.50)", "stocked": False}],+           "entries": entries}, open("verification.json", "w"), indent=1)+open("LICENSE", "w").write("""Creative Commons Attribution 4.0 International (CC BY 4.0)+https://creativecommons.org/licenses/by/4.0/++Copyright 2026 Adom Inc.++Applies to the files authored by Adom on this page: the KiCad symbol and footprint, the 3D models+(tps16850vmar*.step, *.glb, lod/), the virtual MPN etch, the chip outline artwork, the Fusion/EAGLE and+Altium libraries, the provenance tools and data, and the README text.++Not covered (they keep their own terms):+- docs/tps16850vmar-datasheet.pdf and the page images under docs/figures/ and inside docs/proof/: Texas+  Instruments Incorporated (SLVSHA1D), redistributed for reference under TI's terms.+""")+print("OK models.json", len(models), "lod levels", [l["triangles"] for l in levels], "verification entries", len(entries), "grid", ongrid, "nc", nc_ok)
provenance/tools/pin1_check.pyadded+50
@@ -0,0 +1,50 @@+#!/usr/bin/env python3+"""Pin-1 proof image: (a) TI's top-view pinout (SLVSHA1D p.4, Figure 5-1), (b) the footprint's copper in KiCad's+top view with pad 1 and the silkscreen pin-1 dot, (c) the 3D model's terminals seen through the body from the top+(the ortho bottom view flipped about X), pin-1 terminal ringed. All three at the same orientation: pin 1 on the+left, 0.5 mm above the centre line, pins counter-clockwise.+usage: pin1_check.py ds.pdf footprint.kicad_mod model.step out.png"""+import sys, os, re, subprocess, tempfile+import numpy as np+from PIL import Image, ImageDraw, ImageFont, ImageOps+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+import ortho+ds, fp, step, out = sys.argv[1:5]+F = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20)+FB = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 22)+with tempfile.TemporaryDirectory() as t:+    subprocess.run(["pdftoppm", "-r", "150", "-f", "4", "-l", "4", "-png", ds, os.path.join(t, "p")], check=True)+    pg = Image.open([os.path.join(t, f) for f in os.listdir(t)][0]).convert("RGB")+a = pg.crop((int(pg.width * 0.08), int(pg.height * 0.115), int(pg.width * 0.93), int(pg.height * 0.62))).resize((560, 420))+S = 60+b = Image.new("RGB", (560, 420), (13, 17, 23)); d = ImageDraw.Draw(b)+txt = open(fp).read()+cx, cy = 280, 210+for m in re.finditer(r'\(pad "(\d*)" smd (\w+) \(at (-?[\d.]+) (-?[\d.]+)\) \(size ([\d.]+) ([\d.]+)\)\s*\(layers ([^)]*)\)(.*?)(?=\n  \(pad|\n  \(model|\Z)', txt, re.S):+    num, shape, x, y, w, h, layers, rest = m.groups(); x, y, w, h = map(float, (x, y, w, h))+    if '"F.Cu"' not in layers: continue+    col = (230, 160, 40) if num == "1" else (200, 52, 52)+    if shape == "custom":+        for poly in re.findall(r"\(gr_poly \(pts (.*?)\) \(width", rest):+            pts = [(cx + (x + float(u)) * S, cy + (y + float(v)) * S) for u, v in re.findall(r"\(xy (\S+) (\S+)\)", poly)]+            d.polygon(pts, fill=col)+    else:+        d.rectangle([cx + (x - w / 2) * S, cy + (y - h / 2) * S, cx + (x + w / 2) * S, cy + (y + h / 2) * S], fill=col)+m = re.search(r"\(fp_circle \(center (\S+) (\S+)\) \(end (\S+) \S+\)", txt)+ux, uy, ex = float(m.group(1)), float(m.group(2)), float(m.group(3)); r = abs(ex - ux) * S+d.ellipse([cx + ux * S - r, cy + uy * S - r, cx + ux * S + r, cy + uy * S + r], fill=(240, 240, 240))+d.text((cx - 2.875 * S - 8, cy - 0.5 * S - 28), "1", font=FB, fill=(230, 160, 40))+tris = ortho.load_tris(step)+img = ortho.render(tris, "bottom", S, size=(560, 420))+img = ImageOps.flip(img)+c = Image.new("RGB", (560, 420), (13, 17, 23)); c.paste(img, (0, 0), img)+dc = ImageDraw.Draw(c)+px, py = 280 + (-2.75) * S, 210 - 0.5 * S+dc.ellipse([px - 24, py - 24, px + 24, py + 24], outline=(230, 160, 40), width=3)+dc.text((px - 8, py - 52), "1", font=FB, fill=(230, 160, 40))+sheet = Image.new("RGB", (1740, 520), "white"); sd = ImageDraw.Draw(sheet)+for i, (im, t) in enumerate(((a, "TI SLVSHA1D p.4, Figure 5-1 (top view)"), (b, "Footprint copper, top view (pad 1 amber, silk dot)"),+                            (c, "3D model terminals, top view through the body"))):+    sheet.paste(im, (20 + i * 580, 20)); sd.text((20 + i * 580, 450), t, font=F, fill="black")+sd.text((20, 482), "Pin 1 (ILIM) on the left side, 0.5 mm above the package centre line, numbering counter-clockwise from the top; symbol pin 1 = ILIM.", font=F, fill="black")+sheet.save(out); print("OK", out)
provenance/tools/push.shadded+32
@@ -0,0 +1,32 @@+#!/usr/bin/env bash+# usage: push.sh <page_dir> <owner/slug>  (batches under 3.3 MB, a file bigger than that alone, page.json last)+set -u+dir="$1"; ref="$2"; cd "$dir" || exit 1+mapfile -t files < <(find . -type f ! -name page.json -printf '%s %P\n' | sort -n)+batch=(); size=0; n=0+push() {+  local tries=0+  while :; do+    out=$(adom-wiki repo push "$ref" --files "$@" -m "$MSG" 2>&1); rc=$?+    if echo "$out" | grep -q -E '429|RATE_LIMITED'; then+      w=$(echo "$out" | grep -oE '"retry_after":[0-9]+' | grep -oE '[0-9]+' | head -1); w=${w:-20}+      echo "rate limited, waiting $w s"; sleep "$w"; tries=$((tries+1)); [ $tries -gt 5 ] && return 1; continue+    fi+    echo "$out" | tail -3; return $rc+  done+}+flush() {+  [ ${#batch[@]} -eq 0 ] && return 0+  n=$((n+1)); MSG="Component record TPS16850VMAR: files batch $n"+  echo "== batch $n: ${#batch[@]} files, $size bytes"+  push "${batch[@]}" || { echo "PUSH FAILED"; exit 1; }+  batch=(); size=0; sleep 3+}+for line in "${files[@]}"; do+  s=${line%% *}; f=${line#* }+  if [ $((size + s)) -gt 3300000 ]; then flush; fi+  batch+=("$f"); size=$((size + s))+done+flush+MSG="Component record TPS16850VMAR: page.json (last, keeps hero and title)"+echo "== page.json"; push page.json || { echo "PUSH FAILED"; exit 1; }
provenance/tools/render_glb.pyadded+71
@@ -0,0 +1,71 @@+#!/usr/bin/env python3+"""Depth-buffered orthographic render of an uncompressed chip GLB (Z up), for previews and checks.+usage: render_glb.py model.glb out.png [--view iso|top|bottom|front|side|corner] [--size 480] [--bg 36,40,46]+iso: from front-left-up (pin-1 side, -x/+y quadrant shown at the left); top: looking down -Z, +Y up;+bottom: looking up +Z (mirrored as seen from below); front: along +Y; side: along -X."""+import sys, math, argparse, json+import numpy as np+from PIL import Image+sys.path.insert(0, __file__.rsplit("/", 1)[0])+from pygltflib import GLTF2++ap = argparse.ArgumentParser(); ap.add_argument("glb"); ap.add_argument("out")+ap.add_argument("--view", default="iso"); ap.add_argument("--size", type=int, default=480)+ap.add_argument("--bg", default="36,40,46"); a = ap.parse_args()+CT = {5126: np.float32, 5125: np.uint32, 5123: np.uint16}+g = GLTF2().load(a.glb); blob = g.binary_blob()+def acc(i):+    x = g.accessors[i]; bv = g.bufferViews[x.bufferView]; n = {"SCALAR": 1, "VEC3": 3}[x.type]+    arr = np.frombuffer(blob, CT[x.componentType], x.count * n, (bv.byteOffset or 0) + (x.byteOffset or 0))+    return arr.reshape(-1, n) if n > 1 else arr+def mat(n):+    if n.matrix: return np.array(n.matrix).reshape(4, 4).T+    M = np.eye(4)+    if n.scale: M = M @ np.diag(list(n.scale) + [1])+    return M+tris = []+def walk(ni, M):+    n = g.nodes[ni]; M = M @ mat(n)+    if n.mesh is not None:+        for p in g.meshes[n.mesh].primitives:+            P = acc(p.attributes.POSITION).astype(float) * 1000; P = (np.c_[P, np.ones(len(P))] @ M.T)[:, :3]+            I = acc(p.indices).reshape(-1, 3)+            m = g.materials[p.material]; pbr = m.pbrMetallicRoughness+            tris.append((P[I], np.array(pbr.baseColorFactor[:3]), pbr.metallicFactor or 0.0, n.name))+    for c in n.children or []: walk(c, M)+for r in g.scenes[g.scene or 0].nodes: walk(r, np.eye(4))+def R(view):+    def rz(d): t = math.radians(d); return np.array([[math.cos(t), -math.sin(t), 0], [math.sin(t), math.cos(t), 0], [0, 0, 1]])+    def rx(d): t = math.radians(d); return np.array([[1, 0, 0], [0, math.cos(t), -math.sin(t)], [0, math.sin(t), math.cos(t)]])+    return {"top": np.eye(3), "bottom": rx(180), "front": rx(-90), "side": rx(-90) @ rz(90),+            "iso": rx(-55) @ rz(-35), "corner": rx(-70) @ rz(-30)}[view]+Rm = R(a.view)+allp = np.concatenate([t[0].reshape(-1, 3) for t in tris]) @ Rm.T+lo, hi = allp[:, :2].min(0), allp[:, :2].max(0); S = a.size * 3; k = 0.86 * S / max(hi - lo)+c0 = (lo + hi) / 2+img = np.zeros((S, S, 3)); img[:] = np.array([int(v) for v in a.bg.split(",")]) / 255; zb = np.full((S, S), -1e9)+L1 = np.array([-0.4, 0.5, 0.8]); L1 /= np.linalg.norm(L1); L2 = np.array([0.6, -0.3, 0.4]); L2 /= np.linalg.norm(L2)+for T, col, metal, name in tris:+    V = T @ Rm.T+    for tri in V:+        n = np.cross(tri[1] - tri[0], tri[2] - tri[0]); ln = np.linalg.norm(n)+        if ln == 0: continue+        n /= ln+        if n[2] < 0: n = -n+        sh = 0.35 + 0.55 * max(0, n @ L1) + 0.25 * max(0, n @ L2)+        c = np.clip(col ** (1 / 2.2) * sh + (0.15 * metal * max(0, n @ L1) ** 8), 0, 1)+        xy = (tri[:, :2] - c0) * k + S / 2; xy[:, 1] = S - xy[:, 1]+        x0, y0 = np.floor(xy.min(0)).astype(int); x1, y1 = np.ceil(xy.max(0)).astype(int)+        x0, y0 = max(x0, 0), max(y0, 0); x1, y1 = min(x1, S - 1), min(y1, S - 1)+        if x1 < x0 or y1 < y0: continue+        X, Y = np.meshgrid(np.arange(x0, x1 + 1) + 0.5, np.arange(y0, y1 + 1) + 0.5)+        (ax, ay), (bx, by), (cx, cy) = xy+        d = (by - cy) * (ax - cx) + (cx - bx) * (ay - cy)+        if abs(d) < 1e-12: continue+        w1 = ((by - cy) * (X - cx) + (cx - bx) * (Y - cy)) / d; w2 = ((cy - ay) * (X - cx) + (ax - cx) * (Y - cy)) / d; w3 = 1 - w1 - w2+        inside = (w1 >= -1e-6) & (w2 >= -1e-6) & (w3 >= -1e-6)+        z = w1 * tri[0, 2] + w2 * tri[1, 2] + w3 * tri[2, 2] + (0.002 if name.startswith("Adom.LaserEtch") else 0)+        sub = zb[y0:y1 + 1, x0:x1 + 1]; m = inside & (z > sub)+        sub[m] = z[m]; img[y0:y1 + 1, x0:x1 + 1][m] = c+im = Image.fromarray((img * 255).astype(np.uint8)).resize((a.size, a.size), Image.LANCZOS)+im.save(a.out); print(a.out)
provenance/tools/render_sym.pyadded+25
@@ -0,0 +1,25 @@+#!/usr/bin/env python3+"""Quick matplotlib render of a .kicad_sym (rectangle, polylines, captions, pins with names and numbers) for a+visual check. usage: render_sym.py in.kicad_sym out.png"""+import re, sys+import matplotlib; matplotlib.use("Agg")+import matplotlib.pyplot as plt+s = open(sys.argv[1]).read()+fig, ax = plt.subplots(figsize=(10, 7), dpi=130); ax.set_facecolor("#0d1117"); fig.patch.set_facecolor("#0d1117")+for m in re.finditer(r"\(rectangle \(start (\S+) (\S+)\) \(end (\S+) (\S+)\)", s):+    x1, y1, x2, y2 = map(float, m.groups()); ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], color="#8b949e", lw=1.2)+for m in re.finditer(r"\(polyline\s*\(pts(.*?)\)\s*\(stroke", s, re.S):+    pts = [(float(a), float(b)) for a, b in re.findall(r"\(xy (\S+) (\S+)\)", m.group(1))]+    ax.plot([p[0] for p in pts], [p[1] for p in pts], color="#e6edf3", lw=0.5)+for m in re.finditer(r'\(text "([^"]+)" \(at (\S+) (\S+) 0\).*?justify (\w+)', s, re.S):+    ax.text(float(m.group(2)), float(m.group(3)), m.group(1), color="#8C6BF7", fontsize=7, ha=m.group(4), va="center", weight="bold")+for m in re.finditer(r'\(pin (\w+) line \(at (\S+) (\S+) (\d+)\) \(length (\S+)\) \(name "([^"]+)"\) \(number "([^"]+)"\)', s):+    t, x, y, a, L, nm, no = m.groups(); x, y, L = float(x), float(y), float(L)+    dx = L if a == "0" else -L+    ax.plot([x, x + dx], [y, y], color="#00e6dc", lw=1.2)+    ax.text(x + dx + (0.8 if a == "0" else -0.8), y, nm, color="white", fontsize=7, ha="left" if a == "0" else "right", va="center")+    ax.text(x + dx / 2, y + 0.4, no, color="#8b949e", fontsize=6, ha="center")+for prop in ("Reference", "Value"):+    m = re.search(r'\(property "%s" "([^"]*)"\s*\(at (\S+) (\S+)' % prop, s)+    if m: ax.text(float(m.group(2)), float(m.group(3)), m.group(1), color="#c9d1d9", fontsize=8, ha="center", va="center")+ax.set_aspect("equal"); ax.axis("off"); fig.savefig(sys.argv[2], bbox_inches="tight", facecolor=fig.get_facecolor()); print(sys.argv[2])
provenance/tools/snap_symbol.pyadded+41
@@ -0,0 +1,41 @@+#!/usr/bin/env python3+"""Put every pin of an adom-symbol 1.2.6 .kicad_sym on the 2.54 mm grid (known adom-symbol bug: the first pin of+each column sits at y = -2.00 and group gaps are 8.35 mm, so every pin after it is off grid).++Per column (left x < 0, right x > 0), pins are walked top to bottom: the first goes to the nearest grid point, each+next one keeps its distance to the previous one rounded to whole grid steps (2.54 -> 1 step, the 8.35 group gap ->+3 steps). Group captions move with the pin they label, the body rectangle's bottom becomes the lowest pin - 2.54,+and properties drawn below the body move with that bottom. Footprint and Value are set to the page's values.+usage: snap_symbol.py in.kicad_sym out.kicad_sym MPN LIB:FOOTPRINT"""+import re, sys+src, out, mpn, fp = sys.argv[1:5]+s = open(src).read()+G = 2.54+PIN = r"(\(pin \w+ line )\(at (-?[\d.]+) (-?[\d.]+) (\d+)\)"+pins = [(float(m.group(2)), float(m.group(3))) for m in re.finditer(PIN, s)]+newy = {}+for right in (False, True):+    col = sorted([p for p in pins if (p[0] > 0) == right], key=lambda p: -p[1])+    prev_old = prev_new = None+    for x, y in col:+        ny = round(y / G) * G if prev_old is None else prev_new - max(1, round((prev_old - y) / G)) * G+        newy[(x, y)] = round(ny, 2); prev_old, prev_new = y, ny+s2 = re.sub(PIN, lambda m: f"{m.group(1)}(at {m.group(2)} {newy[(float(m.group(2)), float(m.group(3)))]:.2f} {m.group(4)})", s)+def cap_sub(m):+    x, y = float(m.group(2)), float(m.group(3))+    py, ny = max((py, ny) for (px, py), ny in newy.items() if (px > 0) == (x > 0) and py < y)+    return f'{m.group(1)}(at {m.group(2)} {ny + (y - py):.2f} 0)'+s2 = re.sub(r'(\(text "[^"]+" )\(at (-?[\d.]+) (-?[\d.]+) 0\)', cap_sub, s2)+rm = re.search(r"\(rectangle \(start (-?[\d.]+) (-?[\d.]+)\) \(end (-?[\d.]+) (-?[\d.]+)\)", s2)+old_bot = float(rm.group(4)); new_bot = round(min(newy.values()) - G, 2); d = new_bot - old_bot+s2 = s2[:rm.start()] + f"(rectangle (start {rm.group(1)} {rm.group(2)}) (end {rm.group(3)} {new_bot:.2f})" + s2[rm.end():]+def prop_sub(m):+    y = float(m.group(3))+    return f'{m.group(1)}(at {m.group(2)} {y + d:.2f}' if y < old_bot else m.group(0)+s2 = re.sub(r'(\(property "[^"]+" "[^"]*"\s*)\(at (-?[\d.]+) (-?[\d.]+)', prop_sub, s2)+s2 = re.sub(r'\(property "Value" "[^"]*"', f'(property "Value" "{mpn}"', s2, count=1)+s2 = re.sub(r'\(property "Footprint" "[^"]*"', f'(property "Footprint" "{fp}"', s2, count=1)+open(out, "w").write(s2)+off = [(k, v) for k, v in newy.items() if abs(v / G - round(v / G)) > 1e-6]+print("moved", sum(1 for k, v in newy.items() if abs(k[1] - v) > 1e-6), "of", len(newy), "pins; off grid after:", off,+      "; body bottom", old_bot, "->", new_bot, "; x on grid:", all(abs(k[0] / G - round(k[0] / G)) < 1e-6 for k in newy))
provenance/tools/svg_poly_png.pyadded+16
@@ -0,0 +1,16 @@+#!/usr/bin/env python3+"""Rasterize a polyline-only SVG (chip outline art) to PNG with Pillow. usage: svg_poly_png.py in.svg out.png [size] [bg]"""+import sys, re+from PIL import Image, ImageDraw+src, out = sys.argv[1], sys.argv[2]; size = int(sys.argv[3]) if len(sys.argv) > 3 else 320+bg = sys.argv[4] if len(sys.argv) > 4 else "#0d1117"+s = open(src).read()+vb = [float(v) for v in re.search(r'viewBox="([^"]+)"', s).group(1).split()]+k = size / vb[2]+im = Image.new("RGB", (size, int(vb[3] * k)), bg); d = ImageDraw.Draw(im)+for m in re.finditer(r'<(polyline|polygon)[^>]*points="([^"]+)"[^>]*?(?:stroke="([^"]+)")?[^>]*/>', s):+    pts = [tuple(float(v) for v in p.split(",")) for p in m.group(2).split()]+    pts = [((x - vb[0]) * k, (y - vb[1]) * k) for x, y in pts]+    col = m.group(3) or "#e6edf3"+    if len(pts) > 1: d.line(pts, fill=col, width=max(1, int(1.5 * k)))+im.save(out); print(out, im.size)
provenance/tools/symbol-create.jsonadded+247
@@ -0,0 +1,247 @@+{+ "symbolName": "TPS16850VMAR",+ "mpn": "TPS16850VMAR",+ "manufacturer": "Texas Instruments",+ "package": "LQFN-CLIP-23 (VMA0023A, 6.0 x 5.0 mm)",+ "pinCount": 24,+ "description": "9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA)",+ "datasheetUrl": "https://www.ti.com/lit/ds/symlink/tps1685.pdf",+ "footprint": "tps16850vmar:tps16850vmar",+ "reference": "U",+ "distributors": {+  "mouser": "595-TPS16850VMAR",+  "digikey": "296-TPS16850VMARTR-ND"+ },+ "wikiUrl": "https://wiki.adom.inc/adom/tps16850vmar",+ "pinLayout": "left-right",+ "pins": [+  {+   "number": "10",+   "name": "IN",+   "type": "power_in",+   "group": "Power in",+   "side": "left",+   "description": "Power input (FET drain). Solder to the input power plane uniformly for heat dissipation (SLVSHA1D p.5, Table 5-1)."+  },+  {+   "number": "22",+   "name": "IN",+   "type": "power_in",+   "group": "Power in",+   "side": "left",+   "description": "Power input, same node as pins 10, 23 and the exposed pad (p.5)."+  },+  {+   "number": "23",+   "name": "IN",+   "type": "power_in",+   "group": "Power in",+   "side": "left",+   "description": "Power input, same node as pins 10, 22 and the exposed pad (p.5)."+  },+  {+   "number": "24",+   "name": "IN",+   "type": "power_in",+   "group": "Power in",+   "side": "left",+   "description": "Exposed thermal pad (PowerPAD), electrically IN: solder it to the input power plane for heat dissipation (p.5)."+  },+  {+   "number": "9",+   "name": "VDD",+   "type": "power_in",+   "group": "Power in",+   "side": "left",+   "description": "Controller supply, 9 V to 80 V. Connect to VIN through a series resistor and decouple to GND (p.5, p.7)."+  },+  {+   "number": "16",+   "name": "EN/UVLO",+   "type": "input",+   "group": "Control",+   "side": "left",+   "description": "Active-high enable. A resistor divider from the input supply sets the undervoltage threshold. Do not leave floating (p.5)."+  },+  {+   "number": "18",+   "name": "OVP",+   "type": "input",+   "group": "Control",+   "side": "left",+   "description": "Overvoltage set point: resistor divider from VIN. Do not leave floating (p.5)."+  },+  {+   "number": "12",+   "name": "MODE",+   "type": "input",+   "group": "Control",+   "side": "left",+   "description": "Floating = standalone or primary device; tied to GND = secondary to a primary eFuse or controller in a parallel chain (p.5)."+  },+  {+   "number": "4",+   "name": "dVdT",+   "type": "passive",+   "group": "Control",+   "side": "left",+   "description": "Output slew-rate control at start-up: open for the fastest start-up, a capacitor to GND slows the slew rate to limit inrush (p.4)."+  },+  {+   "number": "3",+   "name": "IREF",+   "type": "passive",+   "group": "Current setting",+   "side": "left",+   "description": "Reference voltage (0.3 V to 1.2 V) for the overcurrent, short-circuit and current-sharing blocks: internal current source into a resistor, or driven externally. Do not leave floating (p.4, p.7)."+  },+  {+   "number": "14",+   "name": "ITIMER",+   "type": "passive",+   "group": "Current setting",+   "side": "left",+   "description": "A capacitor to GND sets the overcurrent blanking interval during which the current may exceed the overcurrent threshold, below fast trip (p.5)."+  },+  {+   "number": "6",+   "name": "SFT_SEL",+   "type": "passive",+   "group": "Current setting",+   "side": "left",+   "description": "A resistor to GND selects the scalable fast-trip threshold multiplier. Not recommended to leave floating (p.5)."+  },+  {+   "number": "7",+   "name": "OUT",+   "type": "power_out",+   "group": "Power out",+   "side": "right",+   "description": "Power output (FET source). Solder to the output power plane uniformly for heat dissipation (p.5)."+  },+  {+   "number": "8",+   "name": "OUT",+   "type": "power_out",+   "group": "Power out",+   "side": "right",+   "description": "Power output, same node as pin 7 (p.5)."+  },+  {+   "number": "2",+   "name": "IMON",+   "type": "passive",+   "group": "Current monitor",+   "side": "right",+   "description": "A resistor to GND sets the overcurrent and fast-trip thresholds; also a fast, accurate analog load-current monitor output in steady state. Do not leave floating (p.4)."+  },+  {+   "number": "1",+   "name": "ILIM",+   "type": "passive",+   "group": "Current monitor",+   "side": "right",+   "description": "A resistor to GND sets the active current-sharing threshold in steady state; also this device's current monitor output. Do not leave floating (p.4)."+  },+  {+   "number": "19",+   "name": "PGOOD",+   "type": "open_collector",+   "group": "Status",+   "side": "right",+   "description": "Open-drain power-good output, asserted high in steady state; weak internal pull-up (p.5)."+  },+  {+   "number": "13",+   "name": "~{FLT}",+   "type": "open_collector",+   "group": "Status",+   "side": "right",+   "description": "Open-drain active-low fault output, pulled low on a fault. Pull up to an external supply with a resistor (p.5)."+  },+  {+   "number": "20",+   "name": "SWEN",+   "type": "bidirectional",+   "group": "Status",+   "side": "right",+   "description": "Open-drain signal that reports and controls the power-switch state; tied across a parallel chain to synchronise the devices. Weak internal pull-up (p.5)."+  },+  {+   "number": "15",+   "name": "TEMP",+   "type": "bidirectional",+   "group": "Status",+   "side": "right",+   "description": "Analog junction-temperature output; TEMP pins of parallel devices can be tied to report the hottest device (p.5)."+  },+  {+   "number": "5",+   "name": "GND",+   "type": "power_in",+   "group": "Ground",+   "side": "right",+   "description": "Device ground reference. Connect to system ground (p.4)."+  },+  {+   "number": "11",+   "name": "NC",+   "type": "no_connect",+   "group": "No connect",+   "side": "right",+   "description": "Do not connect anything to this pin (p.5)."+  },+  {+   "number": "17",+   "name": "NC",+   "type": "no_connect",+   "group": "No connect",+   "side": "right",+   "description": "Do not connect anything to this pin (p.5)."+  },+  {+   "number": "21",+   "name": "NC",+   "type": "no_connect",+   "group": "No connect",+   "side": "right",+   "description": "Do not connect anything to this pin (p.5)."+  }+ ],+ "pinDescriptions": {+  "IN (10)": "Power input (FET drain). Solder to the input power plane uniformly for heat dissipation (SLVSHA1D p.5, Table 5-1).",+  "IN (22)": "Power input, same node as pins 10, 23 and the exposed pad (p.5).",+  "IN (23)": "Power input, same node as pins 10, 22 and the exposed pad (p.5).",+  "IN (24)": "Exposed thermal pad (PowerPAD), electrically IN: solder it to the input power plane for heat dissipation (p.5).",+  "VDD": "Controller supply, 9 V to 80 V. Connect to VIN through a series resistor and decouple to GND (p.5, p.7).",+  "EN/UVLO": "Active-high enable. A resistor divider from the input supply sets the undervoltage threshold. Do not leave floating (p.5).",+  "OVP": "Overvoltage set point: resistor divider from VIN. Do not leave floating (p.5).",+  "MODE": "Floating = standalone or primary device; tied to GND = secondary to a primary eFuse or controller in a parallel chain (p.5).",+  "dVdT": "Output slew-rate control at start-up: open for the fastest start-up, a capacitor to GND slows the slew rate to limit inrush (p.4).",+  "IREF": "Reference voltage (0.3 V to 1.2 V) for the overcurrent, short-circuit and current-sharing blocks: internal current source into a resistor, or driven externally. Do not leave floating (p.4, p.7).",+  "ITIMER": "A capacitor to GND sets the overcurrent blanking interval during which the current may exceed the overcurrent threshold, below fast trip (p.5).",+  "SFT_SEL": "A resistor to GND selects the scalable fast-trip threshold multiplier. Not recommended to leave floating (p.5).",+  "OUT (7)": "Power output (FET source). Solder to the output power plane uniformly for heat dissipation (p.5).",+  "OUT (8)": "Power output, same node as pin 7 (p.5).",+  "IMON": "A resistor to GND sets the overcurrent and fast-trip thresholds; also a fast, accurate analog load-current monitor output in steady state. Do not leave floating (p.4).",+  "ILIM": "A resistor to GND sets the active current-sharing threshold in steady state; also this device's current monitor output. Do not leave floating (p.4).",+  "PGOOD": "Open-drain power-good output, asserted high in steady state; weak internal pull-up (p.5).",+  "~{FLT}": "Open-drain active-low fault output, pulled low on a fault. Pull up to an external supply with a resistor (p.5).",+  "SWEN": "Open-drain signal that reports and controls the power-switch state; tied across a parallel chain to synchronise the devices. Weak internal pull-up (p.5).",+  "TEMP": "Analog junction-temperature output; TEMP pins of parallel devices can be tied to report the hottest device (p.5).",+  "GND": "Device ground reference. Connect to system ground (p.4).",+  "NC (11)": "Do not connect anything to this pin (p.5).",+  "NC (17)": "Do not connect anything to this pin (p.5).",+  "NC (21)": "Do not connect anything to this pin (p.5)."+ },+ "groupDescriptions": {+  "Power in": "The FET's input side: pins 10, 22, 23 and the exposed pad are all IN and carry the load current; VDD powers the controller from a filtered copy of the input.",+  "Control": "Enable with undervoltage threshold, overvoltage threshold, standalone or secondary mode, and the start-up slew rate.",+  "Current setting": "Reference voltage, overcurrent blanking timer and scalable fast-trip multiplier, which shape the circuit-breaker response.",+  "Power out": "The FET's output side, pins 7 and 8.",+  "Current monitor": "IMON sets the circuit-breaker threshold and reports the load current; ILIM sets the current-sharing threshold and reports this device's share.",+  "Status": "Open-drain power-good and fault flags, the switch-enable line that synchronises a parallel chain, and the analog temperature output.",+  "Ground": "Device ground reference.",+  "No connect": "Pins 11, 17 and 21: do not connect anything to them."+ }+}\ No newline at end of file
provenance/tools/symbol_json.pyadded+49
@@ -0,0 +1,49 @@+#!/usr/bin/env python3+"""Write the adom-symbol create JSON for TPS16850VMAR: every pin from TI SLVSHA1D Table 5-1 (p.4-5), grouped by+function, inputs and set-pins on the left, outputs, monitors, status, ground and NC on the right.+usage: symbol_json.py out.json"""+import json, sys+P = []+def pin(n, name, t, g, side, desc): P.append(dict(number=str(n), name=name, type=t, group=g, side=side, description=desc))+L, R = "left", "right"+pin(10, "IN", "power_in", "Power in", L, "Power input (FET drain). Solder to the input power plane uniformly for heat dissipation (SLVSHA1D p.5, Table 5-1).")+pin(22, "IN", "power_in", "Power in", L, "Power input, same node as pins 10, 23 and the exposed pad (p.5).")+pin(23, "IN", "power_in", "Power in", L, "Power input, same node as pins 10, 22 and the exposed pad (p.5).")+pin(24, "IN", "power_in", "Power in", L, "Exposed thermal pad (PowerPAD), electrically IN: solder it to the input power plane for heat dissipation (p.5).")+pin(9, "VDD", "power_in", "Power in", L, "Controller supply, 9 V to 80 V. Connect to VIN through a series resistor and decouple to GND (p.5, p.7).")+pin(16, "EN/UVLO", "input", "Control", L, "Active-high enable. A resistor divider from the input supply sets the undervoltage threshold. Do not leave floating (p.5).")+pin(18, "OVP", "input", "Control", L, "Overvoltage set point: resistor divider from VIN. Do not leave floating (p.5).")+pin(12, "MODE", "input", "Control", L, "Floating = standalone or primary device; tied to GND = secondary to a primary eFuse or controller in a parallel chain (p.5).")+pin(4, "dVdT", "passive", "Control", L, "Output slew-rate control at start-up: open for the fastest start-up, a capacitor to GND slows the slew rate to limit inrush (p.4).")+pin(3, "IREF", "passive", "Current setting", L, "Reference voltage (0.3 V to 1.2 V) for the overcurrent, short-circuit and current-sharing blocks: internal current source into a resistor, or driven externally. Do not leave floating (p.4, p.7).")+pin(14, "ITIMER", "passive", "Current setting", L, "A capacitor to GND sets the overcurrent blanking interval during which the current may exceed the overcurrent threshold, below fast trip (p.5).")+pin(6, "SFT_SEL", "passive", "Current setting", L, "A resistor to GND selects the scalable fast-trip threshold multiplier. Not recommended to leave floating (p.5).")+pin(7, "OUT", "power_out", "Power out", R, "Power output (FET source). Solder to the output power plane uniformly for heat dissipation (p.5).")+pin(8, "OUT", "power_out", "Power out", R, "Power output, same node as pin 7 (p.5).")+pin(2, "IMON", "passive", "Current monitor", R, "A resistor to GND sets the overcurrent and fast-trip thresholds; also a fast, accurate analog load-current monitor output in steady state. Do not leave floating (p.4).")+pin(1, "ILIM", "passive", "Current monitor", R, "A resistor to GND sets the active current-sharing threshold in steady state; also this device's current monitor output. Do not leave floating (p.4).")+pin(19, "PGOOD", "open_collector", "Status", R, "Open-drain power-good output, asserted high in steady state; weak internal pull-up (p.5).")+pin(13, "~{FLT}", "open_collector", "Status", R, "Open-drain active-low fault output, pulled low on a fault. Pull up to an external supply with a resistor (p.5).")+pin(20, "SWEN", "bidirectional", "Status", R, "Open-drain signal that reports and controls the power-switch state; tied across a parallel chain to synchronise the devices. Weak internal pull-up (p.5).")+pin(15, "TEMP", "bidirectional", "Status", R, "Analog junction-temperature output; TEMP pins of parallel devices can be tied to report the hottest device (p.5).")+pin(5, "GND", "power_in", "Ground", R, "Device ground reference. Connect to system ground (p.4).")+for n in (11, 17, 21):+    pin(n, "NC", "no_connect", "No connect", R, "Do not connect anything to this pin (p.5).")+spec = {"symbolName": "TPS16850VMAR", "mpn": "TPS16850VMAR", "manufacturer": "Texas Instruments",+        "package": "LQFN-CLIP-23 (VMA0023A, 6.0 x 5.0 mm)", "pinCount": 24,+        "description": "9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA)",+        "datasheetUrl": "https://www.ti.com/lit/ds/symlink/tps1685.pdf", "footprint": "tps16850vmar:tps16850vmar", "reference": "U",+        "distributors": {"mouser": "595-TPS16850VMAR", "digikey": "296-TPS16850VMARTR-ND"},+        "wikiUrl": "https://wiki.adom.inc/adom/tps16850vmar", "pinLayout": "left-right", "pins": P,+        "pinDescriptions": {(f"{p['name']} ({p['number']})" if p["name"] in ("IN", "OUT", "NC") else p["name"]): p["description"] for p in P},+        "groupDescriptions": {+            "Power in": "The FET's input side: pins 10, 22, 23 and the exposed pad are all IN and carry the load current; VDD powers the controller from a filtered copy of the input.",+            "Control": "Enable with undervoltage threshold, overvoltage threshold, standalone or secondary mode, and the start-up slew rate.",+            "Current setting": "Reference voltage, overcurrent blanking timer and scalable fast-trip multiplier, which shape the circuit-breaker response.",+            "Power out": "The FET's output side, pins 7 and 8.",+            "Current monitor": "IMON sets the circuit-breaker threshold and reports the load current; ILIM sets the current-sharing threshold and reports this device's share.",+            "Status": "Open-drain power-good and fault flags, the switch-enable line that synchronises a parallel chain, and the analog temperature output.",+            "Ground": "Device ground reference.",+            "No connect": "Pins 11, 17 and 21: do not connect anything to them."}}+json.dump(spec, open(sys.argv[1], "w"), indent=1)+print("OK", len(P), "pins")
provenance/tps16850vmar-etched.mark-plan.jsonadded+149
@@ -0,0 +1,149 @@+{+ "plan": {+  "schema": "adom/mark-plan@1",+  "mpn": "TPS16850VMAR",+  "step": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/model/tps16850vmar.step",+  "footprint": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/fp/tps16850vmar.kicad_mod",+  "standUp": [],+  "standUpSource": "as-is (Z up)",+  "inputs": {+   "up": "auto",+   "face": "auto",+   "along": null,+   "upSupplied": false,+   "faceSupplied": false,+   "faceSource": "inferred: top face"+  },+  "face": "top",+  "pin1": {+   "source": "footprint pad 1",+   "xyMm": [+    -2.875,+    0.5+   ],+   "corner": "left/upper"+  },+  "existingMarks": [],+  "vendorMarking": {+   "present": false,+   "glyphFaces": 0+  },+  "faceNormal": [+   0,+   0,+   1+  ],+  "longAxis": {+   "axis": "x",+   "vector": [+    1.0,+    0.0,+    0.0+   ],+   "why": "longest usable top dimension (6.00 mm vs 5.00 mm)",+   "source": "longest",+   "override": null,+   "pinRows": null+  },+  "readingDirection": {+   "vector": [+    1.0,+    0.0,+    0.0+   ],+   "angleDeg": 0,+   "textUp": [+    -0.0,+    1.0,+    0.0+   ],+   "rule": "pin 1 / pad 1 at the start (left) of the text, and below it when it sits on a side"+  },+  "band": {+   "regionMm": [+    -3.0,+    -2.5,+    3.0,+    2.5+   ],+   "zMm": 1.4,+   "lengthMm": 6.0,+   "heightMm": 5.0,+   "why": "highest flat face over the body centre",+   "terminationsExcludedBy": null,+   "trimmedEnds": [],+   "keepouts": [],+   "sideTurn": null,+   "margins": {+    "lengthEachSide": 0.12,+    "heightEachSide": 0.15+   }+  },+  "text": {+   "lines": [+    "TPS16850",+    "VMAR"+   ],+   "chars": 12,+   "capHeightMm": 0.7147,+   "smallestLineMm": 0.7147,+   "heightPctOfBand": 32.9,+   "why": "two lines: the smaller line (0.715 mm) beats one line (0.472 mm) by 1.51x",+   "alternative": {+    "lines": [+     "TPS16850VMAR"+    ],+    "capHeightMm": 0.472,+    "smallestLineMm": 0.472+   },+   "font": "service-step2glb /laser-etch (single-stroke outline font)"+  },+  "etch": {+   "poseQuarterTurnsZ": 0,+   "service": "/laser-etch?mode=flat",+   "note": "turn so the reading direction is +X, etch, fit the mark into the band, turn back"+  },+  "outline": {+   "upAxis": "z",+   "poseRotZDeg": 180,+   "rot": 180,+   "recipe": "adom-aiflow-etch outline <part.step> --footprint <part.kicad_mod> --mpn TPS16850VMAR (stands the STEP up (as-is (Z up)), turns it 180 deg about Z and draws TPS16850 / VMAR on the planned band, rot 180)",+   "why": "iso camera looks from +X+Y+Z: text along +Y (rot 90) or -X (rot 180) reads left to right with pin 1 toward the viewer"+  },+  "widget": {+   "px": 320,+   "pxPerMm": 37.03,+   "capHeightPx": 21.6+  },+  "hints": [],+  "warnings": [+   "pin 1 lands UPPER-left in the standard pose (left/upper): the pads are numbered clockwise; check the footprint is not mirrored and the model matches it"+  ],+  "summary": "Mark along the 6.00 mm axis (+X), 0.71 mm text (2 lines), upright with pin 1 left upper, outline rot 180 after a 180 deg pose turn; ~22 px caps at 320 px"+ },+ "etch": {+  "out": "/home/adom/project/uta-dynos/work/pages/tps16850vmar/work/model/tps16850vmar-etched.step",+  "mpn": "TPS16850VMAR",+  "lines": [+   "TPS16850",+   "VMAR"+  ],+  "removedOldMarks": [],+  "turns": [],+  "serviceMarkTurnedQuarter": 0,+  "line2Scaled": true,+  "fit": {+   "scale": 0.8756,+   "capMm": 0.7188,+   "markMm": [+    4.56,+    1.6605+   ],+   "bandMm": [+    6.0,+    5.0+   ],+   "zMm": 1.405+  }+ }+}\ No newline at end of file
provenance/tps16850vmar-lbr-input.kicad_modadded+110
@@ -0,0 +1,110 @@+(footprint "tps16850vmar"+  (version 20240108)+  (generator "adom-footprint")+  (layer "F.Cu")+  (descr "TI VMA0023A LQFN-CLIP-23, 6.0 x 5.0 mm, 1.5 mm max height; land pattern and stencil per TI SLVSHA1D p.55-56 (TPS1685x eFuse)")+  (tags "TPS1685 TPS16850 VMA0023A LQFN-CLIP QFN eFuse")+  (attr smd)+  (fp_rect (start -3.6 -3.1) (end 3.6 3.1)+    (stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd"))+  (fp_text reference "REF**" (at 0 -4)+    (layer "F.SilkS") (effects (font (size 1 1) (thickness 0.15))))+  (fp_text value "TPS16850VMAR" (at 0 4)+    (layer "F.Fab") (effects (font (size 1 1) (thickness 0.15))))+  (pad "1" smd roundrect (at -2.875 -0.5) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "2" smd roundrect (at -2.875 0) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "3" smd roundrect (at -2.875 0.5) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "4" smd roundrect (at -2.875 1) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "5" smd roundrect (at -2.85 1.5) (size 0.7 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "8" smd roundrect (at 0.225 2.325) (size 0.25 0.75)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "9" smd roundrect (at 1.275 2.325) (size 0.25 0.75)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "11" smd roundrect (at 2.875 0.925) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "12" smd roundrect (at 2.875 0.425) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "13" smd roundrect (at 2.875 -0.075) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "14" smd roundrect (at 2.875 -0.575) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "15" smd roundrect (at 2.875 -1.075) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "16" smd roundrect (at 2.875 -1.575) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "18" smd roundrect (at 1.85 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "19" smd roundrect (at 1.35 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "20" smd roundrect (at 0.85 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "21" smd roundrect (at 0.35 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "23" smd roundrect (at -2.55 -1.55) (size 1.3 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "24" smd rect (at 0 -0.075) (size 3.4 2.35)+    (layers "F.Cu" "F.Mask"))+  (pad "24" thru_hole circle (at -1.45 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -1.45 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -1.45 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (fp_poly (pts (xy -2.5 -2.5) (xy 3 -2.5) (xy 3 2.5) (xy -3 2.5) (xy -3 -2)) (stroke (width 0.1) (type default)) (fill none) (layer "F.Fab"))+  (fp_line (start -3.45 -2.95) (end 3.45 -2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start 3.45 -2.95) (end 3.45 2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start 3.45 2.95) (end -3.45 2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start -3.45 2.95) (end -3.45 -2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_circle (center -3.8 -0.5) (end -3.68 -0.5)+    (stroke (width 0.1) (type default)) (fill solid) (layer "F.SilkS"))+  (pad "6" smd rect (at -2.85 2) (size 0.7 0.25) (layers "F.Cu" "F.Paste" "F.Mask"))+  (pad "6" smd rect (at -2.65 2.2875) (size 0.3 0.825) (layers "F.Cu" "F.Paste" "F.Mask"))+  (pad "17" smd rect (at 2.35 -2.3) (size 0.25 0.8) (layers "F.Cu" "F.Paste" "F.Mask"))+  (pad "17" smd rect (at 2.7125 -2.025) (size 0.975 0.25) (layers "F.Cu" "F.Paste" "F.Mask"))+  (pad "22" smd rect (at -2.1 -2.3125) (size 2.3 0.875) (layers "F.Cu") (solder_mask_margin -1.2) (solder_paste_margin -1.2))+  (pad "22" smd rect (at -2.975 -2.05) (size 0.45 0.25) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "22" smd rect (at -1.875 -2.0875) (size 1.75 0.325) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "22" smd rect (at -2.625 -2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "22" smd rect (at -2.125 -2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "22" smd rect (at -1.625 -2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "22" smd rect (at -1.125 -2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "7" smd rect (at -0.925 2.325) (size 1.65 0.85) (layers "F.Cu") (solder_mask_margin -1.2) (solder_paste_margin -1.2))+  (pad "7" smd rect (at -0.925 2.1) (size 1.55 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "7" smd rect (at -1.6 2.475) (size 0.2 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "7" smd rect (at -1.15 2.475) (size 0.2 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "7" smd rect (at -0.7 2.475) (size 0.2 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "7" smd rect (at -0.25 2.475) (size 0.2 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "10" smd rect (at 2.425 2.275) (size 1.65 0.95) (layers "F.Cu") (solder_mask_margin -1.2) (solder_paste_margin -1.2))+  (pad "10" smd rect (at 2.425 2.05) (size 1.55 0.4) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "10" smd rect (at 1.775 2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (pad "10" smd rect (at 2.275 2.475) (size 0.25 0.45) (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0))+  (model "${KIPRJMOD}/tps16850vmar-etched.step"+    (offset (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)))+)
tps16850vmar-etched.glbadded
⋯ 1 unchanged line ⋯
tps16850vmar-hero.overlay.jsonadded+807
@@ -0,0 +1,807 @@+{+ "spec": "adom-hero 1.4",+ "mpn": "TPS16850VMAR",+ "kind": "component + footprint reference art",+ "board_use": false,+ "plane_z_mm": -0.02,+ "units": "metre",+ "upAxis": "Z",+ "layers": {+  "pad_outlines": {+   "material": "Footprint pads - teal dashed outlines - 50 percent opacity",+   "rgba": [+    0.0,+    0.902,+    0.863,+    0.5+   ],+   "pads": 39,+   "span_mm": 9.15,+   "dash_mm": 0.2288,+   "gap_mm": 0.1373,+   "pad_stroke_mm": 0.0549+  },+  "silkscreen": {+   "material": "Silkscreen reference lines - 30 percent opacity",+   "rgba": [+    0.92,+    0.96,+    1.0,+    0.3+   ],+   "footprint_items": 5,+   "pin1": {+    "source": "footprint silkscreen",+    "pad": "1"+   }+  },+  "signal_names": {+   "material": "Signal names - 50 percent opacity",+   "rgba": [+    0.92,+    0.96,+    1.0,+    0.5+   ],+   "font": "DejaVu Sans Mono",+   "labels": 24,+   "sides": "top + mirrored underside (single-sided)",+   "omitted": null,+   "fallback_to_pad_number": 0+  }+ },+ "align": {+  "ok": true,+  "centre_offset_mm": 0.0,+  "tolerance_mm": 0.52,+  "orientation_flipped": false,+  "contacts_bbox_mm": [+   -3.0,+   3.0,+   -2.5,+   2.5+  ],+  "pads_bbox_mm": [+   -3.25,+   3.25,+   -2.75,+   2.75+  ],+  "seating_z_mm": 0.0+ },+ "sources": {+  "glb": "tps16850vmar-etched.glb",+  "glb_sha256": "2a49d1a2afab9135eb2af4a6c77c617bcad3b6cae0eb77c83ec58ebbe0b0e841",+  "footprint": "tps16850vmar.kicad_mod",+  "footprint_sha256": "a4d037c209a248d09f6d1501b6df71442a5bb021a5022c6d159bd36c82693a0c",+  "pins": "page.json component.pins"+ },+ "generator": "factory/hero_glb.py",+ "labels": [+  {+   "pad": "1",+   "text": "ILIM",+   "x": -4.02,+   "y": -0.5,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "2",+   "text": "IMON",+   "x": -3.3,+   "y": 0.0,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "3",+   "text": "IREF",+   "x": -3.3,+   "y": 0.5,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "4",+   "text": "dVdT",+   "x": -3.3,+   "y": 1.0,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "5",+   "text": "GND",+   "x": -3.3,+   "y": 1.5,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "8",+   "text": "OUT",+   "x": 0.225,+   "y": 2.831,+   "align": "right",+   "vertical": true,+   "h": 0.525+  },+  {+   "pad": "9",+   "text": "VDD",+   "x": 1.275,+   "y": 2.831,+   "align": "right",+   "vertical": true,+   "h": 0.525+  },+  {+   "pad": "11",+   "text": "NC",+   "x": 3.3,+   "y": 0.925,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "12",+   "text": "MODE",+   "x": 3.3,+   "y": 0.425,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "13",+   "text": "~{FLT}",+   "x": 3.3,+   "y": -0.075,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "14",+   "text": "ITIMER",+   "x": 3.3,+   "y": -0.575,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "15",+   "text": "TEMP",+   "x": 3.3,+   "y": -1.075,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "16",+   "text": "EN/UVLO",+   "x": 3.3,+   "y": -1.575,+   "align": "left",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "18",+   "text": "OVP",+   "x": 1.85,+   "y": -2.8,+   "align": "left",+   "vertical": true,+   "h": 0.25+  },+  {+   "pad": "19",+   "text": "PGOOD",+   "x": 1.35,+   "y": -2.8,+   "align": "left",+   "vertical": true,+   "h": 0.25+  },+  {+   "pad": "20",+   "text": "SWEN",+   "x": 0.85,+   "y": -2.8,+   "align": "left",+   "vertical": true,+   "h": 0.25+  },+  {+   "pad": "21",+   "text": "NC",+   "x": 0.35,+   "y": -2.8,+   "align": "left",+   "vertical": true,+   "h": 0.25+  },+  {+   "pad": "23",+   "text": "IN",+   "x": -3.35,+   "y": -1.55,+   "align": "right",+   "vertical": false,+   "h": 0.6+  },+  {+   "pad": "24",+   "text": "IN",+   "x": -1.8,+   "y": -0.875,+   "align": "right",+   "vertical": false,+   "h": 0.4+  },+  {+   "pad": "6",+   "text": "SFT_SEL",+   "x": -3.3,+   "y": 2.0,+   "align": "right",+   "vertical": false,+   "h": 0.25+  },+  {+   "pad": "17",+   "text": "NC",+   "x": 2.35,+   "y": -2.85,+   "align": "left",+   "vertical": true,+   "h": 0.6+  },+  {+   "pad": "22",+   "text": "IN",+   "x": -2.1,+   "y": -2.85,+   "align": "left",+   "vertical": true,+   "h": 0.12+  },+  {+   "pad": "7",+   "text": "OUT",+   "x": -0.925,+   "y": 2.85,+   "align": "right",+   "vertical": true,+   "h": 0.12+  },+  {+   "pad": "10",+   "text": "IN",+   "x": 2.4,+   "y": 2.85,+   "align": "right",+   "vertical": true,+   "h": 0.12+  }+ ],+ "pads": [+  {+   "number": "1",+   "shape": "roundrect",+   "center_mm": [+    -2.875,+    -0.5+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "2",+   "shape": "roundrect",+   "center_mm": [+    -2.875,+    0.0+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "3",+   "shape": "roundrect",+   "center_mm": [+    -2.875,+    0.5+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "4",+   "shape": "roundrect",+   "center_mm": [+    -2.875,+    1.0+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "5",+   "shape": "roundrect",+   "center_mm": [+    -2.85,+    1.5+   ],+   "size_mm": [+    0.7,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "8",+   "shape": "roundrect",+   "center_mm": [+    0.225,+    2.325+   ],+   "size_mm": [+    0.25,+    0.75+   ],+   "rot": 0.0+  },+  {+   "number": "9",+   "shape": "roundrect",+   "center_mm": [+    1.275,+    2.325+   ],+   "size_mm": [+    0.25,+    0.75+   ],+   "rot": 0.0+  },+  {+   "number": "11",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    0.925+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "12",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    0.425+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "13",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    -0.075+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "14",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    -0.575+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "15",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    -1.075+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "16",+   "shape": "roundrect",+   "center_mm": [+    2.875,+    -1.575+   ],+   "size_mm": [+    0.65,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "18",+   "shape": "roundrect",+   "center_mm": [+    1.85,+    -2.4+   ],+   "size_mm": [+    0.25,+    0.6+   ],+   "rot": 0.0+  },+  {+   "number": "19",+   "shape": "roundrect",+   "center_mm": [+    1.35,+    -2.4+   ],+   "size_mm": [+    0.25,+    0.6+   ],+   "rot": 0.0+  },+  {+   "number": "20",+   "shape": "roundrect",+   "center_mm": [+    0.85,+    -2.4+   ],+   "size_mm": [+    0.25,+    0.6+   ],+   "rot": 0.0+  },+  {+   "number": "21",+   "shape": "roundrect",+   "center_mm": [+    0.35,+    -2.4+   ],+   "size_mm": [+    0.25,+    0.6+   ],+   "rot": 0.0+  },+  {+   "number": "23",+   "shape": "roundrect",+   "center_mm": [+    -2.55,+    -1.55+   ],+   "size_mm": [+    1.3,+    0.25+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "rect",+   "center_mm": [+    0.0,+    -0.075+   ],+   "size_mm": [+    3.4,+    2.35+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -1.45,+    -0.875+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -0.59,+    -0.875+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    0.59,+    -0.875+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    1.45,+    -0.875+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -1.45,+    -0.075+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -0.59,+    -0.075+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    0.59,+    -0.075+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    1.45,+    -0.075+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -1.45,+    0.725+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    -0.59,+    0.725+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    0.59,+    0.725+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "24",+   "shape": "circle",+   "center_mm": [+    1.45,+    0.725+   ],+   "size_mm": [+    0.5,+    0.5+   ],+   "rot": 0.0+  },+  {+   "number": "6",+   "shape": "custom",+   "center_mm": [+    -2.65,+    2.0+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "17",+   "shape": "custom",+   "center_mm": [+    2.35,+    -2.025+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "22",+   "shape": "custom",+   "center_mm": [+    -2.1,+    -2.05+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "22",+   "shape": "custom",+   "center_mm": [+    -2.1,+    -2.05+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "7",+   "shape": "custom",+   "center_mm": [+    -0.925,+    2.1+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "7",+   "shape": "custom",+   "center_mm": [+    -0.925,+    2.1+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "10",+   "shape": "custom",+   "center_mm": [+    2.4,+    2.05+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  },+  {+   "number": "10",+   "shape": "custom",+   "center_mm": [+    2.4,+    2.05+   ],+   "size_mm": [+    0.2,+    0.2+   ],+   "rot": 0.0+  }+ ]+}\ No newline at end of file
tps16850vmar.glbadded
⋯ 1 unchanged line ⋯
tps16850vmar.kicad_modadded+127
@@ -0,0 +1,127 @@+(footprint "tps16850vmar"+  (version 20240108)+  (generator "adom-footprint")+  (layer "F.Cu")+  (descr "TI VMA0023A LQFN-CLIP-23, 6.0 x 5.0 mm, 1.5 mm max height; land pattern and stencil per TI SLVSHA1D p.55-56 (TPS1685x eFuse)")+  (tags "TPS1685 TPS16850 VMA0023A LQFN-CLIP QFN eFuse")+  (attr smd)+  (fp_rect (start -3.6 -3.1) (end 3.6 3.1)+    (stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd"))+  (fp_text reference "REF**" (at 0 -4)+    (layer "F.SilkS") (effects (font (size 1 1) (thickness 0.15))))+  (fp_text value "TPS16850VMAR" (at 0 4)+    (layer "F.Fab") (effects (font (size 1 1) (thickness 0.15))))+  (pad "1" smd roundrect (at -2.875 -0.5) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "2" smd roundrect (at -2.875 0) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "3" smd roundrect (at -2.875 0.5) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "4" smd roundrect (at -2.875 1) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "5" smd roundrect (at -2.85 1.5) (size 0.7 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "8" smd roundrect (at 0.225 2.325) (size 0.25 0.75)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "9" smd roundrect (at 1.275 2.325) (size 0.25 0.75)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "11" smd roundrect (at 2.875 0.925) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "12" smd roundrect (at 2.875 0.425) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "13" smd roundrect (at 2.875 -0.075) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "14" smd roundrect (at 2.875 -0.575) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "15" smd roundrect (at 2.875 -1.075) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "16" smd roundrect (at 2.875 -1.575) (size 0.65 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "18" smd roundrect (at 1.85 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "19" smd roundrect (at 1.35 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "20" smd roundrect (at 0.85 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "21" smd roundrect (at 0.35 -2.4) (size 0.25 0.6)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "23" smd roundrect (at -2.55 -1.55) (size 1.3 0.25)+    (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.2))+  (pad "24" smd rect (at 0 -0.075) (size 3.4 2.35)+    (layers "F.Cu" "F.Mask"))+  (pad "24" thru_hole circle (at -1.45 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 -0.875) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -1.45 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 -0.075) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -1.45 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at -0.59 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 0.59 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (pad "24" thru_hole circle (at 1.45 0.725) (size 0.5 0.5) (drill 0.2)+    (layers "*.Cu") (property pad_prop_heatsink))+  (fp_poly (pts (xy -2.5 -2.5) (xy 3 -2.5) (xy 3 2.5) (xy -3 2.5) (xy -3 -2)) (stroke (width 0.1) (type default)) (fill none) (layer "F.Fab"))+  (fp_line (start -3.45 -2.95) (end 3.45 -2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start 3.45 -2.95) (end 3.45 2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start 3.45 2.95) (end -3.45 2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_line (start -3.45 2.95) (end -3.45 -2.95)+    (stroke (width 0.1) (type default)) (layer "F.SilkS"))+  (fp_circle (center -3.8 -0.5) (end -3.68 -0.5)+    (stroke (width 0.1) (type default)) (fill solid) (layer "F.SilkS"))+  (pad "6" smd custom (at -2.65 2) (size 0.2 0.2)+    (layers "F.Cu" "F.Paste" "F.Mask")+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.55 -0.125) (xy 0.15 -0.125) (xy 0.15 0.7) (xy -0.15 0.7) (xy -0.15 0.125) (xy -0.55 0.125)) (width 0) (fill yes))))+  (pad "17" smd custom (at 2.35 -2.025) (size 0.2 0.2)+    (layers "F.Cu" "F.Paste" "F.Mask")+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.125 -0.675) (xy 0.125 -0.675) (xy 0.125 -0.125) (xy 0.85 -0.125) (xy 0.85 0.125) (xy -0.125 0.125)) (width 0) (fill yes))))+  (pad "22" smd custom (at -2.1 -2.05) (size 0.2 0.2)+    (layers "F.Cu")+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -1.15 -0.7) (xy 1.15 -0.7) (xy 1.15 0.175) (xy -1.15 0.175)) (width 0) (fill yes))))+  (pad "22" smd custom (at -2.1 -2.05) (size 0.2 0.2)+    (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0)+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -1.1 0.125) (xy 1.1 0.125) (xy 1.1 -0.65) (xy 0.85 -0.65) (xy 0.85 -0.2) (xy 0.6 -0.2) (xy 0.6 -0.65) (xy 0.35 -0.65) (xy 0.35 -0.2) (xy 0.1 -0.2) (xy 0.1 -0.65) (xy -0.15 -0.65) (xy -0.15 -0.2) (xy -0.4 -0.2) (xy -0.4 -0.65) (xy -0.65 -0.65) (xy -0.65 -0.125) (xy -1.1 -0.125)) (width 0) (fill yes))))+  (pad "7" smd custom (at -0.925 2.1) (size 0.2 0.2)+    (layers "F.Cu")+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.825 -0.2) (xy 0.825 -0.2) (xy 0.825 0.65) (xy -0.825 0.65)) (width 0) (fill yes))))+  (pad "7" smd custom (at -0.925 2.1) (size 0.2 0.2)+    (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0)+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.775 -0.15) (xy 0.775 -0.15) (xy 0.775 0.6) (xy 0.575 0.6) (xy 0.575 0.15) (xy 0.325 0.15) (xy 0.325 0.6) (xy 0.125 0.6) (xy 0.125 0.15) (xy -0.125 0.15) (xy -0.125 0.6) (xy -0.325 0.6) (xy -0.325 0.15) (xy -0.575 0.15) (xy -0.575 0.6) (xy -0.775 0.6)) (width 0) (fill yes))))+  (pad "10" smd custom (at 2.4 2.05) (size 0.2 0.2)+    (layers "F.Cu")+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.8 -0.25) (xy 0.85 -0.25) (xy 0.85 0.7) (xy -0.8 0.7)) (width 0) (fill yes))))+  (pad "10" smd custom (at 2.4 2.05) (size 0.2 0.2)+    (layers "F.Cu" "F.Paste" "F.Mask") (solder_mask_margin 0)+    (options (clearance outline) (anchor rect))+    (primitives (gr_poly (pts (xy -0.75 -0.2) (xy 0.8 -0.2) (xy 0.8 0.2) (xy 0 0.2) (xy 0 0.65) (xy -0.25 0.65) (xy -0.25 0.2) (xy -0.5 0.2) (xy -0.5 0.65) (xy -0.75 0.65)) (width 0) (fill yes))))+  (pad "" smd roundrect (at -1.18 -0.695) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (pad "" smd roundrect (at 0 -0.695) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (pad "" smd roundrect (at 1.18 -0.695) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (pad "" smd roundrect (at -1.18 0.545) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (pad "" smd roundrect (at 0 0.545) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (pad "" smd roundrect (at 1.18 0.545) (size 0.98 1.04) (layers "F.Paste") (roundrect_rratio 0.051))+  (model "${KIPRJMOD}/tps16850vmar-etched.step"+    (offset (xyz 0 0 0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0)))+)
tps16850vmar.kicad_symadded+345
@@ -0,0 +1,345 @@+(kicad_symbol_lib+  (version 20231120)+  (generator "adom")+  (symbol "TPS16850VMAR"+    (pin_names (offset 1.016))+    (exclude_from_sim no)+    (in_bom yes)+    (on_board yes)+    (property "Reference" "U"+      (at 0.00 5.08 0)+      (effects (font (size 1.27 1.27)))+    )+    (property "Value" "TPS16850VMAR"+      (at 0.00 -55.88 0)+      (effects (font (size 1.27 1.27)))+    )+    (property "Footprint" "tps16850vmar:tps16850vmar"+      (at 0 -60.96 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Datasheet" "https://www.ti.com/lit/ds/symlink/tps1685.pdf"+      (at 0 -63.50 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Description" "9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA). 2-column symbol, pins grouped by function."+      (at 0 -66.04 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Manufacturer" "Texas Instruments"+      (at 0 -68.58 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "MPN" "TPS16850VMAR"+      (at 0 -71.12 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Adom Wiki" "https://wiki.adom.inc/adom/tps16850vmar"+      (at 0 -73.66 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "DigiKey" "296-TPS16850VMARTR-ND"+      (at 0 -76.20 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Mouser" "595-TPS16850VMAR"+      (at 0 -78.74 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (property "Adom_Chip_Outline" "asset:TPS16850VMAR-3d-outline-dark-named.svg@large"+      (at 0 -81.28 0)+      (effects (font (size 1.27 1.27)) (hide yes))+    )+    (symbol "TPS16850VMAR_0_1"+      (rectangle (start -20.32 2.54) (end 20.32 -53.34)+        (stroke (width 0.254) (type default))+        (fill (type background))+      )+      (text "Power in" (at -19.30 -0.54 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify left))+      )+      (text "Control" (at -19.30 -18.32 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify left))+      )+      (text "Current setting" (at -19.30 -33.56 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify left))+      )+      (text "Power out" (at 19.30 -0.54 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+      )+      (text "Current monitor" (at 19.30 -10.70 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+      )+      (text "Status" (at 19.30 -20.86 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+      )+      (text "Ground" (at 19.30 -36.10 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+      )+      (text "No connect" (at 19.30 -43.72 0)+        (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+      )+      (polyline (pts (xy -0.349 -28.253) (xy -3.840 -26.237)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.349 -29.361) (xy -0.349 -28.253)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.349 -29.361) (xy -0.611 -29.210)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.611 -29.210) (xy -0.611 -29.069)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.611 -29.069) (xy -0.785 -28.968)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.785 -29.109) (xy -0.785 -28.968)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.785 -29.109) (xy -0.960 -29.009)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.960 -29.009) (xy -0.960 -28.868)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.767) (xy -0.960 -28.868)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.908) (xy -1.135 -28.767)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.908) (xy -1.309 -28.807)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.309 -28.807) (xy -1.309 -28.666)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.565) (xy -1.309 -28.666)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.706) (xy -1.484 -28.565)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.706) (xy -1.658 -28.605)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.658 -28.605) (xy -1.658 -28.464)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.364) (xy -1.658 -28.464)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.505) (xy -1.833 -28.364)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.505) (xy -2.007 -28.404)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.007 -28.404) (xy -2.007 -28.263)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.162) (xy -2.007 -28.263)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.303) (xy -2.182 -28.162)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.303) (xy -2.357 -28.203)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.357 -28.203) (xy -2.357 -28.061)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -27.960) (xy -2.357 -28.061)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -28.102) (xy -2.531 -27.960)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -28.102) (xy -3.089 -27.779)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.089 -27.779) (xy -3.089 -27.638)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.537) (xy -3.089 -27.638)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.678) (xy -3.264 -27.537)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.678) (xy -3.439 -27.578)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.439 -27.578) (xy -3.439 -27.437)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.336) (xy -3.439 -27.437)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.477) (xy -3.613 -27.336)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.477) (xy -3.840 -27.346)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.840 -27.346) (xy -3.840 -26.237)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.349 -28.253) (xy 3.840 -25.834)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.840 -25.834) (xy 0.349 -23.819)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.840 -26.237) (xy 0.349 -23.819)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.160) (xy 0.559 -28.837)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.212) (xy 1.815 -28.112)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.990 -28.011) (xy 2.549 -27.688)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.723 -27.588) (xy 2.897 -27.487)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.019) (xy -0.209 -29.140)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.349 -29.361) (xy -0.209 -29.281)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.840 -26.943) (xy 3.840 -25.834)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.185) (xy 3.840 -26.943)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.185) (xy 3.421 -27.044)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.044) (xy 3.247 -27.144)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.247 -27.285) (xy 3.247 -27.144)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.386) (xy 3.247 -27.285)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.386) (xy 3.072 -27.245)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.245) (xy 2.897 -27.346)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.897 -27.487) (xy 2.897 -27.346)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.723 -27.588) (xy 2.723 -27.447)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.549 -27.547) (xy 2.723 -27.447)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.549 -27.688) (xy 2.549 -27.547)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.990 -28.011) (xy 1.990 -27.870)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.815 -27.971) (xy 1.990 -27.870)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.815 -28.112) (xy 1.815 -27.971)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.212) (xy 1.641 -28.071)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.071) (xy 1.501 -28.152)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.501 -28.293) (xy 1.501 -28.152)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.394) (xy 1.501 -28.293)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.394) (xy 1.327 -28.253)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.253) (xy 1.187 -28.333)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.187 -28.475) (xy 1.187 -28.333)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.575) (xy 1.187 -28.475)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.575) (xy 1.013 -28.434)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.434) (xy 0.873 -28.515)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.873 -28.656) (xy 0.873 -28.515)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.757) (xy 0.873 -28.656)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.757) (xy 0.698 -28.616)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.616) (xy 0.559 -28.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.559 -28.837) (xy 0.559 -28.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.160) (xy 0.000 -29.019)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.209 -29.281) (xy -0.209 -29.140)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.342 -28.215) (xy -2.339 -28.212)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.342 -28.210) (xy -2.342 -28.215)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.993 -28.416) (xy -1.990 -28.414)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.993 -28.412) (xy -1.993 -28.416)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.644 -28.618) (xy -1.641 -28.616)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.644 -28.614) (xy -1.644 -28.618)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.295 -28.819) (xy -1.292 -28.817)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.295 -28.815) (xy -1.295 -28.819)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.946 -29.021) (xy -0.943 -29.019)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.946 -29.017) (xy -0.946 -29.021)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.798 -28.122) (xy 1.801 -28.124)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.801 -28.124) (xy 1.801 -28.120)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.531 -27.699) (xy 2.534 -27.701)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.534 -27.701) (xy 2.534 -27.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.076 -27.791) (xy -3.072 -27.789)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.076 -27.787) (xy -3.076 -27.791)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.223 -29.293) (xy -0.227 -29.291)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.593 -29.220) (xy -0.597 -29.222)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.597 -29.222) (xy -0.597 -29.218)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.223 -29.289) (xy -0.223 -29.293)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.545 -28.849) (xy 0.541 -28.847)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.545 -28.845) (xy 0.545 -28.849)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.487 -28.305) (xy 1.484 -28.303)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.173 -28.487) (xy 1.169 -28.485)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.859 -28.668) (xy 0.855 -28.666)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.487 -28.301) (xy 1.487 -28.305)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.859 -28.664) (xy 0.859 -28.668)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.173 -28.482) (xy 1.173 -28.487)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.884 -27.499) (xy 2.880 -27.497)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.233 -27.297) (xy 3.229 -27.295)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.884 -27.495) (xy 2.884 -27.499)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.233 -27.293) (xy 3.233 -27.297)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.425 -27.590) (xy -3.421 -27.588)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.425 -27.586) (xy -3.425 -27.590)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.357 -28.223) (xy -2.342 -28.215)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.357 -28.223) (xy -2.357 -28.061)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.342 -28.210) (xy -2.342 -28.215)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -28.122) (xy -2.357 -28.223)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -27.960) (xy -2.357 -28.061)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.531 -28.122) (xy -2.531 -27.960)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.007 -28.424) (xy -1.993 -28.416)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.007 -28.424) (xy -2.007 -28.263)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.993 -28.412) (xy -1.993 -28.416)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.323) (xy -2.007 -28.424)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.162) (xy -2.007 -28.263)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -2.182 -28.323) (xy -2.182 -28.162)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.658 -28.626) (xy -1.644 -28.618)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.658 -28.626) (xy -1.658 -28.464)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.644 -28.614) (xy -1.644 -28.618)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.525) (xy -1.658 -28.626)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.364) (xy -1.658 -28.464)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.833 -28.525) (xy -1.833 -28.364)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.309 -28.827) (xy -1.295 -28.819)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.309 -28.827) (xy -1.309 -28.666)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.295 -28.815) (xy -1.295 -28.819)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.726) (xy -1.309 -28.827)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.565) (xy -1.309 -28.666)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.484 -28.726) (xy -1.484 -28.565)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.960 -29.029) (xy -0.946 -29.021)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.960 -29.029) (xy -0.960 -28.868)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.946 -29.017) (xy -0.946 -29.021)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.928) (xy -0.960 -29.029)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.767) (xy -0.960 -28.868)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.135 -28.928) (xy -1.135 -28.767)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.815 -28.132) (xy 1.815 -27.971)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.815 -27.971) (xy 1.990 -27.870)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.990 -28.031) (xy 1.990 -27.870)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.815 -28.132) (xy 1.990 -28.031)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.801 -28.124) (xy 1.815 -28.132)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.801 -28.124) (xy 1.801 -28.120)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.549 -27.709) (xy 2.549 -27.547)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.549 -27.547) (xy 2.723 -27.447)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.723 -27.608) (xy 2.723 -27.447)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.549 -27.709) (xy 2.723 -27.608)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.534 -27.701) (xy 2.549 -27.709)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.534 -27.701) (xy 2.534 -27.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.089 -27.799) (xy -3.076 -27.791)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.089 -27.799) (xy -3.089 -27.638)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.076 -27.787) (xy -3.076 -27.791)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.699) (xy -3.089 -27.799)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.537) (xy -3.089 -27.638)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.264 -27.699) (xy -3.264 -27.537)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.785 -29.130) (xy -0.785 -28.968)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.611 -29.230) (xy -0.785 -29.130)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.597 -29.222) (xy -0.611 -29.230)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.597 -29.222) (xy -0.597 -29.218)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.611 -29.069) (xy -0.785 -28.968)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.611 -29.230) (xy -0.611 -29.069)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.180) (xy -0.209 -29.301)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.209 -29.301) (xy -0.223 -29.293)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.223 -29.289) (xy -0.223 -29.293)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.209 -29.301) (xy -0.209 -29.140)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.180) (xy 0.000 -29.019)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.000 -29.019) (xy -0.209 -29.140)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.559 -28.857) (xy 0.545 -28.849)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.559 -28.857) (xy 0.559 -28.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.545 -28.845) (xy 0.545 -28.849)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.777) (xy 0.559 -28.857)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.616) (xy 0.559 -28.696)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.698 -28.777) (xy 0.698 -28.616)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.233) (xy 1.641 -28.071)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.233) (xy 1.501 -28.313)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.501 -28.313) (xy 1.487 -28.305)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.641 -28.071) (xy 1.501 -28.152)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.501 -28.313) (xy 1.501 -28.152)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.487 -28.301) (xy 1.487 -28.305)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.873 -28.676) (xy 0.859 -28.668)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.596) (xy 0.873 -28.676)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.873 -28.676) (xy 0.873 -28.515)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.859 -28.664) (xy 0.859 -28.668)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.596) (xy 1.013 -28.434)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.013 -28.434) (xy 0.873 -28.515)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.414) (xy 1.187 -28.495)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.187 -28.495) (xy 1.173 -28.487)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.173 -28.482) (xy 1.173 -28.487)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.187 -28.495) (xy 1.187 -28.333)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.414) (xy 1.327 -28.253)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 1.327 -28.253) (xy 1.187 -28.333)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.897 -27.507) (xy 2.884 -27.499)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.406) (xy 2.897 -27.507)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.897 -27.507) (xy 2.897 -27.346)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 2.884 -27.495) (xy 2.884 -27.499)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.406) (xy 3.072 -27.245)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.072 -27.245) (xy 2.897 -27.346)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.205) (xy 3.247 -27.306)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.247 -27.306) (xy 3.233 -27.297)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.233 -27.293) (xy 3.233 -27.297)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.247 -27.306) (xy 3.247 -27.144)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.205) (xy 3.421 -27.044)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 3.421 -27.044) (xy 3.247 -27.144)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.439 -27.598) (xy -3.425 -27.590)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.439 -27.598) (xy -3.439 -27.437)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.425 -27.586) (xy -3.425 -27.590)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.497) (xy -3.439 -27.598)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.336) (xy -3.439 -27.437)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -3.613 -27.497) (xy -3.613 -27.336)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.817 -26.517) (xy -1.423 -26.745)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.949 -26.593) (xy -1.686 -26.441)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.592 -26.387) (xy -1.197 -26.615)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -1.592 -26.387) (xy -1.423 -26.289) (xy -1.348 -26.268) (xy -1.310 -26.268) (xy -1.254 -26.279) (xy -1.197 -26.311) (xy -1.178 -26.343) (xy -1.178 -26.365) (xy -1.216 -26.409) (xy -1.385 -26.506)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.897 -26.051) (xy -0.972 -26.051) (xy -1.047 -26.072) (xy -1.122 -26.116) (xy -1.160 -26.159) (xy -1.160 -26.203) (xy -1.122 -26.224) (xy -1.066 -26.235) (xy -1.028 -26.235) (xy -0.972 -26.224) (xy -0.822 -26.181) (xy -0.765 -26.170) (xy -0.728 -26.170) (xy -0.671 -26.181) (xy -0.615 -26.214) (xy -0.615 -26.257) (xy -0.653 -26.300) (xy -0.728 -26.343) (xy -0.803 -26.365) (xy -0.878 -26.365)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.709 -25.964) (xy -0.690 -25.932) (xy -0.690 -25.866) (xy -0.295 -26.094)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.164 -25.628) (xy -0.220 -25.617) (xy -0.295 -25.639) (xy -0.333 -25.660) (xy -0.371 -25.704) (xy -0.352 -25.758) (xy -0.277 -25.823) (xy -0.183 -25.877) (xy -0.089 -25.910) (xy -0.014 -25.910) (xy 0.061 -25.888) (xy 0.080 -25.877) (xy 0.118 -25.834) (xy 0.118 -25.790) (xy 0.080 -25.747) (xy 0.061 -25.736) (xy -0.014 -25.715) (xy -0.089 -25.715) (xy -0.164 -25.736) (xy -0.183 -25.747) (xy -0.220 -25.790) (xy -0.220 -25.834) (xy -0.183 -25.877)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.005 -25.465) (xy -0.033 -25.509) (xy -0.014 -25.541) (xy 0.024 -25.563) (xy 0.080 -25.574) (xy 0.137 -25.563) (xy 0.230 -25.530) (xy 0.305 -25.509) (xy 0.381 -25.509) (xy 0.437 -25.519) (xy 0.493 -25.552) (xy 0.512 -25.584) (xy 0.512 -25.606) (xy 0.475 -25.650) (xy 0.399 -25.693) (xy 0.324 -25.715) (xy 0.287 -25.715) (xy 0.230 -25.704) (xy 0.174 -25.671) (xy 0.155 -25.639) (xy 0.155 -25.595) (xy 0.193 -25.552) (xy 0.249 -25.498) (xy 0.268 -25.465) (xy 0.249 -25.433) (xy 0.212 -25.411) (xy 0.155 -25.400) (xy 0.080 -25.422) (xy 0.005 -25.465)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.512 -25.172) (xy 0.324 -25.281) (xy 0.475 -25.389) (xy 0.475 -25.368) (xy 0.512 -25.324) (xy 0.568 -25.292) (xy 0.643 -25.270) (xy 0.718 -25.270) (xy 0.794 -25.292) (xy 0.831 -25.313) (xy 0.869 -25.357) (xy 0.869 -25.400) (xy 0.831 -25.443) (xy 0.775 -25.476) (xy 0.700 -25.498) (xy 0.662 -25.498) (xy 0.606 -25.487)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.775 -25.020) (xy 0.737 -25.064) (xy 0.756 -25.118) (xy 0.831 -25.183) (xy 0.888 -25.216) (xy 1.000 -25.259) (xy 1.094 -25.270) (xy 1.169 -25.248) (xy 1.207 -25.227) (xy 1.245 -25.183) (xy 1.226 -25.129) (xy 1.151 -25.064) (xy 1.094 -25.032) (xy 0.982 -24.988) (xy 0.888 -24.977) (xy 0.813 -24.999) (xy 0.775 -25.020)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.643 -26.523) (xy -0.098 -26.664)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.343 -26.349) (xy -0.098 -26.664)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.249 -26.295) (xy 0.146 -26.523)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy -0.249 -26.295) (xy 0.296 -26.436)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.052 -26.121) (xy 0.296 -26.436)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.052 -26.121) (xy 0.446 -26.349)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.296 -25.980) (xy 0.540 -26.295)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.296 -25.980) (xy 0.841 -26.121)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.465 -26.186) (xy 0.653 -26.078)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.540 -25.839) (xy 0.935 -26.067)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.540 -25.839) (xy 0.709 -25.742) (xy 0.784 -25.720) (xy 0.822 -25.720) (xy 0.878 -25.731) (xy 0.916 -25.752) (xy 0.935 -25.785) (xy 0.935 -25.807) (xy 0.897 -25.850) (xy 0.728 -25.948)) (stroke (width 0.025) (type default)) (fill (type none)))+      (polyline (pts (xy 0.860 -25.872) (xy 1.198 -25.915)) (stroke (width 0.025) (type default)) (fill (type none)))+    )+    (symbol "TPS16850VMAR_1_1"+      (pin power_in line (at -22.86 -2.54 0) (length 2.54) (name "IN") (number "10"))+      (pin power_in line (at -22.86 -5.08 0) (length 2.54) (name "IN") (number "22"))+      (pin power_in line (at -22.86 -7.62 0) (length 2.54) (name "IN") (number "23"))+      (pin power_in line (at -22.86 -10.16 0) (length 2.54) (name "IN") (number "24"))+      (pin power_in line (at -22.86 -12.70 0) (length 2.54) (name "VDD") (number "9"))+      (pin input line (at -22.86 -20.32 0) (length 2.54) (name "EN/UVLO") (number "16"))+      (pin input line (at -22.86 -22.86 0) (length 2.54) (name "OVP") (number "18"))+      (pin input line (at -22.86 -25.40 0) (length 2.54) (name "MODE") (number "12"))+      (pin passive line (at -22.86 -27.94 0) (length 2.54) (name "dVdT") (number "4"))+      (pin passive line (at -22.86 -35.56 0) (length 2.54) (name "IREF") (number "3"))+      (pin passive line (at -22.86 -38.10 0) (length 2.54) (name "ITIMER") (number "14"))+      (pin passive line (at -22.86 -40.64 0) (length 2.54) (name "SFT_SEL") (number "6"))+      (pin power_out line (at 22.86 -2.54 180) (length 2.54) (name "OUT") (number "7"))+      (pin power_out line (at 22.86 -5.08 180) (length 2.54) (name "OUT") (number "8"))+      (pin passive line (at 22.86 -12.70 180) (length 2.54) (name "IMON") (number "2"))+      (pin passive line (at 22.86 -15.24 180) (length 2.54) (name "ILIM") (number "1"))+      (pin open_collector line (at 22.86 -22.86 180) (length 2.54) (name "PGOOD") (number "19"))+      (pin open_collector line (at 22.86 -25.40 180) (length 2.54) (name "~{FLT}") (number "13"))+      (pin bidirectional line (at 22.86 -27.94 180) (length 2.54) (name "SWEN") (number "20"))+      (pin bidirectional line (at 22.86 -30.48 180) (length 2.54) (name "TEMP") (number "15"))+      (pin power_in line (at 22.86 -38.10 180) (length 2.54) (name "GND") (number "5"))+      (pin no_connect line (at 22.86 -45.72 180) (length 2.54) (name "NC") (number "11"))+      (pin no_connect line (at 22.86 -48.26 180) (length 2.54) (name "NC") (number "17"))+      (pin no_connect line (at 22.86 -50.80 180) (length 2.54) (name "NC") (number "21"))+    )+  )+)
tps16850vmar.lbradded+571
@@ -0,0 +1,571 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+<drawing>+<settings><setting alwaysvectorfont="no"/></settings>+<grid distance="0.1" unitdist="inch" unit="inch" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="inch" altunit="inch"/>+<layers>+<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>+<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>+<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>+<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>+<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>+<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>+<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>+<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>+<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>+<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>+<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>+<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>+<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>+<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>+<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes"/>+<layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes"/>+<layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes"/>+<layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes"/>+<layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes"/>+<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>+<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>+<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>+<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>+<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>+<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>+<layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes"/>+<layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes"/>+<layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes"/>+<layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes"/>+<layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes"/>+<layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes"/>+<layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes"/>+<layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes"/>+</layers>+<library>+<description>9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA). 2-column symbol, pins grouped by function</description>+<packages>+<package name="tps16850vmar">+  <description>52 pads, 6.5 x 5.5 mm. TI VMA0023A LQFN-CLIP-23, 6.0 x 5.0 mm, 1.5 mm max height; land pattern and stencil per TI SLVSHA1D p.55-56 (TPS1685x eFuse)</description>+  <smd name="1" x="-2.8750" y="0.5000" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="2" x="-2.8750" y="-0.0000" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="3" x="-2.8750" y="-0.5000" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="4" x="-2.8750" y="-1.0000" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="5" x="-2.8500" y="-1.5000" dx="0.7000" dy="0.2500" layer="1" roundness="40"/>+  <smd name="8" x="0.2250" y="-2.3250" dx="0.2500" dy="0.7500" layer="1" roundness="40"/>+  <smd name="9" x="1.2750" y="-2.3250" dx="0.2500" dy="0.7500" layer="1" roundness="40"/>+  <smd name="11" x="2.8750" y="-0.9250" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="12" x="2.8750" y="-0.4250" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="13" x="2.8750" y="0.0750" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="14" x="2.8750" y="0.5750" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="15" x="2.8750" y="1.0750" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="16" x="2.8750" y="1.5750" dx="0.6500" dy="0.2500" layer="1" roundness="40"/>+  <smd name="18" x="1.8500" y="2.4000" dx="0.2500" dy="0.6000" layer="1" roundness="40"/>+  <smd name="19" x="1.3500" y="2.4000" dx="0.2500" dy="0.6000" layer="1" roundness="40"/>+  <smd name="20" x="0.8500" y="2.4000" dx="0.2500" dy="0.6000" layer="1" roundness="40"/>+  <smd name="21" x="0.3500" y="2.4000" dx="0.2500" dy="0.6000" layer="1" roundness="40"/>+  <smd name="23" x="-2.5500" y="1.5500" dx="1.3000" dy="0.2500" layer="1" roundness="40"/>+  <smd name="24" x="0.0000" y="0.0750" dx="3.4000" dy="2.3500" layer="1" cream="no"/>+  <pad name="24@2" x="-1.4500" y="0.8750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@3" x="-0.5900" y="0.8750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@4" x="0.5900" y="0.8750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@5" x="1.4500" y="0.8750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@6" x="-1.4500" y="0.0750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@7" x="-0.5900" y="0.0750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@8" x="0.5900" y="0.0750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@9" x="1.4500" y="0.0750" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@10" x="-1.4500" y="-0.7250" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@11" x="-0.5900" y="-0.7250" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@12" x="0.5900" y="-0.7250" drill="0.2000" diameter="0.5000" shape="round"/>+  <pad name="24@13" x="1.4500" y="-0.7250" drill="0.2000" diameter="0.5000" shape="round"/>+  <smd name="6" x="-2.8500" y="-2.0000" dx="0.7000" dy="0.2500" layer="1"/>+  <smd name="6@2" x="-2.6500" y="-2.2875" dx="0.3000" dy="0.8250" layer="1"/>+  <smd name="17" x="2.3500" y="2.3000" dx="0.2500" dy="0.8000" layer="1"/>+  <smd name="17@2" x="2.7125" y="2.0250" dx="0.9750" dy="0.2500" layer="1"/>+  <smd name="22" x="-2.1000" y="2.3125" dx="2.3000" dy="0.8750" layer="1" cream="no" stop="no"/>+  <smd name="22@2" x="-2.9750" y="2.0500" dx="0.4500" dy="0.2500" layer="1"/>+  <smd name="22@3" x="-1.8750" y="2.0875" dx="1.7500" dy="0.3250" layer="1"/>+  <smd name="22@4" x="-2.6250" y="2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <smd name="22@5" x="-2.1250" y="2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <smd name="22@6" x="-1.6250" y="2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <smd name="22@7" x="-1.1250" y="2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <smd name="7" x="-0.9250" y="-2.3250" dx="1.6500" dy="0.8500" layer="1" cream="no" stop="no"/>+  <smd name="7@2" x="-0.9250" y="-2.1000" dx="1.5500" dy="0.3000" layer="1"/>+  <smd name="7@3" x="-1.6000" y="-2.4750" dx="0.2000" dy="0.4500" layer="1"/>+  <smd name="7@4" x="-1.1500" y="-2.4750" dx="0.2000" dy="0.4500" layer="1"/>+  <smd name="7@5" x="-0.7000" y="-2.4750" dx="0.2000" dy="0.4500" layer="1"/>+  <smd name="7@6" x="-0.2500" y="-2.4750" dx="0.2000" dy="0.4500" layer="1"/>+  <smd name="10" x="2.4250" y="-2.2750" dx="1.6500" dy="0.9500" layer="1" cream="no" stop="no"/>+  <smd name="10@2" x="2.4250" y="-2.0500" dx="1.5500" dy="0.4000" layer="1"/>+  <smd name="10@3" x="1.7750" y="-2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <smd name="10@4" x="2.2750" y="-2.4750" dx="0.2500" dy="0.4500" layer="1"/>+  <circle x="-3.8000" y="0.5000" radius="0.1200" width="0.1000" layer="21"/>+  <wire x1="-2.5000" y1="2.5000" x2="3.0000" y2="2.5000" width="0.1000" layer="51"/>+  <wire x1="3.0000" y1="2.5000" x2="3.0000" y2="-2.5000" width="0.1000" layer="51"/>+  <wire x1="3.0000" y1="-2.5000" x2="-3.0000" y2="-2.5000" width="0.1000" layer="51"/>+  <wire x1="-3.0000" y1="-2.5000" x2="-3.0000" y2="2.0000" width="0.1000" layer="51"/>+  <wire x1="-3.0000" y1="2.0000" x2="-2.5000" y2="2.5000" width="0.1000" layer="51"/>+  <wire x1="-3.4500" y1="2.9500" x2="3.4500" y2="2.9500" width="0.1000" layer="21"/>+  <wire x1="3.4500" y1="2.9500" x2="3.4500" y2="-2.9500" width="0.1000" layer="21"/>+  <wire x1="3.4500" y1="-2.9500" x2="-3.4500" y2="-2.9500" width="0.1000" layer="21"/>+  <wire x1="-3.4500" y1="-2.9500" x2="-3.4500" y2="2.9500" width="0.1000" layer="21"/>+  <text x="0" y="4.062" size="1.27" layer="25" align="bottom-center">&gt;NAME</text>+  <text x="0" y="-3.750" size="1.27" layer="27" align="top-center">&gt;VALUE</text>+  <rectangle x1="-1.6700" y1="0.1750" x2="-0.6900" y2="1.2150" layer="31"/>+  <rectangle x1="-0.4900" y1="0.1750" x2="0.4900" y2="1.2150" layer="31"/>+  <rectangle x1="0.6900" y1="0.1750" x2="1.6700" y2="1.2150" layer="31"/>+  <rectangle x1="-1.6700" y1="-1.0650" x2="-0.6900" y2="-0.0250" layer="31"/>+  <rectangle x1="-0.4900" y1="-1.0650" x2="0.4900" y2="-0.0250" layer="31"/>+  <rectangle x1="0.6900" y1="-1.0650" x2="1.6700" y2="-0.0250" layer="31"/>+</package>+</packages>+<symbols>+<symbol name="TPS16850VMAR">+  <description>9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA). 2-column symbol, pins grouped by function</description>+  <wire x1="-20.32" y1="2.54" x2="20.32" y2="2.54" width="0.254" layer="94"/>+  <wire x1="20.32" y1="2.54" x2="20.32" y2="-53.34" width="0.254" layer="94"/>+  <wire x1="20.32" y1="-53.34" x2="-20.32" y2="-53.34" width="0.254" layer="94"/>+  <wire x1="-20.32" y1="-53.34" x2="-20.32" y2="2.54" width="0.254" layer="94"/>+  <wire x1="-0.3490" y1="-28.2530" x2="-3.8400" y2="-26.2370" width="0.0254" layer="94"/>+  <wire x1="-0.3490" y1="-29.3610" x2="-0.3490" y2="-28.2530" width="0.0254" layer="94"/>+  <wire x1="-0.3490" y1="-29.3610" x2="-0.6110" y2="-29.2100" width="0.0254" layer="94"/>+  <wire x1="-0.6110" y1="-29.2100" x2="-0.6110" y2="-29.0690" width="0.0254" layer="94"/>+  <wire x1="-0.6110" y1="-29.0690" x2="-0.7850" y2="-28.9680" width="0.0254" layer="94"/>+  <wire x1="-0.7850" y1="-29.1090" x2="-0.7850" y2="-28.9680" width="0.0254" layer="94"/>+  <wire x1="-0.7850" y1="-29.1090" x2="-0.9600" y2="-29.0090" width="0.0254" layer="94"/>+  <wire x1="-0.9600" y1="-29.0090" x2="-0.9600" y2="-28.8680" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.7670" x2="-0.9600" y2="-28.8680" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.9080" x2="-1.1350" y2="-28.7670" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.9080" x2="-1.3090" y2="-28.8070" width="0.0254" layer="94"/>+  <wire x1="-1.3090" y1="-28.8070" x2="-1.3090" y2="-28.6660" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.5650" x2="-1.3090" y2="-28.6660" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.7060" x2="-1.4840" y2="-28.5650" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.7060" x2="-1.6580" y2="-28.6050" width="0.0254" layer="94"/>+  <wire x1="-1.6580" y1="-28.6050" x2="-1.6580" y2="-28.4640" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.3640" x2="-1.6580" y2="-28.4640" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.5050" x2="-1.8330" y2="-28.3640" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.5050" x2="-2.0070" y2="-28.4040" width="0.0254" layer="94"/>+  <wire x1="-2.0070" y1="-28.4040" x2="-2.0070" y2="-28.2630" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.1620" x2="-2.0070" y2="-28.2630" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.3030" x2="-2.1820" y2="-28.1620" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.3030" x2="-2.3570" y2="-28.2030" width="0.0254" layer="94"/>+  <wire x1="-2.3570" y1="-28.2030" x2="-2.3570" y2="-28.0610" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-27.9600" x2="-2.3570" y2="-28.0610" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-28.1020" x2="-2.5310" y2="-27.9600" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-28.1020" x2="-3.0890" y2="-27.7790" width="0.0254" layer="94"/>+  <wire x1="-3.0890" y1="-27.7790" x2="-3.0890" y2="-27.6380" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.5370" x2="-3.0890" y2="-27.6380" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.6780" x2="-3.2640" y2="-27.5370" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.6780" x2="-3.4390" y2="-27.5780" width="0.0254" layer="94"/>+  <wire x1="-3.4390" y1="-27.5780" x2="-3.4390" y2="-27.4370" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.3360" x2="-3.4390" y2="-27.4370" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.4770" x2="-3.6130" y2="-27.3360" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.4770" x2="-3.8400" y2="-27.3460" width="0.0254" layer="94"/>+  <wire x1="-3.8400" y1="-27.3460" x2="-3.8400" y2="-26.2370" width="0.0254" layer="94"/>+  <wire x1="-0.3490" y1="-28.2530" x2="3.8400" y2="-25.8340" width="0.0254" layer="94"/>+  <wire x1="3.8400" y1="-25.8340" x2="0.3490" y2="-23.8190" width="0.0254" layer="94"/>+  <wire x1="-3.8400" y1="-26.2370" x2="0.3490" y2="-23.8190" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.1600" x2="0.5590" y2="-28.8370" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.2120" x2="1.8150" y2="-28.1120" width="0.0254" layer="94"/>+  <wire x1="1.9900" y1="-28.0110" x2="2.5490" y2="-27.6880" width="0.0254" layer="94"/>+  <wire x1="2.7230" y1="-27.5880" x2="2.8970" y2="-27.4870" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.0190" x2="-0.2090" y2="-29.1400" width="0.0254" layer="94"/>+  <wire x1="-0.3490" y1="-29.3610" x2="-0.2090" y2="-29.2810" width="0.0254" layer="94"/>+  <wire x1="3.8400" y1="-26.9430" x2="3.8400" y2="-25.8340" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.1850" x2="3.8400" y2="-26.9430" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.1850" x2="3.4210" y2="-27.0440" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.0440" x2="3.2470" y2="-27.1440" width="0.0254" layer="94"/>+  <wire x1="3.2470" y1="-27.2850" x2="3.2470" y2="-27.1440" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.3860" x2="3.2470" y2="-27.2850" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.3860" x2="3.0720" y2="-27.2450" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.2450" x2="2.8970" y2="-27.3460" width="0.0254" layer="94"/>+  <wire x1="2.8970" y1="-27.4870" x2="2.8970" y2="-27.3460" width="0.0254" layer="94"/>+  <wire x1="2.7230" y1="-27.5880" x2="2.7230" y2="-27.4470" width="0.0254" layer="94"/>+  <wire x1="2.5490" y1="-27.5470" x2="2.7230" y2="-27.4470" width="0.0254" layer="94"/>+  <wire x1="2.5490" y1="-27.6880" x2="2.5490" y2="-27.5470" width="0.0254" layer="94"/>+  <wire x1="1.9900" y1="-28.0110" x2="1.9900" y2="-27.8700" width="0.0254" layer="94"/>+  <wire x1="1.8150" y1="-27.9710" x2="1.9900" y2="-27.8700" width="0.0254" layer="94"/>+  <wire x1="1.8150" y1="-28.1120" x2="1.8150" y2="-27.9710" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.2120" x2="1.6410" y2="-28.0710" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.0710" x2="1.5010" y2="-28.1520" width="0.0254" layer="94"/>+  <wire x1="1.5010" y1="-28.2930" x2="1.5010" y2="-28.1520" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.3940" x2="1.5010" y2="-28.2930" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.3940" x2="1.3270" y2="-28.2530" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.2530" x2="1.1870" y2="-28.3330" width="0.0254" layer="94"/>+  <wire x1="1.1870" y1="-28.4750" x2="1.1870" y2="-28.3330" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.5750" x2="1.1870" y2="-28.4750" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.5750" x2="1.0130" y2="-28.4340" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.4340" x2="0.8730" y2="-28.5150" width="0.0254" layer="94"/>+  <wire x1="0.8730" y1="-28.6560" x2="0.8730" y2="-28.5150" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.7570" x2="0.8730" y2="-28.6560" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.7570" x2="0.6980" y2="-28.6160" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.6160" x2="0.5590" y2="-28.6960" width="0.0254" layer="94"/>+  <wire x1="0.5590" y1="-28.8370" x2="0.5590" y2="-28.6960" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.1600" x2="0.0000" y2="-29.0190" width="0.0254" layer="94"/>+  <wire x1="-0.2090" y1="-29.2810" x2="-0.2090" y2="-29.1400" width="0.0254" layer="94"/>+  <wire x1="-2.3420" y1="-28.2150" x2="-2.3390" y2="-28.2120" width="0.0254" layer="94"/>+  <wire x1="-2.3420" y1="-28.2100" x2="-2.3420" y2="-28.2150" width="0.0254" layer="94"/>+  <wire x1="-1.9930" y1="-28.4160" x2="-1.9900" y2="-28.4140" width="0.0254" layer="94"/>+  <wire x1="-1.9930" y1="-28.4120" x2="-1.9930" y2="-28.4160" width="0.0254" layer="94"/>+  <wire x1="-1.6440" y1="-28.6180" x2="-1.6410" y2="-28.6160" width="0.0254" layer="94"/>+  <wire x1="-1.6440" y1="-28.6140" x2="-1.6440" y2="-28.6180" width="0.0254" layer="94"/>+  <wire x1="-1.2950" y1="-28.8190" x2="-1.2920" y2="-28.8170" width="0.0254" layer="94"/>+  <wire x1="-1.2950" y1="-28.8150" x2="-1.2950" y2="-28.8190" width="0.0254" layer="94"/>+  <wire x1="-0.9460" y1="-29.0210" x2="-0.9430" y2="-29.0190" width="0.0254" layer="94"/>+  <wire x1="-0.9460" y1="-29.0170" x2="-0.9460" y2="-29.0210" width="0.0254" layer="94"/>+  <wire x1="1.7980" y1="-28.1220" x2="1.8010" y2="-28.1240" width="0.0254" layer="94"/>+  <wire x1="1.8010" y1="-28.1240" x2="1.8010" y2="-28.1200" width="0.0254" layer="94"/>+  <wire x1="2.5310" y1="-27.6990" x2="2.5340" y2="-27.7010" width="0.0254" layer="94"/>+  <wire x1="2.5340" y1="-27.7010" x2="2.5340" y2="-27.6960" width="0.0254" layer="94"/>+  <wire x1="-3.0760" y1="-27.7910" x2="-3.0720" y2="-27.7890" width="0.0254" layer="94"/>+  <wire x1="-3.0760" y1="-27.7870" x2="-3.0760" y2="-27.7910" width="0.0254" layer="94"/>+  <wire x1="-0.2230" y1="-29.2930" x2="-0.2270" y2="-29.2910" width="0.0254" layer="94"/>+  <wire x1="-0.5930" y1="-29.2200" x2="-0.5970" y2="-29.2220" width="0.0254" layer="94"/>+  <wire x1="-0.5970" y1="-29.2220" x2="-0.5970" y2="-29.2180" width="0.0254" layer="94"/>+  <wire x1="-0.2230" y1="-29.2890" x2="-0.2230" y2="-29.2930" width="0.0254" layer="94"/>+  <wire x1="0.5450" y1="-28.8490" x2="0.5410" y2="-28.8470" width="0.0254" layer="94"/>+  <wire x1="0.5450" y1="-28.8450" x2="0.5450" y2="-28.8490" width="0.0254" layer="94"/>+  <wire x1="1.4870" y1="-28.3050" x2="1.4840" y2="-28.3030" width="0.0254" layer="94"/>+  <wire x1="1.1730" y1="-28.4870" x2="1.1690" y2="-28.4850" width="0.0254" layer="94"/>+  <wire x1="0.8590" y1="-28.6680" x2="0.8550" y2="-28.6660" width="0.0254" layer="94"/>+  <wire x1="1.4870" y1="-28.3010" x2="1.4870" y2="-28.3050" width="0.0254" layer="94"/>+  <wire x1="0.8590" y1="-28.6640" x2="0.8590" y2="-28.6680" width="0.0254" layer="94"/>+  <wire x1="1.1730" y1="-28.4820" x2="1.1730" y2="-28.4870" width="0.0254" layer="94"/>+  <wire x1="2.8840" y1="-27.4990" x2="2.8800" y2="-27.4970" width="0.0254" layer="94"/>+  <wire x1="3.2330" y1="-27.2970" x2="3.2290" y2="-27.2950" width="0.0254" layer="94"/>+  <wire x1="2.8840" y1="-27.4950" x2="2.8840" y2="-27.4990" width="0.0254" layer="94"/>+  <wire x1="3.2330" y1="-27.2930" x2="3.2330" y2="-27.2970" width="0.0254" layer="94"/>+  <wire x1="-3.4250" y1="-27.5900" x2="-3.4210" y2="-27.5880" width="0.0254" layer="94"/>+  <wire x1="-3.4250" y1="-27.5860" x2="-3.4250" y2="-27.5900" width="0.0254" layer="94"/>+  <wire x1="-2.3570" y1="-28.2230" x2="-2.3420" y2="-28.2150" width="0.0254" layer="94"/>+  <wire x1="-2.3570" y1="-28.2230" x2="-2.3570" y2="-28.0610" width="0.0254" layer="94"/>+  <wire x1="-2.3420" y1="-28.2100" x2="-2.3420" y2="-28.2150" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-28.1220" x2="-2.3570" y2="-28.2230" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-27.9600" x2="-2.3570" y2="-28.0610" width="0.0254" layer="94"/>+  <wire x1="-2.5310" y1="-28.1220" x2="-2.5310" y2="-27.9600" width="0.0254" layer="94"/>+  <wire x1="-2.0070" y1="-28.4240" x2="-1.9930" y2="-28.4160" width="0.0254" layer="94"/>+  <wire x1="-2.0070" y1="-28.4240" x2="-2.0070" y2="-28.2630" width="0.0254" layer="94"/>+  <wire x1="-1.9930" y1="-28.4120" x2="-1.9930" y2="-28.4160" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.3230" x2="-2.0070" y2="-28.4240" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.1620" x2="-2.0070" y2="-28.2630" width="0.0254" layer="94"/>+  <wire x1="-2.1820" y1="-28.3230" x2="-2.1820" y2="-28.1620" width="0.0254" layer="94"/>+  <wire x1="-1.6580" y1="-28.6260" x2="-1.6440" y2="-28.6180" width="0.0254" layer="94"/>+  <wire x1="-1.6580" y1="-28.6260" x2="-1.6580" y2="-28.4640" width="0.0254" layer="94"/>+  <wire x1="-1.6440" y1="-28.6140" x2="-1.6440" y2="-28.6180" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.5250" x2="-1.6580" y2="-28.6260" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.3640" x2="-1.6580" y2="-28.4640" width="0.0254" layer="94"/>+  <wire x1="-1.8330" y1="-28.5250" x2="-1.8330" y2="-28.3640" width="0.0254" layer="94"/>+  <wire x1="-1.3090" y1="-28.8270" x2="-1.2950" y2="-28.8190" width="0.0254" layer="94"/>+  <wire x1="-1.3090" y1="-28.8270" x2="-1.3090" y2="-28.6660" width="0.0254" layer="94"/>+  <wire x1="-1.2950" y1="-28.8150" x2="-1.2950" y2="-28.8190" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.7260" x2="-1.3090" y2="-28.8270" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.5650" x2="-1.3090" y2="-28.6660" width="0.0254" layer="94"/>+  <wire x1="-1.4840" y1="-28.7260" x2="-1.4840" y2="-28.5650" width="0.0254" layer="94"/>+  <wire x1="-0.9600" y1="-29.0290" x2="-0.9460" y2="-29.0210" width="0.0254" layer="94"/>+  <wire x1="-0.9600" y1="-29.0290" x2="-0.9600" y2="-28.8680" width="0.0254" layer="94"/>+  <wire x1="-0.9460" y1="-29.0170" x2="-0.9460" y2="-29.0210" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.9280" x2="-0.9600" y2="-29.0290" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.7670" x2="-0.9600" y2="-28.8680" width="0.0254" layer="94"/>+  <wire x1="-1.1350" y1="-28.9280" x2="-1.1350" y2="-28.7670" width="0.0254" layer="94"/>+  <wire x1="1.8150" y1="-28.1320" x2="1.8150" y2="-27.9710" width="0.0254" layer="94"/>+  <wire x1="1.8150" y1="-27.9710" x2="1.9900" y2="-27.8700" width="0.0254" layer="94"/>+  <wire x1="1.9900" y1="-28.0310" x2="1.9900" y2="-27.8700" width="0.0254" layer="94"/>+  <wire x1="1.8150" y1="-28.1320" x2="1.9900" y2="-28.0310" width="0.0254" layer="94"/>+  <wire x1="1.8010" y1="-28.1240" x2="1.8150" y2="-28.1320" width="0.0254" layer="94"/>+  <wire x1="1.8010" y1="-28.1240" x2="1.8010" y2="-28.1200" width="0.0254" layer="94"/>+  <wire x1="2.5490" y1="-27.7090" x2="2.5490" y2="-27.5470" width="0.0254" layer="94"/>+  <wire x1="2.5490" y1="-27.5470" x2="2.7230" y2="-27.4470" width="0.0254" layer="94"/>+  <wire x1="2.7230" y1="-27.6080" x2="2.7230" y2="-27.4470" width="0.0254" layer="94"/>+  <wire x1="2.5490" y1="-27.7090" x2="2.7230" y2="-27.6080" width="0.0254" layer="94"/>+  <wire x1="2.5340" y1="-27.7010" x2="2.5490" y2="-27.7090" width="0.0254" layer="94"/>+  <wire x1="2.5340" y1="-27.7010" x2="2.5340" y2="-27.6960" width="0.0254" layer="94"/>+  <wire x1="-3.0890" y1="-27.7990" x2="-3.0760" y2="-27.7910" width="0.0254" layer="94"/>+  <wire x1="-3.0890" y1="-27.7990" x2="-3.0890" y2="-27.6380" width="0.0254" layer="94"/>+  <wire x1="-3.0760" y1="-27.7870" x2="-3.0760" y2="-27.7910" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.6990" x2="-3.0890" y2="-27.7990" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.5370" x2="-3.0890" y2="-27.6380" width="0.0254" layer="94"/>+  <wire x1="-3.2640" y1="-27.6990" x2="-3.2640" y2="-27.5370" width="0.0254" layer="94"/>+  <wire x1="-0.7850" y1="-29.1300" x2="-0.7850" y2="-28.9680" width="0.0254" layer="94"/>+  <wire x1="-0.6110" y1="-29.2300" x2="-0.7850" y2="-29.1300" width="0.0254" layer="94"/>+  <wire x1="-0.5970" y1="-29.2220" x2="-0.6110" y2="-29.2300" width="0.0254" layer="94"/>+  <wire x1="-0.5970" y1="-29.2220" x2="-0.5970" y2="-29.2180" width="0.0254" layer="94"/>+  <wire x1="-0.6110" y1="-29.0690" x2="-0.7850" y2="-28.9680" width="0.0254" layer="94"/>+  <wire x1="-0.6110" y1="-29.2300" x2="-0.6110" y2="-29.0690" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.1800" x2="-0.2090" y2="-29.3010" width="0.0254" layer="94"/>+  <wire x1="-0.2090" y1="-29.3010" x2="-0.2230" y2="-29.2930" width="0.0254" layer="94"/>+  <wire x1="-0.2230" y1="-29.2890" x2="-0.2230" y2="-29.2930" width="0.0254" layer="94"/>+  <wire x1="-0.2090" y1="-29.3010" x2="-0.2090" y2="-29.1400" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.1800" x2="0.0000" y2="-29.0190" width="0.0254" layer="94"/>+  <wire x1="0.0000" y1="-29.0190" x2="-0.2090" y2="-29.1400" width="0.0254" layer="94"/>+  <wire x1="0.5590" y1="-28.8570" x2="0.5450" y2="-28.8490" width="0.0254" layer="94"/>+  <wire x1="0.5590" y1="-28.8570" x2="0.5590" y2="-28.6960" width="0.0254" layer="94"/>+  <wire x1="0.5450" y1="-28.8450" x2="0.5450" y2="-28.8490" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.7770" x2="0.5590" y2="-28.8570" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.6160" x2="0.5590" y2="-28.6960" width="0.0254" layer="94"/>+  <wire x1="0.6980" y1="-28.7770" x2="0.6980" y2="-28.6160" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.2330" x2="1.6410" y2="-28.0710" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.2330" x2="1.5010" y2="-28.3130" width="0.0254" layer="94"/>+  <wire x1="1.5010" y1="-28.3130" x2="1.4870" y2="-28.3050" width="0.0254" layer="94"/>+  <wire x1="1.6410" y1="-28.0710" x2="1.5010" y2="-28.1520" width="0.0254" layer="94"/>+  <wire x1="1.5010" y1="-28.3130" x2="1.5010" y2="-28.1520" width="0.0254" layer="94"/>+  <wire x1="1.4870" y1="-28.3010" x2="1.4870" y2="-28.3050" width="0.0254" layer="94"/>+  <wire x1="0.8730" y1="-28.6760" x2="0.8590" y2="-28.6680" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.5960" x2="0.8730" y2="-28.6760" width="0.0254" layer="94"/>+  <wire x1="0.8730" y1="-28.6760" x2="0.8730" y2="-28.5150" width="0.0254" layer="94"/>+  <wire x1="0.8590" y1="-28.6640" x2="0.8590" y2="-28.6680" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.5960" x2="1.0130" y2="-28.4340" width="0.0254" layer="94"/>+  <wire x1="1.0130" y1="-28.4340" x2="0.8730" y2="-28.5150" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.4140" x2="1.1870" y2="-28.4950" width="0.0254" layer="94"/>+  <wire x1="1.1870" y1="-28.4950" x2="1.1730" y2="-28.4870" width="0.0254" layer="94"/>+  <wire x1="1.1730" y1="-28.4820" x2="1.1730" y2="-28.4870" width="0.0254" layer="94"/>+  <wire x1="1.1870" y1="-28.4950" x2="1.1870" y2="-28.3330" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.4140" x2="1.3270" y2="-28.2530" width="0.0254" layer="94"/>+  <wire x1="1.3270" y1="-28.2530" x2="1.1870" y2="-28.3330" width="0.0254" layer="94"/>+  <wire x1="2.8970" y1="-27.5070" x2="2.8840" y2="-27.4990" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.4060" x2="2.8970" y2="-27.5070" width="0.0254" layer="94"/>+  <wire x1="2.8970" y1="-27.5070" x2="2.8970" y2="-27.3460" width="0.0254" layer="94"/>+  <wire x1="2.8840" y1="-27.4950" x2="2.8840" y2="-27.4990" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.4060" x2="3.0720" y2="-27.2450" width="0.0254" layer="94"/>+  <wire x1="3.0720" y1="-27.2450" x2="2.8970" y2="-27.3460" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.2050" x2="3.2470" y2="-27.3060" width="0.0254" layer="94"/>+  <wire x1="3.2470" y1="-27.3060" x2="3.2330" y2="-27.2970" width="0.0254" layer="94"/>+  <wire x1="3.2330" y1="-27.2930" x2="3.2330" y2="-27.2970" width="0.0254" layer="94"/>+  <wire x1="3.2470" y1="-27.3060" x2="3.2470" y2="-27.1440" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.2050" x2="3.4210" y2="-27.0440" width="0.0254" layer="94"/>+  <wire x1="3.4210" y1="-27.0440" x2="3.2470" y2="-27.1440" width="0.0254" layer="94"/>+  <wire x1="-3.4390" y1="-27.5980" x2="-3.4250" y2="-27.5900" width="0.0254" layer="94"/>+  <wire x1="-3.4390" y1="-27.5980" x2="-3.4390" y2="-27.4370" width="0.0254" layer="94"/>+  <wire x1="-3.4250" y1="-27.5860" x2="-3.4250" y2="-27.5900" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.4970" x2="-3.4390" y2="-27.5980" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.3360" x2="-3.4390" y2="-27.4370" width="0.0254" layer="94"/>+  <wire x1="-3.6130" y1="-27.4970" x2="-3.6130" y2="-27.3360" width="0.0254" layer="94"/>+  <wire x1="-1.8170" y1="-26.5170" x2="-1.4230" y2="-26.7450" width="0.0254" layer="94"/>+  <wire x1="-1.9490" y1="-26.5930" x2="-1.6860" y2="-26.4410" width="0.0254" layer="94"/>+  <wire x1="-1.5920" y1="-26.3870" x2="-1.1970" y2="-26.6150" width="0.0254" layer="94"/>+  <wire x1="-1.5920" y1="-26.3870" x2="-1.4230" y2="-26.2890" width="0.0254" layer="94"/>+  <wire x1="-1.4230" y1="-26.2890" x2="-1.3480" y2="-26.2680" width="0.0254" layer="94"/>+  <wire x1="-1.3480" y1="-26.2680" x2="-1.3100" y2="-26.2680" width="0.0254" layer="94"/>+  <wire x1="-1.3100" y1="-26.2680" x2="-1.2540" y2="-26.2790" width="0.0254" layer="94"/>+  <wire x1="-1.2540" y1="-26.2790" x2="-1.1970" y2="-26.3110" width="0.0254" layer="94"/>+  <wire x1="-1.1970" y1="-26.3110" x2="-1.1780" y2="-26.3430" width="0.0254" layer="94"/>+  <wire x1="-1.1780" y1="-26.3430" x2="-1.1780" y2="-26.3650" width="0.0254" layer="94"/>+  <wire x1="-1.1780" y1="-26.3650" x2="-1.2160" y2="-26.4090" width="0.0254" layer="94"/>+  <wire x1="-1.2160" y1="-26.4090" x2="-1.3850" y2="-26.5060" width="0.0254" layer="94"/>+  <wire x1="-0.8970" y1="-26.0510" x2="-0.9720" y2="-26.0510" width="0.0254" layer="94"/>+  <wire x1="-0.9720" y1="-26.0510" x2="-1.0470" y2="-26.0720" width="0.0254" layer="94"/>+  <wire x1="-1.0470" y1="-26.0720" x2="-1.1220" y2="-26.1160" width="0.0254" layer="94"/>+  <wire x1="-1.1220" y1="-26.1160" x2="-1.1600" y2="-26.1590" width="0.0254" layer="94"/>+  <wire x1="-1.1600" y1="-26.1590" x2="-1.1600" y2="-26.2030" width="0.0254" layer="94"/>+  <wire x1="-1.1600" y1="-26.2030" x2="-1.1220" y2="-26.2240" width="0.0254" layer="94"/>+  <wire x1="-1.1220" y1="-26.2240" x2="-1.0660" y2="-26.2350" width="0.0254" layer="94"/>+  <wire x1="-1.0660" y1="-26.2350" x2="-1.0280" y2="-26.2350" width="0.0254" layer="94"/>+  <wire x1="-1.0280" y1="-26.2350" x2="-0.9720" y2="-26.2240" width="0.0254" layer="94"/>+  <wire x1="-0.9720" y1="-26.2240" x2="-0.8220" y2="-26.1810" width="0.0254" layer="94"/>+  <wire x1="-0.8220" y1="-26.1810" x2="-0.7650" y2="-26.1700" width="0.0254" layer="94"/>+  <wire x1="-0.7650" y1="-26.1700" x2="-0.7280" y2="-26.1700" width="0.0254" layer="94"/>+  <wire x1="-0.7280" y1="-26.1700" x2="-0.6710" y2="-26.1810" width="0.0254" layer="94"/>+  <wire x1="-0.6710" y1="-26.1810" x2="-0.6150" y2="-26.2140" width="0.0254" layer="94"/>+  <wire x1="-0.6150" y1="-26.2140" x2="-0.6150" y2="-26.2570" width="0.0254" layer="94"/>+  <wire x1="-0.6150" y1="-26.2570" x2="-0.6530" y2="-26.3000" width="0.0254" layer="94"/>+  <wire x1="-0.6530" y1="-26.3000" x2="-0.7280" y2="-26.3430" width="0.0254" layer="94"/>+  <wire x1="-0.7280" y1="-26.3430" x2="-0.8030" y2="-26.3650" width="0.0254" layer="94"/>+  <wire x1="-0.8030" y1="-26.3650" x2="-0.8780" y2="-26.3650" width="0.0254" layer="94"/>+  <wire x1="-0.7090" y1="-25.9640" x2="-0.6900" y2="-25.9320" width="0.0254" layer="94"/>+  <wire x1="-0.6900" y1="-25.9320" x2="-0.6900" y2="-25.8660" width="0.0254" layer="94"/>+  <wire x1="-0.6900" y1="-25.8660" x2="-0.2950" y2="-26.0940" width="0.0254" layer="94"/>+  <wire x1="-0.1640" y1="-25.6280" x2="-0.2200" y2="-25.6170" width="0.0254" layer="94"/>+  <wire x1="-0.2200" y1="-25.6170" x2="-0.2950" y2="-25.6390" width="0.0254" layer="94"/>+  <wire x1="-0.2950" y1="-25.6390" x2="-0.3330" y2="-25.6600" width="0.0254" layer="94"/>+  <wire x1="-0.3330" y1="-25.6600" x2="-0.3710" y2="-25.7040" width="0.0254" layer="94"/>+  <wire x1="-0.3710" y1="-25.7040" x2="-0.3520" y2="-25.7580" width="0.0254" layer="94"/>+  <wire x1="-0.3520" y1="-25.7580" x2="-0.2770" y2="-25.8230" width="0.0254" layer="94"/>+  <wire x1="-0.2770" y1="-25.8230" x2="-0.1830" y2="-25.8770" width="0.0254" layer="94"/>+  <wire x1="-0.1830" y1="-25.8770" x2="-0.0890" y2="-25.9100" width="0.0254" layer="94"/>+  <wire x1="-0.0890" y1="-25.9100" x2="-0.0140" y2="-25.9100" width="0.0254" layer="94"/>+  <wire x1="-0.0140" y1="-25.9100" x2="0.0610" y2="-25.8880" width="0.0254" layer="94"/>+  <wire x1="0.0610" y1="-25.8880" x2="0.0800" y2="-25.8770" width="0.0254" layer="94"/>+  <wire x1="0.0800" y1="-25.8770" x2="0.1180" y2="-25.8340" width="0.0254" layer="94"/>+  <wire x1="0.1180" y1="-25.8340" x2="0.1180" y2="-25.7900" width="0.0254" layer="94"/>+  <wire x1="0.1180" y1="-25.7900" x2="0.0800" y2="-25.7470" width="0.0254" layer="94"/>+  <wire x1="0.0800" y1="-25.7470" x2="0.0610" y2="-25.7360" width="0.0254" layer="94"/>+  <wire x1="0.0610" y1="-25.7360" x2="-0.0140" y2="-25.7150" width="0.0254" layer="94"/>+  <wire x1="-0.0140" y1="-25.7150" x2="-0.0890" y2="-25.7150" width="0.0254" layer="94"/>+  <wire x1="-0.0890" y1="-25.7150" x2="-0.1640" y2="-25.7360" width="0.0254" layer="94"/>+  <wire x1="-0.1640" y1="-25.7360" x2="-0.1830" y2="-25.7470" width="0.0254" layer="94"/>+  <wire x1="-0.1830" y1="-25.7470" x2="-0.2200" y2="-25.7900" width="0.0254" layer="94"/>+  <wire x1="-0.2200" y1="-25.7900" x2="-0.2200" y2="-25.8340" width="0.0254" layer="94"/>+  <wire x1="-0.2200" y1="-25.8340" x2="-0.1830" y2="-25.8770" width="0.0254" layer="94"/>+  <wire x1="0.0050" y1="-25.4650" x2="-0.0330" y2="-25.5090" width="0.0254" layer="94"/>+  <wire x1="-0.0330" y1="-25.5090" x2="-0.0140" y2="-25.5410" width="0.0254" layer="94"/>+  <wire x1="-0.0140" y1="-25.5410" x2="0.0240" y2="-25.5630" width="0.0254" layer="94"/>+  <wire x1="0.0240" y1="-25.5630" x2="0.0800" y2="-25.5740" width="0.0254" layer="94"/>+  <wire x1="0.0800" y1="-25.5740" x2="0.1370" y2="-25.5630" width="0.0254" layer="94"/>+  <wire x1="0.1370" y1="-25.5630" x2="0.2300" y2="-25.5300" width="0.0254" layer="94"/>+  <wire x1="0.2300" y1="-25.5300" x2="0.3050" y2="-25.5090" width="0.0254" layer="94"/>+  <wire x1="0.3050" y1="-25.5090" x2="0.3810" y2="-25.5090" width="0.0254" layer="94"/>+  <wire x1="0.3810" y1="-25.5090" x2="0.4370" y2="-25.5190" width="0.0254" layer="94"/>+  <wire x1="0.4370" y1="-25.5190" x2="0.4930" y2="-25.5520" width="0.0254" layer="94"/>+  <wire x1="0.4930" y1="-25.5520" x2="0.5120" y2="-25.5840" width="0.0254" layer="94"/>+  <wire x1="0.5120" y1="-25.5840" x2="0.5120" y2="-25.6060" width="0.0254" layer="94"/>+  <wire x1="0.5120" y1="-25.6060" x2="0.4750" y2="-25.6500" width="0.0254" layer="94"/>+  <wire x1="0.4750" y1="-25.6500" x2="0.3990" y2="-25.6930" width="0.0254" layer="94"/>+  <wire x1="0.3990" y1="-25.6930" x2="0.3240" y2="-25.7150" width="0.0254" layer="94"/>+  <wire x1="0.3240" y1="-25.7150" x2="0.2870" y2="-25.7150" width="0.0254" layer="94"/>+  <wire x1="0.2870" y1="-25.7150" x2="0.2300" y2="-25.7040" width="0.0254" layer="94"/>+  <wire x1="0.2300" y1="-25.7040" x2="0.1740" y2="-25.6710" width="0.0254" layer="94"/>+  <wire x1="0.1740" y1="-25.6710" x2="0.1550" y2="-25.6390" width="0.0254" layer="94"/>+  <wire x1="0.1550" y1="-25.6390" x2="0.1550" y2="-25.5950" width="0.0254" layer="94"/>+  <wire x1="0.1550" y1="-25.5950" x2="0.1930" y2="-25.5520" width="0.0254" layer="94"/>+  <wire x1="0.1930" y1="-25.5520" x2="0.2490" y2="-25.4980" width="0.0254" layer="94"/>+  <wire x1="0.2490" y1="-25.4980" x2="0.2680" y2="-25.4650" width="0.0254" layer="94"/>+  <wire x1="0.2680" y1="-25.4650" x2="0.2490" y2="-25.4330" width="0.0254" layer="94"/>+  <wire x1="0.2490" y1="-25.4330" x2="0.2120" y2="-25.4110" width="0.0254" layer="94"/>+  <wire x1="0.2120" y1="-25.4110" x2="0.1550" y2="-25.4000" width="0.0254" layer="94"/>+  <wire x1="0.1550" y1="-25.4000" x2="0.0800" y2="-25.4220" width="0.0254" layer="94"/>+  <wire x1="0.0800" y1="-25.4220" x2="0.0050" y2="-25.4650" width="0.0254" layer="94"/>+  <wire x1="0.5120" y1="-25.1720" x2="0.3240" y2="-25.2810" width="0.0254" layer="94"/>+  <wire x1="0.3240" y1="-25.2810" x2="0.4750" y2="-25.3890" width="0.0254" layer="94"/>+  <wire x1="0.4750" y1="-25.3890" x2="0.4750" y2="-25.3680" width="0.0254" layer="94"/>+  <wire x1="0.4750" y1="-25.3680" x2="0.5120" y2="-25.3240" width="0.0254" layer="94"/>+  <wire x1="0.5120" y1="-25.3240" x2="0.5680" y2="-25.2920" width="0.0254" layer="94"/>+  <wire x1="0.5680" y1="-25.2920" x2="0.6430" y2="-25.2700" width="0.0254" layer="94"/>+  <wire x1="0.6430" y1="-25.2700" x2="0.7180" y2="-25.2700" width="0.0254" layer="94"/>+  <wire x1="0.7180" y1="-25.2700" x2="0.7940" y2="-25.2920" width="0.0254" layer="94"/>+  <wire x1="0.7940" y1="-25.2920" x2="0.8310" y2="-25.3130" width="0.0254" layer="94"/>+  <wire x1="0.8310" y1="-25.3130" x2="0.8690" y2="-25.3570" width="0.0254" layer="94"/>+  <wire x1="0.8690" y1="-25.3570" x2="0.8690" y2="-25.4000" width="0.0254" layer="94"/>+  <wire x1="0.8690" y1="-25.4000" x2="0.8310" y2="-25.4430" width="0.0254" layer="94"/>+  <wire x1="0.8310" y1="-25.4430" x2="0.7750" y2="-25.4760" width="0.0254" layer="94"/>+  <wire x1="0.7750" y1="-25.4760" x2="0.7000" y2="-25.4980" width="0.0254" layer="94"/>+  <wire x1="0.7000" y1="-25.4980" x2="0.6620" y2="-25.4980" width="0.0254" layer="94"/>+  <wire x1="0.6620" y1="-25.4980" x2="0.6060" y2="-25.4870" width="0.0254" layer="94"/>+  <wire x1="0.7750" y1="-25.0200" x2="0.7370" y2="-25.0640" width="0.0254" layer="94"/>+  <wire x1="0.7370" y1="-25.0640" x2="0.7560" y2="-25.1180" width="0.0254" layer="94"/>+  <wire x1="0.7560" y1="-25.1180" x2="0.8310" y2="-25.1830" width="0.0254" layer="94"/>+  <wire x1="0.8310" y1="-25.1830" x2="0.8880" y2="-25.2160" width="0.0254" layer="94"/>+  <wire x1="0.8880" y1="-25.2160" x2="1.0000" y2="-25.2590" width="0.0254" layer="94"/>+  <wire x1="1.0000" y1="-25.2590" x2="1.0940" y2="-25.2700" width="0.0254" layer="94"/>+  <wire x1="1.0940" y1="-25.2700" x2="1.1690" y2="-25.2480" width="0.0254" layer="94"/>+  <wire x1="1.1690" y1="-25.2480" x2="1.2070" y2="-25.2270" width="0.0254" layer="94"/>+  <wire x1="1.2070" y1="-25.2270" x2="1.2450" y2="-25.1830" width="0.0254" layer="94"/>+  <wire x1="1.2450" y1="-25.1830" x2="1.2260" y2="-25.1290" width="0.0254" layer="94"/>+  <wire x1="1.2260" y1="-25.1290" x2="1.1510" y2="-25.0640" width="0.0254" layer="94"/>+  <wire x1="1.1510" y1="-25.0640" x2="1.0940" y2="-25.0320" width="0.0254" layer="94"/>+  <wire x1="1.0940" y1="-25.0320" x2="0.9820" y2="-24.9880" width="0.0254" layer="94"/>+  <wire x1="0.9820" y1="-24.9880" x2="0.8880" y2="-24.9770" width="0.0254" layer="94"/>+  <wire x1="0.8880" y1="-24.9770" x2="0.8130" y2="-24.9990" width="0.0254" layer="94"/>+  <wire x1="0.8130" y1="-24.9990" x2="0.7750" y2="-25.0200" width="0.0254" layer="94"/>+  <wire x1="-0.6430" y1="-26.5230" x2="-0.0980" y2="-26.6640" width="0.0254" layer="94"/>+  <wire x1="-0.3430" y1="-26.3490" x2="-0.0980" y2="-26.6640" width="0.0254" layer="94"/>+  <wire x1="-0.2490" y1="-26.2950" x2="0.1460" y2="-26.5230" width="0.0254" layer="94"/>+  <wire x1="-0.2490" y1="-26.2950" x2="0.2960" y2="-26.4360" width="0.0254" layer="94"/>+  <wire x1="0.0520" y1="-26.1210" x2="0.2960" y2="-26.4360" width="0.0254" layer="94"/>+  <wire x1="0.0520" y1="-26.1210" x2="0.4460" y2="-26.3490" width="0.0254" layer="94"/>+  <wire x1="0.2960" y1="-25.9800" x2="0.5400" y2="-26.2950" width="0.0254" layer="94"/>+  <wire x1="0.2960" y1="-25.9800" x2="0.8410" y2="-26.1210" width="0.0254" layer="94"/>+  <wire x1="0.4650" y1="-26.1860" x2="0.6530" y2="-26.0780" width="0.0254" layer="94"/>+  <wire x1="0.5400" y1="-25.8390" x2="0.9350" y2="-26.0670" width="0.0254" layer="94"/>+  <wire x1="0.5400" y1="-25.8390" x2="0.7090" y2="-25.7420" width="0.0254" layer="94"/>+  <wire x1="0.7090" y1="-25.7420" x2="0.7840" y2="-25.7200" width="0.0254" layer="94"/>+  <wire x1="0.7840" y1="-25.7200" x2="0.8220" y2="-25.7200" width="0.0254" layer="94"/>+  <wire x1="0.8220" y1="-25.7200" x2="0.8780" y2="-25.7310" width="0.0254" layer="94"/>+  <wire x1="0.8780" y1="-25.7310" x2="0.9160" y2="-25.7520" width="0.0254" layer="94"/>+  <wire x1="0.9160" y1="-25.7520" x2="0.9350" y2="-25.7850" width="0.0254" layer="94"/>+  <wire x1="0.9350" y1="-25.7850" x2="0.9350" y2="-25.8070" width="0.0254" layer="94"/>+  <wire x1="0.9350" y1="-25.8070" x2="0.8970" y2="-25.8500" width="0.0254" layer="94"/>+  <wire x1="0.8970" y1="-25.8500" x2="0.7280" y2="-25.9480" width="0.0254" layer="94"/>+  <wire x1="0.8600" y1="-25.8720" x2="1.1980" y2="-25.9150" width="0.0254" layer="94"/>+  <text x="0.0000" y="5.0800" size="1.27" layer="95" align="center">&gt;NAME</text>+  <text x="0.0000" y="-55.8800" size="1.27" layer="96" align="center">&gt;VALUE</text>+  <pin name="IN" x="-22.86" y="-2.54" length="short" direction="pwr" visible="both"/>+  <pin name="IN@2" x="-22.86" y="-5.08" length="short" direction="pwr" visible="both"/>+  <pin name="IN@3" x="-22.86" y="-7.62" length="short" direction="pwr" visible="both"/>+  <pin name="IN@4" x="-22.86" y="-10.16" length="short" direction="pwr" visible="both"/>+  <pin name="VDD" x="-22.86" y="-12.7" length="short" direction="pwr" visible="both"/>+  <pin name="EN/UVLO" x="-22.86" y="-20.32" length="short" direction="in" visible="both"/>+  <pin name="OVP" x="-22.86" y="-22.86" length="short" direction="in" visible="both"/>+  <pin name="MODE" x="-22.86" y="-25.4" length="short" direction="in" visible="both"/>+  <pin name="dVdT" x="-22.86" y="-27.94" length="short" direction="pas" visible="both"/>+  <pin name="IREF" x="-22.86" y="-35.56" length="short" direction="pas" visible="both"/>+  <pin name="ITIMER" x="-22.86" y="-38.1" length="short" direction="pas" visible="both"/>+  <pin name="SFT_SEL" x="-22.86" y="-40.64" length="short" direction="pas" visible="both"/>+  <pin name="OUT" x="22.86" y="-2.54" length="short" direction="out" rot="R180" visible="both"/>+  <pin name="OUT@2" x="22.86" y="-5.08" length="short" direction="out" rot="R180" visible="both"/>+  <pin name="IMON" x="22.86" y="-12.7" length="short" direction="pas" rot="R180" visible="both"/>+  <pin name="ILIM" x="22.86" y="-15.24" length="short" direction="pas" rot="R180" visible="both"/>+  <pin name="PGOOD" x="22.86" y="-22.86" length="short" direction="oc" rot="R180" visible="both"/>+  <pin name="!FLT!" x="22.86" y="-25.4" length="short" direction="oc" rot="R180" visible="both"/>+  <pin name="SWEN" x="22.86" y="-27.94" length="short" direction="io" rot="R180" visible="both"/>+  <pin name="TEMP" x="22.86" y="-30.48" length="short" direction="io" rot="R180" visible="both"/>+  <pin name="GND" x="22.86" y="-38.1" length="short" direction="pwr" rot="R180" visible="both"/>+  <pin name="NC" x="22.86" y="-45.72" length="short" direction="nc" rot="R180" visible="both"/>+  <pin name="NC@2" x="22.86" y="-48.26" length="short" direction="nc" rot="R180" visible="both"/>+  <pin name="NC@3" x="22.86" y="-50.8" length="short" direction="nc" rot="R180" visible="both"/>+  <text x="-19.3000" y="-0.5400" size="0.762" layer="94" font="vector" ratio="15" align="center-left">Power in</text>+  <text x="-19.3000" y="-18.3200" size="0.762" layer="94" font="vector" ratio="15" align="center-left">Control</text>+  <text x="-19.3000" y="-33.5600" size="0.762" layer="94" font="vector" ratio="15" align="center-left">Current setting</text>+  <text x="19.3000" y="-0.5400" size="0.762" layer="94" font="vector" ratio="15" align="center-right">Power out</text>+  <text x="19.3000" y="-10.7000" size="0.762" layer="94" font="vector" ratio="15" align="center-right">Current monitor</text>+  <text x="19.3000" y="-20.8600" size="0.762" layer="94" font="vector" ratio="15" align="center-right">Status</text>+  <text x="19.3000" y="-36.1000" size="0.762" layer="94" font="vector" ratio="15" align="center-right">Ground</text>+  <text x="19.3000" y="-43.7200" size="0.762" layer="94" font="vector" ratio="15" align="center-right">No connect</text>+</symbol>+</symbols>+<devicesets>+<deviceset name="TPS16850VMAR" prefix="U">+  <description>9 V to 80 V, 20 A stackable integrated hot-swap eFuse, 3.5 mOhm FET, auto-retry, 73 A fixed fast trip, LQFN-CLIP-23 (VMA). 2-column symbol, pins grouped by function</description>+  <gates>+    <gate name="G$1" symbol="TPS16850VMAR" x="0" y="0"/>+  </gates>+  <devices>+    <device name="" package="tps16850vmar">+      <connects>+        <connect gate="G$1" pin="IN" pad="10 10@2 10@3 10@4"/>+        <connect gate="G$1" pin="IN@2" pad="22 22@2 22@3 22@4 22@5 22@6 22@7"/>+        <connect gate="G$1" pin="IN@3" pad="23"/>+        <connect gate="G$1" pin="IN@4" pad="24 24@2 24@3 24@4 24@5 24@6 24@7 24@8 24@9 24@10 24@11 24@12 24@13"/>+        <connect gate="G$1" pin="VDD" pad="9"/>+        <connect gate="G$1" pin="EN/UVLO" pad="16"/>+        <connect gate="G$1" pin="OVP" pad="18"/>+        <connect gate="G$1" pin="MODE" pad="12"/>+        <connect gate="G$1" pin="dVdT" pad="4"/>+        <connect gate="G$1" pin="IREF" pad="3"/>+        <connect gate="G$1" pin="ITIMER" pad="14"/>+        <connect gate="G$1" pin="SFT_SEL" pad="6 6@2"/>+        <connect gate="G$1" pin="OUT" pad="7 7@2 7@3 7@4 7@5 7@6"/>+        <connect gate="G$1" pin="OUT@2" pad="8"/>+        <connect gate="G$1" pin="IMON" pad="2"/>+        <connect gate="G$1" pin="ILIM" pad="1"/>+        <connect gate="G$1" pin="PGOOD" pad="19"/>+        <connect gate="G$1" pin="!FLT!" pad="13"/>+        <connect gate="G$1" pin="SWEN" pad="20"/>+        <connect gate="G$1" pin="TEMP" pad="15"/>+        <connect gate="G$1" pin="GND" pad="5"/>+        <connect gate="G$1" pin="NC" pad="11"/>+        <connect gate="G$1" pin="NC@2" pad="17 17@2"/>+        <connect gate="G$1" pin="NC@3" pad="21"/>+      </connects>+      <technologies>+        <technology name="">+          <attribute name="MPN" value="TPS16850VMAR" constant="no"/>+          <attribute name="MANUFACTURER" value="Texas Instruments" constant="no"/>+          <attribute name="DATASHEET" value="https://www.ti.com/lit/ds/symlink/tps1685.pdf" constant="no"/>+          <attribute name="ADOM_WIKI" value="https://wiki.adom.inc/adom/tps16850vmar" constant="no"/>+          <attribute name="MOUSER_PN" value="595-TPS16850VMAR" constant="no"/>+          <attribute name="DIGIKEY_PN" value="296-TPS16850VMARTR-ND" constant="no"/>+        </technology>+      </technologies>+    </device>+  </devices>+</deviceset>+</devicesets>+</library>+</drawing>+</eagle>\ No newline at end of file
verification.jsonadded+271
@@ -0,0 +1,271 @@+{+ "schema": "adom/verification@1",+ "part": "TPS16850VMAR",+ "variants": [+  {+   "mpn": "TPS16850VMAR",+   "note": "auto-retry variant, 73 A fixed fast trip; 2500-piece large tape and reel (SLVSHA1D p.3, p.50)",+   "stocked": false+  }+ ],+ "entries": [+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI), automated checks, not yet reviewed by a person",+    "handle": "claude"+   },+   "status": "verified",+   "title": "Pinout matches the datasheet",+   "scope": [+    "symbol"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Symbol pins match SLVSHA1D Table 5-1 (p.4-5): 1 ILIM, 2 IMON, 3 IREF, 4 dVdT, 5 GND, 6 SFT_SEL, 7-8 OUT, 9 VDD, 10/22/23 IN, 11/17/21 NC, 12 MODE, 13 FLT (active low), 14 ITIMER, 15 TEMP, 16 EN/UVLO, 18 OVP, 19 PGOOD, 20 SWEN, exposed pad (24) IN",+     "result": "pass"+    },+    {+     "text": "Electrical types: IN, VDD, GND power in; OUT power out; EN/UVLO, OVP, MODE input; FLT and PGOOD open drain; SWEN and TEMP bidirectional; resistor/capacitor set pins passive; NC no_connect",+     "result": "pass"+    },+    {+     "text": "Every pin sits on the 2.54 mm grid: yes (adom-symbol 1.2.6 put the first pin of each column at y = -2.00 with 8.35 mm group gaps; all 24 pins moved by provenance/tools/snap_symbol.py)",+     "result": "pass"+    },+    {+     "text": "Fusion .lbr: NC pins typed nc (adom-lbr 2.47.5 wrote io; fixed by provenance/tools/lbr_fix.py), every pin visible=both, lint PASS",+     "result": "pass"+    },+    {+     "text": "Altium SchLib read back with adom-lbr import-altium: 24 pins, names shown; NC pins read back as Passive because Altium has no no-connect pin type (use a No ERC marker on the sheet)",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "tps16850vmar-ds-p4.png",+     "href": "docs/figures/tps16850vmar-ds-p4.png"+    },+    {+     "label": "tps16850vmar-ds-p5.png",+     "href": "docs/figures/tps16850vmar-ds-p5.png"+    }+   ],+   "files": {+    "tps16850vmar.kicad_sym": "6744ba16ebb60b9fec757df856b244d3d4d36acceecd46d845679a4faa2fa7d7",+    "tps16850vmar.lbr": "9ace87d7b3714abc4ca70199f149594570fc1534f0ada5a85238ad61cdf31411",+    "altium/TPS16850VMAR.SchLib": "e550ad3980c965a9b69876a5da309df57b446e386df64a65149d2c8a50d47d5e"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI), automated checks, not yet reviewed by a person",+    "handle": "claude"+   },+   "status": "verified",+   "title": "Footprint equals TI's recommended land pattern",+   "scope": [+    "footprint"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Overlay on SLVSHA1D p.55 at TI's printed 15X scale: 69.2 % of the copper outline on TI's strokes (TI draws the metal under mask of pads 7, 10, 22 dashed), comb mask openings 97.4 % on TI's green",+     "result": "pass"+    },+    {+     "text": "Pad by pad against TI's VMA0023A footprint published through Ultra Librarian: copper, mask and paste of all 24 pad numbers agree to 0.050 mm2 or less (corner treatment only); the 12 vias are at the same positions",+     "result": "pass"+    },+    {+     "text": "Pads 7, 10 and 22 are solder-mask defined combs over a larger copper rectangle, as TI draws them; pads 6 and 17 are L shapes; exposed pad paste is TI's six 0.98 x 1.04 mm windows (p.56, 76 % coverage)",+     "result": "pass"+    },+    {+     "text": "KiCad's standard library has no VMA0023A footprint, so no KiCad comparison is possible",+     "result": "note"+    },+    {+     "text": "adom-lbr 2.47.5 drops KiCad custom-pad shapes and paste-only pads: the Fusion and Altium libraries are made from provenance/tps16850vmar-lbr-input.kicad_mod, the same copper as rectangle unions, copper-only pads with mask and paste expansion -1.2 mm; Fusion gets TI's six paste windows on tCream by hand; Altium gets one exposed-pad paste aperture with the same area (expansion -0.174 mm) because adom-lbr writes no paste-layer regions",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "tps16850vmar-footprint-check.png",+     "href": "docs/proof/tps16850vmar-footprint-check.png"+    },+    {+     "label": "tps16850vmar-ds-p55.png",+     "href": "docs/figures/tps16850vmar-ds-p55.png"+    },+    {+     "label": "tps16850vmar-ds-p56.png",+     "href": "docs/figures/tps16850vmar-ds-p56.png"+    }+   ],+   "files": {+    "tps16850vmar.kicad_mod": "a4d037c209a248d09f6d1501b6df71442a5bb021a5022c6d159bd36c82693a0c",+    "tps16850vmar.lbr": "9ace87d7b3714abc4ca70199f149594570fc1534f0ada5a85238ad61cdf31411",+    "altium/TPS16850VMAR.PcbLib": "2b9263bf6f0d5a18fd6372f6d5317e820d9886dc1e2ced07cb520136232a0e0d"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI), automated checks, not yet reviewed by a person",+    "handle": "claude"+   },+   "status": "verified",+   "title": "Pin 1 orientation agrees across datasheet, footprint, 3D model and symbol",+   "scope": [+    "footprint",+    "3d",+    "symbol"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Datasheet: pin 1 (ILIM) on the left side 0.5 mm above the centre line in the top view (Figure 5-1, p.4; land pattern p.55), pin-1 index corner and exposed-pad chamfer at the top left (p.54)",+     "result": "pass"+    },+    {+     "text": "Footprint: pad 1 at (-2.875, -0.5) in KiCad's Y-down frame, silkscreen dot to its left, fab outline chamfered at the top-left corner; numbering counter-clockwise (1-5 down the left, 6 corner, 7-10 along the bottom, 11-16 up the right, 17 corner, 18-21 along the top right to left, 22-23 top left)",+     "result": "pass"+    },+    {+     "text": "3D model: pin-1 terminal at (-2.75, +0.5) in the Y-up 3D frame (= pad 1), exposed-pad chamfer at the top-left corner; component-hero align check OK, offset 0.0 mm, zero rotation",+     "result": "pass"+    },+    {+     "text": "Symbol pin 1 = ILIM; Fusion and Altium map pin 1 to pad 1 (read back)",+     "result": "pass"+    },+    {+     "text": "Tape and reel: TI quadrant Q1 for pin 1 (p.52)",+     "result": "pass"+    }+   ],+   "evidence": [+    {+     "label": "tps16850vmar-pin1-check.png",+     "href": "docs/proof/tps16850vmar-pin1-check.png"+    },+    {+     "label": "tps16850vmar-ds-p4.png",+     "href": "docs/figures/tps16850vmar-ds-p4.png"+    },+    {+     "label": "tps16850vmar-ds-p52.png",+     "href": "docs/figures/tps16850vmar-ds-p52.png"+    }+   ],+   "files": {+    "tps16850vmar.kicad_mod": "a4d037c209a248d09f6d1501b6df71442a5bb021a5022c6d159bd36c82693a0c",+    "tps16850vmar.step": "34e33e779b6b92ffc048bf33a89dd3df7f246fd69638259933d5915d814a55f8",+    "tps16850vmar-etched.step": "15ef0f3945e0f6a08b63528edee6df68de23bae11e79c865b36fa0ffd3276ed1",+    "tps16850vmar.kicad_sym": "6744ba16ebb60b9fec757df856b244d3d4d36acceecd46d845679a4faa2fa7d7"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI), automated checks, not yet reviewed by a person",+    "handle": "claude"+   },+   "status": "verified",+   "title": "3D model inside TI's package drawing",+   "scope": [+    "3d"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Bottom view over SLVSHA1D p.54: 97.3 % of the model's edge pixels on TI's strokes at a fitted 118.25 px/mm (TI 10X = 118.1 px/mm at 300 dpi)",+     "result": "pass"+    },+    {+     "text": "Side view: terminal exposures on TI's (0.2) marks; 70.1 % edge overlap; TI draws the body at A max 1.5 mm, the model is at the nominal 1.4 mm",+     "result": "pass"+    },+    {+     "text": "Every printed dimension at its nominal (table in provenance/3d-model.json)",+     "result": "pass"+    },+    {+     "text": "Virtual MPN etch gate PASS (axis, upright with pin 1 left, size, flat, group); labelled virtual: TI's real marking is TPS16850",+     "result": "pass"+    },+    {+     "text": "TI's manufacturer STEP was not reachable with plain HTTP (Ultra Librarian export behind reCAPTCHA); the model is AI-built from the drawing",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "tps16850vmar-model-vs-drawing-bottom.png",+     "href": "docs/proof/tps16850vmar-model-vs-drawing-bottom.png"+    },+    {+     "label": "tps16850vmar-model-vs-drawing-side.png",+     "href": "docs/proof/tps16850vmar-model-vs-drawing-side.png"+    },+    {+     "label": "tps16850vmar-etched.check.png",+     "href": "docs/proof/tps16850vmar-etched.check.png"+    },+    {+     "label": "tps16850vmar-ds-p54.png",+     "href": "docs/figures/tps16850vmar-ds-p54.png"+    }+   ],+   "files": {+    "tps16850vmar.step": "34e33e779b6b92ffc048bf33a89dd3df7f246fd69638259933d5915d814a55f8",+    "tps16850vmar-etched.step": "15ef0f3945e0f6a08b63528edee6df68de23bae11e79c865b36fa0ffd3276ed1",+    "tps16850vmar-hero.glb": "5835866ecf6e8e2a408cd69f0b0f1863f6decb13f396c27613b06ca05ab14aac"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI), automated checks, not yet reviewed by a person",+    "handle": "claude"+   },+   "status": "open",+   "title": "Still to do",+   "scope": [+    "*"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "Compare with TI's own STEP (Ultra Librarian) when someone can download it through a browser",+     "result": "open"+    },+    {+     "text": "Open the Fusion .lbr and Altium libraries in the native tools and look at the comb pads, paste windows and NC pins",+     "result": "open"+    },+    {+     "text": "A person reviews this page",+     "result": "open"+    }+   ],+   "evidence": [],+   "files": {}+  }+ ]+}\ No newline at end of file
viewers/footprint.htmladded+210
@@ -0,0 +1,210 @@+<!doctype html><html><head><meta charset="utf-8">+<title>tps16850vmar - adom-footprint</title>+<meta name="viewport" content="width=device-width,initial-scale=1">+<style>+/* ── adom-footprint shared viewer core (CSS) ───────────────────────────────+   Included VERBATIM by both the live app (app.html) and the static embed+   (embed.html) so the canvas, zoom toolbar and layer-panel rows look identical+   and cannot drift. Self-contained literal colours (no dependency on either+   file's CSS vars). Class prefix: av- */++.av-vp{position:absolute;inset:0;overflow:hidden;cursor:grab;background:radial-gradient(circle at 50% 42%,#121a26 0%,#0d1117 72%)}+.av-vp.grab{cursor:grabbing}+/* DIRECT child only - the zoom-toolbar button icons (.av-tools svg) also live+   inside .av-vp; without '>' they'd inherit position:absolute and stack at 0,0. */+.av-vp > svg{position:absolute;left:0;top:0;width:100%;height:100%;transform-origin:0 0;display:block}++/* zoom toolbar */+/* Grouped translucent toolbar (matches adom-symbol's .tools): one container, borderless+   buttons that highlight on hover - instead of individually-boxed buttons. */+.av-tools{position:absolute;left:10px;top:10px;display:flex;gap:3px;padding:3px;z-index:5;background:rgba(22,27,34,.82);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid #222b38;border-radius:9px}+.av-tools button{width:30px;height:30px;border-radius:6px;border:none;background:transparent;color:#cfd8e2;cursor:pointer;display:grid;place-items:center;transition:background .15s ease,color .15s ease}+.av-tools button svg{width:16px;height:16px;display:block}+.av-tools button:hover{background:#222b38;color:#37c8a6}+.av-tools button:focus,.av-tools button:focus-visible{outline:none}+.av-panhint{position:absolute;right:10px;bottom:9px;color:#8b949e;font-size:11px;z-index:5;pointer-events:none;user-select:none;-webkit-user-select:none}++/* layer panel rows */+.av-lrow{display:flex;align-items:center;gap:9px;padding:8px 9px;border-radius:8px;cursor:pointer}+.av-lrow:hover{background:#161c27}+.av-lrow .sw{width:13px;height:13px;border-radius:3px;border:1px solid rgba(255,255,255,.15);flex:0 0 13px}+.av-lrow .sw.ring{background:transparent!important}+.av-lrow .ln{flex:1;font-size:13px}+.av-lrow .meta{font-size:10px;color:#8b949e}+.av-lrow .chk{width:16px;height:16px;border-radius:4px;border:1.5px solid #3a4757;display:grid;place-items:center;color:#0b0f17;font-size:11px}+.av-lrow.on .chk{background:#37c8a6;border-color:#37c8a6}+.av-lrow.off .ln,.av-lrow.off .sw{opacity:.4}+.av-lrow.special{background:linear-gradient(100deg,rgba(55,200,166,.10),transparent);border:1px solid rgba(55,200,166,.25);margin-top:4px}+.av-lrow.special .ln{color:#7ef0d2;font-weight:600}++:root{--bg:#0d1117;--panel:#11161f;--border:#222b38;--text:#e6edf3;--muted:#8b949e;--accent:#37c8a6}+*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}+body{background:var(--bg);color:var(--text);font-family:'Satoshi','Segoe UI',system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden}+header{display:flex;align-items:center;gap:9px;padding:9px 14px;border-bottom:1px solid var(--border);flex:0 0 auto}+header .dot{width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent)}+header .b{font-weight:700;font-size:14px}header .b span{color:var(--muted);font-weight:400}+header .nm{margin-left:auto;font-weight:600;font-size:13px;color:#cfd8e2}+main{flex:1;display:flex;min-height:0}+.vpwrap{flex:1;position:relative;min-width:0}+aside{flex:0 0 248px;border-left:1px solid var(--border);background:var(--panel);display:flex;flex-direction:column;min-height:0}+aside .ah{padding:9px 12px;border-bottom:1px solid var(--border);font-size:12px;color:var(--muted)}+.layers{padding:6px}+.note{font-size:11px;color:var(--muted);line-height:1.45;padding:8px 11px}+.note b{color:#7ef0d2}+</style></head>+<body>+  <header><span class="dot"></span><span class="b">adom-footprint <span>· interactive</span></span><span class="nm">tps16850vmar</span></header>+  <main>+    <div class="vpwrap">+      <div class="av-vp" id="vp">+        <svg xmlns="http://www.w3.org/2000/svg" viewBox="-4.920 -4.100 9.520 8.200" preserveAspectRatio="xMidYMid meet"><g class="adom-layer-courtyard"><rect x="-3.600" y="-3.100" width="7.200" height="6.200" fill="none" stroke="#FF26E2" stroke-width="0.05" stroke-dasharray="0.2,0.1"/></g><g class="adom-layer-fab"><path d="M-2.500,-2.500 L3.000,-2.500 L3.000,2.500 L-3.000,2.500 L-3.000,-2.000 Z" fill="none" stroke="#6e7681" stroke-width="0.1"/></g><g class="adom-layer-copper"><g data-pad="1" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="-3.200" y="-0.625" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="2" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="-3.200" y="-0.125" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="3" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="-3.200" y="0.375" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="4" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="-3.200" y="0.875" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="5" data-shape="roundrect" data-size="0.700x0.250" data-mount="smd"><rect x="-3.200" y="1.375" width="0.700" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="8" data-shape="roundrect" data-size="0.250x0.750" data-mount="smd"><rect x="0.100" y="1.950" width="0.250" height="0.750" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="9" data-shape="roundrect" data-size="0.250x0.750" data-mount="smd"><rect x="1.150" y="1.950" width="0.250" height="0.750" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="11" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="0.800" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="12" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="0.300" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="13" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="-0.200" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="14" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="-0.700" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="15" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="-1.200" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="16" data-shape="roundrect" data-size="0.650x0.250" data-mount="smd"><rect x="2.550" y="-1.700" width="0.650" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="18" data-shape="roundrect" data-size="0.250x0.600" data-mount="smd"><rect x="1.725" y="-2.700" width="0.250" height="0.600" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="19" data-shape="roundrect" data-size="0.250x0.600" data-mount="smd"><rect x="1.225" y="-2.700" width="0.250" height="0.600" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="20" data-shape="roundrect" data-size="0.250x0.600" data-mount="smd"><rect x="0.725" y="-2.700" width="0.250" height="0.600" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="21" data-shape="roundrect" data-size="0.250x0.600" data-mount="smd"><rect x="0.225" y="-2.700" width="0.250" height="0.600" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="23" data-shape="roundrect" data-size="1.300x0.250" data-mount="smd"><rect x="-3.200" y="-1.675" width="1.300" height="0.250" rx="0.050" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="rect" data-size="3.400x2.350" data-mount="smd"><rect x="-1.700" y="-1.250" width="3.400" height="2.350" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-1.450" cy="-0.875" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-0.590" cy="-0.875" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="0.590" cy="-0.875" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="1.450" cy="-0.875" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-1.450" cy="-0.075" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-0.590" cy="-0.075" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="0.590" cy="-0.075" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="1.450" cy="-0.075" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-1.450" cy="0.725" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="-0.590" cy="0.725" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="0.590" cy="0.725" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="24" data-shape="circle" data-size="0.500x0.500" data-mount="thru_hole"><circle cx="1.450" cy="0.725" r="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="6" data-shape="rect" data-size="0.700x0.250" data-mount="smd"><rect x="-3.200" y="1.875" width="0.700" height="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="6" data-shape="rect" data-size="0.300x0.825" data-mount="smd"><rect x="-2.800" y="1.875" width="0.300" height="0.825" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="17" data-shape="rect" data-size="0.250x0.800" data-mount="smd"><rect x="2.225" y="-2.700" width="0.250" height="0.800" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="17" data-shape="rect" data-size="0.975x0.250" data-mount="smd"><rect x="2.225" y="-2.150" width="0.975" height="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="2.300x0.875" data-mount="smd"><rect x="-3.250" y="-2.750" width="2.300" height="0.875" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="0.450x0.250" data-mount="smd"><rect x="-3.200" y="-2.175" width="0.450" height="0.250" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="1.750x0.325" data-mount="smd"><rect x="-2.750" y="-2.250" width="1.750" height="0.325" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="-2.750" y="-2.700" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="-2.250" y="-2.700" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="-1.750" y="-2.700" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="22" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="-1.250" y="-2.700" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="1.650x0.850" data-mount="smd"><rect x="-1.750" y="1.900" width="1.650" height="0.850" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="1.550x0.300" data-mount="smd"><rect x="-1.700" y="1.950" width="1.550" height="0.300" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="0.200x0.450" data-mount="smd"><rect x="-1.700" y="2.250" width="0.200" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="0.200x0.450" data-mount="smd"><rect x="-1.250" y="2.250" width="0.200" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="0.200x0.450" data-mount="smd"><rect x="-0.800" y="2.250" width="0.200" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="7" data-shape="rect" data-size="0.200x0.450" data-mount="smd"><rect x="-0.350" y="2.250" width="0.200" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="10" data-shape="rect" data-size="1.650x0.950" data-mount="smd"><rect x="1.600" y="1.800" width="1.650" height="0.950" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="10" data-shape="rect" data-size="1.550x0.400" data-mount="smd"><rect x="1.650" y="1.850" width="1.550" height="0.400" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="10" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="1.650" y="2.250" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="10" data-shape="rect" data-size="0.250x0.450" data-mount="smd"><rect x="2.150" y="2.250" width="0.250" height="0.450" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g></g><g class="adom-layer-heatsink"><circle cx="-1.200" cy="-0.675" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="-1.200" cy="-0.675" r="0.15" fill="#0d1117"/><circle cx="0.000" cy="-0.675" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="0.000" cy="-0.675" r="0.15" fill="#0d1117"/><circle cx="1.200" cy="-0.675" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="1.200" cy="-0.675" r="0.15" fill="#0d1117"/><circle cx="-1.200" cy="0.525" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="-1.200" cy="0.525" r="0.15" fill="#0d1117"/><circle cx="0.000" cy="0.525" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="0.000" cy="0.525" r="0.15" fill="#0d1117"/><circle cx="1.200" cy="0.525" r="0.30" fill="#8a5a2b" stroke="#e8a13a" stroke-width="0.05"/><circle cx="1.200" cy="0.525" r="0.15" fill="#0d1117"/></g><g class="adom-layer-drill"><circle cx="-1.450" cy="-0.875" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="-0.590" cy="-0.875" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="0.590" cy="-0.875" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="1.450" cy="-0.875" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="-1.450" cy="-0.075" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="-0.590" cy="-0.075" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="0.590" cy="-0.075" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="1.450" cy="-0.075" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="-1.450" cy="0.725" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="-0.590" cy="0.725" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="0.590" cy="0.725" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="1.450" cy="0.725" r="0.100" fill="#0d1117" stroke="#666" stroke-width="0.05"/></g><g class="adom-layer-silk"><line x1="-3.450" y1="-2.950" x2="3.450" y2="-2.950" stroke="#00cccc" stroke-width="0.12" stroke-linecap="round"/><line x1="3.450" y1="-2.950" x2="3.450" y2="2.950" stroke="#00cccc" stroke-width="0.12" stroke-linecap="round"/><line x1="3.450" y1="2.950" x2="-3.450" y2="2.950" stroke="#00cccc" stroke-width="0.12" stroke-linecap="round"/><line x1="-3.450" y1="2.950" x2="-3.450" y2="-2.950" stroke="#00cccc" stroke-width="0.12" stroke-linecap="round"/><circle cx="-3.800" cy="-0.500" r="0.120" fill="#00cccc" stroke="#00cccc" stroke-width="0.12"/></g><g class="adom-layer-padnum"><text x="0.000" y="-0.075" text-anchor="middle" dominant-baseline="central" font-size="0.987" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-1.450" y="-0.875" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-0.590" y="-0.875" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="0.590" y="-0.875" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="1.450" y="-0.875" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-1.450" y="-0.075" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-0.590" y="-0.075" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="0.590" y="-0.075" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="1.450" y="-0.075" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-1.450" y="0.725" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-0.590" y="0.725" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="0.590" y="0.725" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="1.450" y="0.725" text-anchor="middle" dominant-baseline="central" font-size="0.210" fill="#fff" font-family="sans-serif" style="pointer-events:none">24</text><text x="-2.650" y="2.288" text-anchor="middle" dominant-baseline="central" font-size="0.126" fill="#fff" font-family="sans-serif" style="pointer-events:none">6</text><text x="-2.100" y="-2.312" text-anchor="middle" dominant-baseline="central" font-size="0.367" fill="#fff" font-family="sans-serif" style="pointer-events:none">22</text><text x="-1.875" y="-2.087" text-anchor="middle" dominant-baseline="central" font-size="0.137" fill="#fff" font-family="sans-serif" style="pointer-events:none">22</text><text x="-0.925" y="2.325" text-anchor="middle" dominant-baseline="central" font-size="0.357" fill="#fff" font-family="sans-serif" style="pointer-events:none">7</text><text x="-0.925" y="2.100" text-anchor="middle" dominant-baseline="central" font-size="0.126" fill="#fff" font-family="sans-serif" style="pointer-events:none">7</text><text x="2.425" y="2.275" text-anchor="middle" dominant-baseline="central" font-size="0.399" fill="#fff" font-family="sans-serif" style="pointer-events:none">10</text><text x="2.425" y="2.050" text-anchor="middle" dominant-baseline="central" font-size="0.168" fill="#fff" font-family="sans-serif" style="pointer-events:none">10</text></g><g class="adom-layer-paste-apertures"><rect x="-3.200" y="-0.625" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 -2.875 -0.500)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="-0.125" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 -2.875 0.000)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="0.375" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 -2.875 0.500)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="0.875" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 -2.875 1.000)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="1.375" width="0.700" height="0.250" rx="0.05" transform="rotate(0.00 -2.850 1.500)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="0.100" y="1.950" width="0.250" height="0.750" rx="0.05" transform="rotate(0.00 0.225 2.325)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="1.150" y="1.950" width="0.250" height="0.750" rx="0.05" transform="rotate(0.00 1.275 2.325)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="0.800" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 0.925)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="0.300" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 0.425)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="-0.200" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 -0.075)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="-0.700" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 -0.575)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="-1.200" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 -1.075)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.550" y="-1.700" width="0.650" height="0.250" rx="0.05" transform="rotate(0.00 2.875 -1.575)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="1.725" y="-2.700" width="0.250" height="0.600" rx="0.05" transform="rotate(0.00 1.850 -2.400)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="1.225" y="-2.700" width="0.250" height="0.600" rx="0.05" transform="rotate(0.00 1.350 -2.400)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="0.725" y="-2.700" width="0.250" height="0.600" rx="0.05" transform="rotate(0.00 0.850 -2.400)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="0.225" y="-2.700" width="0.250" height="0.600" rx="0.05" transform="rotate(0.00 0.350 -2.400)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="-1.675" width="1.300" height="0.250" rx="0.05" transform="rotate(0.00 -2.550 -1.550)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.700" y="-1.250" width="3.400" height="2.350" rx="0.05" transform="rotate(0.00 0.000 -0.075)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="1.875" width="0.700" height="0.250" rx="0.05" transform="rotate(0.00 -2.850 2.000)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-2.800" y="1.875" width="0.300" height="0.825" rx="0.05" transform="rotate(0.00 -2.650 2.288)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.225" y="-2.700" width="0.250" height="0.800" rx="0.05" transform="rotate(0.00 2.350 -2.300)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.225" y="-2.150" width="0.975" height="0.250" rx="0.05" transform="rotate(0.00 2.712 -2.025)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-3.200" y="-2.175" width="0.450" height="0.250" rx="0.05" transform="rotate(0.00 -2.975 -2.050)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-2.750" y="-2.250" width="1.750" height="0.325" rx="0.05" transform="rotate(0.00 -1.875 -2.087)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-2.750" y="-2.700" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 -2.625 -2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-2.250" y="-2.700" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 -2.125 -2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.750" y="-2.700" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 -1.625 -2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.250" y="-2.700" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 -1.125 -2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.700" y="1.950" width="1.550" height="0.300" rx="0.05" transform="rotate(0.00 -0.925 2.100)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.700" y="2.250" width="0.200" height="0.450" rx="0.05" transform="rotate(0.00 -1.600 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.250" y="2.250" width="0.200" height="0.450" rx="0.05" transform="rotate(0.00 -1.150 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-0.800" y="2.250" width="0.200" height="0.450" rx="0.05" transform="rotate(0.00 -0.700 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-0.350" y="2.250" width="0.200" height="0.450" rx="0.05" transform="rotate(0.00 -0.250 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="1.650" y="1.850" width="1.550" height="0.400" rx="0.05" transform="rotate(0.00 2.425 2.050)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="1.650" y="2.250" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 1.775 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="2.150" y="2.250" width="0.250" height="0.450" rx="0.05" transform="rotate(0.00 2.275 2.475)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.670" y="-1.215" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 -1.180 -0.695)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-0.490" y="-1.215" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 0.000 -0.695)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="0.690" y="-1.215" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 1.180 -0.695)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-1.670" y="0.025" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 -1.180 0.545)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="-0.490" y="0.025" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 0.000 0.545)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/><rect x="0.690" y="0.025" width="0.980" height="1.040" rx="0.05" transform="rotate(0.00 1.180 0.545)" fill="none" stroke="#8aa0b8" stroke-width="0.03" stroke-dasharray="0.12 0.08" opacity="0.7"/></g><g class="adom-layer-paste-dots"><circle cx="-2.875" cy="-0.500" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.875" cy="0.000" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.875" cy="0.500" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.875" cy="1.000" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.975" cy="1.500" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.725" cy="1.500" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.225" cy="2.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.225" cy="2.450" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.275" cy="2.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.275" cy="2.450" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="0.925" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="0.425" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="-0.075" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="-0.575" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="-1.075" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.875" cy="-1.575" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.850" cy="-2.400" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.350" cy="-2.400" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.850" cy="-2.400" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.350" cy="-2.400" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.925" cy="-1.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.675" cy="-1.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.425" cy="-1.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.175" cy="-1.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.875" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.875" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="-0.950" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="-0.700" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="-0.450" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="0.300" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="0.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.625" cy="0.800" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.375" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.375" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.375" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.375" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="-0.950" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="-0.700" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="-0.450" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="0.300" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="0.550" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.625" cy="0.800" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.875" cy="-0.200" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="0.875" cy="0.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.975" cy="2.000" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.725" cy="2.000" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.650" cy="2.163" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.650" cy="2.413" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.350" cy="-2.425" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.350" cy="-2.175" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.462" cy="-2.025" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.712" cy="-2.025" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.962" cy="-2.025" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.975" cy="-2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.500" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.250" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.000" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.750" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.500" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.250" cy="-2.087" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.625" cy="-2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-2.125" cy="-2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.625" cy="-2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.125" cy="-2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.425" cy="2.100" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.175" cy="2.100" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.925" cy="2.100" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.675" cy="2.100" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.425" cy="2.100" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.600" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-1.150" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.700" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="-0.250" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.925" cy="2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.175" cy="2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.425" cy="2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.675" cy="2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.925" cy="2.050" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="1.775" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/><circle cx="2.275" cy="2.475" r="0.150" fill="#37c8a6" opacity="0.92"/></g></svg>+      </div>+    </div>+    <aside>+      <div class="ah">Layers</div>+      <div class="layers" id="layers"></div>+      <div class="note">The <b>solder paste jet</b> layer shows the 300µm paste-dispensing dots that travel with the footprint. Off by default - toggle it on.</div>+    </aside>+  </main>+<script>/* ── adom-footprint shared viewer core (window.AV) ─────────────────────────+   Single source of truth for the layer list, toggle behaviour, defaults,+   pan/zoom and toolbar icons. Included VERBATIM by both app.html (live) and+   embed.html (static) so the two viewers cannot drift. Pure client-side; works+   on any SVG that carries the <g class="adom-layer-*"> groups. */+(function(){+  var ICON_ZIN='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M10.5 8v5M8 10.5h5"/></svg>';+  var ICON_ZOUT='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M8 10.5h5"/></svg>';+  // Zoom-to-FIT = a magnifier with a small square inside (fit content to view).+  // Deliberately NOT the four-corner expand/"fullscreen" glyph.+  var ICON_FIT='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5"/><rect x="7.6" y="7.6" width="5.8" height="5.8" rx="1.2"/></svg>';++  // The canonical layer list. Every layer is a <g class="adom-layer-*"> in the+  // self-rendered SVG, so toggling is group-based (robust) - never colour-match.+  // `kind:'group'` on every entry: all layers are toggled by their <g> group+  // (robust), never by colour-match. (app.html still reads def.kind.)+  var LAYER_DEFS=[+    {key:'copper',    name:'Copper',           kind:'group', sel:'.adom-layer-copper',          sw:'#C83434'},+    // Auto-generated thermal-via array under the exposed pad - only present (and+    // listed) when the footprint has an exposed thermal pad.+    {key:'heatsink',  name:'Heatsink vias',    kind:'group', sel:'.adom-layer-heatsink',        sw:'#e8a13a'},+    {key:'padnum',    name:'Pad numbers',      kind:'group', sel:'.adom-layer-padnum',          sw:'#ffffff', ring:true},+    {key:'silk',      name:'Silkscreen',       kind:'group', sel:'.adom-layer-silk',            sw:'#00cccc'},+    {key:'fab',       name:'Fab (F.Fab)',      kind:'group', sel:'.adom-layer-fab',             sw:'#6e7681', ring:true},+    {key:'courtyard', name:'Courtyard',        kind:'group', sel:'.adom-layer-courtyard',       sw:'#FF26E2', ring:true},+    {key:'drill',     name:'Drill',            kind:'group', sel:'.adom-layer-drill',           sw:'#888888', ring:true},+    {key:'paste-ap',  name:'Paste apertures',  kind:'group', sel:'.adom-layer-paste-apertures', sw:'#8aa0b8', ring:true},+    // Generic name - the 300µm solder-paste dispensing dots. Off by default.+    {key:'paste-dots',name:'Solder paste jet', kind:'group', sel:'.adom-layer-paste-dots',      sw:'#37c8a6', special:true},+  ];++  // True only if the group actually holds drawn geometry (not an empty <g>) - so+  // layers with nothing in THIS footprint aren't listed as dead, dim rows.+  function groupHasGeo(svg,def){+    if(!svg) return false; var n=0,g=svg.querySelectorAll(def.sel);+    for(var i=0;i<g.length;i++){ n+=g[i].querySelectorAll('path,rect,circle,line,polygon,polyline,text').length; }+    return n>0;+  }+  function layerPresent(svg,def){ return groupHasGeo(svg,def); }+  function applyLayer(svg,def,on){+    if(!svg) return; var g=svg.querySelectorAll(def.sel);+    for(var i=0;i<g.length;i++) g[i].style.display=on?'':'none';+  }++  // Build layer rows into a container. opts:+  //   svg, container, state {key:bool}, meta {pasteDots,pasteApertures},+  //   onToggle(key,on). Missing state key -> special OFF, others ON. Skips empty+  //   non-special groups. Returns the keys actually shown.+  function buildLayers(opts){+    var svg=opts.svg, box=opts.container, state=opts.state||{}, meta=opts.meta||{}, shown=[];+    box.innerHTML='';+    LAYER_DEFS.forEach(function(def){+      if(!def.special && !groupHasGeo(svg,def)) return;+      var on = def.special ? (state[def.key]===true) : (state[def.key]!==false);+      var m = def.key==='paste-dots' ? ((meta.pasteDots||0)+' @ 300µm')+            : def.key==='paste-ap'   ? ((meta.pasteApertures||0)+' openings') : '';+      var row=document.createElement('div');+      row.className='av-lrow '+(on?'on':'off')+(def.special?' special':'');+      row.innerHTML='<span class="sw'+(def.ring?' ring':'')+'" style="'+(def.ring?('border-color:'+def.sw):('background:'+def.sw))+'"></span>'+        +'<span class="ln">'+def.name+'</span>'+(m?'<span class="meta">'+m+'</span>':'')+        +'<span class="chk">'+(on?'✓':'')+'</span>';+      row.onclick=function(){+        var nv=!row.classList.contains('on');+        row.classList.toggle('on',nv); row.classList.toggle('off',!nv);+        row.querySelector('.chk').textContent=nv?'✓':'';+        state[def.key]=nv; applyLayer(svg,def,nv);+        if(opts.onToggle) opts.onToggle(def.key,nv);+      };+      box.appendChild(row); applyLayer(svg,def,on); shown.push(def.key);+    });+    return shown;+  }++  // Wire pan + zoom on a viewport element (the box that contains the <svg>).+  // Returns a controller {fit, zoomIn, zoomOut, apply}.+  function initViewport(vp){+    var svg=vp.querySelector('svg');+    if(svg){ svg.removeAttribute('width'); svg.removeAttribute('height'); }+    var s=1,tx=0,ty=0;+    function apply(){ var el=vp.querySelector('svg'); if(el) el.style.transform='translate('+tx+'px,'+ty+'px) scale('+s+')'; }+    function zoomAt(cx,cy,f){ tx=cx-(cx-tx)*f; ty=cy-(cy-ty)*f; s*=f; apply(); }+    function fit(){ s=1;tx=0;ty=0;apply(); }+    // Smooth, delta-PROPORTIONAL zoom (matches adom-symbol). A fixed per-event+    // factor makes the trackpad leap - one gentle two-finger nudge fires a burst+    // of tiny wheel events and a fixed 1.12× compounds. Instead derive the factor+    // from how much actually scrolled (exp → smooth + reversible), normalise+    // device units, and clamp one event so a chunky mouse notch can't jump.+    var ZOOM_K=0.0022; // sensitivity: lower = gentler+    vp.addEventListener('wheel',function(e){+      e.preventDefault();+      var d=e.deltaY;+      if(e.deltaMode===1) d*=16; else if(e.deltaMode===2) d*=vp.clientHeight;+      d=Math.max(-50,Math.min(50,d));+      var r=vp.getBoundingClientRect();+      zoomAt(e.clientX-r.left,e.clientY-r.top,Math.exp(-d*ZOOM_K));+    },{passive:false});+    var drag=false,lx=0,ly=0;+    vp.addEventListener('pointerdown',function(e){ if(e.target.closest('.av-tools'))return; drag=true;lx=e.clientX;ly=e.clientY;vp.classList.add('grab');vp.setPointerCapture(e.pointerId); });+    vp.addEventListener('pointermove',function(e){ if(!drag)return; tx+=e.clientX-lx;ty+=e.clientY-ly;lx=e.clientX;ly=e.clientY;apply(); });+    vp.addEventListener('pointerup',function(){ drag=false;vp.classList.remove('grab'); });+    fit();+    return {+      fit:fit,+      zoomIn:function(){ var r=vp.getBoundingClientRect(); zoomAt(r.width/2,r.height/2,1.2); },+      zoomOut:function(){ var r=vp.getBoundingClientRect(); zoomAt(r.width/2,r.height/2,1/1.2); },+      apply:apply+    };+  }++  // Inject the standard zoom toolbar (+ / − / fit) + pan hint into a viewport,+  // wired to a controller from initViewport. Idempotent.+  function addToolbar(vp,ctl){+    if(vp.querySelector('.av-tools')) return;+    var t=document.createElement('div'); t.className='av-tools';+    t.innerHTML='<button data-z="in" title="Zoom in">'+ICON_ZIN+'</button>'+      +'<button data-z="out" title="Zoom out">'+ICON_ZOUT+'</button>'+      +'<button data-z="fit" title="Zoom to fit">'+ICON_FIT+'</button>';+    vp.appendChild(t);+    t.querySelector('[data-z="in"]').onclick=ctl.zoomIn;+    t.querySelector('[data-z="out"]').onclick=ctl.zoomOut;+    t.querySelector('[data-z="fit"]').onclick=ctl.fit;+    var h=document.createElement('div'); h.className='av-panhint'; h.textContent='drag to pan · scroll to zoom'; vp.appendChild(h);+  }++  window.AV={+    LAYER_DEFS:LAYER_DEFS, groupHasGeo:groupHasGeo, layerPresent:layerPresent,+    applyLayer:applyLayer, buildLayers:buildLayers, initViewport:initViewport,+    addToolbar:addToolbar, ICON_FIT:ICON_FIT, ICON_ZIN:ICON_ZIN, ICON_ZOUT:ICON_ZOUT+  };+})();+</script>+<script>+var META={"pasteApertures":43,"pasteDots":84};+(function(){+  var vp=document.getElementById('vp');+  var svg=vp.querySelector('svg');+  var ctl=AV.initViewport(vp);+  AV.addToolbar(vp,ctl);+  AV.buildLayers({ svg:svg, container:document.getElementById('layers'), state:{}, meta:META });+})();+</script>+</body></html>