@tscircuit/footprinter 0.0.77 → 0.0.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -987,6 +987,7 @@ type Footprinter = {
987
987
  pinrow: (num_pins: number) => FootprinterParamsBuilder<"p" | "id" | "od">;
988
988
  axial: () => FootprinterParamsBuilder<"p" | "id" | "od">;
989
989
  pushbutton: () => FootprinterParamsBuilder<"tllabel" | "trlabel" | "bllabel" | "brlabel">;
990
+ stampboard: () => FootprinterParamsBuilder<"w" | "left" | "right" | "top" | "bottom" | "p" | "pw" | "pl" | "innerhole">;
990
991
  params: () => any;
991
992
  /** @deprecated use circuitJson() instead */
992
993
  soup: () => AnySoupElement[];
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ __export(fn_exports, {
31
31
  sot563: () => sot563,
32
32
  sot723: () => sot723,
33
33
  ssop: () => ssop,
34
+ stampboard: () => stampboard,
34
35
  tssop: () => tssop
35
36
  });
36
37
 
@@ -62,6 +63,23 @@ var platedhole = (pn, x, y, id, od) => {
62
63
  // src/fn/dip.ts
63
64
  import { z } from "zod";
64
65
  import { length } from "circuit-json";
66
+
67
+ // src/helpers/silkscreenRef.ts
68
+ var silkscreenRef = (x, y, font_size) => {
69
+ return {
70
+ type: "pcb_silkscreen_text",
71
+ pcb_silkscreen_text_id: "silkscreen_text_1",
72
+ font: "tscircuit2024",
73
+ font_size,
74
+ pcb_component_id: "pcb_component_1",
75
+ text: "{REF}",
76
+ layer: "top",
77
+ anchor_position: { x, y },
78
+ anchor_alignment: "center"
79
+ };
80
+ };
81
+
82
+ // src/fn/dip.ts
65
83
  var extendDipDef = (newDefaults) => z.object({
66
84
  fn: z.string(),
67
85
  dip: z.literal(true),
@@ -162,8 +180,14 @@ var dip = (raw_params) => {
162
180
  };
163
181
  silkscreenPins.push(silkscreenPin);
164
182
  }
183
+ const silkscreenRefText = silkscreenRef(0, sh / 2 + 0.5, 0.4);
165
184
  return {
166
- circuitJson: [...platedHoles, silkscreenBorder, ...silkscreenPins],
185
+ circuitJson: [
186
+ ...platedHoles,
187
+ silkscreenBorder,
188
+ silkscreenRefText,
189
+ ...silkscreenPins
190
+ ],
167
191
  parameters
168
192
  };
169
193
  };
@@ -331,15 +355,18 @@ var passive = (params) => {
331
355
  throw new Error("could not infer pad width");
332
356
  if (ph === void 0)
333
357
  throw new Error("could not infer pad width");
358
+ const silkscreenRefText = silkscreenRef(0, h / 2, h / 12);
334
359
  if (tht) {
335
360
  return [
336
361
  platedhole(1, -p / 2, 0, pw, pw * 1 / 0.8),
337
- platedhole(2, p / 2, 0, pw, pw * 1 / 0.8)
362
+ platedhole(2, p / 2, 0, pw, pw * 1 / 0.8),
363
+ silkscreenRefText
338
364
  ];
339
365
  } else {
340
366
  return [
341
367
  rectpad(["1", "left"], -p / 2, 0, pw, ph),
342
- rectpad(["2", "right"], p / 2, 0, pw, ph)
368
+ rectpad(["2", "right"], p / 2, 0, pw, ph),
369
+ silkscreenRefText
343
370
  ];
344
371
  }
345
372
  };
@@ -438,8 +465,8 @@ var bga_def = z5.object({
438
465
  const m = s.match(/([A-Z]+)(\d+)/);
439
466
  if (!m)
440
467
  return s;
441
- let Y = ALPHABET.indexOf(m[1]);
442
- let X = parseInt(m[2]) - 1;
468
+ const Y = ALPHABET.indexOf(m[1]);
469
+ const X = Number.parseInt(m[2]) - 1;
443
470
  return Y * a.grid.x + X + 1;
444
471
  });
445
472
  }
@@ -502,7 +529,15 @@ ${JSON.stringify(
502
529
  );
503
530
  }
504
531
  }
505
- return { circuitJson: [...pads], parameters };
532
+ const silkscreenRefText = silkscreenRef(
533
+ 0,
534
+ grid.y * p / 2,
535
+ 0.2
536
+ );
537
+ return {
538
+ circuitJson: [...pads, silkscreenRefText],
539
+ parameters
540
+ };
506
541
  };
507
542
 
508
543
  // src/fn/soic.ts
@@ -570,6 +605,11 @@ var soicWithoutParsing = (parameters) => {
570
605
  const m = Math.min(1, parameters.p / 2);
571
606
  const sw = parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2;
572
607
  const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m;
608
+ const silkscreenRefText = silkscreenRef(
609
+ 0,
610
+ sh / 2 + 0.4,
611
+ sh / 12
612
+ );
573
613
  const silkscreenBorder = {
574
614
  type: "pcb_silkscreen_path",
575
615
  layer: "top",
@@ -589,7 +629,7 @@ var soicWithoutParsing = (parameters) => {
589
629
  { x: -sw / 2, y: -sh / 2 }
590
630
  ]
591
631
  };
592
- return [...pads, silkscreenBorder];
632
+ return [...pads, silkscreenBorder, silkscreenRefText];
593
633
  };
594
634
 
595
635
  // src/fn/quad.ts
@@ -839,7 +879,8 @@ var quad = (raw_params) => {
839
879
  y: corner_y - csz * dy
840
880
  }
841
881
  ],
842
- type: "pcb_silkscreen_path"
882
+ type: "pcb_silkscreen_path",
883
+ stroke_width: 0.1
843
884
  });
844
885
  }
845
886
  if ((arrow === "in1" || arrow === "in2") && !parameters.legsoutside) {
@@ -858,7 +899,8 @@ var quad = (raw_params) => {
858
899
  y: corner_y
859
900
  }
860
901
  ],
861
- type: "pcb_silkscreen_path"
902
+ type: "pcb_silkscreen_path",
903
+ stroke_width: 0
862
904
  },
863
905
  {
864
906
  layer: "top",
@@ -874,7 +916,8 @@ var quad = (raw_params) => {
874
916
  y: corner_y - csz * dy
875
917
  }
876
918
  ],
877
- type: "pcb_silkscreen_path"
919
+ type: "pcb_silkscreen_path",
920
+ stroke_width: 0.1
878
921
  }
879
922
  );
880
923
  }
@@ -901,12 +944,22 @@ var quad = (raw_params) => {
901
944
  y: arrow_y + 0.2 * rotate_arrow
902
945
  }
903
946
  ],
904
- type: "pcb_silkscreen_path"
947
+ type: "pcb_silkscreen_path",
948
+ stroke_width: 0.1
905
949
  });
906
950
  }
907
951
  }
952
+ const silkscreenRefText = silkscreenRef(
953
+ 0,
954
+ parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),
955
+ 0.3
956
+ );
908
957
  return {
909
- circuitJson: [...pads, ...silkscreen_corners],
958
+ circuitJson: [
959
+ ...pads,
960
+ ...silkscreen_corners,
961
+ silkscreenRefText
962
+ ],
910
963
  parameters
911
964
  };
912
965
  };
@@ -1079,21 +1132,26 @@ var sot23WithoutParsing = (parameters) => {
1079
1132
  const { x, y } = getCcwSot23Coords({
1080
1133
  num_pins: parameters.num_pins,
1081
1134
  pn: i + 1,
1082
- w: parseFloat(parameters.w),
1083
- h: parseFloat(parameters.h),
1084
- pl: parseFloat(parameters.pl)
1135
+ w: Number.parseFloat(parameters.w),
1136
+ h: Number.parseFloat(parameters.h),
1137
+ pl: Number.parseFloat(parameters.pl)
1085
1138
  });
1086
1139
  pads.push(
1087
1140
  rectpad(
1088
1141
  i + 1,
1089
1142
  x,
1090
1143
  y,
1091
- parseFloat(parameters.pl),
1092
- parseFloat(parameters.pw)
1144
+ Number.parseFloat(parameters.pl),
1145
+ Number.parseFloat(parameters.pw)
1093
1146
  )
1094
1147
  );
1095
1148
  }
1096
- return pads;
1149
+ const silkscreenRefText = silkscreenRef(
1150
+ 0,
1151
+ Number(parameters.h),
1152
+ 0.3
1153
+ );
1154
+ return [...pads, silkscreenRefText];
1097
1155
  };
1098
1156
 
1099
1157
  // src/fn/dfn.ts
@@ -1140,7 +1198,8 @@ var dfn = (raw_params) => {
1140
1198
  { x: dx * sw / 2, y: dy * sh / 2 },
1141
1199
  { x: dx * sw / 2, y: dy * sh / 2 - dy * parameters.p }
1142
1200
  ],
1143
- type: "pcb_silkscreen_path"
1201
+ type: "pcb_silkscreen_path",
1202
+ stroke_width: 0.1
1144
1203
  });
1145
1204
  }
1146
1205
  const as = parameters.p / 4;
@@ -1168,10 +1227,20 @@ var dfn = (raw_params) => {
1168
1227
  x: atx,
1169
1228
  y: aty
1170
1229
  }
1171
- ]
1230
+ ],
1231
+ stroke_width: 0.1
1172
1232
  });
1233
+ const silkscreenRefText = silkscreenRef(
1234
+ 0,
1235
+ sh / 2 + 0.4,
1236
+ sh / 12
1237
+ );
1173
1238
  return {
1174
- circuitJson: [...pads, ...silkscreenPaths],
1239
+ circuitJson: [
1240
+ ...pads,
1241
+ silkscreenRefText,
1242
+ ...silkscreenPaths
1243
+ ],
1175
1244
  parameters
1176
1245
  };
1177
1246
  };
@@ -1195,7 +1264,11 @@ var pinrow = (raw_params) => {
1195
1264
  for (let i = 0; i < parameters.num_pins; i++) {
1196
1265
  holes.push(platedhole(i + 1, xoff + i * p, 0, id, od));
1197
1266
  }
1198
- return { circuitJson: holes, parameters };
1267
+ const silkscreenRefText = silkscreenRef(0, p / 2, 0.5);
1268
+ return {
1269
+ circuitJson: [...holes, silkscreenRefText],
1270
+ parameters
1271
+ };
1199
1272
  };
1200
1273
 
1201
1274
  // src/fn/sot563.ts
@@ -1256,8 +1329,14 @@ var sot723_def = z12.object({
1256
1329
  });
1257
1330
  var sot723 = (raw_params) => {
1258
1331
  const parameters = sot723_def.parse(raw_params);
1332
+ const pad = sot723WithoutParsing(parameters);
1333
+ const silkscreenRefText = silkscreenRef(
1334
+ 0,
1335
+ Number(parameters.h),
1336
+ 0.3
1337
+ );
1259
1338
  return {
1260
- circuitJson: sot723WithoutParsing(parameters),
1339
+ circuitJson: [...pad, silkscreenRefText],
1261
1340
  parameters
1262
1341
  };
1263
1342
  };
@@ -1296,6 +1375,7 @@ var sot723WithoutParsing = (parameters) => {
1296
1375
 
1297
1376
  // src/fn/sod123.ts
1298
1377
  import { z as z13 } from "zod";
1378
+ import "circuit-json";
1299
1379
  var sod_def = z13.object({
1300
1380
  fn: z13.string(),
1301
1381
  w: z13.string().default("2.36mm"),
@@ -1306,8 +1386,15 @@ var sod_def = z13.object({
1306
1386
  });
1307
1387
  var sod123 = (raw_params) => {
1308
1388
  const parameters = sod_def.parse(raw_params);
1389
+ const silkscreenRefText = silkscreenRef(
1390
+ 0,
1391
+ Number(parameters.h) / 4 + 0.4,
1392
+ 0.3
1393
+ );
1309
1394
  return {
1310
- circuitJson: sodWithoutParsing(parameters),
1395
+ circuitJson: sodWithoutParsing(parameters).concat(
1396
+ silkscreenRefText
1397
+ ),
1311
1398
  parameters
1312
1399
  };
1313
1400
  };
@@ -1324,15 +1411,15 @@ var sodWithoutParsing = (parameters) => {
1324
1411
  for (let i = 0; i < 2; i++) {
1325
1412
  const { x, y } = getSodCoords({
1326
1413
  pn: i + 1,
1327
- pad_spacing: parseFloat(parameters.pad_spacing)
1414
+ pad_spacing: Number.parseFloat(parameters.pad_spacing)
1328
1415
  });
1329
1416
  pads.push(
1330
1417
  rectpad(
1331
1418
  i + 1,
1332
1419
  x,
1333
1420
  y,
1334
- parseFloat(parameters.pl),
1335
- parseFloat(parameters.pw)
1421
+ Number.parseFloat(parameters.pl),
1422
+ Number.parseFloat(parameters.pw)
1336
1423
  )
1337
1424
  );
1338
1425
  }
@@ -1341,15 +1428,15 @@ var sodWithoutParsing = (parameters) => {
1341
1428
 
1342
1429
  // src/fn/axial.ts
1343
1430
  import {
1344
- length as length7
1431
+ length as length8
1345
1432
  } from "@tscircuit/soup";
1346
1433
  import { z as z14 } from "zod";
1347
1434
  var axial_def = z14.object({
1348
1435
  fn: z14.string(),
1349
1436
  num_pins: z14.any().transform(() => 2),
1350
- p: length7.optional().default("2.54mm"),
1351
- id: length7.optional().default("0.7mm"),
1352
- od: length7.optional().default("1mm")
1437
+ p: length8.optional().default("2.54mm"),
1438
+ id: length8.optional().default("0.7mm"),
1439
+ od: length8.optional().default("1mm")
1353
1440
  });
1354
1441
  var axial = (raw_params) => {
1355
1442
  const parameters = axial_def.parse(raw_params);
@@ -1369,7 +1456,15 @@ var axial = (raw_params) => {
1369
1456
  stroke_width: 0.1,
1370
1457
  pcb_silkscreen_path_id: ""
1371
1458
  };
1372
- return { circuitJson: [...plated_holes, silkscreenLine], parameters };
1459
+ const silkscreenRefText = silkscreenRef(0, p / 4, 0.5);
1460
+ return {
1461
+ circuitJson: [
1462
+ ...plated_holes,
1463
+ silkscreenLine,
1464
+ silkscreenRefText
1465
+ ],
1466
+ parameters
1467
+ };
1373
1468
  };
1374
1469
 
1375
1470
  // src/fn/pushbutton.ts
@@ -1423,12 +1518,344 @@ var pushbutton = (raw_params) => {
1423
1518
  { x: width / 5, y: 0 }
1424
1519
  ])
1425
1520
  ];
1521
+ const silkscreenRefText = silkscreenRef(
1522
+ 0,
1523
+ height / 2 + 0.4,
1524
+ 0.5
1525
+ );
1426
1526
  return {
1427
- circuitJson: [...holes, ...silkscreenLines],
1527
+ circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],
1428
1528
  parameters
1429
1529
  };
1430
1530
  };
1431
1531
 
1532
+ // src/fn/stampboard.ts
1533
+ import {
1534
+ length as length9
1535
+ } from "circuit-json";
1536
+ import { z as z16 } from "zod";
1537
+ var stampboard_def = z16.object({
1538
+ fn: z16.string(),
1539
+ w: length9.default("22.58mm"),
1540
+ left: length9.optional(),
1541
+ right: length9.optional(),
1542
+ top: length9.optional(),
1543
+ bottom: length9.optional(),
1544
+ p: length9.default(length9.parse("2.54mm")),
1545
+ pw: length9.default(length9.parse("1.6mm")),
1546
+ pl: length9.default(length9.parse("3.2mm")),
1547
+ innerhole: z16.boolean().default(false)
1548
+ });
1549
+ var getHeight = (parameters) => {
1550
+ const params = stampboard_def.parse(parameters);
1551
+ if (params.left && params.right) {
1552
+ return Math.max(params.left, params.right) * params.p;
1553
+ }
1554
+ if (params.left) {
1555
+ return params.left * params.p;
1556
+ }
1557
+ if (params.right) {
1558
+ return params.right * params.p;
1559
+ }
1560
+ return 51;
1561
+ };
1562
+ var stampboard = (raw_params) => {
1563
+ const params = stampboard_def.parse(raw_params);
1564
+ const rectpads = [];
1565
+ const holes = [];
1566
+ let firstPinLocation = { x: 0, y: 0 };
1567
+ let routes = [];
1568
+ const innerDiameter = 1;
1569
+ const outerDiameter = 1.2;
1570
+ const triangleHeight = 1;
1571
+ const triangleWidth = 0.6;
1572
+ if (params.right) {
1573
+ const yoff = -((params.right - 1) / 2) * params.p;
1574
+ for (let i = 0; i < params.right; i++) {
1575
+ if (i === 0 && !params.left && !params.bottom) {
1576
+ firstPinLocation = {
1577
+ x: params.w / 2 - params.pl * 1.4,
1578
+ y: yoff + i * params.p
1579
+ };
1580
+ routes = [
1581
+ {
1582
+ x: firstPinLocation.x + triangleHeight / 2,
1583
+ y: firstPinLocation.y
1584
+ },
1585
+ // Tip of the triangle (pointing right)
1586
+ {
1587
+ x: firstPinLocation.x - triangleHeight / 2,
1588
+ y: firstPinLocation.y + triangleWidth / 2
1589
+ },
1590
+ // Bottom corner of the base
1591
+ {
1592
+ x: firstPinLocation.x - triangleHeight / 2,
1593
+ y: firstPinLocation.y - triangleWidth / 2
1594
+ },
1595
+ // Top corner of the base
1596
+ {
1597
+ x: firstPinLocation.x + triangleHeight / 2,
1598
+ y: firstPinLocation.y
1599
+ }
1600
+ // Close the path at the tip
1601
+ ];
1602
+ }
1603
+ rectpads.push(
1604
+ rectpad(
1605
+ i + 1,
1606
+ params.w / 2 - params.pl / 2,
1607
+ yoff + i * params.p,
1608
+ params.pl,
1609
+ params.pw
1610
+ )
1611
+ );
1612
+ if (params.innerhole) {
1613
+ holes.push(
1614
+ platedhole(
1615
+ i + 1,
1616
+ params.w / 2,
1617
+ yoff + i * params.p,
1618
+ innerDiameter,
1619
+ outerDiameter
1620
+ )
1621
+ );
1622
+ holes.push(
1623
+ platedhole(
1624
+ i + 1,
1625
+ params.w / 2 - params.pl + outerDiameter / 2,
1626
+ yoff + i * params.p,
1627
+ innerDiameter,
1628
+ outerDiameter
1629
+ )
1630
+ );
1631
+ }
1632
+ }
1633
+ }
1634
+ if (params.left) {
1635
+ const yoff = -((params.left - 1) / 2) * params.p;
1636
+ for (let i = 0; i < params.left; i++) {
1637
+ if (i === params.left - 1) {
1638
+ firstPinLocation = {
1639
+ x: -params.w / 2 + params.pl * 1.4,
1640
+ y: yoff + i * params.p
1641
+ };
1642
+ routes = [
1643
+ {
1644
+ x: firstPinLocation.x - triangleHeight / 2,
1645
+ y: firstPinLocation.y
1646
+ },
1647
+ // Tip of the triangle (pointing left)
1648
+ {
1649
+ x: firstPinLocation.x + triangleHeight / 2,
1650
+ y: firstPinLocation.y + triangleWidth / 2
1651
+ },
1652
+ // Top corner of the base
1653
+ {
1654
+ x: firstPinLocation.x + triangleHeight / 2,
1655
+ y: firstPinLocation.y - triangleWidth / 2
1656
+ },
1657
+ // Bottom corner of the base
1658
+ {
1659
+ x: firstPinLocation.x - triangleHeight / 2,
1660
+ y: firstPinLocation.y
1661
+ }
1662
+ // Close the path at the tip
1663
+ ];
1664
+ }
1665
+ rectpads.push(
1666
+ rectpad(
1667
+ i + 1,
1668
+ -params.w / 2 + params.pl / 2,
1669
+ yoff + i * params.p,
1670
+ params.pl,
1671
+ params.pw
1672
+ )
1673
+ );
1674
+ if (params.innerhole) {
1675
+ holes.push(
1676
+ platedhole(
1677
+ i + 1,
1678
+ -params.w / 2,
1679
+ yoff + i * params.p,
1680
+ innerDiameter,
1681
+ outerDiameter
1682
+ )
1683
+ );
1684
+ holes.push(
1685
+ platedhole(
1686
+ i + 1,
1687
+ -params.w / 2 + params.pl - outerDiameter / 2,
1688
+ yoff + i * params.p,
1689
+ innerDiameter,
1690
+ outerDiameter
1691
+ )
1692
+ );
1693
+ }
1694
+ }
1695
+ }
1696
+ if (params.top) {
1697
+ const xoff = -((params.top - 1) / 2) * params.p;
1698
+ for (let i = 0; i < params.top; i++) {
1699
+ if (i === params.top - 1 && !params.left && !params.bottom && !params.right) {
1700
+ firstPinLocation = {
1701
+ x: xoff + i * params.p,
1702
+ y: getHeight(params) / 2 - params.pl * 1.4
1703
+ };
1704
+ routes = [
1705
+ {
1706
+ x: firstPinLocation.x,
1707
+ y: firstPinLocation.y + triangleHeight / 2
1708
+ },
1709
+ // Tip of the triangle (pointing up)
1710
+ {
1711
+ x: firstPinLocation.x - triangleWidth / 2,
1712
+ y: firstPinLocation.y - triangleHeight / 2
1713
+ },
1714
+ // Left corner of the base
1715
+ {
1716
+ x: firstPinLocation.x + triangleWidth / 2,
1717
+ y: firstPinLocation.y - triangleHeight / 2
1718
+ },
1719
+ // Right corner of the base
1720
+ {
1721
+ x: firstPinLocation.x,
1722
+ y: firstPinLocation.y + triangleHeight / 2
1723
+ }
1724
+ // Close the path at the tip
1725
+ ];
1726
+ }
1727
+ rectpads.push(
1728
+ rectpad(
1729
+ i + 1,
1730
+ xoff + i * params.p,
1731
+ getHeight(params) / 2 - params.pl / 2,
1732
+ params.pw,
1733
+ params.pl
1734
+ )
1735
+ );
1736
+ if (params.innerhole) {
1737
+ holes.push(
1738
+ platedhole(
1739
+ i + 1,
1740
+ xoff + i * params.p,
1741
+ getHeight(params) / 2,
1742
+ innerDiameter,
1743
+ outerDiameter
1744
+ )
1745
+ );
1746
+ holes.push(
1747
+ platedhole(
1748
+ i + 1,
1749
+ xoff + i * params.p,
1750
+ getHeight(params) / 2 - params.pl + outerDiameter / 2,
1751
+ innerDiameter,
1752
+ outerDiameter
1753
+ )
1754
+ );
1755
+ }
1756
+ }
1757
+ }
1758
+ if (params.bottom) {
1759
+ const xoff = -((params.bottom - 1) / 2) * params.p;
1760
+ for (let i = 0; i < params.bottom; i++) {
1761
+ if (i === 0 && !params.left) {
1762
+ firstPinLocation = {
1763
+ x: xoff + i * params.p,
1764
+ y: -getHeight(params) / 2 + params.pl * 1.4
1765
+ };
1766
+ routes = [
1767
+ {
1768
+ x: firstPinLocation.x,
1769
+ y: firstPinLocation.y - triangleHeight / 2
1770
+ },
1771
+ // Tip of the triangle (pointing down)
1772
+ {
1773
+ x: firstPinLocation.x - triangleWidth / 2,
1774
+ y: firstPinLocation.y + triangleHeight / 2
1775
+ },
1776
+ // Left corner of the base
1777
+ {
1778
+ x: firstPinLocation.x + triangleWidth / 2,
1779
+ y: firstPinLocation.y + triangleHeight / 2
1780
+ },
1781
+ // Right corner of the base
1782
+ {
1783
+ x: firstPinLocation.x,
1784
+ y: firstPinLocation.y - triangleHeight / 2
1785
+ }
1786
+ // Close the path at the tip
1787
+ ];
1788
+ }
1789
+ rectpads.push(
1790
+ rectpad(
1791
+ i + 1,
1792
+ xoff + i * params.p,
1793
+ -getHeight(params) / 2 + params.pl / 2,
1794
+ params.pw,
1795
+ params.pl
1796
+ )
1797
+ );
1798
+ if (params.innerhole) {
1799
+ holes.push(
1800
+ platedhole(
1801
+ i + 1,
1802
+ xoff + i * params.p,
1803
+ -getHeight(params) / 2,
1804
+ innerDiameter,
1805
+ outerDiameter
1806
+ )
1807
+ );
1808
+ holes.push(
1809
+ platedhole(
1810
+ i + 1,
1811
+ xoff + i * params.p,
1812
+ -getHeight(params) / 2 + params.pl - outerDiameter / 2,
1813
+ innerDiameter,
1814
+ outerDiameter
1815
+ )
1816
+ );
1817
+ }
1818
+ }
1819
+ }
1820
+ const silkscreenTriangle = {
1821
+ type: "pcb_silkscreen_path",
1822
+ pcb_silkscreen_path_id: "pcb_silkscreen_triangle_1",
1823
+ pcb_component_id: "2",
1824
+ route: routes,
1825
+ stroke_width: 0.1,
1826
+ layer: "top"
1827
+ };
1828
+ const silkscreenPath = {
1829
+ type: "pcb_silkscreen_path",
1830
+ pcb_silkscreen_path_id: "pcb_silkscreen_path_1",
1831
+ pcb_component_id: "1",
1832
+ route: [
1833
+ { x: -params.w / 2, y: getHeight(params) / 2 },
1834
+ { x: params.w / 2, y: getHeight(params) / 2 },
1835
+ { x: params.w / 2, y: -getHeight(params) / 2 },
1836
+ { x: -params.w / 2, y: -getHeight(params) / 2 },
1837
+ { x: -params.w / 2, y: getHeight(params) / 2 }
1838
+ ],
1839
+ stroke_width: 0.1,
1840
+ layer: "top"
1841
+ };
1842
+ const silkscreenRefText = silkscreenRef(
1843
+ 0,
1844
+ getHeight(params) / 2 + 0.5,
1845
+ getHeight(params) / 25
1846
+ );
1847
+ return {
1848
+ circuitJson: [
1849
+ ...rectpads,
1850
+ ...holes,
1851
+ silkscreenPath,
1852
+ silkscreenTriangle,
1853
+ silkscreenRefText
1854
+ ],
1855
+ parameters: params
1856
+ };
1857
+ };
1858
+
1432
1859
  // src/helpers/is-not-null.ts
1433
1860
  function isNotNull(value) {
1434
1861
  return value !== null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n\n return {\n circuitJson: [...platedHoles, silkscreenBorder, ...silkscreenPins],\n parameters,\n }\n}\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n let Y = ALPHABET.indexOf(m[1]!)\n let X = parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n\n return { circuitJson: [...pads], parameters }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\n\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n }\n\n return {\n circuitJson: [...pads, ...silkscreen_corners],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parseFloat(parameters.w),\n h: parseFloat(parameters.h),\n pl: parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n parseFloat(parameters.pl),\n parseFloat(parameters.pw),\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n })\n\n return {\n circuitJson: [...pads, ...silkscreenPaths],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n return { circuitJson: holes, parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n return {\n circuitJson: sot723WithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n return {\n circuitJson: sodWithoutParsing(parameters),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n parseFloat(parameters.pl),\n parseFloat(parameters.pw),\n ),\n )\n }\n\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n\n return { circuitJson: [...plated_holes, silkscreenLine], parameters }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n\n return {\n circuitJson: [...holes, ...silkscreenLines],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,UAAU,MAAM;AAAA,EAAK,EAAE,QAAQ,EAAE;AAAA,EAAG,CAAC,GAAG,MACnD,KAAK,IAAK,IAAI,IAAK,KAAK,KAAK,KAAK,EAAE;AACtC,EAAE,IAAI,CAAC,OAAO;AAAA,EACZ;AAAA,EACA,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC;AAC1B,EAAE;;;ACJF,SAAS,UAAU;AAEZ,IAAM,aAAa,CACxB,IACA,GACA,GACA,IACA,OACkB;AAClB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,eAAe,GAAG,EAAE;AAAA,IACpB,gBAAgB,GAAG,EAAE;AAAA,IACrB,aAAa;AAAA,IACb,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACxB,YAAY,CAAC,GAAG,SAAS,CAAC;AAAA,EAC5B;AACF;;;ACdA,SAAS,SAAS;AAClB,SAAS,cAAc;AAGhB,IAAM,eAAe,CAAC,gBAC3B,EACG,OAAO;AAAA,EACN,IAAI,EAAE,OAAO;AAAA,EACb,KAAK,EAAE,QAAQ,IAAI;AAAA,EACnB,UAAU,EAAE,OAAO;AAAA,EACnB,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,GAAG,OAAO,SAAS;AAAA,EACnB,GAAG,OAAO,QAAQ,OAAO,MAAM,YAAY,KAAK,QAAQ,CAAC;AAAA,EACzD,IAAI,OAAO,SAAS;AAAA,EACpB,IAAI,OAAO,SAAS;AACtB,CAAC,EACA,UAAU,CAAC,MAAM;AAEhB,MAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AAClB,MAAE,KAAK,OAAO,MAAM,OAAO;AAC3B,MAAE,KAAK,OAAO,MAAM,OAAO;AAAA,EAC7B,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB;AAGA,MAAI,CAAC,EAAE,GAAG;AACR,QAAI,EAAE,MAAM;AACV,QAAE,IAAI,OAAO,MAAM,QAAQ;AAAA,IAC7B,WAAW,EAAE,QAAQ;AACnB,QAAE,IAAI,OAAO,MAAM,QAAQ;AAAA,IAC7B,OAAO;AACL,QAAE,IAAI,OAAO,MAAM,YAAY,KAAK,QAAQ;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT,CAAC;AAEE,IAAM,UAAU,aAAa,CAAC,CAAC;AAE/B,IAAM,kBAAkB,CAC7B,UACA,IACA,GACA,MACG;AAEH,QAAM,KAAK,WAAW;AACtB,QAAM,SAAS,MAAM;AAGrB,QAAM,cAAc,KAAK;AAGzB,QAAM,KAAK;AAEX,QAAM,IAAI,KAAK;AAEf,MAAI,QAAQ;AAGV,WAAO,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,EAC/C,OAAO;AAEL,WAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD;AACF;AAKO,IAAM,MAAM,CAAC,eAOyC;AAC3D,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,QAAM,cAAmC,CAAC;AAC1C,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI;AAAA,MACf,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AACA,gBAAY;AAAA,MACV,WAAW,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,SAAS,WAAW,MAAM,KAAK;AAAA,IAC1E;AAAA,EACF;AAEA,QAAM,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1C,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,mBAAsC;AAAA,IAC1C,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACzB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA,MAExB,GAAG,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO;AAAA,QAC5B,GAAI,IAAI,KAAM;AAAA,QACd,GAAI,IAAI,KAAM,IAAI,KAAK;AAAA,MACzB,EAAE;AAAA,MACF,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA,MACvB,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACxB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IAC3B;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACA,QAAM,iBAA2C,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,SAAS,IAAI,WAAW,WAAW;AACzC,UAAM,YAAY,SACd,CAAC,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,MACvC,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI;AAC1C,UAAM,YAAY,UACb,CAAC,KAAK,OAAO,IAAI,IAAI,WAAW,KAChC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,WAAW,KAAK,WAAW;AACjE,UAAM,gBAAgB;AAAA,MACpB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,kBAAkB,OAAO,IAAI,CAAC;AAAA,MAC9B,wBAAwB,OAAO,IAAI,CAAC;AAAA,MACpC,MAAM,OAAO,IAAI,CAAC;AAAA,MAClB,iBAAiB;AAAA,QACf,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,kBAAkB;AAAA,IACpB;AAEA,mBAAe,KAAK,aAAa;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,aAAa,kBAAkB,GAAG,cAAc;AAAA,IACjE;AAAA,EACF;AACF;;;AC3JO,IAAM,UAAU,CACrB,IACA,GACA,GACA,GACA,MACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY,MAAM,QAAQ,EAAE,IACxB,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,IAChC,CAAC,GAAG,SAAS,CAAC;AAAA,EACpB;AACF;;;ACnBA,OAAOA,SAAQ;AAEf,SAAS,KAAAC,UAAS;AAClB,SAAS,UAAAC,SAAQ,gBAAgB;AAcjC,IAAM,QAAQ;AAAA,EACZ;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AACA,IAAM,YAA0C,MAAM,OAAO,CAAC,KAAU,MAAM;AAC5E,MAAI,EAAE,MAAM,IAAI;AAChB,SAAO;AACT,GAAG,CAAC,CAAC;AACL,IAAM,cAA4C,MAAM;AAAA,EACtD,CAAC,KAAU,MAAM;AACf,QAAI,EAAE,QAAQ,IAAI;AAClB,WAAO;AAAA,EACT;AAAA,EACA,CAAC;AACH;AAEO,IAAM,cAAcD,GAAE,OAAO;AAAA,EAClC,KAAKA,GAAE,QAAQ;AAAA,EACf,GAAGC;AAAA,EACH,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,QAAQ,SAAS,SAAS;AAAA,EAC1B,UAAU,SAAS,SAAS;AAAA,EAC5B,GAAGA,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AACrB,CAAC;AAID,IAAM,eAAe,CAAC,MAAc,QAAQ,KAAK,IAAI,OAAO,IAAI;AAChE,IAAM,eAAe,CAAC,MAAc,OAAO,IAAI;AAC/C,IAAM,eAAe,CAAC,MAAc,OAAO,IAAI;AAC/C,IAAM,eAAe,CAAC,MAAc,QAAQ,KAAK,IAAI,OAAO,IAAI;AAEzD,IAAM,UAAU,CAAC,WAAyC;AAC/D,MAAI,EAAE,KAAK,GAAG,IAAI,IAAI,QAAQ,UAAU,GAAG,EAAE,IAAI;AAEjD,MAAI,OAAO,MAAM;AAAU,QAAIC,IAAG,CAAC;AACnC,MAAI,OAAO,MAAM;AAAU,QAAIA,IAAG,CAAC;AACnC,MAAI,OAAO,MAAM;AAAU,QAAIA,IAAG,CAAC;AACnC,MAAI,OAAO,OAAO;AAAU,SAAKA,IAAG,EAAE;AACtC,MAAI,OAAO,OAAO;AAAU,SAAKA,IAAG,EAAE;AAEtC,MAAI,IAAK,GAAI;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,QAAQ;AACV,SAAK,UAAU,MAAM;AAAA,EACvB;AAEA,MAAI,UAAU;AACZ,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAEA,MAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI;AAC/B,SAAK;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,IAAI;AACN,QAAI,GAAG;AACP,QAAI,GAAG;AACP,QAAI,GAAG;AACP,UAAM,GAAG,WAAW,GAAG,YAAY;AACnC,UAAM,GAAG,WAAW,GAAG,YAAY;AAAA,EACrC;AAEA,MAAI,OAAO;AAAW,UAAM,IAAI,MAAM,2BAA2B;AACjE,MAAI,OAAO;AAAW,UAAM,IAAI,MAAM,2BAA2B;AAEjE,MAAI,KAAK;AACP,WAAO;AAAA,MACL,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,IAAK,KAAK,IAAK,GAAG;AAAA,MAC3C,WAAW,GAAG,IAAI,GAAG,GAAG,IAAK,KAAK,IAAK,GAAG;AAAA,IAC5C;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL,QAAQ,CAAC,KAAK,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,MACxC,QAAQ,CAAC,KAAK,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IAC1C;AAAA,EACF;AACF;;;AClLO,IAAM,QAAQ,CAAC,eAGoC;AACxD,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACJO,IAAM,MAAM,CACjB,eACuD;AACvD,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACLO,IAAM,MAAM,CACjB,eACuD;AACvD,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACJO,IAAM,MAAM,CACjB,eACuD;AACvD,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACPO,IAAM,WAAW;;;ACGxB,SAAS,KAAAC,UAAS;AAClB,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACJjC,SAAS,KAAAC,UAAS;AAEX,IAAM,QAAQA,GAClB,OAAO,EACP,UAAU,CAAC,MAAM;AAChB,QAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,MAAM;AAC7B,SAAO;AAAA,IACL,GAAG,WAAW,CAAC;AAAA,IACf,GAAG,WAAW,CAAC;AAAA,EACjB;AACF,CAAC,EACA;AAAA,EACCA,GAAE,OAAO;AAAA,IACP,GAAGA,GAAE,OAAO;AAAA,IACZ,GAAGA,GAAE,OAAO;AAAA,EACd,CAAC;AACH;;;AChBF,SAAS,KAAAC,UAAS;AAEX,IAAM,gBAAgBA,GAC1B,OAAO,EACP,GAAGA,GAAE,MAAMA,GAAE,IAAI,CAAC,CAAC,EACnB,UAAU,CAAC,MAAM;AAChB,MAAI,MAAM,QAAQ,CAAC;AAAG,WAAO;AAC7B,MAAI,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG;AACxC,QAAI,EAAE,MAAM,GAAG,EAAE;AAAA,EACnB;AACA,SAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM;AAC7B,UAAM,SAAS,OAAO,CAAC;AACvB,WAAO,MAAM,MAAM,IAAI,IAAI;AAAA,EAC7B,CAAC;AACH,CAAC,EACA,KAAKA,GAAE,MAAMA,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,CAAC,CAAC,CAAC;;;AFNnC,IAAM,UAAUC,GACpB,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO;AAAA,EACnB,MAAM,MAAM,SAAS;AAAA,EACrB,GAAGC,UAAS,QAAQ,OAAO;AAAA,EAC3B,GAAGC,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AAAA,EACnB,MAAMA,QAAO,SAAS,EAAE,SAAS,eAAe;AAAA,EAChD,KAAKA,QAAO,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAElD,UAAUF,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAE/B,SAAS,cAAc,QAAQ,CAAC,CAAC;AACnC,CAAC,EACA,UAAU,CAAC,MAAM;AAChB,MAAI,SAAoC;AACxC,MAAI,EAAE;AAAU,aAAS;AACzB,MAAI,EAAE;AAAU,aAAS;AACzB,MAAI,EAAE;AAAU,aAAS;AAEzB,MAAI,CAAC,EAAE,MAAM;AAEX,UAAM,iBAAiB,KAAK,KAAK,KAAK,KAAK,EAAE,QAAQ,CAAC;AACtD,MAAE,OAAO,EAAE,GAAG,gBAAgB,GAAG,eAAe;AAAA,EAClD;AAEA,MAAI,EAAE,SAAS;AACb,MAAE,UAAU,EAAE,QAAQ,IAAI,CAAC,MAAM;AAC/B,UAAI,OAAO,MAAM;AAAU,eAAO;AAClC,UAAI,MAAM;AAAU,eAAO;AAC3B,UAAI,MAAM;AAAW,eAAO;AAC5B,YAAM,IAAI,EAAE,MAAM,eAAe;AACjC,UAAI,CAAC;AAAG,eAAO;AACf,UAAI,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAE;AAC9B,UAAI,IAAI,SAAS,EAAE,CAAC,CAAE,IAAI;AAC1B,aAAO,IAAI,EAAE,KAAM,IAAI,IAAI;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,EAAE,GAAG,GAAG,OAAO;AAE/B,SAAO;AACT,CAAC;AAKI,IAAM,MAAM,CACjB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,MAAI,EAAE,UAAU,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,QAAQ,IAAI;AAEtD,WAAU,OAAO,OAAQ;AAEzB,UAAQ,OAAO;AAEf,QAAM,OAAoB,CAAC;AAE3B,QAAM,oBAAoB,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ;AAC5E,QAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI;AAE3C,MAAI,QAAQ,WAAW,KAAK,mBAAmB,GAAG;AAGhD,QAAI,KAAK,KAAK,gBAAgB,IAAI,MAAM,GAAG;AACzC,cAAQ,KAAK,QAAQ;AAAA,IACvB,WAAW,qBAAqB,GAAG;AACjC,cAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,QAAQ,GAAG;AAG/B,UAAM,cAAc,KAAK,MAAM,KAAK,KAAK,gBAAgB,CAAC;AAI1D,UAAM,iBAAiB,KAAK,OAAO,KAAK,IAAI,eAAe,CAAC;AAC5D,UAAM,iBAAiB,KAAK,OAAO,KAAK,IAAI,eAAe,CAAC;AAG5D,aAAS,IAAI,gBAAgB,IAAI,iBAAiB,aAAa,KAAK;AAClE,eAAS,IAAI,gBAAgB,IAAI,iBAAiB,aAAa,KAAK;AAClE,yBAAiB,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,SAAS,GAAG;AAChC,qBAAiB,KAAK,CAAC;AAAA,EACzB;AAEA,MAAI,qBAAqB,iBAAiB,QAAQ;AAChD,UAAM,IAAI;AAAA,MACR;AAAA;AAAA,EAAqH,KAAK;AAAA,QACxH;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,uBAAuB,IAAI,IAAI,gBAAgB;AAErD,MAAI,sBAAsB;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC/B,UAAI,UAAU,IAAI,KAAK,IAAI,IAAI;AAC/B,UAAI,qBAAqB,IAAI,OAAO,GAAG;AACrC;AACA;AAAA,MACF;AACA,iBAAW;AAEX,YAAM,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACvC,YAAM,QAAQ,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK;AAGxC,WAAK;AAAA,QACH,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,OAAO,KAAK,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,CAAC,GAAG,IAAI,GAAG,WAAW;AAC9C;;;AG1IA,SAAS,KAAAG,UAA4B;AACrC,SAAS,UAAAC,eAAc;AAKhB,IAAM,gBAAgB,CAAC,gBAK5BC,GACG,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO;AAAA,EACnB,GAAGC,QAAO,QAAQA,QAAO,MAAM,YAAY,KAAK,OAAO,CAAC;AAAA,EACxD,GAAGA,QAAO,QAAQA,QAAO,MAAM,YAAY,KAAK,QAAQ,CAAC;AAAA,EACzD,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,aAAaD,GACV,QAAQ,EACR,SAAS,EACT,QAAQ,YAAY,eAAe,KAAK;AAC7C,CAAC,EACA,UAAU,CAAC,MAAM;AAEhB,MAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AAClB,MAAE,KAAKC,QAAO,MAAM,OAAO;AAC3B,MAAE,KAAKA,QAAO,MAAM,OAAO;AAAA,EAC7B,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB;AAEA,SAAO;AACT,CAAC;AAEE,IAAM,WAAW,cAAc,CAAC,CAAC;AAGjC,IAAM,mBAAmB,CAAC,eAQ3B;AACJ,MAAI,WAAW,sBAAsB,QAAW;AAC9C,eAAW,cAAc,CAAC,WAAW;AAAA,EACvC;AACA,QAAM,EAAE,UAAU,IAAI,GAAG,GAAG,IAAI,YAAY,IAAI;AAEhD,QAAM,KAAK,WAAW;AACtB,QAAM,SAAS,MAAM;AAGrB,QAAM,cAAc,KAAK;AAGzB,QAAM,KAAK;AAEX,QAAM,IAAI,KAAK;AAEf,QAAM,YAAY,cAAc,KAAK,IAAI,CAAC,KAAK;AAE/C,MAAI,QAAQ;AAGV,WAAO,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,EAC3D,OAAO;AAEL,WAAO,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAChE;AACF;AAKO,IAAM,OAAO,CAAC,eAOqC;AACxD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,eAAyC;AAC1E,QAAM,OAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,iBAAiB;AAAA,MAChC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,aAAa,WAAW;AAAA,IAC1B,CAAC;AACD,SAAK;AAAA,MACH,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,OAAO,WAAW,MAAM,OAAO;AAAA,IACvE;AAAA,EACF;AAGA,QAAM,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC;AACtC,QAAM,KACJ,WAAW,KAAK,WAAW,cAAc,IAAI,WAAW,KAAK,KAAK;AACpE,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,mBAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACzB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA,MAExB,GAAG,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO;AAAA,QAC5B,GAAI,IAAI,KAAM;AAAA,QACd,GAAI,IAAI,KAAM,IAAI,KAAK;AAAA,MACzB,EAAE;AAAA,MACF,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA,MACvB,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACxB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,MAAM,gBAAgB;AACnC;;;AC3IA,SAAS,KAAAC,UAAS;AAClB,SAAS,UAAAC,eAAc;;;ACFvB,SAAS,KAAAC,UAAS;AACX,IAAM,sBAAsBA,GAAE,KAAK;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACqBM,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKgB;AACd,QAAM,UAAoB,CAAC;AAC3B,QAAM,gBAAgB,WAAW;AACjC,MAAI,8BAA8B;AAGlC,QAAM,MAA0C,CAAC;AACjD,aAAW,aAAa,eAAe,CAAC,GAAG;AACzC,QAAI,SAAS,IAAI;AAAA,EACnB;AACA,MAAI,CAAC,IAAI,YAAY,CAAC,IAAI,WAAW,CAAC,IAAI,aAAa,CAAC,IAAI,YAAY;AACtE,QAAI,WAAW;AAAA,EACjB;AACA,MAAI,CAAC,IAAI,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,YAAY,CAAC,IAAI,QAAQ;AAClE,QAAI,IAAI,UAAU;AAChB,UAAI,SAAS;AAAA,IACf,WAAW,IAAI,SAAS;AACtB,UAAI,WAAW;AAAA,IACjB,WAAW,IAAI,WAAW;AACxB,UAAI,YAAY;AAAA,IAClB,WAAW,IAAI,YAAY;AACzB,UAAI,UAAU;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,IAAI,YAAY,IAAI,QAAQ;AAC9B,kCAA8B;AAAA,EAChC,WAAW,IAAI,YAAY,IAAI,WAAW;AACxC,kCAA8B;AAAA,EAChC,WAAW,IAAI,cAAc,IAAI,SAAS;AACxC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,cAAc,IAAI,UAAU;AACzC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,aAAa,IAAI,WAAW;AACzC,kCAA8B,gBAAgB,IAAI;AAAA,EACpD,WAAW,IAAI,aAAa,IAAI,QAAQ;AACtC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,WAAW,IAAI,UAAU;AACtC,kCAA8B,gBAAgB,IAAI;AAAA,EACpD,WAAW,IAAI,WAAW,IAAI,SAAS;AACrC,kCAA8B,gBAAgB;AAAA,EAChD;AAEA,UAAQ,KAAK,EAAE;AAKf,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAQ,2BAA2B,IAAI,IAAI;AAC3C,QAAI,OAAO,CAAC,IAAI;AACd;AACA,UAAI,8BAA8B,UAAU;AAC1C,sCAA8B;AAAA,MAChC;AAAA,IACF,OAAO;AACL;AACA,UAAI,8BAA8B,GAAG;AACnC,sCAA8B;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AFhGO,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EACpC,IAAIA,GAAE,OAAO;AAAA,EACb,IAAIA,GAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,EAC7B,KAAKA,GAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,EAC9B,aAAaA,GACV,OAAO,EACP,GAAGA,GAAE,MAAM,mBAAmB,CAAC,EAC/B,UAAU,CAAC,MAAO,OAAO,MAAM,WAAW,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAE,EACxE,KAAKA,GAAE,MAAM,mBAAmB,CAAC,EACjC,SAAS;AAAA,EACZ,UAAUA,GAAE,OAAO;AAAA,EACnB,GAAGC,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,QAAQA,QAAO,MAAM,OAAO,CAAC;AAAA,EACvC,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,YAAYD,GAAE,MAAM,CAACA,GAAE,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE,SAAS;AAAA,EACvD,aAAaA,GAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,gBAAgB,CAC3B,MACG;AACH,MAAI,EAAE,KAAK,CAAC,EAAE,GAAG;AACf,MAAE,IAAI,EAAE;AAAA,EACV,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG;AACtB,MAAE,IAAI,EAAE;AAAA,EACV;AAEA,QAAM,iBAAiB,EAAE,WAAW;AAEpC,MAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG;AAEjC,UAAM,0BAA0B,iBAAiB;AACjD,MAAE,IAAI,EAAE,IAAI;AAAA,EACd;AAEA,MAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;AAEtC,MAAE,KAAK,EAAE,IAAI,EAAE,KAAK,MAAM,iBAAiB;AAAA,EAC7C;AAEA,MAAI,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG;AAEvB,MAAE,IAAI,EAAE,KAAK,iBAAiB;AAC9B,MAAE,IAAI,EAAE;AAAA,EACV;AAEA,MAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AACzB,MAAE,KAAK,EAAE,IAAI;AACb,MAAE,KAAK,EAAE,IAAI;AAAA,EACf,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,cAAc,UAAU,aAAa;AAE7D,IAAM,YAAY,CAAC,QAAQ,UAAU,SAAS,KAAK;AAE5C,IAAM,gBAAgB,CAAC,WAQxB;AACJ,QAAM,EAAE,WAAW,IAAI,GAAG,GAAG,GAAG,IAAI,YAAY,IAAI;AACpD,QAAM,eAAe,YAAY;AACjC,QAAM,OAAO,UAAU,KAAK,OAAO,KAAK,KAAK,YAAY,CAAC;AAC1D,QAAM,OAAO,KAAK,KAAK;AAGvB,QAAM,MAAM,KAAK,eAAe;AAEhC,QAAM,MAAM,KAAK,eAAe;AAGhC,QAAM,QAAQ,cAAc,KAAK,IAAI,CAAC,KAAK;AAE3C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,OAAO;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,IAC/D,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,GAAG,OAAO;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,IAC7D;AACE,YAAM,IAAI,MAAM,oBAAoB;AAAA,EACxC;AACF;AAEO,IAAM,OAAO,CAClB,eACuD;AACvD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,QAAM,OAAyB,CAAC;AAChC,QAAM,UAAU,cAAc,UAAU;AAExC,QAAM,MAAM,WAAW,WAAW;AAClC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,cAAc;AAAA,MAChB,WAAW,WAAW;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,aAAa,WAAW;AAAA,IAC1B,CAAC;AAED,QAAI,KAAK,WAAW;AACpB,QAAI,KAAK,WAAW;AACpB,QAAI,gBAAgB,QAAQ;AAC1B;AAAC,OAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAAA,IACrB;AAEA,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,SAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACrC;AAEA,MAAI,WAAW,YAAY;AACzB,QAAI,OAAO,WAAW,eAAe,WAAW;AAC9C,YAAM,MAAM,WAAW,KAAK,MAAM,KAAK,WAAW;AAClD,YAAM,MAAM,WAAW,KAAK,MAAM,KAAK,WAAW;AAClD,WAAK,KAAK,QAAQ,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,IACnD,OAAO;AACL,WAAK;AAAA,QACH;AAAA,UACE,CAAC,YAAY;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,WAAW;AAAA,UACtB,WAAW,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,qBAA0C,CAAC;AACjD,aAAW,CAAC,QAAQ,IAAI,EAAE,KAAK;AAAA,IAC7B,CAAC,YAAY,IAAI,CAAC;AAAA,IAClB,CAAC,eAAe,IAAI,EAAE;AAAA,IACtB,CAAC,gBAAgB,GAAG,EAAE;AAAA,IACtB,CAAC,aAAa,GAAG,CAAC;AAAA,EACpB,GAAY;AAGV,UAAM,WAAY,WAAW,IAAI,IAAK;AACtC,UAAM,WAAY,WAAW,IAAI,IAAK;AACtC,QAAI,QAAgC;AAEpC,QAAI,UAAU;AACd,QAAI,UAAU;AAGd,UAAM,MAAM,WAAW,KAAK;AAE5B,QAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,YAAY;AAC7C,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,YAAY;AAC1D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,WAAW,aAAa;AAC/D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,aAAa;AAC3D,cAAQ;AAAA,IACV,WAAW,QAAQ,GAAG,MAAM,KAAK,WAAW,eAAe;AACzD,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,eAAe;AAC7D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,gBAAgB;AAC9D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,WAAW,gBAAgB;AAClE,cAAQ;AAAA,IACV;AAEA,UAAM,eAAe,UAAU,QAAQ,IAAI;AAC3C,QAAI,WAAW,aAAa;AAC1B,YAAM,WAAW,UAAU,QAAQ,WAAW,KAAK,IAAI,WAAW,KAAK;AACvE,YAAM,WAAW,UAAU,QAAQ,WAAW,KAAK,IAAI,WAAW,KAAK;AACvE,iBAAW,WAAW,KAAK;AAC3B,iBAAW,WAAW,KAAK;AAAA,IAC7B;AAGA,QAAI,UAAU,UAAU,WAAW,aAAa;AAC9C,yBAAmB,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,wBAAwB,uBAAuB,MAAM;AAAA,QACrD,OAAO;AAAA,UACL;AAAA,YACE,GAAG,WAAW,MAAM;AAAA,YACpB,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG,WAAW,MAAM;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAIA,SAAK,UAAU,SAAS,UAAU,UAAU,CAAC,WAAW,aAAa;AACnE,yBAAmB;AAAA,QACjB;AAAA,UACE,OAAO;AAAA,UACP,kBAAkB;AAAA,UAClB,wBAAwB,uBAAuB,MAAM;AAAA,UACrD,OAAO;AAAA,YACL;AAAA,cACE,GAAG,WAAW,MAAM;AAAA,cACpB,GAAG;AAAA,YACL;AAAA,YACA;AAAA,cACE,GAAG,WAAY,MAAM,KAAM;AAAA,cAC3B,GAAG;AAAA,YACL;AAAA,UACF;AAAA,UACA,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,kBAAkB;AAAA,UAClB,wBAAwB,uBAAuB,MAAM;AAAA,UACrD,OAAO;AAAA,YACL;AAAA,cACE,GAAG;AAAA,cACH,GAAG,WAAY,MAAM,KAAM;AAAA,YAC7B;AAAA,YACA;AAAA,cACE,GAAG;AAAA,cACH,GAAG,WAAW,MAAM;AAAA,YACtB;AAAA,UACF;AAAA,UACA,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,SAAS,UAAU,OAAO;AACtC,yBAAmB,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,wBAAwB,uBAAuB,MAAM;AAAA,QACrD,OAAO;AAAA,UACL;AAAA,YACE,GAAG,UAAU,MAAM,CAAC;AAAA,YACpB,GAAG,UAAU,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG,UAAU,MAAM,eAAe,CAAC;AAAA,YACnC,GAAG,UAAU;AAAA,UACf;AAAA,UACA;AAAA,YACE,GAAG,UAAU,MAAM,CAAC;AAAA,YACpB,GAAG,UAAU,MAAM;AAAA,UACrB;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,MAAM,GAAG,kBAAkB;AAAA,IAC5C;AAAA,EACF;AACF;;;AGxSO,IAAM,UAAU,cAAc,OAAO,CAAC,CAAC,EAAE,UAAU,aAAa;AAEhE,IAAM,MAAM,CACjB,eACuD;AACvD,aAAW,cAAc;AACzB,SAAO,KAAK,UAAU;AACxB;;;ACLO,IAAM,MAAM,CACjB,eAC0D;AAC1D,aAAW,cAAc;AAEzB,QAAM,gBAAgB,SAAS,MAAM,UAAU;AAC/C,MAAI,CAAC,WAAW,GAAG;AACjB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,IAAI;AACf;AAAA,MACF,KAAK;AACH,YAAI,WAAW,MAAM;AAAI,qBAAW,IAAI;AAAA;AACnC,qBAAW,IAAI;AACpB;AAAA,MACF,KAAK;AACH,mBAAW,IAAI;AACf;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAC,WAAW,IAAI;AAClB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF;AACE,mBAAW,KAAK,cAAc,KAAK;AACnC;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAC,WAAW,IAAI;AAClB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF,KAAK;AACH,YAAI,WAAW,MAAM;AAAI,qBAAW,KAAK;AAAA;AACpC,qBAAW,KAAK;AACrB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF;AACE,mBAAW,KAAK,cAAc;AAC9B;AAAA,IACJ;AAAA,EACF;AACA,SAAO,KAAK,UAAU;AACxB;;;ACzDO,IAAM,UAAU,cAAc,OAAO,CAAC,CAAC,EAAE,UAAU,aAAa;AAEhE,IAAM,MAAM,CACjB,eACuD;AACvD,aAAW,cAAc;AACzB,MAAI,WAAW,eAAe,QAAW;AACvC,eAAW,aAAa;AAAA,EAC1B;AACA,SAAO,KAAK,UAAU;AACxB;;;ACTO,IAAM,WAAW,cAAc;AAAA,EACpC,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAEM,IAAM,OAAO,CAClB,eACuD;AACvD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACfO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACbO,IAAM,aAAa,cAAc;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,EAAE,GAAG,YAAY,UAAU,EAAE,CAAC;AAClE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACdO,IAAM,aAAa,cAAc,CAAC,CAAC;AAEnC,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM;AAAA,IAClC,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,YAAY;AAAA,EACd,CAAC;AAED,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACtBA,SAAS,KAAAE,UAAS;AAGX,IAAM,YAAYC,GAAE,OAAO;AAAA,EAChC,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9B,GAAGA,GAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,GAAGA,GAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,IAAIA,GAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,GAAE,OAAO,EAAE,QAAQ,SAAS;AAClC,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,SAAO;AAAA,IACL,aAAa,oBAAoB,UAAU;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAC,eAM5B;AACJ,QAAM,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI;AAEzB,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,MAAM,GAAG,EAAE;AAAA,EACzB,WAAW,OAAO,GAAG;AACnB,WAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAAA,EAC5B,OAAO;AACL,WAAO,EAAE,GAAG,KAAK,GAAG,KAAK;AAAA,EAC3B;AACF;AAEO,IAAM,sBAAsB,CAAC,eAA0C;AAC5E,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,kBAAkB;AAAA,MACjC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW,WAAW,CAAC;AAAA,MAC1B,GAAG,WAAW,WAAW,CAAC;AAAA,MAC1B,IAAI,WAAW,WAAW,EAAE;AAAA,IAC9B,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,WAAW,WAAW,EAAE;AAAA,QACxB,WAAW,WAAW,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACxDA,OAAkB;;;ACRX,IAAM,UAAU;AAAA,EACrB,EAAE,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE;AAAA,EAClC,EAAE,MAAM,aAAa,IAAI,GAAG,IAAI,EAAE;AAAA,EAClC,EAAE,MAAM,eAAe,IAAI,IAAI,IAAI,GAAG;AAAA,EACtC,EAAE,MAAM,gBAAgB,IAAI,GAAG,IAAI,GAAG;AACxC;;;ADMO,IAAM,UAAU,cAAc,CAAC,CAAC;AAOhC,IAAM,MAAM,CACjB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,QAAM,OAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,iBAAiB;AAAA,MAChC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AACD,SAAK;AAAA,MACH,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,OAAO,WAAW,MAAM,OAAO;AAAA,IACvE;AAAA,EACF;AAGA,QAAM,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC;AACtC,QAAM,KAAK,WAAW,IAAI;AAC1B,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,kBAAuC,CAAC;AAE9C,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,IAAI,GAAG,IAAI;AACnB,oBAAgB,KAAK;AAAA,MACnB,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,MACxB,OAAO;AAAA,QACL,EAAE,GAAI,KAAK,KAAM,IAAI,KAAK,WAAW,GAAG,GAAI,KAAK,KAAM,EAAE;AAAA,QACzD,EAAE,GAAI,KAAK,KAAM,GAAG,GAAI,KAAK,KAAM,EAAE;AAAA,QACrC,EAAE,GAAI,KAAK,KAAM,GAAG,GAAI,KAAK,KAAM,IAAI,KAAK,WAAW,EAAE;AAAA,MAC3D;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAIA,QAAM,KAAK,WAAW,IAAI;AAE1B,QAAM,MAAM,CAAC,KAAK,IAAI,KAAK;AAE3B,QAAM,MAAM,KAAK,IAAI,WAAW,IAAI;AAEpC,kBAAgB,KAAK;AAAA,IACnB,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,MACX;AAAA,MACA;AAAA,QACE,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,MACX;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,MAAM,GAAG,eAAe;AAAA,IACzC;AAAA,EACF;AACF;;;AE/FA,SAAS,KAAAC,WAAS;AAClB,SAAS,UAAAC,eAAmC;AAGrC,IAAM,aAAaC,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,OAAO;AAAA,EACnB,GAAGC,QAAO,QAAQ,OAAO,EAAE,SAAS,OAAO;AAAA,EAC3C,IAAIA,QAAO,QAAQ,OAAO,EAAE,SAAS,gBAAgB;AAAA,EACrD,IAAIA,QAAO,QAAQ,OAAO,EAAE,SAAS,gBAAgB;AACvD,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,UAAU;AAC9C,QAAM,EAAE,GAAG,IAAI,GAAG,IAAI;AACtB,QAAM,QAAe,CAAC;AAEtB,QAAM,KAAK,WAAW,WAAW;AACjC,QAAM,OAAO,EAAE,KAAK,KAAK;AAEzB,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,KAAK,WAAW,IAAI,GAAG,OAAO,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,aAAa,OAAO,WAAW;AAC1C;;;ACtBO,IAAM,aAAa,cAAc,CAAC,CAAC;AAEnC,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM;AAAA,IAClC,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,YAAY;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;AClBO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,EAAE,GAAG,YAAY,UAAU,EAAE,CAAC;AACjE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACdO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,EAAE,GAAG,YAAY,UAAU,GAAG,CAAC;AAClE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACjBA,SAAS,KAAAC,WAAS;AAGX,IAAM,aAAaC,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9B,GAAGA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC7B,GAAGA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC7B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AACjC,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,UAAU;AAC9C,SAAO;AAAA,IACL,aAAa,qBAAqB,UAAU;AAAA,IAC5C;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,eAM7B;AACJ,QAAM,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI;AAEzB,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB,WAAW,OAAO,GAAG;AACnB,WAAO,EAAE,GAAG,GAAG,GAAG,KAAK;AAAA,EACzB,OAAO;AACL,WAAO,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,EACxB;AACF;AAEO,IAAM,uBAAuB,CAClC,eACG;AACH,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,EAAE,GAAG,EAAE,IAAI,mBAAmB;AAAA,MAClC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,IAAI,OAAO,WAAW,WAAW,EAAE;AAAA,IACrC,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO,WAAW,WAAW,EAAE;AAAA,QAC/B,MAAM,IAAI,OAAO,WAAW,WAAW,EAAE,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACjEA,SAAS,KAAAC,WAAS;AAGX,IAAM,UAAUC,IAAE,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO;AAAA,EACb,GAAGA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,GAAGA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,aAAaA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAC1C,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,SAAO;AAAA,IACL,aAAa,kBAAkB,UAAU;AAAA,IACzC;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,eAGvB;AACJ,QAAM,EAAE,IAAI,YAAY,IAAI;AAE5B,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,EAAE;AAAA,EACrC,OAAO;AACL,WAAO,EAAE,GAAG,cAAc,GAAG,GAAG,EAAE;AAAA,EACpC;AACF;AAEO,IAAM,oBAAoB,CAAC,eAAwC;AACxE,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,EAAE,GAAG,EAAE,IAAI,aAAa;AAAA,MAC5B,IAAI,IAAI;AAAA,MACR,aAAa,WAAW,WAAW,WAAW;AAAA,IAChD,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,WAAW,WAAW,EAAE;AAAA,QACxB,WAAW,WAAW,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACxDA;AAAA,EACE,UAAAC;AAAA,OAIK;AAEP,SAAS,KAAAC,WAAS;AAGX,IAAM,YAAYC,IAAE,OAAO;AAAA,EAChC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,IAAI,EAAE,UAAU,MAAM,CAAC;AAAA,EACnC,GAAGC,QAAO,SAAS,EAAE,QAAQ,QAAQ;AAAA,EACrC,IAAIA,QAAO,SAAS,EAAE,QAAQ,OAAO;AAAA,EACrC,IAAIA,QAAO,SAAS,EAAE,QAAQ,KAAK;AACrC,CAAC;AAGM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAE7C,QAAM,EAAE,GAAG,IAAI,GAAG,IAAI;AAEtB,QAAM,eAAe;AAAA,IACnB,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IAC/B,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EAChC;AAEA,QAAM,iBAAoC;AAAA,IACxC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,EAAE;AAAA,MAChC,EAAE,GAAG,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,EAAE;AAAA,IACjC;AAAA,IACA,cAAc;AAAA,IACd,wBAAwB;AAAA,EAC1B;AAEA,SAAO,EAAE,aAAa,CAAC,GAAG,cAAc,cAAc,GAAG,WAAW;AACtE;;;AC3CA,SAAS,KAAAC,WAAS;;;ACCX,IAAM,iBAAiB,CAC5B,OACA,UAKI,CAAC,MACiB;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,SAAS;AAAA,IACxB,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,wBAAwB,QAAQ,0BAA0B;AAAA,IAC1D;AAAA,IACA,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;;;ADdO,IAAM,iBAAiBC,IAAE,OAAO;AAAA,EACrC,IAAIA,IAAE,QAAQ,YAAY;AAC5B,CAAC;AAEM,IAAM,aAAa,CACxB,eAC0D;AAC1D,QAAM,aAAa,eAAe,MAAM,UAAU;AAElD,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,eAAe;AAErB,QAAM,QAA6B;AAAA,IACjC,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACtE,WAAW,GAAG,CAAC,QAAQ,GAAG,CAAC,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACvE,WAAW,GAAG,QAAQ,GAAG,CAAC,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACtE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,EACvE;AAEA,QAAM,kBAAuC;AAAA;AAAA,IAE3C,eAAe;AAAA,MACb,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MAChC,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,SAAS,EAAE;AAAA,IACjC,CAAC;AAAA,IACD,eAAe;AAAA,MACb,EAAE,GAAG,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MAC/B,EAAE,GAAG,QAAQ,GAAG,GAAG,SAAS,EAAE;AAAA,IAChC,CAAC;AAAA;AAAA,IAED,eAAe;AAAA,MACb,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE;AAAA,MACtB,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE;AAAA,MACtB,EAAE,GAAK,QAAQ,IAAK,IAAK,KAAK,KAAK,CAAC,GAAG,GAAG,SAAS,EAAE;AAAA,IACvD,CAAC;AAAA,IACD,eAAe;AAAA,MACb,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE;AAAA,MACrB,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,OAAO,GAAG,eAAe;AAAA,IAC1C;AAAA,EACF;AACF;;;AEnDO,SAAS,UAAa,OAA6B;AACxD,SAAO,UAAU;AACnB;;;AC4DO,IAAM,SAAS,CAAC,QAA6B;AAClD,MAAIC,MAAK,YAAY;AAGrB,OAAK,IAAI,WAAW,KAAK,IAAI,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC5D,UAAM,MAAM,GAAG;AAEjB,QAAM,YAAY,IACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,UAAM,IAAI,EAAE,MAAM,2BAA2B;AAC7C,UAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;AACzB,QAAI,GAAG,SAAS,GAAG;AAAG,aAAO;AAC7B,WAAO,EAAE,IAAI,IAAI,CAAC,GAAI,GAAG,IAAI,CAAC,EAAG;AAAA,EACnC,CAAC,EACA,OAAO,SAAS;AAEnB,aAAW,EAAE,IAAI,EAAE,KAAK,WAAW;AACjC,IAAAA,MAAKA,IAAG,EAAE,EAAE,CAAC;AAAA,EACf;AAEA,EAAAA,IAAG,UAAU,GAAG;AAEhB,SAAOA;AACT;AAEO,IAAM,cAAc,MAGtB;AACH,QAAM,QAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,MACE,KAAK,CAAC,QAAa,SAAiB;AAElC,YAAI,SAAS,UAAU,SAAS,eAAe;AAC7C,cAAI,QAAQ,UAAU,WAAa,OAAO,EAAE,GAAG;AAC7C,mBAAO,MAAM,WAAa,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,UAC/C;AAEA,cAAI,CAAC,WAAa,OAAO,EAAE,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,OAAO,EAAE,IAC3C,OAAO,SAAS,kBAAkB,OAAO,MAAM,MAAM,EACvD;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,MAAM;AAEX,kBAAM,IAAI;AAAA,cACR,oFAAoF,IAAI;AAAA,YAC1F;AAAA,UACF;AAAA,QACF;AACA,YAAI,SAAS,QAAQ;AACnB,cAAI,CAAC,WAAa,OAAO,EAAE,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,OAAO,EAAE,IAC3C,OAAO,SAAS,kBAAkB,OAAO,MAAM,MAAM,EACvD;AAAA,YACF;AAAA,UACF;AACA,iBAAO,MAAM,WAAa,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,QAC/C;AACA,YAAI,SAAS,UAAU;AAErB,iBAAO,MAAM;AAAA,QACf;AACA,YAAI,SAAS,aAAa;AACxB,iBAAO,CAAC,MAAc;AACpB,mBAAO,SAAS;AAChB,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO,CAAC,MAAW;AACjB,cAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,gBAAI,GAAG,IAAI,GAAG,CAAC,MAAM,YAAc;AACjC,qBAAO,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI;AACxB,qBAAO,KAAK,GAAG,IAAI,GAAG,CAAC;AAAA,YACzB,OAAO;AACL,qBAAO,IAAI,IAAI;AACf,qBAAO,KAAK;AACZ,kBAAI,SAAS,SAAS,SAAS,OAAO;AACpC,oBAAI,GAAG;AACL,yBAAO,WAAW;AAAA,gBACpB;AAAA,cACF,OAAO;AACL,uBAAO,WAAW,OAAO,WAAW,CAAC;AAAA,cACvC;AAAA,YACF;AAAA,UACF,OAAO;AAEL,gBAAI,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAc,GAAG;AAAA,YAEpD,OAAO;AACL,qBAAO,IAAI,IAAI,KAAK;AAAA,YACtB;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,YAAY,SAAS;AAEd,IAAM,KAAK;","names":["mm","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","fp"]}
1
+ {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n dip: z.literal(true),\n num_pins: z.number(),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.2mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.2)\n } else if (!v.od) {\n v.od = v.id! * (1.2 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"@tscircuit/soup\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 2.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 6.0,\n G_mm_min: 2.6,\n X_mm_min: 2.4,\n C_mm_ref: 4.4,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 7.2,\n G_mm_min: 3.8,\n X_mm_min: 3.0,\n C_mm_ref: 5.6,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, h / 2, h / 12)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"@tscircuit/soup\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"@tscircuit/soup\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n if (num_pins_missing !== missing_pin_nums.length) {\n throw new Error(\n `not able to create bga component, unable to determine missing pins (try specifying them with \"missing+1+2+...\"\\n\\n${JSON.stringify(\n parameters,\n null,\n \" \",\n )}`,\n )\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z, type AnyZodObject } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number(),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { length } from \"@tscircuit/soup\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.literal(true).optional(),\n ccw: z.literal(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number(),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"@tscircuit/soup\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"@tscircuit/soup\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number(),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.2mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.number().default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"@tscircuit/soup\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 2; i++) {\n const { x, y } = getSodCoords({\n pn: i + 1,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"@tscircuit/soup\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n num_pins: z.any().transform(() => 2),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = 4.5\n const height = 6.5\n const holeDiameter = 1\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n left: length.optional(),\n right: length.optional(),\n top: length.optional(),\n bottom: length.optional(),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let firstPinLocation: {\n x: number\n y: number\n } = { x: 0, y: 0 }\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n firstPinLocation = {\n x: params.w / 2 - params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing right)\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n params.w / 2 - params.pl + outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n firstPinLocation = {\n x: -params.w / 2 + params.pl * 1.4,\n y: yoff + i * params.p,\n }\n routes = [\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Tip of the triangle (pointing left)\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: firstPinLocation.x + triangleHeight / 2,\n y: firstPinLocation.y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: firstPinLocation.x - triangleHeight / 2,\n y: firstPinLocation.y,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2 + params.pl - outerDiameter / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: getHeight(params) / 2 - params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n getHeight(params) / 2 - params.pl + outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n firstPinLocation = {\n x: xoff + i * params.p,\n y: -getHeight(params) / 2 + params.pl * 1.4,\n }\n routes = [\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: firstPinLocation.x - triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: firstPinLocation.x + triangleWidth / 2,\n y: firstPinLocation.y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: firstPinLocation.x,\n y: firstPinLocation.y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n rectpads.push(\n rectpad(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1,\n xoff + i * params.p,\n -getHeight(params) / 2 + params.pl - outerDiameter / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: getHeight(params) / 2 },\n { x: params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: -getHeight(params) / 2 },\n { x: -params.w / 2, y: getHeight(params) / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n getHeight(params) / 2 + 0.5,\n getHeight(params) / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"@tscircuit/soup\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n \"w\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"pw\" | \"pl\" | \"innerhole\"\n >\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","z","z","z","z","length","z","z","length","z","z","length","z","z","length","fp"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/footprinter",
3
3
  "type": "module",
4
- "version": "0.0.77",
4
+ "version": "0.0.79",
5
5
  "description": "",
6
6
  "main": "dist/index.js",
7
7
  "files": [