diff --git a/examples/features/keepoutsolver/keepoutsolver01-input.json b/examples/features/keepoutsolver/keepoutsolver01-input.json
new file mode 100644
index 00000000..4c74b2ab
--- /dev/null
+++ b/examples/features/keepoutsolver/keepoutsolver01-input.json
@@ -0,0 +1,7491 @@
+[
+ {
+ "hdRoutes": [
+ {
+ "connectionName": "source_net_1_mst2",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -33.144999999999996,
+ "y": 16.040000000000003,
+ "z": 0
+ },
+ {
+ "x": -33.54719964857121,
+ "y": 16.422776602298317,
+ "z": 0
+ },
+ {
+ "x": -34.62280035142878,
+ "y": 16.597223397701686,
+ "z": 0
+ },
+ {
+ "x": -35.02499999999999,
+ "y": 16.98,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_3",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -33.144999999999996,
+ "y": 13.499999999999998,
+ "z": 0
+ },
+ {
+ "x": -33.551289755499994,
+ "y": 13.499999999999998,
+ "z": 0
+ },
+ {
+ "x": -34.61871024450001,
+ "y": 13.499999999999998,
+ "z": 0
+ },
+ {
+ "x": -35.025000000000006,
+ "y": 13.499999999999998,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_3",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -7.620000000000001,
+ "y": -11.919999999999998,
+ "z": 0
+ },
+ {
+ "x": -8.025597164353895,
+ "y": -12.005497318852813,
+ "z": 0
+ },
+ {
+ "x": -8.214402835646109,
+ "y": -12.02616934781385,
+ "z": 0
+ },
+ {
+ "x": -8.620000000000001,
+ "y": -12.111666666666665,
+ "z": 0
+ },
+ {
+ "x": -9.019901481982533,
+ "y": -12.500525862455989,
+ "z": 0
+ },
+ {
+ "x": -14.20013471801754,
+ "y": -15.661867915021565,
+ "z": 0
+ },
+ {
+ "x": -14.600036200000073,
+ "y": -16.05072711081089,
+ "z": 0
+ },
+ {
+ "x": -15.006325955500074,
+ "y": -16.05072711081089,
+ "z": 0
+ },
+ {
+ "x": -16.393742044500073,
+ "y": -16.05072711081089,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": -16.05072711081089,
+ "z": 0
+ },
+ {
+ "x": -17.19663178089257,
+ "y": -15.667010498800355,
+ "z": 0
+ },
+ {
+ "x": -22.802218810456004,
+ "y": -10.625408601517128,
+ "z": 0
+ },
+ {
+ "x": -23.19996820000004,
+ "y": -10.459021780000064,
+ "z": 0
+ },
+ {
+ "x": -23.60625795550004,
+ "y": -10.397294771088395,
+ "z": 0
+ },
+ {
+ "x": -24.993674044500036,
+ "y": -10.397294771088395,
+ "z": 0
+ },
+ {
+ "x": -25.399963800000037,
+ "y": -10.459021780000064,
+ "z": 0
+ },
+ {
+ "x": -25.829157029002705,
+ "y": -10.192370264915263,
+ "z": 0
+ },
+ {
+ "x": -28.985165572265597,
+ "y": -9.993479399535737,
+ "z": 0
+ },
+ {
+ "x": -29.39,
+ "y": -10.16,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_12",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -7.62,
+ "y": -4.299999999999999,
+ "z": 0
+ },
+ {
+ "x": -8.025597164353893,
+ "y": -4.385497318852815,
+ "z": 0
+ },
+ {
+ "x": -8.214402835646109,
+ "y": -4.406169347813849,
+ "z": 0
+ },
+ {
+ "x": -8.620000000000001,
+ "y": -4.491666666666665,
+ "z": 0
+ },
+ {
+ "x": -9.018651751679643,
+ "y": -4.432048528023444,
+ "z": 0
+ },
+ {
+ "x": -14.201384448320429,
+ "y": -0.11062055864327983,
+ "z": 0
+ },
+ {
+ "x": -14.600036200000073,
+ "y": -0.051002420000057835,
+ "z": 0
+ },
+ {
+ "x": -15.006060826047028,
+ "y": -0.16456304084078538,
+ "z": 0
+ },
+ {
+ "x": -16.39400717395312,
+ "y": -0.1961513748114308,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": -0.30971199565215835,
+ "z": 0
+ },
+ {
+ "x": -17.19941894156704,
+ "y": -0.6993322357260092,
+ "z": 0
+ },
+ {
+ "x": -22.800581058433078,
+ "y": -4.689463718722397,
+ "z": 0
+ },
+ {
+ "x": -23.199968200000043,
+ "y": -4.746436785714346,
+ "z": 0
+ },
+ {
+ "x": -23.605571019807304,
+ "y": -4.3716258352280075,
+ "z": 0
+ },
+ {
+ "x": -28.98439718019274,
+ "y": -3.939810950486339,
+ "z": 0
+ },
+ {
+ "x": -29.39,
+ "y": -3.5650000000000017,
+ "z": 0
+ },
+ {
+ "x": -29.796289755500002,
+ "y": -3.5650000000000017,
+ "z": 0
+ },
+ {
+ "x": -30.5837102445,
+ "y": -3.5650000000000017,
+ "z": 0
+ },
+ {
+ "x": -30.990000000000002,
+ "y": -3.5650000000000017,
+ "z": 0
+ },
+ {
+ "x": -31.298887079621053,
+ "y": -3.9708837761098543,
+ "z": 0
+ },
+ {
+ "x": -31.39611292037894,
+ "y": -8.059116223890149,
+ "z": 0
+ },
+ {
+ "x": -31.70499999999999,
+ "y": -8.465000000000002,
+ "z": 0
+ },
+ {
+ "x": -32.0280578993095,
+ "y": -8.848407900829692,
+ "z": 0
+ },
+ {
+ "x": -32.111842300690554,
+ "y": -8.97659209917031,
+ "z": 0
+ },
+ {
+ "x": -32.43490020000006,
+ "y": -9.36,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_4",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 15.70003399999996,
+ "y": 2.2500589999999647,
+ "z": 0
+ },
+ {
+ "x": 9.090058999999966,
+ "y": 2.2500589999999647,
+ "z": 0
+ },
+ {
+ "x": 7.620000000000001,
+ "y": 0.7799999999999994,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_6",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 15.70003399999996,
+ "y": -7.749941000000035,
+ "z": 0
+ },
+ {
+ "x": 13.609941000000035,
+ "y": -7.749941000000035,
+ "z": 0
+ },
+ {
+ "x": 7.62,
+ "y": -1.7600000000000016,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst0",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 15.70003399999996,
+ "y": -12.250059000000078,
+ "z": 0
+ },
+ {
+ "x": 10.490059000000077,
+ "y": -12.250059000000078,
+ "z": 0
+ },
+ {
+ "x": 7.619999999999999,
+ "y": -9.38,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst3",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 15.70003399999996,
+ "y": -12.250059000000078,
+ "z": 0
+ },
+ {
+ "x": 17.09437406750257,
+ "y": -10.855718932497467,
+ "z": 0
+ },
+ {
+ "x": 17.09437406750257,
+ "y": -3.6721999809429358,
+ "z": 0
+ },
+ {
+ "x": 17.09437406750257,
+ "y": -3.6443990675026896,
+ "z": 0
+ },
+ {
+ "x": 15.70003399999996,
+ "y": -2.2500590000000784,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_8",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": 2.2500589999999647,
+ "z": 0
+ },
+ {
+ "x": -8.689941000000037,
+ "y": 2.2500589999999647,
+ "z": 0
+ },
+ {
+ "x": -7.619999999999999,
+ "y": 3.320000000000002,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst2",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": -2.2500590000000784,
+ "z": 0
+ },
+ {
+ "x": -16.05711479879851,
+ "y": -2.5723815738367852,
+ "z": 0
+ },
+ {
+ "x": -16.39422320806981,
+ "y": -2.596105977229822,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": -2.4250585000000786,
+ "z": 0
+ },
+ {
+ "x": -17.192607415429134,
+ "y": -2.4876235384092364,
+ "z": 0
+ },
+ {
+ "x": -22.808541993222516,
+ "y": -9.873811684293308,
+ "z": 0
+ },
+ {
+ "x": -23.19996820000004,
+ "y": -10.051002420000058,
+ "z": 0
+ },
+ {
+ "x": -23.60625795550004,
+ "y": -10.112729428911727,
+ "z": 0
+ },
+ {
+ "x": -24.993674044500036,
+ "y": -10.112729428911727,
+ "z": 0
+ },
+ {
+ "x": -25.399963800000037,
+ "y": -10.051002420000058,
+ "z": 0
+ },
+ {
+ "x": -25.777780285098075,
+ "y": -9.804303059472463,
+ "z": 0
+ },
+ {
+ "x": -28.987824713633692,
+ "y": -8.082161904149787,
+ "z": 0
+ },
+ {
+ "x": -29.39,
+ "y": -7.709971250000018,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_10",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": -7.749941000000035,
+ "z": 0
+ },
+ {
+ "x": -8.529941000000036,
+ "y": -7.749941000000035,
+ "z": 0
+ },
+ {
+ "x": -7.62,
+ "y": -6.839999999999999,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst1",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": -12.250059000000078,
+ "z": 0
+ },
+ {
+ "x": -17.114039893449068,
+ "y": -10.836053106551084,
+ "z": 0
+ },
+ {
+ "x": -17.114039893449068,
+ "y": -3.664064893449073,
+ "z": 0
+ },
+ {
+ "x": -17.114039893449068,
+ "y": -3.664064893449073,
+ "z": 0
+ },
+ {
+ "x": -15.700034000000073,
+ "y": -2.2500590000000784,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_trace_12",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": 12.250058999999965,
+ "z": 0
+ },
+ {
+ "x": -16.105842591930337,
+ "y": 12.172194506920844,
+ "z": 0
+ },
+ {
+ "x": -16.39422320806981,
+ "y": 12.152923993079087,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": 12.075059499999965,
+ "z": 0
+ },
+ {
+ "x": -17.18201157328734,
+ "y": 11.986084708093266,
+ "z": 0
+ },
+ {
+ "x": -22.784957355632994,
+ "y": 4.718903495311736,
+ "z": 0
+ },
+ {
+ "x": -23.19996820000004,
+ "y": 4.7464367857142316,
+ "z": 0
+ },
+ {
+ "x": -23.592425145694364,
+ "y": 4.567555922248487,
+ "z": 0
+ },
+ {
+ "x": -28.98444163920324,
+ "y": 3.533368283871699,
+ "z": 0
+ },
+ {
+ "x": -29.39,
+ "y": 3.170028749999982,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst2",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -15.700034000000073,
+ "y": 7.749940999999922,
+ "z": 0
+ },
+ {
+ "x": -15.79879203272318,
+ "y": 7.706720243420978,
+ "z": 0
+ },
+ {
+ "x": -16.39422320806981,
+ "y": 7.687449729579219,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": 7.574941499999921,
+ "z": 0
+ },
+ {
+ "x": -17.19492107601652,
+ "y": 7.5040937796199865,
+ "z": 0
+ },
+ {
+ "x": -22.805078923983594,
+ "y": 1.5451212150741636,
+ "z": 0
+ },
+ {
+ "x": -23.19996820000004,
+ "y": 1.1501256500000336,
+ "z": 0
+ },
+ {
+ "x": -23.60152003178846,
+ "y": 0.7640127656971301,
+ "z": 0
+ },
+ {
+ "x": -24.998411968211617,
+ "y": 0.33511046430284575,
+ "z": 0
+ },
+ {
+ "x": -25.399963800000037,
+ "y": -0.051002420000057835,
+ "z": 0
+ },
+ {
+ "x": -25.80100706608506,
+ "y": -0.43801789092356047,
+ "z": 0
+ },
+ {
+ "x": -28.98895673391498,
+ "y": -1.9830132790765376,
+ "z": 0
+ },
+ {
+ "x": -29.39,
+ "y": -2.3700287500000403,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_0",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 3.81,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 4.200507647999999,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 4.319492352,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 4.709999999999999,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 5.131148092255273,
+ "y": 13.64781933026343,
+ "z": 0
+ },
+ {
+ "x": 15.875277793204145,
+ "y": 7.637273547586945,
+ "z": 0
+ },
+ {
+ "x": 16.097760272727232,
+ "y": 7.16,
+ "z": 0
+ },
+ {
+ "x": 16.289176295851117,
+ "y": 6.806323148096977,
+ "z": 0
+ },
+ {
+ "x": 16.504263947719753,
+ "y": 5.956317614222348,
+ "z": 0
+ },
+ {
+ "x": 16.80003179999996,
+ "y": 5.783638534482748,
+ "z": 0
+ },
+ {
+ "x": 17.17501890700906,
+ "y": 5.769793657008904,
+ "z": 0
+ },
+ {
+ "x": 17.47668580113494,
+ "y": -11.666841981408318,
+ "z": 0
+ },
+ {
+ "x": 17.62481209090895,
+ "y": -12.039809199999898,
+ "z": 0
+ },
+ {
+ "x": 17.624812090908947,
+ "y": -12.408746191791279,
+ "z": 0
+ },
+ {
+ "x": 17.624812090908947,
+ "y": -12.631120508208697,
+ "z": 0
+ },
+ {
+ "x": 17.624812090908947,
+ "y": -13.000057500000079,
+ "z": 0
+ },
+ {
+ "x": 17.308774527147357,
+ "y": -13.263548118068096,
+ "z": 0
+ },
+ {
+ "x": 9.010368710336166,
+ "y": -13.487787512016784,
+ "z": 0
+ },
+ {
+ "x": 8.619999999999997,
+ "y": -13.330028750000043,
+ "z": 0
+ },
+ {
+ "x": 8.226755747540587,
+ "y": -13.058588646585662,
+ "z": 0
+ },
+ {
+ "x": 8.083698797913955,
+ "y": -12.991440103414384,
+ "z": 0
+ },
+ {
+ "x": 7.6904545454545445,
+ "y": -12.720000000000002,
+ "z": 0
+ },
+ {
+ "x": 7.658777923535055,
+ "y": -12.36319636944922,
+ "z": 0
+ },
+ {
+ "x": 7.6516766219194885,
+ "y": -12.276803630550784,
+ "z": 0
+ },
+ {
+ "x": 7.619999999999999,
+ "y": -11.920000000000002,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst4",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 1.27,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 0.17806375232909177,
+ "y": 12.908063752329092,
+ "z": 0
+ },
+ {
+ "x": -2.277611970197334,
+ "y": 12.908063752329092,
+ "z": 0
+ },
+ {
+ "x": -2.6364021005857805,
+ "y": 13.266853882717538,
+ "z": 0
+ },
+ {
+ "x": -2.6364021005857805,
+ "y": 14.904702686454806,
+ "z": 0
+ },
+ {
+ "x": -2.9460937082708925,
+ "y": 15.214394294139918,
+ "z": 0
+ },
+ {
+ "x": -8.235580705860077,
+ "y": 15.214394294139918,
+ "z": 0
+ },
+ {
+ "x": -8.235580705860077,
+ "y": 15.214394294139918,
+ "z": 0
+ },
+ {
+ "x": -15.700034000000073,
+ "y": 7.749940999999922,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_1_mst5",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": 1.27,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 7.557058256646538,
+ "y": 7.712941743353461,
+ "z": 0
+ },
+ {
+ "x": 14.91435246159008,
+ "y": 7.712941743353461,
+ "z": 0
+ },
+ {
+ "x": 14.94002244231864,
+ "y": 7.687271762624903,
+ "z": 0
+ },
+ {
+ "x": 15.550614588198577,
+ "y": 7.5431861096394135,
+ "z": 0
+ },
+ {
+ "x": 15.550614588198577,
+ "y": 7.5431861096394135,
+ "z": 0
+ },
+ {
+ "x": 15.779579254545414,
+ "y": 7.16,
+ "z": 0
+ },
+ {
+ "x": 15.779579254545414,
+ "y": 7.16,
+ "z": 0
+ },
+ {
+ "x": 15.905410158294302,
+ "y": 6.735872086043502,
+ "z": 0
+ },
+ {
+ "x": 15.900333536752001,
+ "y": 6.752983438187801,
+ "z": 0
+ },
+ {
+ "x": 15.900333536752001,
+ "y": 6.579707959855058,
+ "z": 0
+ },
+ {
+ "x": 15.900333536752001,
+ "y": 4.181834156111259,
+ "z": 0
+ },
+ {
+ "x": 17.031332100841787,
+ "y": 3.050835592021473,
+ "z": 0
+ },
+ {
+ "x": 17.031332100841787,
+ "y": -0.9187608991582508,
+ "z": 0
+ },
+ {
+ "x": 15.70003399999996,
+ "y": -2.2500590000000784,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_3",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -1.27,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": -1.27,
+ "y": 14.390507648,
+ "z": 0
+ },
+ {
+ "x": -1.27,
+ "y": 14.509492351999999,
+ "z": 0
+ },
+ {
+ "x": -1.27,
+ "y": 14.899999999999999,
+ "z": 0
+ },
+ {
+ "x": -1.625005417163898,
+ "y": 15.313064900468385,
+ "z": 0
+ },
+ {
+ "x": -4.283177049694513,
+ "y": 17.150673459671054,
+ "z": 0
+ },
+ {
+ "x": -4.709999999999999,
+ "y": 17.45,
+ "z": 0
+ },
+ {
+ "x": -5.129508172013803,
+ "y": 17.161705691359877,
+ "z": 0
+ },
+ {
+ "x": -14.19448497265074,
+ "y": 16.90207068071559,
+ "z": 0
+ },
+ {
+ "x": -14.600036200000073,
+ "y": 16.949330389189193,
+ "z": 0
+ },
+ {
+ "x": -15.006325955500074,
+ "y": 16.949330389189193,
+ "z": 0
+ },
+ {
+ "x": -16.393742044500073,
+ "y": 16.949330389189193,
+ "z": 0
+ },
+ {
+ "x": -16.800031800000074,
+ "y": 16.949330389189193,
+ "z": 0
+ },
+ {
+ "x": -17.18683290645326,
+ "y": 16.557500550359403,
+ "z": 0
+ },
+ {
+ "x": -22.84619816462664,
+ "y": 5.443152868002759,
+ "z": 0
+ },
+ {
+ "x": -23.19996820000004,
+ "y": 5.253563214285654,
+ "z": 0
+ },
+ {
+ "x": -23.61881699137389,
+ "y": 4.981003217570675,
+ "z": 0
+ },
+ {
+ "x": -28.98425262372859,
+ "y": 4.83362814396315,
+ "z": 0
+ },
+ {
+ "x": -29.389999999999997,
+ "y": 5.079999999999998,
+ "z": 0
+ }
+ ],
+ "vias": []
+ },
+ {
+ "connectionName": "source_net_2",
+ "traceThickness": 0.15,
+ "viaDiameter": 0.6,
+ "route": [
+ {
+ "x": -3.81,
+ "y": 14,
+ "z": 0
+ },
+ {
+ "x": 2.7995946159002805,
+ "y": 7.3904053840997195,
+ "z": 0
+ },
+ {
+ "x": 15.073309413334021,
+ "y": 7.3904053840997195,
+ "z": 0
+ },
+ {
+ "x": 15.13810932150548,
+ "y": 7.378963111456373,
+ "z": 0
+ },
+ {
+ "x": 15.461398236363596,
+ "y": 7.16,
+ "z": 0
+ },
+ {
+ "x": 15.672261731177166,
+ "y": 6.986470863552442,
+ "z": 0
+ },
+ {
+ "x": 15.672261731177166,
+ "y": 6.986470863552442,
+ "z": 0
+ },
+ {
+ "x": 16.50373409395306,
+ "y": 7.084390647958256,
+ "z": 0
+ },
+ {
+ "x": 16.50373409395306,
+ "y": 7.084390647958256,
+ "z": 0
+ },
+ {
+ "x": 16.50373409395306,
+ "y": 7.084390647958256,
+ "z": 0
+ },
+ {
+ "x": 16.80003179999996,
+ "y": 7.318787155172417,
+ "z": 0
+ },
+ {
+ "x": 16.80003179999996,
+ "y": 7.318787155172417,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.29030754304036,
+ "y": 6.9231267532552625,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.82389710892105,
+ "y": -11.622167812180587,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -12.039809199999898,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -12.039809199999898,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -12.408746191791279,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -12.631120508208697,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -12.631120508208697,
+ "z": 0
+ },
+ {
+ "x": 17.924702236363444,
+ "y": -13.000057500000079,
+ "z": 0
+ },
+ {
+ "x": 17.62105492278438,
+ "y": -13.463758477170906,
+ "z": 0
+ },
+ {
+ "x": 17.77007218645092,
+ "y": -13.23619364228721,
+ "z": 0
+ },
+ {
+ "x": 13.768293187060165,
+ "y": -17.237972641677967,
+ "z": 0
+ },
+ {
+ "x": -6.672745931123345,
+ "y": -17.237972641677967,
+ "z": 0
+ },
+ {
+ "x": -7.620000000000001,
+ "y": -16.29071857280131,
+ "z": 0
+ },
+ {
+ "x": -7.620000000000001,
+ "y": -14.459999999999999,
+ "z": 0
+ }
+ ],
+ "vias": []
+ }
+ ],
+ "obstacles": [
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.619999999999999,
+ "y": -14.460000000000003
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_0",
+ "connectivity_net379",
+ "source_port_0",
+ "pcb_smtpad_0",
+ "pcb_port_0"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.619999999999999,
+ "y": -11.920000000000002
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_1",
+ "connectivity_net37",
+ "source_trace_14",
+ "source_port_43",
+ "source_trace_0",
+ "source_port_1",
+ "source_net_0",
+ "pcb_smtpad_1",
+ "pcb_port_1",
+ "pcb_plated_hole_0",
+ "pcb_port_43"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.619999999999999,
+ "y": -9.38
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_2",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.62,
+ "y": -6.840000000000001
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_3",
+ "connectivity_net380",
+ "source_port_3",
+ "pcb_smtpad_3",
+ "pcb_port_3"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.62,
+ "y": -4.300000000000001
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_4",
+ "connectivity_net381",
+ "source_port_4",
+ "pcb_smtpad_4",
+ "pcb_port_4"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.62,
+ "y": -1.7600000000000016
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_5",
+ "connectivity_net17",
+ "source_trace_6",
+ "source_port_27",
+ "source_port_5",
+ "pcb_smtpad_5",
+ "pcb_port_5",
+ "pcb_smtpad_27",
+ "pcb_port_27"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.620000000000001,
+ "y": 0.7799999999999994
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_6",
+ "connectivity_net12",
+ "source_trace_4",
+ "source_port_23",
+ "source_port_6",
+ "pcb_smtpad_6",
+ "pcb_port_6",
+ "pcb_smtpad_23",
+ "pcb_port_23"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.620000000000001,
+ "y": 3.3200000000000003
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_7",
+ "connectivity_net382",
+ "source_port_7",
+ "pcb_smtpad_7",
+ "pcb_port_7"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": 7.620000000000001,
+ "y": 5.859999999999998
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_8",
+ "connectivity_net383",
+ "source_port_8",
+ "pcb_smtpad_8",
+ "pcb_port_8"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.620000000000001,
+ "y": -14.459999999999999
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_9",
+ "connectivity_net41",
+ "source_trace_16",
+ "source_port_46",
+ "source_trace_2",
+ "source_port_9",
+ "source_net_2",
+ "pcb_smtpad_9",
+ "pcb_port_9",
+ "pcb_plated_hole_3",
+ "pcb_port_46"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.620000000000001,
+ "y": -11.919999999999998
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_10",
+ "connectivity_net43",
+ "source_trace_17",
+ "source_port_45",
+ "source_trace_3",
+ "source_port_10",
+ "source_net_3",
+ "pcb_smtpad_10",
+ "pcb_port_10",
+ "pcb_plated_hole_2",
+ "pcb_port_45"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.620000000000001,
+ "y": -9.379999999999999
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_11",
+ "connectivity_net384",
+ "source_port_11",
+ "pcb_smtpad_11",
+ "pcb_port_11"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.62,
+ "y": -6.839999999999999
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_12",
+ "connectivity_net27",
+ "source_trace_10",
+ "source_port_36",
+ "source_port_12",
+ "pcb_smtpad_12",
+ "pcb_port_12",
+ "pcb_smtpad_36",
+ "pcb_port_36"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.62,
+ "y": -4.299999999999999
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_13",
+ "connectivity_net32",
+ "source_trace_12",
+ "source_port_40",
+ "source_port_13",
+ "pcb_smtpad_13",
+ "pcb_port_13",
+ "pcb_smtpad_40",
+ "pcb_port_40"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.62,
+ "y": -1.7599999999999998
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_14",
+ "connectivity_net385",
+ "source_port_14",
+ "pcb_smtpad_14",
+ "pcb_port_14"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.619999999999999,
+ "y": 0.7800000000000011
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_15",
+ "connectivity_net386",
+ "source_port_15",
+ "pcb_smtpad_15",
+ "pcb_port_15"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.619999999999999,
+ "y": 3.320000000000002
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_16",
+ "connectivity_net22",
+ "source_trace_8",
+ "source_port_32",
+ "source_port_16",
+ "pcb_smtpad_16",
+ "pcb_port_16",
+ "pcb_smtpad_32",
+ "pcb_port_32"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2,
+ "center": {
+ "x": -7.619999999999999,
+ "y": 5.860000000000001
+ },
+ "height": 1.6,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_17",
+ "connectivity_net387",
+ "source_port_17",
+ "pcb_smtpad_17",
+ "pcb_port_17"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": 5.080000000000001,
+ "y": 6.16
+ },
+ "height": 2,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_18",
+ "connectivity_net388",
+ "source_port_18",
+ "pcb_smtpad_18",
+ "pcb_port_18"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": 2.5400000000000014,
+ "y": 6.16
+ },
+ "height": 2,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_19",
+ "connectivity_net389",
+ "source_port_19",
+ "pcb_smtpad_19",
+ "pcb_port_19"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": 1.2442411479337109e-15,
+ "y": 6.16
+ },
+ "height": 2,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_20",
+ "connectivity_net390",
+ "source_port_20",
+ "pcb_smtpad_20",
+ "pcb_port_20"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": -2.5399999999999987,
+ "y": 6.16
+ },
+ "height": 2,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_21",
+ "connectivity_net391",
+ "source_port_21",
+ "pcb_smtpad_21",
+ "pcb_port_21"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": -5.079999999999999,
+ "y": 6.16
+ },
+ "height": 2,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_22",
+ "connectivity_net392",
+ "source_port_22",
+ "pcb_smtpad_22",
+ "pcb_port_22"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 15.70003399999996,
+ "y": 2.2500589999999647
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_23",
+ "connectivity_net12",
+ "source_trace_4",
+ "source_port_23",
+ "source_port_6",
+ "pcb_smtpad_6",
+ "pcb_port_6",
+ "pcb_smtpad_23",
+ "pcb_port_23"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 24.299965999999927,
+ "y": 2.2500589999999647
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_24",
+ "connectivity_net393",
+ "source_port_24",
+ "pcb_smtpad_24",
+ "pcb_port_24"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 15.70003399999996,
+ "y": -2.2500590000000784
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_25",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 24.299965999999927,
+ "y": -2.2500590000000784
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_26",
+ "connectivity_net394",
+ "source_port_26",
+ "pcb_smtpad_26",
+ "pcb_port_26"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 15.70003399999996,
+ "y": -7.749941000000035
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_27",
+ "connectivity_net17",
+ "source_trace_6",
+ "source_port_27",
+ "source_port_5",
+ "pcb_smtpad_5",
+ "pcb_port_5",
+ "pcb_smtpad_27",
+ "pcb_port_27"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 24.299965999999927,
+ "y": -7.749941000000035
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_28",
+ "connectivity_net395",
+ "source_port_28",
+ "pcb_smtpad_28",
+ "pcb_port_28"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 15.70003399999996,
+ "y": -12.250059000000078
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_29",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": 24.299965999999927,
+ "y": -12.250059000000078
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_30",
+ "connectivity_net396",
+ "source_port_30",
+ "pcb_smtpad_30",
+ "pcb_port_30"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": 2.2500589999999647
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_31",
+ "connectivity_net397",
+ "source_port_31",
+ "pcb_smtpad_31",
+ "pcb_port_31"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": 2.2500589999999647
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_32",
+ "connectivity_net22",
+ "source_trace_8",
+ "source_port_32",
+ "source_port_16",
+ "pcb_smtpad_16",
+ "pcb_port_16",
+ "pcb_smtpad_32",
+ "pcb_port_32"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": -2.2500590000000784
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_33",
+ "connectivity_net398",
+ "source_port_33",
+ "pcb_smtpad_33",
+ "pcb_port_33"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": -2.2500590000000784
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_34",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": -7.749941000000035
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_35",
+ "connectivity_net399",
+ "source_port_35",
+ "pcb_smtpad_35",
+ "pcb_port_35"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": -7.749941000000035
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_36",
+ "connectivity_net27",
+ "source_trace_10",
+ "source_port_36",
+ "source_port_12",
+ "pcb_smtpad_12",
+ "pcb_port_12",
+ "pcb_smtpad_36",
+ "pcb_port_36"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": -12.250059000000078
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_37",
+ "connectivity_net400",
+ "source_port_37",
+ "pcb_smtpad_37",
+ "pcb_port_37"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": -12.250059000000078
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_38",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": 12.250058999999965
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_39",
+ "connectivity_net401",
+ "source_port_39",
+ "pcb_smtpad_39",
+ "pcb_port_39"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": 12.250058999999965
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_40",
+ "connectivity_net32",
+ "source_trace_12",
+ "source_port_40",
+ "source_port_13",
+ "pcb_smtpad_13",
+ "pcb_port_13",
+ "pcb_smtpad_40",
+ "pcb_port_40"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -24.29996600000004,
+ "y": 7.749940999999922
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_41",
+ "connectivity_net402",
+ "source_port_41",
+ "pcb_smtpad_41",
+ "pcb_port_41"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 2.1999956,
+ "center": {
+ "x": -15.700034000000073,
+ "y": 7.749940999999922
+ },
+ "height": 1.499997,
+ "layers": ["top"],
+ "connectedTo": [
+ "pcb_smtpad_42",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "oval",
+ "width": 1.8,
+ "center": {
+ "x": 3.81,
+ "y": 14
+ },
+ "height": 1.8,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_0",
+ "connectivity_net37",
+ "source_trace_14",
+ "source_port_43",
+ "source_trace_0",
+ "source_port_1",
+ "source_net_0",
+ "pcb_smtpad_1",
+ "pcb_port_1",
+ "pcb_plated_hole_0",
+ "pcb_port_43"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "oval",
+ "width": 1.8,
+ "center": {
+ "x": 1.27,
+ "y": 14
+ },
+ "height": 1.8,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_1",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "source_net_1",
+ "pcb_smtpad_2",
+ "pcb_port_2",
+ "pcb_smtpad_25",
+ "pcb_port_25",
+ "pcb_smtpad_29",
+ "pcb_port_29",
+ "pcb_smtpad_34",
+ "pcb_port_34",
+ "pcb_smtpad_38",
+ "pcb_port_38",
+ "pcb_smtpad_42",
+ "pcb_port_42",
+ "pcb_plated_hole_1",
+ "pcb_port_44"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "oval",
+ "width": 1.8,
+ "center": {
+ "x": -1.27,
+ "y": 14
+ },
+ "height": 1.8,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_2",
+ "connectivity_net43",
+ "source_trace_17",
+ "source_port_45",
+ "source_trace_3",
+ "source_port_10",
+ "source_net_3",
+ "pcb_smtpad_10",
+ "pcb_port_10",
+ "pcb_plated_hole_2",
+ "pcb_port_45"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "oval",
+ "width": 1.8,
+ "center": {
+ "x": -3.81,
+ "y": 14
+ },
+ "height": 1.8,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_3",
+ "connectivity_net41",
+ "source_trace_16",
+ "source_port_46",
+ "source_trace_2",
+ "source_port_9",
+ "source_net_2",
+ "pcb_smtpad_9",
+ "pcb_port_9",
+ "pcb_plated_hole_3",
+ "pcb_port_46"
+ ],
+ "zLayers": [0]
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_4",
+ "connectivity_net403",
+ "source_port_47",
+ "pcb_plated_hole_4",
+ "pcb_port_47"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_0"],
+ "zLayers": [0],
+ "obstacleId": "__obs0"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_5",
+ "connectivity_net404",
+ "source_port_48",
+ "pcb_plated_hole_5",
+ "pcb_port_48"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_1"],
+ "zLayers": [0],
+ "obstacleId": "__obs1"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_6",
+ "connectivity_net405",
+ "source_port_49",
+ "pcb_plated_hole_6",
+ "pcb_port_49"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_2"],
+ "zLayers": [0],
+ "obstacleId": "__obs2"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_7",
+ "connectivity_net406",
+ "source_port_50",
+ "pcb_plated_hole_7",
+ "pcb_port_50"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_3"],
+ "zLayers": [0],
+ "obstacleId": "__obs3"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_8",
+ "connectivity_net407",
+ "source_port_51",
+ "pcb_plated_hole_8",
+ "pcb_port_51"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_0"],
+ "zLayers": [0],
+ "obstacleId": "__obs4"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_9",
+ "connectivity_net408",
+ "source_port_52",
+ "pcb_plated_hole_9",
+ "pcb_port_52"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_4"],
+ "zLayers": [0],
+ "obstacleId": "__obs5"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 2.5400000000000014
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_10",
+ "connectivity_net409",
+ "source_port_53",
+ "pcb_plated_hole_10",
+ "pcb_port_53"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_5"],
+ "zLayers": [0],
+ "obstacleId": "__obs6"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": 2.3329521523757077e-16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_11",
+ "connectivity_net410",
+ "source_port_54",
+ "pcb_plated_hole_11",
+ "pcb_port_54"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_1"],
+ "zLayers": [0],
+ "obstacleId": "__obs7"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -2.5399999999999987
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_12",
+ "connectivity_net411",
+ "source_port_55",
+ "pcb_plated_hole_12",
+ "pcb_port_55"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_4"],
+ "zLayers": [0],
+ "obstacleId": "__obs8"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_13",
+ "connectivity_net412",
+ "source_port_56",
+ "pcb_plated_hole_13",
+ "pcb_port_56"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_1"],
+ "zLayers": [0],
+ "obstacleId": "__obs9"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_14",
+ "connectivity_net413",
+ "source_port_57",
+ "pcb_plated_hole_14",
+ "pcb_port_57"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_6"],
+ "zLayers": [0],
+ "obstacleId": "__obs10"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_15",
+ "connectivity_net414",
+ "source_port_58",
+ "pcb_plated_hole_15",
+ "pcb_port_58"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_7"],
+ "zLayers": [0],
+ "obstacleId": "__obs11"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_16",
+ "connectivity_net415",
+ "source_port_59",
+ "pcb_plated_hole_16",
+ "pcb_port_59"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_8"],
+ "zLayers": [0],
+ "obstacleId": "__obs12"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_17",
+ "connectivity_net416",
+ "source_port_60",
+ "pcb_plated_hole_17",
+ "pcb_port_60"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_9"],
+ "zLayers": [0],
+ "obstacleId": "__obs13"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 37.81,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_18",
+ "connectivity_net417",
+ "source_port_61",
+ "pcb_plated_hole_18",
+ "pcb_port_61"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_2"],
+ "zLayers": [0],
+ "obstacleId": "__obs14"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.269999999999996,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_19",
+ "connectivity_net418",
+ "source_port_62",
+ "pcb_plated_hole_19",
+ "pcb_port_62"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_9"],
+ "zLayers": [0],
+ "obstacleId": "__obs15"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.269999999999996,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_20",
+ "connectivity_net419",
+ "source_port_63",
+ "pcb_plated_hole_20",
+ "pcb_port_63"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_6"],
+ "zLayers": [0],
+ "obstacleId": "__obs16"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.269999999999996,
+ "y": 12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_21",
+ "connectivity_net420",
+ "source_port_64",
+ "pcb_plated_hole_21",
+ "pcb_port_64"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_10"],
+ "zLayers": [0],
+ "obstacleId": "__obs17"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.269999999999996,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_22",
+ "connectivity_net421",
+ "source_port_65",
+ "pcb_plated_hole_22",
+ "pcb_port_65"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_7"],
+ "zLayers": [0],
+ "obstacleId": "__obs18"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.269999999999996,
+ "y": 7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_23",
+ "connectivity_net422",
+ "source_port_66",
+ "pcb_plated_hole_23",
+ "pcb_port_66"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_11"],
+ "zLayers": [0],
+ "obstacleId": "__obs19"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": 5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_24",
+ "connectivity_net423",
+ "source_port_67",
+ "pcb_plated_hole_24",
+ "pcb_port_67"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_12"],
+ "zLayers": [0],
+ "obstacleId": "__obs20"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": 2.540000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_25",
+ "connectivity_net424",
+ "source_port_68",
+ "pcb_plated_hole_25",
+ "pcb_port_68"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_3"],
+ "zLayers": [0],
+ "obstacleId": "__obs21"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": 7.776507174585693e-17
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_26",
+ "connectivity_net425",
+ "source_port_69",
+ "pcb_plated_hole_26",
+ "pcb_port_69"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_2"],
+ "zLayers": [0],
+ "obstacleId": "__obs22"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -2.539999999999999
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_27",
+ "connectivity_net426",
+ "source_port_70",
+ "pcb_plated_hole_27",
+ "pcb_port_70"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_10"],
+ "zLayers": [0],
+ "obstacleId": "__obs23"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_28",
+ "connectivity_net427",
+ "source_port_71",
+ "pcb_plated_hole_28",
+ "pcb_port_71"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_8"],
+ "zLayers": [0],
+ "obstacleId": "__obs24"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_29",
+ "connectivity_net428",
+ "source_port_72",
+ "pcb_plated_hole_29",
+ "pcb_port_72"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_3"],
+ "zLayers": [0],
+ "obstacleId": "__obs25"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_30",
+ "connectivity_net429",
+ "source_port_73",
+ "pcb_plated_hole_30",
+ "pcb_port_73"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_13"],
+ "zLayers": [0],
+ "obstacleId": "__obs26"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_31",
+ "connectivity_net430",
+ "source_port_74",
+ "pcb_plated_hole_31",
+ "pcb_port_74"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_5"],
+ "zLayers": [0],
+ "obstacleId": "__obs27"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_32",
+ "connectivity_net431",
+ "source_port_75",
+ "pcb_plated_hole_32",
+ "pcb_port_75"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_14"],
+ "zLayers": [0],
+ "obstacleId": "__obs28"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 35.27,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_33",
+ "connectivity_net432",
+ "source_port_76",
+ "pcb_plated_hole_33",
+ "pcb_port_76"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_0"],
+ "zLayers": [0],
+ "obstacleId": "__obs29"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_34",
+ "connectivity_net433",
+ "source_port_77",
+ "pcb_plated_hole_34",
+ "pcb_port_77"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_6"],
+ "zLayers": [0],
+ "obstacleId": "__obs30"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_35",
+ "connectivity_net434",
+ "source_port_78",
+ "pcb_plated_hole_35",
+ "pcb_port_78"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_4"],
+ "zLayers": [0],
+ "obstacleId": "__obs31"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_36",
+ "connectivity_net435",
+ "source_port_79",
+ "pcb_plated_hole_36",
+ "pcb_port_79"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_0"],
+ "zLayers": [0],
+ "obstacleId": "__obs32"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_37",
+ "connectivity_net436",
+ "source_port_80",
+ "pcb_plated_hole_37",
+ "pcb_port_80"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_12"],
+ "zLayers": [0],
+ "obstacleId": "__obs33"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_38",
+ "connectivity_net437",
+ "source_port_81",
+ "pcb_plated_hole_38",
+ "pcb_port_81"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_6"],
+ "zLayers": [0],
+ "obstacleId": "__obs34"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_39",
+ "connectivity_net438",
+ "source_port_82",
+ "pcb_plated_hole_39",
+ "pcb_port_82"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_5"],
+ "zLayers": [0],
+ "obstacleId": "__obs35"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": 2.540000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_40",
+ "connectivity_net439",
+ "source_port_83",
+ "pcb_plated_hole_40",
+ "pcb_port_83"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_9"],
+ "zLayers": [0],
+ "obstacleId": "__obs36"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": -7.776507174585693e-17
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_41",
+ "connectivity_net440",
+ "source_port_84",
+ "pcb_plated_hole_41",
+ "pcb_port_84"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_13"],
+ "zLayers": [0],
+ "obstacleId": "__obs37"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": -2.539999999999999
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_42",
+ "connectivity_net441",
+ "source_port_85",
+ "pcb_plated_hole_42",
+ "pcb_port_85"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_11"],
+ "zLayers": [0],
+ "obstacleId": "__obs38"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.73,
+ "y": -5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_43",
+ "connectivity_net442",
+ "source_port_86",
+ "pcb_plated_hole_43",
+ "pcb_port_86"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_2"],
+ "zLayers": [0],
+ "obstacleId": "__obs39"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.730000000000004,
+ "y": -7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_44",
+ "connectivity_net443",
+ "source_port_87",
+ "pcb_plated_hole_44",
+ "pcb_port_87"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_14"],
+ "zLayers": [0],
+ "obstacleId": "__obs40"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.730000000000004,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_45",
+ "connectivity_net444",
+ "source_port_88",
+ "pcb_plated_hole_45",
+ "pcb_port_88"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_1"],
+ "zLayers": [0],
+ "obstacleId": "__obs41"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.730000000000004,
+ "y": -12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_46",
+ "connectivity_net445",
+ "source_port_89",
+ "pcb_plated_hole_46",
+ "pcb_port_89"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_10"],
+ "zLayers": [0],
+ "obstacleId": "__obs42"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.730000000000004,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_47",
+ "connectivity_net446",
+ "source_port_90",
+ "pcb_plated_hole_47",
+ "pcb_port_90"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_7"],
+ "zLayers": [0],
+ "obstacleId": "__obs43"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 32.730000000000004,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_48",
+ "connectivity_net447",
+ "source_port_91",
+ "pcb_plated_hole_48",
+ "pcb_port_91"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_12"],
+ "zLayers": [0],
+ "obstacleId": "__obs44"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_49",
+ "connectivity_net448",
+ "source_port_92",
+ "pcb_plated_hole_49",
+ "pcb_port_92"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_14"],
+ "zLayers": [0],
+ "obstacleId": "__obs45"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_50",
+ "connectivity_net449",
+ "source_port_93",
+ "pcb_plated_hole_50",
+ "pcb_port_93"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_13"],
+ "zLayers": [0],
+ "obstacleId": "__obs46"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_51",
+ "connectivity_net450",
+ "source_port_94",
+ "pcb_plated_hole_51",
+ "pcb_port_94"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_8"],
+ "zLayers": [0],
+ "obstacleId": "__obs47"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_52",
+ "connectivity_net451",
+ "source_port_95",
+ "pcb_plated_hole_52",
+ "pcb_port_95"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_5"],
+ "zLayers": [0],
+ "obstacleId": "__obs48"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_53",
+ "connectivity_net452",
+ "source_port_96",
+ "pcb_plated_hole_53",
+ "pcb_port_96"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_0"],
+ "zLayers": [0],
+ "obstacleId": "__obs49"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.189999999999998,
+ "y": 5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_54",
+ "connectivity_net453",
+ "source_port_97",
+ "pcb_plated_hole_54",
+ "pcb_port_97"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_6"],
+ "zLayers": [0],
+ "obstacleId": "__obs50"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": 2.5400000000000005
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_55",
+ "connectivity_net454",
+ "source_port_98",
+ "pcb_plated_hole_55",
+ "pcb_port_98"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_7"],
+ "zLayers": [0],
+ "obstacleId": "__obs51"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -2.3329521523757077e-16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_56",
+ "connectivity_net455",
+ "source_port_99",
+ "pcb_plated_hole_56",
+ "pcb_port_99"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_2"],
+ "zLayers": [0],
+ "obstacleId": "__obs52"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -2.5399999999999996
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_57",
+ "connectivity_net456",
+ "source_port_100",
+ "pcb_plated_hole_57",
+ "pcb_port_100"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_12"],
+ "zLayers": [0],
+ "obstacleId": "__obs53"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_58",
+ "connectivity_net457",
+ "source_port_101",
+ "pcb_plated_hole_58",
+ "pcb_port_101"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_10"],
+ "zLayers": [0],
+ "obstacleId": "__obs54"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_59",
+ "connectivity_net458",
+ "source_port_102",
+ "pcb_plated_hole_59",
+ "pcb_port_102"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_9"],
+ "zLayers": [0],
+ "obstacleId": "__obs55"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_60",
+ "connectivity_net459",
+ "source_port_103",
+ "pcb_plated_hole_60",
+ "pcb_port_103"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_11"],
+ "zLayers": [0],
+ "obstacleId": "__obs56"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_61",
+ "connectivity_net460",
+ "source_port_104",
+ "pcb_plated_hole_61",
+ "pcb_port_104"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_3"],
+ "zLayers": [0],
+ "obstacleId": "__obs57"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_62",
+ "connectivity_net461",
+ "source_port_105",
+ "pcb_plated_hole_62",
+ "pcb_port_105"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_4"],
+ "zLayers": [0],
+ "obstacleId": "__obs58"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": 30.19,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_63",
+ "connectivity_net462",
+ "source_port_106",
+ "pcb_plated_hole_63",
+ "pcb_port_106"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_1"],
+ "zLayers": [0],
+ "obstacleId": "__obs59"
+ },
+ {
+ "type": "rect",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_64",
+ "connectivity_net463",
+ "source_port_107",
+ "pcb_plated_hole_64",
+ "pcb_port_107"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_15"],
+ "zLayers": [0],
+ "obstacleId": "__obs60"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_65",
+ "connectivity_net464",
+ "source_port_108",
+ "pcb_plated_hole_65",
+ "pcb_port_108"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_16"],
+ "zLayers": [0],
+ "obstacleId": "__obs61"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_66",
+ "connectivity_net465",
+ "source_port_109",
+ "pcb_plated_hole_66",
+ "pcb_port_109"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_17"],
+ "zLayers": [0],
+ "obstacleId": "__obs62"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_67",
+ "connectivity_net466",
+ "source_port_110",
+ "pcb_plated_hole_67",
+ "pcb_port_110"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_18"],
+ "zLayers": [0],
+ "obstacleId": "__obs63"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_68",
+ "connectivity_net467",
+ "source_port_111",
+ "pcb_plated_hole_68",
+ "pcb_port_111"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_15"],
+ "zLayers": [0],
+ "obstacleId": "__obs64"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_69",
+ "connectivity_net468",
+ "source_port_112",
+ "pcb_plated_hole_69",
+ "pcb_port_112"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_19"],
+ "zLayers": [0],
+ "obstacleId": "__obs65"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": -2.5400000000000005
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_70",
+ "connectivity_net469",
+ "source_port_113",
+ "pcb_plated_hole_70",
+ "pcb_port_113"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_20"],
+ "zLayers": [0],
+ "obstacleId": "__obs66"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 2.3329521523757077e-16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_71",
+ "connectivity_net470",
+ "source_port_114",
+ "pcb_plated_hole_71",
+ "pcb_port_114"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_16"],
+ "zLayers": [0],
+ "obstacleId": "__obs67"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 2.5399999999999996
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_72",
+ "connectivity_net471",
+ "source_port_115",
+ "pcb_plated_hole_72",
+ "pcb_port_115"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_19"],
+ "zLayers": [0],
+ "obstacleId": "__obs68"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_73",
+ "connectivity_net472",
+ "source_port_116",
+ "pcb_plated_hole_73",
+ "pcb_port_116"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_16"],
+ "zLayers": [0],
+ "obstacleId": "__obs69"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_74",
+ "connectivity_net473",
+ "source_port_117",
+ "pcb_plated_hole_74",
+ "pcb_port_117"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_21"],
+ "zLayers": [0],
+ "obstacleId": "__obs70"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_75",
+ "connectivity_net474",
+ "source_port_118",
+ "pcb_plated_hole_75",
+ "pcb_port_118"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_22"],
+ "zLayers": [0],
+ "obstacleId": "__obs71"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_76",
+ "connectivity_net475",
+ "source_port_119",
+ "pcb_plated_hole_76",
+ "pcb_port_119"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_23"],
+ "zLayers": [0],
+ "obstacleId": "__obs72"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_77",
+ "connectivity_net476",
+ "source_port_120",
+ "pcb_plated_hole_77",
+ "pcb_port_120"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_24"],
+ "zLayers": [0],
+ "obstacleId": "__obs73"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -37.81,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_78",
+ "connectivity_net477",
+ "source_port_121",
+ "pcb_plated_hole_78",
+ "pcb_port_121"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_17"],
+ "zLayers": [0],
+ "obstacleId": "__obs74"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_79",
+ "connectivity_net478",
+ "source_port_122",
+ "pcb_plated_hole_79",
+ "pcb_port_122"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_24"],
+ "zLayers": [0],
+ "obstacleId": "__obs75"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_80",
+ "connectivity_net479",
+ "source_port_123",
+ "pcb_plated_hole_80",
+ "pcb_port_123"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_21"],
+ "zLayers": [0],
+ "obstacleId": "__obs76"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_81",
+ "connectivity_net480",
+ "source_port_124",
+ "pcb_plated_hole_81",
+ "pcb_port_124"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_25"],
+ "zLayers": [0],
+ "obstacleId": "__obs77"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_82",
+ "connectivity_net481",
+ "source_port_125",
+ "pcb_plated_hole_82",
+ "pcb_port_125"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_22"],
+ "zLayers": [0],
+ "obstacleId": "__obs78"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_83",
+ "connectivity_net482",
+ "source_port_126",
+ "pcb_plated_hole_83",
+ "pcb_port_126"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_26"],
+ "zLayers": [0],
+ "obstacleId": "__obs79"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_84",
+ "connectivity_net483",
+ "source_port_127",
+ "pcb_plated_hole_84",
+ "pcb_port_127"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_27"],
+ "zLayers": [0],
+ "obstacleId": "__obs80"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": -2.540000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_85",
+ "connectivity_net484",
+ "source_port_128",
+ "pcb_plated_hole_85",
+ "pcb_port_128"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_18"],
+ "zLayers": [0],
+ "obstacleId": "__obs81"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": 7.776507174585693e-17
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_86",
+ "connectivity_net485",
+ "source_port_129",
+ "pcb_plated_hole_86",
+ "pcb_port_129"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_17"],
+ "zLayers": [0],
+ "obstacleId": "__obs82"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": 2.539999999999999
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_87",
+ "connectivity_net486",
+ "source_port_130",
+ "pcb_plated_hole_87",
+ "pcb_port_130"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_25"],
+ "zLayers": [0],
+ "obstacleId": "__obs83"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.27,
+ "y": 5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_88",
+ "connectivity_net487",
+ "source_port_131",
+ "pcb_plated_hole_88",
+ "pcb_port_131"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_23"],
+ "zLayers": [0],
+ "obstacleId": "__obs84"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.269999999999996,
+ "y": 7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_89",
+ "connectivity_net488",
+ "source_port_132",
+ "pcb_plated_hole_89",
+ "pcb_port_132"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_18"],
+ "zLayers": [0],
+ "obstacleId": "__obs85"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.269999999999996,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_90",
+ "connectivity_net489",
+ "source_port_133",
+ "pcb_plated_hole_90",
+ "pcb_port_133"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_28"],
+ "zLayers": [0],
+ "obstacleId": "__obs86"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.269999999999996,
+ "y": 12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_91",
+ "connectivity_net490",
+ "source_port_134",
+ "pcb_plated_hole_91",
+ "pcb_port_134"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_20"],
+ "zLayers": [0],
+ "obstacleId": "__obs87"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.269999999999996,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_92",
+ "connectivity_net491",
+ "source_port_135",
+ "pcb_plated_hole_92",
+ "pcb_port_135"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_29"],
+ "zLayers": [0],
+ "obstacleId": "__obs88"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -35.269999999999996,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_93",
+ "connectivity_net492",
+ "source_port_136",
+ "pcb_plated_hole_93",
+ "pcb_port_136"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_15"],
+ "zLayers": [0],
+ "obstacleId": "__obs89"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.730000000000004,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_94",
+ "connectivity_net493",
+ "source_port_137",
+ "pcb_plated_hole_94",
+ "pcb_port_137"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_21"],
+ "zLayers": [0],
+ "obstacleId": "__obs90"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.730000000000004,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_95",
+ "connectivity_net494",
+ "source_port_138",
+ "pcb_plated_hole_95",
+ "pcb_port_138"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_19"],
+ "zLayers": [0],
+ "obstacleId": "__obs91"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.730000000000004,
+ "y": -12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_96",
+ "connectivity_net495",
+ "source_port_139",
+ "pcb_plated_hole_96",
+ "pcb_port_139"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_15"],
+ "zLayers": [0],
+ "obstacleId": "__obs92"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.730000000000004,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_97",
+ "connectivity_net496",
+ "source_port_140",
+ "pcb_plated_hole_97",
+ "pcb_port_140"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_27"],
+ "zLayers": [0],
+ "obstacleId": "__obs93"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.730000000000004,
+ "y": -7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_98",
+ "connectivity_net497",
+ "source_port_141",
+ "pcb_plated_hole_98",
+ "pcb_port_141"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_21"],
+ "zLayers": [0],
+ "obstacleId": "__obs94"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": -5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_99",
+ "connectivity_net498",
+ "source_port_142",
+ "pcb_plated_hole_99",
+ "pcb_port_142"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_20"],
+ "zLayers": [0],
+ "obstacleId": "__obs95"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": -2.540000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_100",
+ "connectivity_net499",
+ "source_port_143",
+ "pcb_plated_hole_100",
+ "pcb_port_143"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_24"],
+ "zLayers": [0],
+ "obstacleId": "__obs96"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": -7.776507174585693e-17
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_101",
+ "connectivity_net500",
+ "source_port_144",
+ "pcb_plated_hole_101",
+ "pcb_port_144"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_28"],
+ "zLayers": [0],
+ "obstacleId": "__obs97"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 2.539999999999999
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_102",
+ "connectivity_net501",
+ "source_port_145",
+ "pcb_plated_hole_102",
+ "pcb_port_145"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_26"],
+ "zLayers": [0],
+ "obstacleId": "__obs98"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_103",
+ "connectivity_net502",
+ "source_port_146",
+ "pcb_plated_hole_103",
+ "pcb_port_146"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_17"],
+ "zLayers": [0],
+ "obstacleId": "__obs99"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_104",
+ "connectivity_net503",
+ "source_port_147",
+ "pcb_plated_hole_104",
+ "pcb_port_147"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_29"],
+ "zLayers": [0],
+ "obstacleId": "__obs100"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_105",
+ "connectivity_net504",
+ "source_port_148",
+ "pcb_plated_hole_105",
+ "pcb_port_148"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_16"],
+ "zLayers": [0],
+ "obstacleId": "__obs101"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_106",
+ "connectivity_net505",
+ "source_port_149",
+ "pcb_plated_hole_106",
+ "pcb_port_149"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_25"],
+ "zLayers": [0],
+ "obstacleId": "__obs102"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_107",
+ "connectivity_net506",
+ "source_port_150",
+ "pcb_plated_hole_107",
+ "pcb_port_150"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_22"],
+ "zLayers": [0],
+ "obstacleId": "__obs103"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -32.73,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_108",
+ "connectivity_net507",
+ "source_port_151",
+ "pcb_plated_hole_108",
+ "pcb_port_151"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_27"],
+ "zLayers": [0],
+ "obstacleId": "__obs104"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_109",
+ "connectivity_net508",
+ "source_port_152",
+ "pcb_plated_hole_109",
+ "pcb_port_152"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_29"],
+ "zLayers": [0],
+ "obstacleId": "__obs105"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_110",
+ "connectivity_net509",
+ "source_port_153",
+ "pcb_plated_hole_110",
+ "pcb_port_153"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_28"],
+ "zLayers": [0],
+ "obstacleId": "__obs106"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -12.700000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_111",
+ "connectivity_net510",
+ "source_port_154",
+ "pcb_plated_hole_111",
+ "pcb_port_154"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_23"],
+ "zLayers": [0],
+ "obstacleId": "__obs107"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_112",
+ "connectivity_net511",
+ "source_port_155",
+ "pcb_plated_hole_112",
+ "pcb_port_155"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_20"],
+ "zLayers": [0],
+ "obstacleId": "__obs108"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -7.620000000000001
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_113",
+ "connectivity_net512",
+ "source_port_156",
+ "pcb_plated_hole_113",
+ "pcb_port_156"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_15"],
+ "zLayers": [0],
+ "obstacleId": "__obs109"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -5.080000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_114",
+ "connectivity_net513",
+ "source_port_157",
+ "pcb_plated_hole_114",
+ "pcb_port_157"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_21"],
+ "zLayers": [0],
+ "obstacleId": "__obs110"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -2.5400000000000014
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_115",
+ "connectivity_net514",
+ "source_port_158",
+ "pcb_plated_hole_115",
+ "pcb_port_158"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_22"],
+ "zLayers": [0],
+ "obstacleId": "__obs111"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": -2.3329521523757077e-16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_116",
+ "connectivity_net515",
+ "source_port_159",
+ "pcb_plated_hole_116",
+ "pcb_port_159"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_17"],
+ "zLayers": [0],
+ "obstacleId": "__obs112"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.19,
+ "y": 2.5399999999999987
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_117",
+ "connectivity_net516",
+ "source_port_160",
+ "pcb_plated_hole_117",
+ "pcb_port_160"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_27"],
+ "zLayers": [0],
+ "obstacleId": "__obs113"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 5.079999999999998
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_118",
+ "connectivity_net517",
+ "source_port_161",
+ "pcb_plated_hole_118",
+ "pcb_port_161"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_25"],
+ "zLayers": [0],
+ "obstacleId": "__obs114"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 7.619999999999997
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_119",
+ "connectivity_net518",
+ "source_port_162",
+ "pcb_plated_hole_119",
+ "pcb_port_162"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_24"],
+ "zLayers": [0],
+ "obstacleId": "__obs115"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 10.16
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_120",
+ "connectivity_net519",
+ "source_port_163",
+ "pcb_plated_hole_120",
+ "pcb_port_163"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_26"],
+ "zLayers": [0],
+ "obstacleId": "__obs116"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 12.7
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_121",
+ "connectivity_net520",
+ "source_port_164",
+ "pcb_plated_hole_121",
+ "pcb_port_164"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_18"],
+ "zLayers": [0],
+ "obstacleId": "__obs117"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 15.240000000000002
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_122",
+ "connectivity_net521",
+ "source_port_165",
+ "pcb_plated_hole_122",
+ "pcb_port_165"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_19"],
+ "zLayers": [0],
+ "obstacleId": "__obs118"
+ },
+ {
+ "type": "oval",
+ "width": 1.6,
+ "center": {
+ "x": -30.189999999999998,
+ "y": 17.78
+ },
+ "height": 1.6,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [
+ "pcb_plated_hole_123",
+ "connectivity_net522",
+ "source_port_166",
+ "pcb_plated_hole_123",
+ "pcb_port_166"
+ ],
+ "netIsAssignable": true,
+ "offBoardConnectsTo": ["source_component_internal_connection_16"],
+ "zLayers": [0],
+ "obstacleId": "__obs119"
+ },
+ {
+ "type": "rect",
+ "width": 13,
+ "center": {
+ "x": -2.4492935982947064e-16,
+ "y": -6
+ },
+ "height": 22,
+ "layers": ["top", "inner1", "inner2", "bottom"],
+ "connectedTo": [],
+ "zLayers": [0]
+ }
+ ],
+ "connMap": {
+ "netMap": {
+ "connectivity_net0": [
+ "source_net_3",
+ "-762,-1192:0",
+ "pcb_port_10",
+ "-127,1400:0",
+ "pcb_port_45",
+ "pcb_smtpad_10",
+ "connectivity_net43",
+ "source_trace_17",
+ "source_port_45",
+ "source_trace_3",
+ "source_port_10",
+ "pcb_plated_hole_2",
+ "-127,1400:0-0-1-2",
+ "pcb_plated_hole_81",
+ "connectivity_net480",
+ "source_port_124",
+ "pcb_port_124",
+ "source_component_internal_connection_25",
+ "-3527,-1270:0-0-1-2",
+ "pcb_plated_hole_87",
+ "connectivity_net486",
+ "source_port_130",
+ "pcb_port_130",
+ "-3527,254:0-0-1-2",
+ "pcb_plated_hole_106",
+ "connectivity_net505",
+ "source_port_149",
+ "pcb_port_149",
+ "-3273,1270:0-0-1-2",
+ "pcb_plated_hole_118",
+ "connectivity_net517",
+ "source_port_161",
+ "pcb_port_161",
+ "-3019,508:0-0-1-2",
+ "__obs102",
+ "pcb_plated_hole_70",
+ "connectivity_net469",
+ "source_port_113",
+ "pcb_port_113",
+ "source_component_internal_connection_20",
+ "-3781,-254:0-0-1-2",
+ "pcb_plated_hole_91",
+ "connectivity_net490",
+ "source_port_134",
+ "pcb_port_134",
+ "-3527,1270:0-0-1-2",
+ "pcb_plated_hole_99",
+ "connectivity_net498",
+ "source_port_142",
+ "pcb_port_142",
+ "-3273,-508:0-0-1-2",
+ "pcb_plated_hole_112",
+ "connectivity_net511",
+ "source_port_155",
+ "pcb_port_155",
+ "-3019,-1016:0-0-1-2",
+ "__obs87",
+ "__obs108",
+ "__obs114"
+ ],
+ "connectivity_net1": [
+ "source_net_2",
+ "-762,-1446:0",
+ "pcb_port_9",
+ "-381,1400:0",
+ "pcb_port_46",
+ "pcb_smtpad_9",
+ "connectivity_net41",
+ "source_trace_16",
+ "source_port_46",
+ "source_trace_2",
+ "source_port_9",
+ "pcb_plated_hole_3",
+ "-381,1400:0-0-1-2"
+ ],
+ "connectivity_net2": [
+ "source_net_1_mst0",
+ "source_net_1",
+ "762,-938:0",
+ "pcb_port_2",
+ "1570,-1225:0",
+ "pcb_port_29",
+ "source_net_1_mst1",
+ "-1570,-225:0",
+ "pcb_port_34",
+ "-1570,-1225:0",
+ "pcb_port_38",
+ "source_net_1_mst2",
+ "-1570,775:0",
+ "pcb_port_42",
+ "source_net_1_mst3",
+ "1570,-225:0",
+ "pcb_port_25",
+ "source_net_1_mst4",
+ "127,1400:0",
+ "pcb_port_44",
+ "source_net_1_mst5",
+ "pcb_smtpad_2",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "pcb_smtpad_25",
+ "pcb_smtpad_29",
+ "pcb_smtpad_34",
+ "pcb_smtpad_38",
+ "pcb_smtpad_42",
+ "pcb_plated_hole_1",
+ "127,1400:0-0-1-2",
+ "pcb_plated_hole_75",
+ "connectivity_net474",
+ "source_port_118",
+ "pcb_port_118",
+ "source_component_internal_connection_22",
+ "-3781,1016:0-0-1-2",
+ "pcb_plated_hole_82",
+ "connectivity_net481",
+ "source_port_125",
+ "pcb_port_125",
+ "-3527,-1016:0-0-1-2",
+ "pcb_plated_hole_107",
+ "connectivity_net506",
+ "source_port_150",
+ "pcb_port_150",
+ "-3273,1524:0-0-1-2",
+ "pcb_plated_hole_115",
+ "connectivity_net514",
+ "source_port_158",
+ "pcb_port_158",
+ "-3019,-254:0-0-1-2",
+ "__obs103",
+ "pcb_plated_hole_64",
+ "connectivity_net463",
+ "source_port_107",
+ "pcb_port_107",
+ "source_component_internal_connection_15",
+ "-3781,-1778:0-0-1-2",
+ "pcb_plated_hole_68",
+ "connectivity_net467",
+ "source_port_111",
+ "pcb_port_111",
+ "-3781,-762:0-0-1-2",
+ "pcb_plated_hole_93",
+ "connectivity_net492",
+ "source_port_136",
+ "pcb_port_136",
+ "-3527,1778:0-0-1-2",
+ "pcb_plated_hole_96",
+ "connectivity_net495",
+ "source_port_139",
+ "pcb_port_139",
+ "-3273,-1270:0-0-1-2",
+ "pcb_plated_hole_113",
+ "connectivity_net512",
+ "source_port_156",
+ "pcb_port_156",
+ "-3019,-762:0-0-1-2",
+ "__obs89",
+ "__obs109",
+ "__obs111"
+ ],
+ "connectivity_net3": [
+ "source_net_0",
+ "762,-1192:0",
+ "pcb_port_1",
+ "381,1400:0",
+ "pcb_port_43",
+ "pcb_smtpad_1",
+ "connectivity_net37",
+ "source_trace_14",
+ "source_port_43",
+ "source_trace_0",
+ "source_port_1",
+ "pcb_plated_hole_0",
+ "381,1400:0-0-1-2"
+ ],
+ "connectivity_net4": [
+ "source_trace_12",
+ "-1570,1225:0",
+ "pcb_port_40",
+ "-762,-430:0",
+ "pcb_port_13",
+ "pcb_smtpad_13",
+ "connectivity_net32",
+ "source_port_40",
+ "source_port_13",
+ "pcb_smtpad_40",
+ "pcb_plated_hole_84",
+ "connectivity_net483",
+ "source_port_127",
+ "pcb_port_127",
+ "source_component_internal_connection_27",
+ "-3527,-508:0-0-1-2",
+ "pcb_plated_hole_97",
+ "connectivity_net496",
+ "source_port_140",
+ "pcb_port_140",
+ "-3273,-1016:0-0-1-2",
+ "pcb_plated_hole_108",
+ "connectivity_net507",
+ "source_port_151",
+ "pcb_port_151",
+ "-3273,1778:0-0-1-2",
+ "pcb_plated_hole_117",
+ "connectivity_net516",
+ "source_port_160",
+ "pcb_port_160",
+ "-3019,254:0-0-1-2",
+ "__obs93",
+ "__obs113"
+ ],
+ "connectivity_net5": [
+ "source_trace_10",
+ "-1570,-775:0",
+ "pcb_port_36",
+ "-762,-684:0",
+ "pcb_port_12",
+ "pcb_smtpad_12",
+ "connectivity_net27",
+ "source_port_36",
+ "source_port_12",
+ "pcb_smtpad_36"
+ ],
+ "connectivity_net6": [
+ "source_trace_8",
+ "-1570,225:0",
+ "pcb_port_32",
+ "-762,332:0",
+ "pcb_port_16",
+ "pcb_smtpad_16",
+ "connectivity_net22",
+ "source_port_32",
+ "source_port_16",
+ "pcb_smtpad_32"
+ ],
+ "connectivity_net7": [
+ "source_trace_6",
+ "1570,-775:0",
+ "pcb_port_27",
+ "762,-176:0",
+ "pcb_port_5",
+ "pcb_smtpad_5",
+ "connectivity_net17",
+ "source_port_27",
+ "source_port_5",
+ "pcb_smtpad_27"
+ ],
+ "connectivity_net8": [
+ "source_trace_4",
+ "1570,225:0",
+ "pcb_port_23",
+ "762,78:0",
+ "pcb_port_6",
+ "pcb_smtpad_6",
+ "connectivity_net12",
+ "source_port_23",
+ "source_port_6",
+ "pcb_smtpad_23"
+ ],
+ "connectivity_net9": [
+ "pcb_smtpad_0",
+ "connectivity_net379",
+ "source_port_0",
+ "pcb_port_0",
+ "762,-1446:0"
+ ],
+ "connectivity_net10": [
+ "pcb_smtpad_3",
+ "connectivity_net380",
+ "source_port_3",
+ "pcb_port_3",
+ "762,-684:0"
+ ],
+ "connectivity_net11": [
+ "pcb_smtpad_4",
+ "connectivity_net381",
+ "source_port_4",
+ "pcb_port_4",
+ "762,-430:0"
+ ],
+ "connectivity_net12": [
+ "pcb_smtpad_7",
+ "connectivity_net382",
+ "source_port_7",
+ "pcb_port_7",
+ "762,332:0"
+ ],
+ "connectivity_net13": [
+ "pcb_smtpad_8",
+ "connectivity_net383",
+ "source_port_8",
+ "pcb_port_8",
+ "762,586:0"
+ ],
+ "connectivity_net14": [
+ "pcb_smtpad_11",
+ "connectivity_net384",
+ "source_port_11",
+ "pcb_port_11",
+ "-762,-938:0"
+ ],
+ "connectivity_net15": [
+ "pcb_smtpad_14",
+ "connectivity_net385",
+ "source_port_14",
+ "pcb_port_14",
+ "-762,-176:0"
+ ],
+ "connectivity_net16": [
+ "pcb_smtpad_15",
+ "connectivity_net386",
+ "source_port_15",
+ "pcb_port_15",
+ "-762,78:0"
+ ],
+ "connectivity_net17": [
+ "pcb_smtpad_17",
+ "connectivity_net387",
+ "source_port_17",
+ "pcb_port_17",
+ "-762,586:0"
+ ],
+ "connectivity_net18": [
+ "pcb_smtpad_18",
+ "connectivity_net388",
+ "source_port_18",
+ "pcb_port_18",
+ "508,616:0"
+ ],
+ "connectivity_net19": [
+ "pcb_smtpad_19",
+ "connectivity_net389",
+ "source_port_19",
+ "pcb_port_19",
+ "254,616:0"
+ ],
+ "connectivity_net20": [
+ "pcb_smtpad_20",
+ "connectivity_net390",
+ "source_port_20",
+ "pcb_port_20",
+ "0,616:0"
+ ],
+ "connectivity_net21": [
+ "pcb_smtpad_21",
+ "connectivity_net391",
+ "source_port_21",
+ "pcb_port_21",
+ "-254,616:0"
+ ],
+ "connectivity_net22": [
+ "pcb_smtpad_22",
+ "connectivity_net392",
+ "source_port_22",
+ "pcb_port_22",
+ "-508,616:0"
+ ],
+ "connectivity_net23": [
+ "pcb_smtpad_24",
+ "connectivity_net393",
+ "source_port_24",
+ "pcb_port_24",
+ "2430,225:0"
+ ],
+ "connectivity_net24": [
+ "pcb_smtpad_26",
+ "connectivity_net394",
+ "source_port_26",
+ "pcb_port_26",
+ "2430,-225:0"
+ ],
+ "connectivity_net25": [
+ "pcb_smtpad_28",
+ "connectivity_net395",
+ "source_port_28",
+ "pcb_port_28",
+ "2430,-775:0"
+ ],
+ "connectivity_net26": [
+ "pcb_smtpad_30",
+ "connectivity_net396",
+ "source_port_30",
+ "pcb_port_30",
+ "2430,-1225:0"
+ ],
+ "connectivity_net27": [
+ "pcb_smtpad_31",
+ "connectivity_net397",
+ "source_port_31",
+ "pcb_port_31",
+ "-2430,225:0"
+ ],
+ "connectivity_net28": [
+ "pcb_smtpad_33",
+ "connectivity_net398",
+ "source_port_33",
+ "pcb_port_33",
+ "-2430,-225:0"
+ ],
+ "connectivity_net29": [
+ "pcb_smtpad_35",
+ "connectivity_net399",
+ "source_port_35",
+ "pcb_port_35",
+ "-2430,-775:0"
+ ],
+ "connectivity_net30": [
+ "pcb_smtpad_37",
+ "connectivity_net400",
+ "source_port_37",
+ "pcb_port_37",
+ "-2430,-1225:0"
+ ],
+ "connectivity_net31": [
+ "pcb_smtpad_39",
+ "connectivity_net401",
+ "source_port_39",
+ "pcb_port_39",
+ "-2430,1225:0"
+ ],
+ "connectivity_net32": [
+ "pcb_smtpad_41",
+ "connectivity_net402",
+ "source_port_41",
+ "pcb_port_41",
+ "-2430,775:0"
+ ],
+ "connectivity_net33": [
+ "pcb_plated_hole_4",
+ "connectivity_net403",
+ "source_port_47",
+ "pcb_port_47",
+ "source_component_internal_connection_0",
+ "3781,1778:0-0-1-2",
+ "pcb_plated_hole_8",
+ "connectivity_net407",
+ "source_port_51",
+ "pcb_port_51",
+ "3781,762:0-0-1-2",
+ "pcb_plated_hole_33",
+ "connectivity_net432",
+ "source_port_76",
+ "pcb_port_76",
+ "3527,-1778:0-0-1-2",
+ "pcb_plated_hole_36",
+ "connectivity_net435",
+ "source_port_79",
+ "pcb_port_79",
+ "3273,1270:0-0-1-2",
+ "pcb_plated_hole_53",
+ "connectivity_net452",
+ "source_port_96",
+ "pcb_port_96",
+ "3019,762:0-0-1-2"
+ ],
+ "connectivity_net34": [
+ "pcb_plated_hole_5",
+ "connectivity_net404",
+ "source_port_48",
+ "pcb_port_48",
+ "source_component_internal_connection_1",
+ "3781,1524:0-0-1-2",
+ "pcb_plated_hole_11",
+ "connectivity_net410",
+ "source_port_54",
+ "pcb_port_54",
+ "3781,0:0-0-1-2",
+ "pcb_plated_hole_13",
+ "connectivity_net412",
+ "source_port_56",
+ "pcb_port_56",
+ "3781,-508:0-0-1-2",
+ "pcb_plated_hole_45",
+ "connectivity_net444",
+ "source_port_88",
+ "pcb_port_88",
+ "3273,-1016:0-0-1-2",
+ "pcb_plated_hole_63",
+ "connectivity_net462",
+ "source_port_106",
+ "pcb_port_106",
+ "3019,-1778:0-0-1-2"
+ ],
+ "connectivity_net35": [
+ "pcb_plated_hole_6",
+ "connectivity_net405",
+ "source_port_49",
+ "pcb_port_49",
+ "source_component_internal_connection_2",
+ "3781,1270:0-0-1-2",
+ "pcb_plated_hole_18",
+ "connectivity_net417",
+ "source_port_61",
+ "pcb_port_61",
+ "3781,-1778:0-0-1-2",
+ "pcb_plated_hole_26",
+ "connectivity_net425",
+ "source_port_69",
+ "pcb_port_69",
+ "3527,0:0-0-1-2",
+ "pcb_plated_hole_43",
+ "connectivity_net442",
+ "source_port_86",
+ "pcb_port_86",
+ "3273,-508:0-0-1-2",
+ "pcb_plated_hole_56",
+ "connectivity_net455",
+ "source_port_99",
+ "pcb_port_99",
+ "3019,0:0-0-1-2"
+ ],
+ "connectivity_net36": [
+ "pcb_plated_hole_7",
+ "connectivity_net406",
+ "source_port_50",
+ "pcb_port_50",
+ "source_component_internal_connection_3",
+ "3781,1016:0-0-1-2",
+ "pcb_plated_hole_25",
+ "connectivity_net424",
+ "source_port_68",
+ "pcb_port_68",
+ "3527,254:0-0-1-2",
+ "pcb_plated_hole_29",
+ "connectivity_net428",
+ "source_port_72",
+ "pcb_port_72",
+ "3527,-762:0-0-1-2",
+ "pcb_plated_hole_61",
+ "connectivity_net460",
+ "source_port_104",
+ "pcb_port_104",
+ "3019,-1270:0-0-1-2"
+ ],
+ "connectivity_net37": [
+ "pcb_plated_hole_9",
+ "connectivity_net408",
+ "source_port_52",
+ "pcb_port_52",
+ "source_component_internal_connection_4",
+ "3781,508:0-0-1-2",
+ "pcb_plated_hole_12",
+ "connectivity_net411",
+ "source_port_55",
+ "pcb_port_55",
+ "3781,-254:0-0-1-2",
+ "pcb_plated_hole_35",
+ "connectivity_net434",
+ "source_port_78",
+ "pcb_port_78",
+ "3273,1524:0-0-1-2",
+ "pcb_plated_hole_62",
+ "connectivity_net461",
+ "source_port_105",
+ "pcb_port_105",
+ "3019,-1524:0-0-1-2"
+ ],
+ "connectivity_net38": [
+ "pcb_plated_hole_10",
+ "connectivity_net409",
+ "source_port_53",
+ "pcb_port_53",
+ "source_component_internal_connection_5",
+ "3781,254:0-0-1-2",
+ "pcb_plated_hole_31",
+ "connectivity_net430",
+ "source_port_74",
+ "pcb_port_74",
+ "3527,-1270:0-0-1-2",
+ "pcb_plated_hole_39",
+ "connectivity_net438",
+ "source_port_82",
+ "pcb_port_82",
+ "3273,508:0-0-1-2",
+ "pcb_plated_hole_52",
+ "connectivity_net451",
+ "source_port_95",
+ "pcb_port_95",
+ "3019,1016:0-0-1-2"
+ ],
+ "connectivity_net39": [
+ "pcb_plated_hole_14",
+ "connectivity_net413",
+ "source_port_57",
+ "pcb_port_57",
+ "source_component_internal_connection_6",
+ "3781,-762:0-0-1-2",
+ "pcb_plated_hole_20",
+ "connectivity_net419",
+ "source_port_63",
+ "pcb_port_63",
+ "3527,1524:0-0-1-2",
+ "pcb_plated_hole_34",
+ "connectivity_net433",
+ "source_port_77",
+ "pcb_port_77",
+ "3273,1778:0-0-1-2",
+ "pcb_plated_hole_38",
+ "connectivity_net437",
+ "source_port_81",
+ "pcb_port_81",
+ "3273,762:0-0-1-2",
+ "pcb_plated_hole_54",
+ "connectivity_net453",
+ "source_port_97",
+ "pcb_port_97",
+ "3019,508:0-0-1-2"
+ ],
+ "connectivity_net40": [
+ "pcb_plated_hole_15",
+ "connectivity_net414",
+ "source_port_58",
+ "pcb_port_58",
+ "source_component_internal_connection_7",
+ "3781,-1016:0-0-1-2",
+ "pcb_plated_hole_22",
+ "connectivity_net421",
+ "source_port_65",
+ "pcb_port_65",
+ "3527,1016:0-0-1-2",
+ "pcb_plated_hole_47",
+ "connectivity_net446",
+ "source_port_90",
+ "pcb_port_90",
+ "3273,-1524:0-0-1-2",
+ "pcb_plated_hole_55",
+ "connectivity_net454",
+ "source_port_98",
+ "pcb_port_98",
+ "3019,254:0-0-1-2"
+ ],
+ "connectivity_net41": [
+ "pcb_plated_hole_16",
+ "connectivity_net415",
+ "source_port_59",
+ "pcb_port_59",
+ "source_component_internal_connection_8",
+ "3781,-1270:0-0-1-2",
+ "pcb_plated_hole_28",
+ "connectivity_net427",
+ "source_port_71",
+ "pcb_port_71",
+ "3527,-508:0-0-1-2",
+ "pcb_plated_hole_51",
+ "connectivity_net450",
+ "source_port_94",
+ "pcb_port_94",
+ "3019,1270:0-0-1-2"
+ ],
+ "connectivity_net42": [
+ "pcb_plated_hole_17",
+ "connectivity_net416",
+ "source_port_60",
+ "pcb_port_60",
+ "source_component_internal_connection_9",
+ "3781,-1524:0-0-1-2",
+ "pcb_plated_hole_19",
+ "connectivity_net418",
+ "source_port_62",
+ "pcb_port_62",
+ "3527,1778:0-0-1-2",
+ "pcb_plated_hole_40",
+ "connectivity_net439",
+ "source_port_83",
+ "pcb_port_83",
+ "3273,254:0-0-1-2",
+ "pcb_plated_hole_59",
+ "connectivity_net458",
+ "source_port_102",
+ "pcb_port_102",
+ "3019,-762:0-0-1-2"
+ ],
+ "connectivity_net43": [
+ "pcb_plated_hole_21",
+ "connectivity_net420",
+ "source_port_64",
+ "pcb_port_64",
+ "source_component_internal_connection_10",
+ "3527,1270:0-0-1-2",
+ "pcb_plated_hole_27",
+ "connectivity_net426",
+ "source_port_70",
+ "pcb_port_70",
+ "3527,-254:0-0-1-2",
+ "pcb_plated_hole_46",
+ "connectivity_net445",
+ "source_port_89",
+ "pcb_port_89",
+ "3273,-1270:0-0-1-2",
+ "pcb_plated_hole_58",
+ "connectivity_net457",
+ "source_port_101",
+ "pcb_port_101",
+ "3019,-508:0-0-1-2"
+ ],
+ "connectivity_net44": [
+ "pcb_plated_hole_23",
+ "connectivity_net422",
+ "source_port_66",
+ "pcb_port_66",
+ "source_component_internal_connection_11",
+ "3527,762:0-0-1-2",
+ "pcb_plated_hole_42",
+ "connectivity_net441",
+ "source_port_85",
+ "pcb_port_85",
+ "3273,-254:0-0-1-2",
+ "pcb_plated_hole_60",
+ "connectivity_net459",
+ "source_port_103",
+ "pcb_port_103",
+ "3019,-1016:0-0-1-2"
+ ],
+ "connectivity_net45": [
+ "pcb_plated_hole_24",
+ "connectivity_net423",
+ "source_port_67",
+ "pcb_port_67",
+ "source_component_internal_connection_12",
+ "3527,508:0-0-1-2",
+ "pcb_plated_hole_37",
+ "connectivity_net436",
+ "source_port_80",
+ "pcb_port_80",
+ "3273,1016:0-0-1-2",
+ "pcb_plated_hole_48",
+ "connectivity_net447",
+ "source_port_91",
+ "pcb_port_91",
+ "3273,-1778:0-0-1-2",
+ "pcb_plated_hole_57",
+ "connectivity_net456",
+ "source_port_100",
+ "pcb_port_100",
+ "3019,-254:0-0-1-2"
+ ],
+ "connectivity_net46": [
+ "pcb_plated_hole_30",
+ "connectivity_net429",
+ "source_port_73",
+ "pcb_port_73",
+ "source_component_internal_connection_13",
+ "3527,-1016:0-0-1-2",
+ "pcb_plated_hole_41",
+ "connectivity_net440",
+ "source_port_84",
+ "pcb_port_84",
+ "3273,0:0-0-1-2",
+ "pcb_plated_hole_50",
+ "connectivity_net449",
+ "source_port_93",
+ "pcb_port_93",
+ "3019,1524:0-0-1-2"
+ ],
+ "connectivity_net47": [
+ "pcb_plated_hole_32",
+ "connectivity_net431",
+ "source_port_75",
+ "pcb_port_75",
+ "source_component_internal_connection_14",
+ "3527,-1524:0-0-1-2",
+ "pcb_plated_hole_44",
+ "connectivity_net443",
+ "source_port_87",
+ "pcb_port_87",
+ "3273,-762:0-0-1-2",
+ "pcb_plated_hole_49",
+ "connectivity_net448",
+ "source_port_92",
+ "pcb_port_92",
+ "3019,1778:0-0-1-2"
+ ],
+ "connectivity_net48": [
+ "source_net_1_mst0",
+ "source_net_1",
+ "762,-938:0",
+ "pcb_port_2",
+ "1570,-1225:0",
+ "pcb_port_29",
+ "source_net_1_mst1",
+ "-1570,-225:0",
+ "pcb_port_34",
+ "-1570,-1225:0",
+ "pcb_port_38",
+ "source_net_1_mst2",
+ "-1570,775:0",
+ "pcb_port_42",
+ "source_net_1_mst3",
+ "1570,-225:0",
+ "pcb_port_25",
+ "source_net_1_mst4",
+ "127,1400:0",
+ "pcb_port_44",
+ "source_net_1_mst5",
+ "pcb_smtpad_2",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "pcb_smtpad_25",
+ "pcb_smtpad_29",
+ "pcb_smtpad_34",
+ "pcb_smtpad_38",
+ "pcb_smtpad_42",
+ "pcb_plated_hole_1",
+ "127,1400:0-0-1-2",
+ "pcb_plated_hole_75",
+ "connectivity_net474",
+ "source_port_118",
+ "pcb_port_118",
+ "source_component_internal_connection_22",
+ "-3781,1016:0-0-1-2",
+ "pcb_plated_hole_82",
+ "connectivity_net481",
+ "source_port_125",
+ "pcb_port_125",
+ "-3527,-1016:0-0-1-2",
+ "pcb_plated_hole_107",
+ "connectivity_net506",
+ "source_port_150",
+ "pcb_port_150",
+ "-3273,1524:0-0-1-2",
+ "pcb_plated_hole_115",
+ "connectivity_net514",
+ "source_port_158",
+ "pcb_port_158",
+ "-3019,-254:0-0-1-2",
+ "__obs103",
+ "pcb_plated_hole_64",
+ "connectivity_net463",
+ "source_port_107",
+ "pcb_port_107",
+ "source_component_internal_connection_15",
+ "-3781,-1778:0-0-1-2",
+ "pcb_plated_hole_68",
+ "connectivity_net467",
+ "source_port_111",
+ "pcb_port_111",
+ "-3781,-762:0-0-1-2",
+ "pcb_plated_hole_93",
+ "connectivity_net492",
+ "source_port_136",
+ "pcb_port_136",
+ "-3527,1778:0-0-1-2",
+ "pcb_plated_hole_96",
+ "connectivity_net495",
+ "source_port_139",
+ "pcb_port_139",
+ "-3273,-1270:0-0-1-2",
+ "pcb_plated_hole_113",
+ "connectivity_net512",
+ "source_port_156",
+ "pcb_port_156",
+ "-3019,-762:0-0-1-2",
+ "__obs89",
+ "__obs109",
+ "__obs111"
+ ],
+ "connectivity_net49": [
+ "pcb_plated_hole_65",
+ "connectivity_net464",
+ "source_port_108",
+ "pcb_port_108",
+ "source_component_internal_connection_16",
+ "-3781,-1524:0-0-1-2",
+ "pcb_plated_hole_71",
+ "connectivity_net470",
+ "source_port_114",
+ "pcb_port_114",
+ "-3781,0:0-0-1-2",
+ "pcb_plated_hole_73",
+ "connectivity_net472",
+ "source_port_116",
+ "pcb_port_116",
+ "-3781,508:0-0-1-2",
+ "pcb_plated_hole_105",
+ "connectivity_net504",
+ "source_port_148",
+ "pcb_port_148",
+ "-3273,1016:0-0-1-2",
+ "pcb_plated_hole_123",
+ "connectivity_net522",
+ "source_port_166",
+ "pcb_port_166",
+ "-3019,1778:0-0-1-2"
+ ],
+ "connectivity_net50": [
+ "pcb_plated_hole_66",
+ "connectivity_net465",
+ "source_port_109",
+ "pcb_port_109",
+ "source_component_internal_connection_17",
+ "-3781,-1270:0-0-1-2",
+ "pcb_plated_hole_78",
+ "connectivity_net477",
+ "source_port_121",
+ "pcb_port_121",
+ "-3781,1778:0-0-1-2",
+ "pcb_plated_hole_86",
+ "connectivity_net485",
+ "source_port_129",
+ "pcb_port_129",
+ "-3527,0:0-0-1-2",
+ "pcb_plated_hole_103",
+ "connectivity_net502",
+ "source_port_146",
+ "pcb_port_146",
+ "-3273,508:0-0-1-2",
+ "pcb_plated_hole_116",
+ "connectivity_net515",
+ "source_port_159",
+ "pcb_port_159",
+ "-3019,0:0-0-1-2"
+ ],
+ "connectivity_net51": [
+ "pcb_plated_hole_67",
+ "connectivity_net466",
+ "source_port_110",
+ "pcb_port_110",
+ "source_component_internal_connection_18",
+ "-3781,-1016:0-0-1-2",
+ "pcb_plated_hole_85",
+ "connectivity_net484",
+ "source_port_128",
+ "pcb_port_128",
+ "-3527,-254:0-0-1-2",
+ "pcb_plated_hole_89",
+ "connectivity_net488",
+ "source_port_132",
+ "pcb_port_132",
+ "-3527,762:0-0-1-2",
+ "pcb_plated_hole_121",
+ "connectivity_net520",
+ "source_port_164",
+ "pcb_port_164",
+ "-3019,1270:0-0-1-2"
+ ],
+ "connectivity_net52": [
+ "pcb_plated_hole_69",
+ "connectivity_net468",
+ "source_port_112",
+ "pcb_port_112",
+ "source_component_internal_connection_19",
+ "-3781,-508:0-0-1-2",
+ "pcb_plated_hole_72",
+ "connectivity_net471",
+ "source_port_115",
+ "pcb_port_115",
+ "-3781,254:0-0-1-2",
+ "pcb_plated_hole_95",
+ "connectivity_net494",
+ "source_port_138",
+ "pcb_port_138",
+ "-3273,-1524:0-0-1-2",
+ "pcb_plated_hole_122",
+ "connectivity_net521",
+ "source_port_165",
+ "pcb_port_165",
+ "-3019,1524:0-0-1-2"
+ ],
+ "connectivity_net53": [
+ "source_net_3",
+ "-762,-1192:0",
+ "pcb_port_10",
+ "-127,1400:0",
+ "pcb_port_45",
+ "pcb_smtpad_10",
+ "connectivity_net43",
+ "source_trace_17",
+ "source_port_45",
+ "source_trace_3",
+ "source_port_10",
+ "pcb_plated_hole_2",
+ "-127,1400:0-0-1-2",
+ "pcb_plated_hole_81",
+ "connectivity_net480",
+ "source_port_124",
+ "pcb_port_124",
+ "source_component_internal_connection_25",
+ "-3527,-1270:0-0-1-2",
+ "pcb_plated_hole_87",
+ "connectivity_net486",
+ "source_port_130",
+ "pcb_port_130",
+ "-3527,254:0-0-1-2",
+ "pcb_plated_hole_106",
+ "connectivity_net505",
+ "source_port_149",
+ "pcb_port_149",
+ "-3273,1270:0-0-1-2",
+ "pcb_plated_hole_118",
+ "connectivity_net517",
+ "source_port_161",
+ "pcb_port_161",
+ "-3019,508:0-0-1-2",
+ "__obs102",
+ "pcb_plated_hole_70",
+ "connectivity_net469",
+ "source_port_113",
+ "pcb_port_113",
+ "source_component_internal_connection_20",
+ "-3781,-254:0-0-1-2",
+ "pcb_plated_hole_91",
+ "connectivity_net490",
+ "source_port_134",
+ "pcb_port_134",
+ "-3527,1270:0-0-1-2",
+ "pcb_plated_hole_99",
+ "connectivity_net498",
+ "source_port_142",
+ "pcb_port_142",
+ "-3273,-508:0-0-1-2",
+ "pcb_plated_hole_112",
+ "connectivity_net511",
+ "source_port_155",
+ "pcb_port_155",
+ "-3019,-1016:0-0-1-2",
+ "__obs87",
+ "__obs108",
+ "__obs114"
+ ],
+ "connectivity_net54": [
+ "pcb_plated_hole_74",
+ "connectivity_net473",
+ "source_port_117",
+ "pcb_port_117",
+ "source_component_internal_connection_21",
+ "-3781,762:0-0-1-2",
+ "pcb_plated_hole_80",
+ "connectivity_net479",
+ "source_port_123",
+ "pcb_port_123",
+ "-3527,-1524:0-0-1-2",
+ "pcb_plated_hole_94",
+ "connectivity_net493",
+ "source_port_137",
+ "pcb_port_137",
+ "-3273,-1778:0-0-1-2",
+ "pcb_plated_hole_98",
+ "connectivity_net497",
+ "source_port_141",
+ "pcb_port_141",
+ "-3273,-762:0-0-1-2",
+ "pcb_plated_hole_114",
+ "connectivity_net513",
+ "source_port_157",
+ "pcb_port_157",
+ "-3019,-508:0-0-1-2"
+ ],
+ "connectivity_net55": [
+ "source_net_1_mst0",
+ "source_net_1",
+ "762,-938:0",
+ "pcb_port_2",
+ "1570,-1225:0",
+ "pcb_port_29",
+ "source_net_1_mst1",
+ "-1570,-225:0",
+ "pcb_port_34",
+ "-1570,-1225:0",
+ "pcb_port_38",
+ "source_net_1_mst2",
+ "-1570,775:0",
+ "pcb_port_42",
+ "source_net_1_mst3",
+ "1570,-225:0",
+ "pcb_port_25",
+ "source_net_1_mst4",
+ "127,1400:0",
+ "pcb_port_44",
+ "source_net_1_mst5",
+ "pcb_smtpad_2",
+ "connectivity_net39",
+ "source_trace_15",
+ "source_port_44",
+ "source_trace_13",
+ "source_port_42",
+ "source_trace_11",
+ "source_port_38",
+ "source_trace_9",
+ "source_port_34",
+ "source_trace_7",
+ "source_port_29",
+ "source_trace_5",
+ "source_port_25",
+ "source_trace_1",
+ "source_port_2",
+ "pcb_smtpad_25",
+ "pcb_smtpad_29",
+ "pcb_smtpad_34",
+ "pcb_smtpad_38",
+ "pcb_smtpad_42",
+ "pcb_plated_hole_1",
+ "127,1400:0-0-1-2",
+ "pcb_plated_hole_75",
+ "connectivity_net474",
+ "source_port_118",
+ "pcb_port_118",
+ "source_component_internal_connection_22",
+ "-3781,1016:0-0-1-2",
+ "pcb_plated_hole_82",
+ "connectivity_net481",
+ "source_port_125",
+ "pcb_port_125",
+ "-3527,-1016:0-0-1-2",
+ "pcb_plated_hole_107",
+ "connectivity_net506",
+ "source_port_150",
+ "pcb_port_150",
+ "-3273,1524:0-0-1-2",
+ "pcb_plated_hole_115",
+ "connectivity_net514",
+ "source_port_158",
+ "pcb_port_158",
+ "-3019,-254:0-0-1-2",
+ "__obs103",
+ "pcb_plated_hole_64",
+ "connectivity_net463",
+ "source_port_107",
+ "pcb_port_107",
+ "source_component_internal_connection_15",
+ "-3781,-1778:0-0-1-2",
+ "pcb_plated_hole_68",
+ "connectivity_net467",
+ "source_port_111",
+ "pcb_port_111",
+ "-3781,-762:0-0-1-2",
+ "pcb_plated_hole_93",
+ "connectivity_net492",
+ "source_port_136",
+ "pcb_port_136",
+ "-3527,1778:0-0-1-2",
+ "pcb_plated_hole_96",
+ "connectivity_net495",
+ "source_port_139",
+ "pcb_port_139",
+ "-3273,-1270:0-0-1-2",
+ "pcb_plated_hole_113",
+ "connectivity_net512",
+ "source_port_156",
+ "pcb_port_156",
+ "-3019,-762:0-0-1-2",
+ "__obs89",
+ "__obs109",
+ "__obs111"
+ ],
+ "connectivity_net56": [
+ "pcb_plated_hole_76",
+ "connectivity_net475",
+ "source_port_119",
+ "pcb_port_119",
+ "source_component_internal_connection_23",
+ "-3781,1270:0-0-1-2",
+ "pcb_plated_hole_88",
+ "connectivity_net487",
+ "source_port_131",
+ "pcb_port_131",
+ "-3527,508:0-0-1-2",
+ "pcb_plated_hole_111",
+ "connectivity_net510",
+ "source_port_154",
+ "pcb_port_154",
+ "-3019,-1270:0-0-1-2"
+ ],
+ "connectivity_net57": [
+ "pcb_plated_hole_77",
+ "connectivity_net476",
+ "source_port_120",
+ "pcb_port_120",
+ "source_component_internal_connection_24",
+ "-3781,1524:0-0-1-2",
+ "pcb_plated_hole_79",
+ "connectivity_net478",
+ "source_port_122",
+ "pcb_port_122",
+ "-3527,-1778:0-0-1-2",
+ "pcb_plated_hole_100",
+ "connectivity_net499",
+ "source_port_143",
+ "pcb_port_143",
+ "-3273,-254:0-0-1-2",
+ "pcb_plated_hole_119",
+ "connectivity_net518",
+ "source_port_162",
+ "pcb_port_162",
+ "-3019,762:0-0-1-2"
+ ],
+ "connectivity_net58": [
+ "source_net_3",
+ "-762,-1192:0",
+ "pcb_port_10",
+ "-127,1400:0",
+ "pcb_port_45",
+ "pcb_smtpad_10",
+ "connectivity_net43",
+ "source_trace_17",
+ "source_port_45",
+ "source_trace_3",
+ "source_port_10",
+ "pcb_plated_hole_2",
+ "-127,1400:0-0-1-2",
+ "pcb_plated_hole_81",
+ "connectivity_net480",
+ "source_port_124",
+ "pcb_port_124",
+ "source_component_internal_connection_25",
+ "-3527,-1270:0-0-1-2",
+ "pcb_plated_hole_87",
+ "connectivity_net486",
+ "source_port_130",
+ "pcb_port_130",
+ "-3527,254:0-0-1-2",
+ "pcb_plated_hole_106",
+ "connectivity_net505",
+ "source_port_149",
+ "pcb_port_149",
+ "-3273,1270:0-0-1-2",
+ "pcb_plated_hole_118",
+ "connectivity_net517",
+ "source_port_161",
+ "pcb_port_161",
+ "-3019,508:0-0-1-2",
+ "__obs102",
+ "pcb_plated_hole_70",
+ "connectivity_net469",
+ "source_port_113",
+ "pcb_port_113",
+ "source_component_internal_connection_20",
+ "-3781,-254:0-0-1-2",
+ "pcb_plated_hole_91",
+ "connectivity_net490",
+ "source_port_134",
+ "pcb_port_134",
+ "-3527,1270:0-0-1-2",
+ "pcb_plated_hole_99",
+ "connectivity_net498",
+ "source_port_142",
+ "pcb_port_142",
+ "-3273,-508:0-0-1-2",
+ "pcb_plated_hole_112",
+ "connectivity_net511",
+ "source_port_155",
+ "pcb_port_155",
+ "-3019,-1016:0-0-1-2",
+ "__obs87",
+ "__obs108",
+ "__obs114"
+ ],
+ "connectivity_net59": [
+ "pcb_plated_hole_83",
+ "connectivity_net482",
+ "source_port_126",
+ "pcb_port_126",
+ "source_component_internal_connection_26",
+ "-3527,-762:0-0-1-2",
+ "pcb_plated_hole_102",
+ "connectivity_net501",
+ "source_port_145",
+ "pcb_port_145",
+ "-3273,254:0-0-1-2",
+ "pcb_plated_hole_120",
+ "connectivity_net519",
+ "source_port_163",
+ "pcb_port_163",
+ "-3019,1016:0-0-1-2"
+ ],
+ "connectivity_net60": [
+ "source_trace_12",
+ "-1570,1225:0",
+ "pcb_port_40",
+ "-762,-430:0",
+ "pcb_port_13",
+ "pcb_smtpad_13",
+ "connectivity_net32",
+ "source_port_40",
+ "source_port_13",
+ "pcb_smtpad_40",
+ "pcb_plated_hole_84",
+ "connectivity_net483",
+ "source_port_127",
+ "pcb_port_127",
+ "source_component_internal_connection_27",
+ "-3527,-508:0-0-1-2",
+ "pcb_plated_hole_97",
+ "connectivity_net496",
+ "source_port_140",
+ "pcb_port_140",
+ "-3273,-1016:0-0-1-2",
+ "pcb_plated_hole_108",
+ "connectivity_net507",
+ "source_port_151",
+ "pcb_port_151",
+ "-3273,1778:0-0-1-2",
+ "pcb_plated_hole_117",
+ "connectivity_net516",
+ "source_port_160",
+ "pcb_port_160",
+ "-3019,254:0-0-1-2",
+ "__obs93",
+ "__obs113"
+ ],
+ "connectivity_net61": [
+ "pcb_plated_hole_90",
+ "connectivity_net489",
+ "source_port_133",
+ "pcb_port_133",
+ "source_component_internal_connection_28",
+ "-3527,1016:0-0-1-2",
+ "pcb_plated_hole_101",
+ "connectivity_net500",
+ "source_port_144",
+ "pcb_port_144",
+ "-3273,0:0-0-1-2",
+ "pcb_plated_hole_110",
+ "connectivity_net509",
+ "source_port_153",
+ "pcb_port_153",
+ "-3019,-1524:0-0-1-2"
+ ],
+ "connectivity_net62": [
+ "pcb_plated_hole_92",
+ "connectivity_net491",
+ "source_port_135",
+ "pcb_port_135",
+ "source_component_internal_connection_29",
+ "-3527,1524:0-0-1-2",
+ "pcb_plated_hole_104",
+ "connectivity_net503",
+ "source_port_147",
+ "pcb_port_147",
+ "-3273,762:0-0-1-2",
+ "pcb_plated_hole_109",
+ "connectivity_net508",
+ "source_port_152",
+ "pcb_port_152",
+ "-3019,-1778:0-0-1-2"
+ ],
+ "connectivity_net63": ["0,-600:0-0-1-2"]
+ },
+ "idToNetMap": {
+ "source_net_3": "connectivity_net0",
+ "-762,-1192:0": "connectivity_net0",
+ "pcb_port_10": "connectivity_net0",
+ "-127,1400:0": "connectivity_net0",
+ "pcb_port_45": "connectivity_net0",
+ "source_net_2": "connectivity_net1",
+ "-762,-1446:0": "connectivity_net1",
+ "pcb_port_9": "connectivity_net1",
+ "-381,1400:0": "connectivity_net1",
+ "pcb_port_46": "connectivity_net1",
+ "source_net_1_mst0": "connectivity_net2",
+ "source_net_1": "connectivity_net2",
+ "762,-938:0": "connectivity_net2",
+ "pcb_port_2": "connectivity_net2",
+ "1570,-1225:0": "connectivity_net2",
+ "pcb_port_29": "connectivity_net2",
+ "source_net_1_mst1": "connectivity_net2",
+ "-1570,-225:0": "connectivity_net2",
+ "pcb_port_34": "connectivity_net2",
+ "-1570,-1225:0": "connectivity_net2",
+ "pcb_port_38": "connectivity_net2",
+ "source_net_1_mst2": "connectivity_net2",
+ "-1570,775:0": "connectivity_net2",
+ "pcb_port_42": "connectivity_net2",
+ "source_net_1_mst3": "connectivity_net2",
+ "1570,-225:0": "connectivity_net2",
+ "pcb_port_25": "connectivity_net2",
+ "source_net_1_mst4": "connectivity_net2",
+ "127,1400:0": "connectivity_net2",
+ "pcb_port_44": "connectivity_net2",
+ "source_net_1_mst5": "connectivity_net2",
+ "source_net_0": "connectivity_net3",
+ "762,-1192:0": "connectivity_net3",
+ "pcb_port_1": "connectivity_net3",
+ "381,1400:0": "connectivity_net3",
+ "pcb_port_43": "connectivity_net3",
+ "source_trace_12": "connectivity_net4",
+ "-1570,1225:0": "connectivity_net4",
+ "pcb_port_40": "connectivity_net4",
+ "-762,-430:0": "connectivity_net4",
+ "pcb_port_13": "connectivity_net4",
+ "source_trace_10": "connectivity_net5",
+ "-1570,-775:0": "connectivity_net5",
+ "pcb_port_36": "connectivity_net5",
+ "-762,-684:0": "connectivity_net5",
+ "pcb_port_12": "connectivity_net5",
+ "source_trace_8": "connectivity_net6",
+ "-1570,225:0": "connectivity_net6",
+ "pcb_port_32": "connectivity_net6",
+ "-762,332:0": "connectivity_net6",
+ "pcb_port_16": "connectivity_net6",
+ "source_trace_6": "connectivity_net7",
+ "1570,-775:0": "connectivity_net7",
+ "pcb_port_27": "connectivity_net7",
+ "762,-176:0": "connectivity_net7",
+ "pcb_port_5": "connectivity_net7",
+ "source_trace_4": "connectivity_net8",
+ "1570,225:0": "connectivity_net8",
+ "pcb_port_23": "connectivity_net8",
+ "762,78:0": "connectivity_net8",
+ "pcb_port_6": "connectivity_net8",
+ "pcb_smtpad_0": "connectivity_net9",
+ "connectivity_net379": "connectivity_net9",
+ "source_port_0": "connectivity_net9",
+ "pcb_port_0": "connectivity_net9",
+ "762,-1446:0": "connectivity_net9",
+ "pcb_smtpad_1": "connectivity_net3",
+ "connectivity_net37": "connectivity_net3",
+ "source_trace_14": "connectivity_net3",
+ "source_port_43": "connectivity_net3",
+ "source_trace_0": "connectivity_net3",
+ "source_port_1": "connectivity_net3",
+ "pcb_plated_hole_0": "connectivity_net3",
+ "pcb_smtpad_2": "connectivity_net2",
+ "connectivity_net39": "connectivity_net2",
+ "source_trace_15": "connectivity_net2",
+ "source_port_44": "connectivity_net2",
+ "source_trace_13": "connectivity_net2",
+ "source_port_42": "connectivity_net2",
+ "source_trace_11": "connectivity_net2",
+ "source_port_38": "connectivity_net2",
+ "source_trace_9": "connectivity_net2",
+ "source_port_34": "connectivity_net2",
+ "source_trace_7": "connectivity_net2",
+ "source_port_29": "connectivity_net2",
+ "source_trace_5": "connectivity_net2",
+ "source_port_25": "connectivity_net2",
+ "source_trace_1": "connectivity_net2",
+ "source_port_2": "connectivity_net2",
+ "pcb_smtpad_25": "connectivity_net2",
+ "pcb_smtpad_29": "connectivity_net2",
+ "pcb_smtpad_34": "connectivity_net2",
+ "pcb_smtpad_38": "connectivity_net2",
+ "pcb_smtpad_42": "connectivity_net2",
+ "pcb_plated_hole_1": "connectivity_net2",
+ "pcb_smtpad_3": "connectivity_net10",
+ "connectivity_net380": "connectivity_net10",
+ "source_port_3": "connectivity_net10",
+ "pcb_port_3": "connectivity_net10",
+ "762,-684:0": "connectivity_net10",
+ "pcb_smtpad_4": "connectivity_net11",
+ "connectivity_net381": "connectivity_net11",
+ "source_port_4": "connectivity_net11",
+ "pcb_port_4": "connectivity_net11",
+ "762,-430:0": "connectivity_net11",
+ "pcb_smtpad_5": "connectivity_net7",
+ "connectivity_net17": "connectivity_net7",
+ "source_port_27": "connectivity_net7",
+ "source_port_5": "connectivity_net7",
+ "pcb_smtpad_27": "connectivity_net7",
+ "pcb_smtpad_6": "connectivity_net8",
+ "connectivity_net12": "connectivity_net8",
+ "source_port_23": "connectivity_net8",
+ "source_port_6": "connectivity_net8",
+ "pcb_smtpad_23": "connectivity_net8",
+ "pcb_smtpad_7": "connectivity_net12",
+ "connectivity_net382": "connectivity_net12",
+ "source_port_7": "connectivity_net12",
+ "pcb_port_7": "connectivity_net12",
+ "762,332:0": "connectivity_net12",
+ "pcb_smtpad_8": "connectivity_net13",
+ "connectivity_net383": "connectivity_net13",
+ "source_port_8": "connectivity_net13",
+ "pcb_port_8": "connectivity_net13",
+ "762,586:0": "connectivity_net13",
+ "pcb_smtpad_9": "connectivity_net1",
+ "connectivity_net41": "connectivity_net1",
+ "source_trace_16": "connectivity_net1",
+ "source_port_46": "connectivity_net1",
+ "source_trace_2": "connectivity_net1",
+ "source_port_9": "connectivity_net1",
+ "pcb_plated_hole_3": "connectivity_net1",
+ "pcb_smtpad_10": "connectivity_net0",
+ "connectivity_net43": "connectivity_net0",
+ "source_trace_17": "connectivity_net0",
+ "source_port_45": "connectivity_net0",
+ "source_trace_3": "connectivity_net0",
+ "source_port_10": "connectivity_net0",
+ "pcb_plated_hole_2": "connectivity_net0",
+ "pcb_smtpad_11": "connectivity_net14",
+ "connectivity_net384": "connectivity_net14",
+ "source_port_11": "connectivity_net14",
+ "pcb_port_11": "connectivity_net14",
+ "-762,-938:0": "connectivity_net14",
+ "pcb_smtpad_12": "connectivity_net5",
+ "connectivity_net27": "connectivity_net5",
+ "source_port_36": "connectivity_net5",
+ "source_port_12": "connectivity_net5",
+ "pcb_smtpad_36": "connectivity_net5",
+ "pcb_smtpad_13": "connectivity_net4",
+ "connectivity_net32": "connectivity_net4",
+ "source_port_40": "connectivity_net4",
+ "source_port_13": "connectivity_net4",
+ "pcb_smtpad_40": "connectivity_net4",
+ "pcb_smtpad_14": "connectivity_net15",
+ "connectivity_net385": "connectivity_net15",
+ "source_port_14": "connectivity_net15",
+ "pcb_port_14": "connectivity_net15",
+ "-762,-176:0": "connectivity_net15",
+ "pcb_smtpad_15": "connectivity_net16",
+ "connectivity_net386": "connectivity_net16",
+ "source_port_15": "connectivity_net16",
+ "pcb_port_15": "connectivity_net16",
+ "-762,78:0": "connectivity_net16",
+ "pcb_smtpad_16": "connectivity_net6",
+ "connectivity_net22": "connectivity_net6",
+ "source_port_32": "connectivity_net6",
+ "source_port_16": "connectivity_net6",
+ "pcb_smtpad_32": "connectivity_net6",
+ "pcb_smtpad_17": "connectivity_net17",
+ "connectivity_net387": "connectivity_net17",
+ "source_port_17": "connectivity_net17",
+ "pcb_port_17": "connectivity_net17",
+ "-762,586:0": "connectivity_net17",
+ "pcb_smtpad_18": "connectivity_net18",
+ "connectivity_net388": "connectivity_net18",
+ "source_port_18": "connectivity_net18",
+ "pcb_port_18": "connectivity_net18",
+ "508,616:0": "connectivity_net18",
+ "pcb_smtpad_19": "connectivity_net19",
+ "connectivity_net389": "connectivity_net19",
+ "source_port_19": "connectivity_net19",
+ "pcb_port_19": "connectivity_net19",
+ "254,616:0": "connectivity_net19",
+ "pcb_smtpad_20": "connectivity_net20",
+ "connectivity_net390": "connectivity_net20",
+ "source_port_20": "connectivity_net20",
+ "pcb_port_20": "connectivity_net20",
+ "0,616:0": "connectivity_net20",
+ "pcb_smtpad_21": "connectivity_net21",
+ "connectivity_net391": "connectivity_net21",
+ "source_port_21": "connectivity_net21",
+ "pcb_port_21": "connectivity_net21",
+ "-254,616:0": "connectivity_net21",
+ "pcb_smtpad_22": "connectivity_net22",
+ "connectivity_net392": "connectivity_net22",
+ "source_port_22": "connectivity_net22",
+ "pcb_port_22": "connectivity_net22",
+ "-508,616:0": "connectivity_net22",
+ "pcb_smtpad_24": "connectivity_net23",
+ "connectivity_net393": "connectivity_net23",
+ "source_port_24": "connectivity_net23",
+ "pcb_port_24": "connectivity_net23",
+ "2430,225:0": "connectivity_net23",
+ "pcb_smtpad_26": "connectivity_net24",
+ "connectivity_net394": "connectivity_net24",
+ "source_port_26": "connectivity_net24",
+ "pcb_port_26": "connectivity_net24",
+ "2430,-225:0": "connectivity_net24",
+ "pcb_smtpad_28": "connectivity_net25",
+ "connectivity_net395": "connectivity_net25",
+ "source_port_28": "connectivity_net25",
+ "pcb_port_28": "connectivity_net25",
+ "2430,-775:0": "connectivity_net25",
+ "pcb_smtpad_30": "connectivity_net26",
+ "connectivity_net396": "connectivity_net26",
+ "source_port_30": "connectivity_net26",
+ "pcb_port_30": "connectivity_net26",
+ "2430,-1225:0": "connectivity_net26",
+ "pcb_smtpad_31": "connectivity_net27",
+ "connectivity_net397": "connectivity_net27",
+ "source_port_31": "connectivity_net27",
+ "pcb_port_31": "connectivity_net27",
+ "-2430,225:0": "connectivity_net27",
+ "pcb_smtpad_33": "connectivity_net28",
+ "connectivity_net398": "connectivity_net28",
+ "source_port_33": "connectivity_net28",
+ "pcb_port_33": "connectivity_net28",
+ "-2430,-225:0": "connectivity_net28",
+ "pcb_smtpad_35": "connectivity_net29",
+ "connectivity_net399": "connectivity_net29",
+ "source_port_35": "connectivity_net29",
+ "pcb_port_35": "connectivity_net29",
+ "-2430,-775:0": "connectivity_net29",
+ "pcb_smtpad_37": "connectivity_net30",
+ "connectivity_net400": "connectivity_net30",
+ "source_port_37": "connectivity_net30",
+ "pcb_port_37": "connectivity_net30",
+ "-2430,-1225:0": "connectivity_net30",
+ "pcb_smtpad_39": "connectivity_net31",
+ "connectivity_net401": "connectivity_net31",
+ "source_port_39": "connectivity_net31",
+ "pcb_port_39": "connectivity_net31",
+ "-2430,1225:0": "connectivity_net31",
+ "pcb_smtpad_41": "connectivity_net32",
+ "connectivity_net402": "connectivity_net32",
+ "source_port_41": "connectivity_net32",
+ "pcb_port_41": "connectivity_net32",
+ "-2430,775:0": "connectivity_net32",
+ "381,1400:0-0-1-2": "connectivity_net3",
+ "127,1400:0-0-1-2": "connectivity_net2",
+ "-127,1400:0-0-1-2": "connectivity_net0",
+ "-381,1400:0-0-1-2": "connectivity_net1",
+ "pcb_plated_hole_4": "connectivity_net33",
+ "connectivity_net403": "connectivity_net33",
+ "source_port_47": "connectivity_net33",
+ "pcb_port_47": "connectivity_net33",
+ "source_component_internal_connection_0": "connectivity_net33",
+ "3781,1778:0-0-1-2": "connectivity_net33",
+ "pcb_plated_hole_5": "connectivity_net34",
+ "connectivity_net404": "connectivity_net34",
+ "source_port_48": "connectivity_net34",
+ "pcb_port_48": "connectivity_net34",
+ "source_component_internal_connection_1": "connectivity_net34",
+ "3781,1524:0-0-1-2": "connectivity_net34",
+ "pcb_plated_hole_6": "connectivity_net35",
+ "connectivity_net405": "connectivity_net35",
+ "source_port_49": "connectivity_net35",
+ "pcb_port_49": "connectivity_net35",
+ "source_component_internal_connection_2": "connectivity_net35",
+ "3781,1270:0-0-1-2": "connectivity_net35",
+ "pcb_plated_hole_7": "connectivity_net36",
+ "connectivity_net406": "connectivity_net36",
+ "source_port_50": "connectivity_net36",
+ "pcb_port_50": "connectivity_net36",
+ "source_component_internal_connection_3": "connectivity_net36",
+ "3781,1016:0-0-1-2": "connectivity_net36",
+ "pcb_plated_hole_8": "connectivity_net33",
+ "connectivity_net407": "connectivity_net33",
+ "source_port_51": "connectivity_net33",
+ "pcb_port_51": "connectivity_net33",
+ "3781,762:0-0-1-2": "connectivity_net33",
+ "pcb_plated_hole_9": "connectivity_net37",
+ "connectivity_net408": "connectivity_net37",
+ "source_port_52": "connectivity_net37",
+ "pcb_port_52": "connectivity_net37",
+ "source_component_internal_connection_4": "connectivity_net37",
+ "3781,508:0-0-1-2": "connectivity_net37",
+ "pcb_plated_hole_10": "connectivity_net38",
+ "connectivity_net409": "connectivity_net38",
+ "source_port_53": "connectivity_net38",
+ "pcb_port_53": "connectivity_net38",
+ "source_component_internal_connection_5": "connectivity_net38",
+ "3781,254:0-0-1-2": "connectivity_net38",
+ "pcb_plated_hole_11": "connectivity_net34",
+ "connectivity_net410": "connectivity_net34",
+ "source_port_54": "connectivity_net34",
+ "pcb_port_54": "connectivity_net34",
+ "3781,0:0-0-1-2": "connectivity_net34",
+ "pcb_plated_hole_12": "connectivity_net37",
+ "connectivity_net411": "connectivity_net37",
+ "source_port_55": "connectivity_net37",
+ "pcb_port_55": "connectivity_net37",
+ "3781,-254:0-0-1-2": "connectivity_net37",
+ "pcb_plated_hole_13": "connectivity_net34",
+ "connectivity_net412": "connectivity_net34",
+ "source_port_56": "connectivity_net34",
+ "pcb_port_56": "connectivity_net34",
+ "3781,-508:0-0-1-2": "connectivity_net34",
+ "pcb_plated_hole_14": "connectivity_net39",
+ "connectivity_net413": "connectivity_net39",
+ "source_port_57": "connectivity_net39",
+ "pcb_port_57": "connectivity_net39",
+ "source_component_internal_connection_6": "connectivity_net39",
+ "3781,-762:0-0-1-2": "connectivity_net39",
+ "pcb_plated_hole_15": "connectivity_net40",
+ "connectivity_net414": "connectivity_net40",
+ "source_port_58": "connectivity_net40",
+ "pcb_port_58": "connectivity_net40",
+ "source_component_internal_connection_7": "connectivity_net40",
+ "3781,-1016:0-0-1-2": "connectivity_net40",
+ "pcb_plated_hole_16": "connectivity_net41",
+ "connectivity_net415": "connectivity_net41",
+ "source_port_59": "connectivity_net41",
+ "pcb_port_59": "connectivity_net41",
+ "source_component_internal_connection_8": "connectivity_net41",
+ "3781,-1270:0-0-1-2": "connectivity_net41",
+ "pcb_plated_hole_17": "connectivity_net42",
+ "connectivity_net416": "connectivity_net42",
+ "source_port_60": "connectivity_net42",
+ "pcb_port_60": "connectivity_net42",
+ "source_component_internal_connection_9": "connectivity_net42",
+ "3781,-1524:0-0-1-2": "connectivity_net42",
+ "pcb_plated_hole_18": "connectivity_net35",
+ "connectivity_net417": "connectivity_net35",
+ "source_port_61": "connectivity_net35",
+ "pcb_port_61": "connectivity_net35",
+ "3781,-1778:0-0-1-2": "connectivity_net35",
+ "pcb_plated_hole_19": "connectivity_net42",
+ "connectivity_net418": "connectivity_net42",
+ "source_port_62": "connectivity_net42",
+ "pcb_port_62": "connectivity_net42",
+ "3527,1778:0-0-1-2": "connectivity_net42",
+ "pcb_plated_hole_20": "connectivity_net39",
+ "connectivity_net419": "connectivity_net39",
+ "source_port_63": "connectivity_net39",
+ "pcb_port_63": "connectivity_net39",
+ "3527,1524:0-0-1-2": "connectivity_net39",
+ "pcb_plated_hole_21": "connectivity_net43",
+ "connectivity_net420": "connectivity_net43",
+ "source_port_64": "connectivity_net43",
+ "pcb_port_64": "connectivity_net43",
+ "source_component_internal_connection_10": "connectivity_net43",
+ "3527,1270:0-0-1-2": "connectivity_net43",
+ "pcb_plated_hole_22": "connectivity_net40",
+ "connectivity_net421": "connectivity_net40",
+ "source_port_65": "connectivity_net40",
+ "pcb_port_65": "connectivity_net40",
+ "3527,1016:0-0-1-2": "connectivity_net40",
+ "pcb_plated_hole_23": "connectivity_net44",
+ "connectivity_net422": "connectivity_net44",
+ "source_port_66": "connectivity_net44",
+ "pcb_port_66": "connectivity_net44",
+ "source_component_internal_connection_11": "connectivity_net44",
+ "3527,762:0-0-1-2": "connectivity_net44",
+ "pcb_plated_hole_24": "connectivity_net45",
+ "connectivity_net423": "connectivity_net45",
+ "source_port_67": "connectivity_net45",
+ "pcb_port_67": "connectivity_net45",
+ "source_component_internal_connection_12": "connectivity_net45",
+ "3527,508:0-0-1-2": "connectivity_net45",
+ "pcb_plated_hole_25": "connectivity_net36",
+ "connectivity_net424": "connectivity_net36",
+ "source_port_68": "connectivity_net36",
+ "pcb_port_68": "connectivity_net36",
+ "3527,254:0-0-1-2": "connectivity_net36",
+ "pcb_plated_hole_26": "connectivity_net35",
+ "connectivity_net425": "connectivity_net35",
+ "source_port_69": "connectivity_net35",
+ "pcb_port_69": "connectivity_net35",
+ "3527,0:0-0-1-2": "connectivity_net35",
+ "pcb_plated_hole_27": "connectivity_net43",
+ "connectivity_net426": "connectivity_net43",
+ "source_port_70": "connectivity_net43",
+ "pcb_port_70": "connectivity_net43",
+ "3527,-254:0-0-1-2": "connectivity_net43",
+ "pcb_plated_hole_28": "connectivity_net41",
+ "connectivity_net427": "connectivity_net41",
+ "source_port_71": "connectivity_net41",
+ "pcb_port_71": "connectivity_net41",
+ "3527,-508:0-0-1-2": "connectivity_net41",
+ "pcb_plated_hole_29": "connectivity_net36",
+ "connectivity_net428": "connectivity_net36",
+ "source_port_72": "connectivity_net36",
+ "pcb_port_72": "connectivity_net36",
+ "3527,-762:0-0-1-2": "connectivity_net36",
+ "pcb_plated_hole_30": "connectivity_net46",
+ "connectivity_net429": "connectivity_net46",
+ "source_port_73": "connectivity_net46",
+ "pcb_port_73": "connectivity_net46",
+ "source_component_internal_connection_13": "connectivity_net46",
+ "3527,-1016:0-0-1-2": "connectivity_net46",
+ "pcb_plated_hole_31": "connectivity_net38",
+ "connectivity_net430": "connectivity_net38",
+ "source_port_74": "connectivity_net38",
+ "pcb_port_74": "connectivity_net38",
+ "3527,-1270:0-0-1-2": "connectivity_net38",
+ "pcb_plated_hole_32": "connectivity_net47",
+ "connectivity_net431": "connectivity_net47",
+ "source_port_75": "connectivity_net47",
+ "pcb_port_75": "connectivity_net47",
+ "source_component_internal_connection_14": "connectivity_net47",
+ "3527,-1524:0-0-1-2": "connectivity_net47",
+ "pcb_plated_hole_33": "connectivity_net33",
+ "connectivity_net432": "connectivity_net33",
+ "source_port_76": "connectivity_net33",
+ "pcb_port_76": "connectivity_net33",
+ "3527,-1778:0-0-1-2": "connectivity_net33",
+ "pcb_plated_hole_34": "connectivity_net39",
+ "connectivity_net433": "connectivity_net39",
+ "source_port_77": "connectivity_net39",
+ "pcb_port_77": "connectivity_net39",
+ "3273,1778:0-0-1-2": "connectivity_net39",
+ "pcb_plated_hole_35": "connectivity_net37",
+ "connectivity_net434": "connectivity_net37",
+ "source_port_78": "connectivity_net37",
+ "pcb_port_78": "connectivity_net37",
+ "3273,1524:0-0-1-2": "connectivity_net37",
+ "pcb_plated_hole_36": "connectivity_net33",
+ "connectivity_net435": "connectivity_net33",
+ "source_port_79": "connectivity_net33",
+ "pcb_port_79": "connectivity_net33",
+ "3273,1270:0-0-1-2": "connectivity_net33",
+ "pcb_plated_hole_37": "connectivity_net45",
+ "connectivity_net436": "connectivity_net45",
+ "source_port_80": "connectivity_net45",
+ "pcb_port_80": "connectivity_net45",
+ "3273,1016:0-0-1-2": "connectivity_net45",
+ "pcb_plated_hole_38": "connectivity_net39",
+ "connectivity_net437": "connectivity_net39",
+ "source_port_81": "connectivity_net39",
+ "pcb_port_81": "connectivity_net39",
+ "3273,762:0-0-1-2": "connectivity_net39",
+ "pcb_plated_hole_39": "connectivity_net38",
+ "connectivity_net438": "connectivity_net38",
+ "source_port_82": "connectivity_net38",
+ "pcb_port_82": "connectivity_net38",
+ "3273,508:0-0-1-2": "connectivity_net38",
+ "pcb_plated_hole_40": "connectivity_net42",
+ "connectivity_net439": "connectivity_net42",
+ "source_port_83": "connectivity_net42",
+ "pcb_port_83": "connectivity_net42",
+ "3273,254:0-0-1-2": "connectivity_net42",
+ "pcb_plated_hole_41": "connectivity_net46",
+ "connectivity_net440": "connectivity_net46",
+ "source_port_84": "connectivity_net46",
+ "pcb_port_84": "connectivity_net46",
+ "3273,0:0-0-1-2": "connectivity_net46",
+ "pcb_plated_hole_42": "connectivity_net44",
+ "connectivity_net441": "connectivity_net44",
+ "source_port_85": "connectivity_net44",
+ "pcb_port_85": "connectivity_net44",
+ "3273,-254:0-0-1-2": "connectivity_net44",
+ "pcb_plated_hole_43": "connectivity_net35",
+ "connectivity_net442": "connectivity_net35",
+ "source_port_86": "connectivity_net35",
+ "pcb_port_86": "connectivity_net35",
+ "3273,-508:0-0-1-2": "connectivity_net35",
+ "pcb_plated_hole_44": "connectivity_net47",
+ "connectivity_net443": "connectivity_net47",
+ "source_port_87": "connectivity_net47",
+ "pcb_port_87": "connectivity_net47",
+ "3273,-762:0-0-1-2": "connectivity_net47",
+ "pcb_plated_hole_45": "connectivity_net34",
+ "connectivity_net444": "connectivity_net34",
+ "source_port_88": "connectivity_net34",
+ "pcb_port_88": "connectivity_net34",
+ "3273,-1016:0-0-1-2": "connectivity_net34",
+ "pcb_plated_hole_46": "connectivity_net43",
+ "connectivity_net445": "connectivity_net43",
+ "source_port_89": "connectivity_net43",
+ "pcb_port_89": "connectivity_net43",
+ "3273,-1270:0-0-1-2": "connectivity_net43",
+ "pcb_plated_hole_47": "connectivity_net40",
+ "connectivity_net446": "connectivity_net40",
+ "source_port_90": "connectivity_net40",
+ "pcb_port_90": "connectivity_net40",
+ "3273,-1524:0-0-1-2": "connectivity_net40",
+ "pcb_plated_hole_48": "connectivity_net45",
+ "connectivity_net447": "connectivity_net45",
+ "source_port_91": "connectivity_net45",
+ "pcb_port_91": "connectivity_net45",
+ "3273,-1778:0-0-1-2": "connectivity_net45",
+ "pcb_plated_hole_49": "connectivity_net47",
+ "connectivity_net448": "connectivity_net47",
+ "source_port_92": "connectivity_net47",
+ "pcb_port_92": "connectivity_net47",
+ "3019,1778:0-0-1-2": "connectivity_net47",
+ "pcb_plated_hole_50": "connectivity_net46",
+ "connectivity_net449": "connectivity_net46",
+ "source_port_93": "connectivity_net46",
+ "pcb_port_93": "connectivity_net46",
+ "3019,1524:0-0-1-2": "connectivity_net46",
+ "pcb_plated_hole_51": "connectivity_net41",
+ "connectivity_net450": "connectivity_net41",
+ "source_port_94": "connectivity_net41",
+ "pcb_port_94": "connectivity_net41",
+ "3019,1270:0-0-1-2": "connectivity_net41",
+ "pcb_plated_hole_52": "connectivity_net38",
+ "connectivity_net451": "connectivity_net38",
+ "source_port_95": "connectivity_net38",
+ "pcb_port_95": "connectivity_net38",
+ "3019,1016:0-0-1-2": "connectivity_net38",
+ "pcb_plated_hole_53": "connectivity_net33",
+ "connectivity_net452": "connectivity_net33",
+ "source_port_96": "connectivity_net33",
+ "pcb_port_96": "connectivity_net33",
+ "3019,762:0-0-1-2": "connectivity_net33",
+ "pcb_plated_hole_54": "connectivity_net39",
+ "connectivity_net453": "connectivity_net39",
+ "source_port_97": "connectivity_net39",
+ "pcb_port_97": "connectivity_net39",
+ "3019,508:0-0-1-2": "connectivity_net39",
+ "pcb_plated_hole_55": "connectivity_net40",
+ "connectivity_net454": "connectivity_net40",
+ "source_port_98": "connectivity_net40",
+ "pcb_port_98": "connectivity_net40",
+ "3019,254:0-0-1-2": "connectivity_net40",
+ "pcb_plated_hole_56": "connectivity_net35",
+ "connectivity_net455": "connectivity_net35",
+ "source_port_99": "connectivity_net35",
+ "pcb_port_99": "connectivity_net35",
+ "3019,0:0-0-1-2": "connectivity_net35",
+ "pcb_plated_hole_57": "connectivity_net45",
+ "connectivity_net456": "connectivity_net45",
+ "source_port_100": "connectivity_net45",
+ "pcb_port_100": "connectivity_net45",
+ "3019,-254:0-0-1-2": "connectivity_net45",
+ "pcb_plated_hole_58": "connectivity_net43",
+ "connectivity_net457": "connectivity_net43",
+ "source_port_101": "connectivity_net43",
+ "pcb_port_101": "connectivity_net43",
+ "3019,-508:0-0-1-2": "connectivity_net43",
+ "pcb_plated_hole_59": "connectivity_net42",
+ "connectivity_net458": "connectivity_net42",
+ "source_port_102": "connectivity_net42",
+ "pcb_port_102": "connectivity_net42",
+ "3019,-762:0-0-1-2": "connectivity_net42",
+ "pcb_plated_hole_60": "connectivity_net44",
+ "connectivity_net459": "connectivity_net44",
+ "source_port_103": "connectivity_net44",
+ "pcb_port_103": "connectivity_net44",
+ "3019,-1016:0-0-1-2": "connectivity_net44",
+ "pcb_plated_hole_61": "connectivity_net36",
+ "connectivity_net460": "connectivity_net36",
+ "source_port_104": "connectivity_net36",
+ "pcb_port_104": "connectivity_net36",
+ "3019,-1270:0-0-1-2": "connectivity_net36",
+ "pcb_plated_hole_62": "connectivity_net37",
+ "connectivity_net461": "connectivity_net37",
+ "source_port_105": "connectivity_net37",
+ "pcb_port_105": "connectivity_net37",
+ "3019,-1524:0-0-1-2": "connectivity_net37",
+ "pcb_plated_hole_63": "connectivity_net34",
+ "connectivity_net462": "connectivity_net34",
+ "source_port_106": "connectivity_net34",
+ "pcb_port_106": "connectivity_net34",
+ "3019,-1778:0-0-1-2": "connectivity_net34",
+ "pcb_plated_hole_64": "connectivity_net2",
+ "connectivity_net463": "connectivity_net2",
+ "source_port_107": "connectivity_net2",
+ "pcb_port_107": "connectivity_net2",
+ "source_component_internal_connection_15": "connectivity_net2",
+ "-3781,-1778:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_65": "connectivity_net49",
+ "connectivity_net464": "connectivity_net49",
+ "source_port_108": "connectivity_net49",
+ "pcb_port_108": "connectivity_net49",
+ "source_component_internal_connection_16": "connectivity_net49",
+ "-3781,-1524:0-0-1-2": "connectivity_net49",
+ "pcb_plated_hole_66": "connectivity_net50",
+ "connectivity_net465": "connectivity_net50",
+ "source_port_109": "connectivity_net50",
+ "pcb_port_109": "connectivity_net50",
+ "source_component_internal_connection_17": "connectivity_net50",
+ "-3781,-1270:0-0-1-2": "connectivity_net50",
+ "pcb_plated_hole_67": "connectivity_net51",
+ "connectivity_net466": "connectivity_net51",
+ "source_port_110": "connectivity_net51",
+ "pcb_port_110": "connectivity_net51",
+ "source_component_internal_connection_18": "connectivity_net51",
+ "-3781,-1016:0-0-1-2": "connectivity_net51",
+ "pcb_plated_hole_68": "connectivity_net2",
+ "connectivity_net467": "connectivity_net2",
+ "source_port_111": "connectivity_net2",
+ "pcb_port_111": "connectivity_net2",
+ "-3781,-762:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_69": "connectivity_net52",
+ "connectivity_net468": "connectivity_net52",
+ "source_port_112": "connectivity_net52",
+ "pcb_port_112": "connectivity_net52",
+ "source_component_internal_connection_19": "connectivity_net52",
+ "-3781,-508:0-0-1-2": "connectivity_net52",
+ "pcb_plated_hole_70": "connectivity_net0",
+ "connectivity_net469": "connectivity_net0",
+ "source_port_113": "connectivity_net0",
+ "pcb_port_113": "connectivity_net0",
+ "source_component_internal_connection_20": "connectivity_net0",
+ "-3781,-254:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_71": "connectivity_net49",
+ "connectivity_net470": "connectivity_net49",
+ "source_port_114": "connectivity_net49",
+ "pcb_port_114": "connectivity_net49",
+ "-3781,0:0-0-1-2": "connectivity_net49",
+ "pcb_plated_hole_72": "connectivity_net52",
+ "connectivity_net471": "connectivity_net52",
+ "source_port_115": "connectivity_net52",
+ "pcb_port_115": "connectivity_net52",
+ "-3781,254:0-0-1-2": "connectivity_net52",
+ "pcb_plated_hole_73": "connectivity_net49",
+ "connectivity_net472": "connectivity_net49",
+ "source_port_116": "connectivity_net49",
+ "pcb_port_116": "connectivity_net49",
+ "-3781,508:0-0-1-2": "connectivity_net49",
+ "pcb_plated_hole_74": "connectivity_net54",
+ "connectivity_net473": "connectivity_net54",
+ "source_port_117": "connectivity_net54",
+ "pcb_port_117": "connectivity_net54",
+ "source_component_internal_connection_21": "connectivity_net54",
+ "-3781,762:0-0-1-2": "connectivity_net54",
+ "pcb_plated_hole_75": "connectivity_net2",
+ "connectivity_net474": "connectivity_net2",
+ "source_port_118": "connectivity_net2",
+ "pcb_port_118": "connectivity_net2",
+ "source_component_internal_connection_22": "connectivity_net2",
+ "-3781,1016:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_76": "connectivity_net56",
+ "connectivity_net475": "connectivity_net56",
+ "source_port_119": "connectivity_net56",
+ "pcb_port_119": "connectivity_net56",
+ "source_component_internal_connection_23": "connectivity_net56",
+ "-3781,1270:0-0-1-2": "connectivity_net56",
+ "pcb_plated_hole_77": "connectivity_net57",
+ "connectivity_net476": "connectivity_net57",
+ "source_port_120": "connectivity_net57",
+ "pcb_port_120": "connectivity_net57",
+ "source_component_internal_connection_24": "connectivity_net57",
+ "-3781,1524:0-0-1-2": "connectivity_net57",
+ "pcb_plated_hole_78": "connectivity_net50",
+ "connectivity_net477": "connectivity_net50",
+ "source_port_121": "connectivity_net50",
+ "pcb_port_121": "connectivity_net50",
+ "-3781,1778:0-0-1-2": "connectivity_net50",
+ "pcb_plated_hole_79": "connectivity_net57",
+ "connectivity_net478": "connectivity_net57",
+ "source_port_122": "connectivity_net57",
+ "pcb_port_122": "connectivity_net57",
+ "-3527,-1778:0-0-1-2": "connectivity_net57",
+ "pcb_plated_hole_80": "connectivity_net54",
+ "connectivity_net479": "connectivity_net54",
+ "source_port_123": "connectivity_net54",
+ "pcb_port_123": "connectivity_net54",
+ "-3527,-1524:0-0-1-2": "connectivity_net54",
+ "pcb_plated_hole_81": "connectivity_net0",
+ "connectivity_net480": "connectivity_net0",
+ "source_port_124": "connectivity_net0",
+ "pcb_port_124": "connectivity_net0",
+ "source_component_internal_connection_25": "connectivity_net0",
+ "-3527,-1270:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_82": "connectivity_net2",
+ "connectivity_net481": "connectivity_net2",
+ "source_port_125": "connectivity_net2",
+ "pcb_port_125": "connectivity_net2",
+ "-3527,-1016:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_83": "connectivity_net59",
+ "connectivity_net482": "connectivity_net59",
+ "source_port_126": "connectivity_net59",
+ "pcb_port_126": "connectivity_net59",
+ "source_component_internal_connection_26": "connectivity_net59",
+ "-3527,-762:0-0-1-2": "connectivity_net59",
+ "pcb_plated_hole_84": "connectivity_net4",
+ "connectivity_net483": "connectivity_net4",
+ "source_port_127": "connectivity_net4",
+ "pcb_port_127": "connectivity_net4",
+ "source_component_internal_connection_27": "connectivity_net4",
+ "-3527,-508:0-0-1-2": "connectivity_net4",
+ "pcb_plated_hole_85": "connectivity_net51",
+ "connectivity_net484": "connectivity_net51",
+ "source_port_128": "connectivity_net51",
+ "pcb_port_128": "connectivity_net51",
+ "-3527,-254:0-0-1-2": "connectivity_net51",
+ "pcb_plated_hole_86": "connectivity_net50",
+ "connectivity_net485": "connectivity_net50",
+ "source_port_129": "connectivity_net50",
+ "pcb_port_129": "connectivity_net50",
+ "-3527,0:0-0-1-2": "connectivity_net50",
+ "pcb_plated_hole_87": "connectivity_net0",
+ "connectivity_net486": "connectivity_net0",
+ "source_port_130": "connectivity_net0",
+ "pcb_port_130": "connectivity_net0",
+ "-3527,254:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_88": "connectivity_net56",
+ "connectivity_net487": "connectivity_net56",
+ "source_port_131": "connectivity_net56",
+ "pcb_port_131": "connectivity_net56",
+ "-3527,508:0-0-1-2": "connectivity_net56",
+ "pcb_plated_hole_89": "connectivity_net51",
+ "connectivity_net488": "connectivity_net51",
+ "source_port_132": "connectivity_net51",
+ "pcb_port_132": "connectivity_net51",
+ "-3527,762:0-0-1-2": "connectivity_net51",
+ "pcb_plated_hole_90": "connectivity_net61",
+ "connectivity_net489": "connectivity_net61",
+ "source_port_133": "connectivity_net61",
+ "pcb_port_133": "connectivity_net61",
+ "source_component_internal_connection_28": "connectivity_net61",
+ "-3527,1016:0-0-1-2": "connectivity_net61",
+ "pcb_plated_hole_91": "connectivity_net0",
+ "connectivity_net490": "connectivity_net0",
+ "source_port_134": "connectivity_net0",
+ "pcb_port_134": "connectivity_net0",
+ "-3527,1270:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_92": "connectivity_net62",
+ "connectivity_net491": "connectivity_net62",
+ "source_port_135": "connectivity_net62",
+ "pcb_port_135": "connectivity_net62",
+ "source_component_internal_connection_29": "connectivity_net62",
+ "-3527,1524:0-0-1-2": "connectivity_net62",
+ "pcb_plated_hole_93": "connectivity_net2",
+ "connectivity_net492": "connectivity_net2",
+ "source_port_136": "connectivity_net2",
+ "pcb_port_136": "connectivity_net2",
+ "-3527,1778:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_94": "connectivity_net54",
+ "connectivity_net493": "connectivity_net54",
+ "source_port_137": "connectivity_net54",
+ "pcb_port_137": "connectivity_net54",
+ "-3273,-1778:0-0-1-2": "connectivity_net54",
+ "pcb_plated_hole_95": "connectivity_net52",
+ "connectivity_net494": "connectivity_net52",
+ "source_port_138": "connectivity_net52",
+ "pcb_port_138": "connectivity_net52",
+ "-3273,-1524:0-0-1-2": "connectivity_net52",
+ "pcb_plated_hole_96": "connectivity_net2",
+ "connectivity_net495": "connectivity_net2",
+ "source_port_139": "connectivity_net2",
+ "pcb_port_139": "connectivity_net2",
+ "-3273,-1270:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_97": "connectivity_net4",
+ "connectivity_net496": "connectivity_net4",
+ "source_port_140": "connectivity_net4",
+ "pcb_port_140": "connectivity_net4",
+ "-3273,-1016:0-0-1-2": "connectivity_net4",
+ "pcb_plated_hole_98": "connectivity_net54",
+ "connectivity_net497": "connectivity_net54",
+ "source_port_141": "connectivity_net54",
+ "pcb_port_141": "connectivity_net54",
+ "-3273,-762:0-0-1-2": "connectivity_net54",
+ "pcb_plated_hole_99": "connectivity_net0",
+ "connectivity_net498": "connectivity_net0",
+ "source_port_142": "connectivity_net0",
+ "pcb_port_142": "connectivity_net0",
+ "-3273,-508:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_100": "connectivity_net57",
+ "connectivity_net499": "connectivity_net57",
+ "source_port_143": "connectivity_net57",
+ "pcb_port_143": "connectivity_net57",
+ "-3273,-254:0-0-1-2": "connectivity_net57",
+ "pcb_plated_hole_101": "connectivity_net61",
+ "connectivity_net500": "connectivity_net61",
+ "source_port_144": "connectivity_net61",
+ "pcb_port_144": "connectivity_net61",
+ "-3273,0:0-0-1-2": "connectivity_net61",
+ "pcb_plated_hole_102": "connectivity_net59",
+ "connectivity_net501": "connectivity_net59",
+ "source_port_145": "connectivity_net59",
+ "pcb_port_145": "connectivity_net59",
+ "-3273,254:0-0-1-2": "connectivity_net59",
+ "pcb_plated_hole_103": "connectivity_net50",
+ "connectivity_net502": "connectivity_net50",
+ "source_port_146": "connectivity_net50",
+ "pcb_port_146": "connectivity_net50",
+ "-3273,508:0-0-1-2": "connectivity_net50",
+ "pcb_plated_hole_104": "connectivity_net62",
+ "connectivity_net503": "connectivity_net62",
+ "source_port_147": "connectivity_net62",
+ "pcb_port_147": "connectivity_net62",
+ "-3273,762:0-0-1-2": "connectivity_net62",
+ "pcb_plated_hole_105": "connectivity_net49",
+ "connectivity_net504": "connectivity_net49",
+ "source_port_148": "connectivity_net49",
+ "pcb_port_148": "connectivity_net49",
+ "-3273,1016:0-0-1-2": "connectivity_net49",
+ "pcb_plated_hole_106": "connectivity_net0",
+ "connectivity_net505": "connectivity_net0",
+ "source_port_149": "connectivity_net0",
+ "pcb_port_149": "connectivity_net0",
+ "-3273,1270:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_107": "connectivity_net2",
+ "connectivity_net506": "connectivity_net2",
+ "source_port_150": "connectivity_net2",
+ "pcb_port_150": "connectivity_net2",
+ "-3273,1524:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_108": "connectivity_net4",
+ "connectivity_net507": "connectivity_net4",
+ "source_port_151": "connectivity_net4",
+ "pcb_port_151": "connectivity_net4",
+ "-3273,1778:0-0-1-2": "connectivity_net4",
+ "pcb_plated_hole_109": "connectivity_net62",
+ "connectivity_net508": "connectivity_net62",
+ "source_port_152": "connectivity_net62",
+ "pcb_port_152": "connectivity_net62",
+ "-3019,-1778:0-0-1-2": "connectivity_net62",
+ "pcb_plated_hole_110": "connectivity_net61",
+ "connectivity_net509": "connectivity_net61",
+ "source_port_153": "connectivity_net61",
+ "pcb_port_153": "connectivity_net61",
+ "-3019,-1524:0-0-1-2": "connectivity_net61",
+ "pcb_plated_hole_111": "connectivity_net56",
+ "connectivity_net510": "connectivity_net56",
+ "source_port_154": "connectivity_net56",
+ "pcb_port_154": "connectivity_net56",
+ "-3019,-1270:0-0-1-2": "connectivity_net56",
+ "pcb_plated_hole_112": "connectivity_net0",
+ "connectivity_net511": "connectivity_net0",
+ "source_port_155": "connectivity_net0",
+ "pcb_port_155": "connectivity_net0",
+ "-3019,-1016:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_113": "connectivity_net2",
+ "connectivity_net512": "connectivity_net2",
+ "source_port_156": "connectivity_net2",
+ "pcb_port_156": "connectivity_net2",
+ "-3019,-762:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_114": "connectivity_net54",
+ "connectivity_net513": "connectivity_net54",
+ "source_port_157": "connectivity_net54",
+ "pcb_port_157": "connectivity_net54",
+ "-3019,-508:0-0-1-2": "connectivity_net54",
+ "pcb_plated_hole_115": "connectivity_net2",
+ "connectivity_net514": "connectivity_net2",
+ "source_port_158": "connectivity_net2",
+ "pcb_port_158": "connectivity_net2",
+ "-3019,-254:0-0-1-2": "connectivity_net2",
+ "pcb_plated_hole_116": "connectivity_net50",
+ "connectivity_net515": "connectivity_net50",
+ "source_port_159": "connectivity_net50",
+ "pcb_port_159": "connectivity_net50",
+ "-3019,0:0-0-1-2": "connectivity_net50",
+ "pcb_plated_hole_117": "connectivity_net4",
+ "connectivity_net516": "connectivity_net4",
+ "source_port_160": "connectivity_net4",
+ "pcb_port_160": "connectivity_net4",
+ "-3019,254:0-0-1-2": "connectivity_net4",
+ "pcb_plated_hole_118": "connectivity_net0",
+ "connectivity_net517": "connectivity_net0",
+ "source_port_161": "connectivity_net0",
+ "pcb_port_161": "connectivity_net0",
+ "-3019,508:0-0-1-2": "connectivity_net0",
+ "pcb_plated_hole_119": "connectivity_net57",
+ "connectivity_net518": "connectivity_net57",
+ "source_port_162": "connectivity_net57",
+ "pcb_port_162": "connectivity_net57",
+ "-3019,762:0-0-1-2": "connectivity_net57",
+ "pcb_plated_hole_120": "connectivity_net59",
+ "connectivity_net519": "connectivity_net59",
+ "source_port_163": "connectivity_net59",
+ "pcb_port_163": "connectivity_net59",
+ "-3019,1016:0-0-1-2": "connectivity_net59",
+ "pcb_plated_hole_121": "connectivity_net51",
+ "connectivity_net520": "connectivity_net51",
+ "source_port_164": "connectivity_net51",
+ "pcb_port_164": "connectivity_net51",
+ "-3019,1270:0-0-1-2": "connectivity_net51",
+ "pcb_plated_hole_122": "connectivity_net52",
+ "connectivity_net521": "connectivity_net52",
+ "source_port_165": "connectivity_net52",
+ "pcb_port_165": "connectivity_net52",
+ "-3019,1524:0-0-1-2": "connectivity_net52",
+ "pcb_plated_hole_123": "connectivity_net49",
+ "connectivity_net522": "connectivity_net49",
+ "source_port_166": "connectivity_net49",
+ "pcb_port_166": "connectivity_net49",
+ "-3019,1778:0-0-1-2": "connectivity_net49",
+ "0,-600:0-0-1-2": "connectivity_net63",
+ "__obs103": "connectivity_net2",
+ "__obs89": "connectivity_net2",
+ "__obs102": "connectivity_net0",
+ "__obs87": "connectivity_net0",
+ "__obs108": "connectivity_net0",
+ "__obs93": "connectivity_net4",
+ "__obs109": "connectivity_net2",
+ "__obs113": "connectivity_net4",
+ "__obs111": "connectivity_net2",
+ "__obs114": "connectivity_net0"
+ }
+ },
+ "colorMap": {
+ "connectivity_net8": "hsl(0, 100%, 50%)",
+ "source_net_3": "hsl(0, 100%, 50%)",
+ "connectivity_net7": "hsl(21.428571428571427, 100%, 50%)",
+ "source_net_2": "hsl(21.428571428571427, 100%, 50%)",
+ "source_net_1_mst0": "hsl(48.57142857142857, 100%, 50%)",
+ "source_net_1_mst1": "hsl(72.85714285714286, 100%, 50%)",
+ "source_net_1_mst2": "hsl(97.14285714285714, 100%, 50%)",
+ "source_net_1_mst3": "hsl(121.42857142857143, 100%, 50%)",
+ "source_net_1_mst4": "hsl(145.71428571428572, 100%, 50%)",
+ "source_net_1_mst5": "hsl(170, 100%, 50%)",
+ "connectivity_net5": "hsl(171.42857142857142, 100%, 50%)",
+ "source_net_0": "hsl(171.42857142857142, 100%, 50%)",
+ "connectivity_net4": "hsl(192.85714285714286, 100%, 50%)",
+ "source_trace_12": "hsl(192.85714285714286, 100%, 50%)",
+ "connectivity_net3": "hsl(214.28571428571428, 100%, 50%)",
+ "source_trace_10": "hsl(214.28571428571428, 100%, 50%)",
+ "connectivity_net2": "hsl(235.71428571428572, 100%, 50%)",
+ "source_trace_8": "hsl(235.71428571428572, 100%, 50%)",
+ "connectivity_net1": "hsl(257.14285714285717, 100%, 50%)",
+ "source_trace_6": "hsl(257.14285714285717, 100%, 50%)",
+ "connectivity_net0": "hsl(278.57142857142856, 100%, 50%)",
+ "source_trace_4": "hsl(278.57142857142856, 100%, 50%)"
+ }
+ }
+]
diff --git a/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx b/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx
new file mode 100644
index 00000000..6f43c879
--- /dev/null
+++ b/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx
@@ -0,0 +1,22 @@
+import { GenericSolverDebugger } from "lib/testing/GenericSolverDebugger"
+import { TraceKeepoutSolver } from "lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver"
+import { ConnectivityMap } from "circuit-json-to-connectivity-map"
+import input from "./keepoutsolver01-input.json"
+
+export default () => {
+ const createSolver = () => {
+ const data = input[0] as any
+
+ const connMap = new ConnectivityMap(data.connMap.netMap)
+
+ return new TraceKeepoutSolver({
+ hdRoutes: data.hdRoutes,
+ obstacles: data.obstacles,
+ connMap,
+ colorMap: data.colorMap,
+ keepoutRadiusSchedule: data.keepoutRadiusSchedule,
+ })
+ }
+
+ return
+}
diff --git a/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts b/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts
index caab6d30..640bc939 100644
--- a/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts
+++ b/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts
@@ -34,6 +34,7 @@ import { getGlobalInMemoryCache } from "lib/cache/setupGlobalCaches"
import { NetToPointPairsSolver2_OffBoardConnection } from "../../solvers/NetToPointPairsSolver2_OffBoardConnection/NetToPointPairsSolver2_OffBoardConnection"
import { RectDiffPipeline } from "@tscircuit/rectdiff"
import { TraceSimplificationSolver } from "../../solvers/TraceSimplificationSolver/TraceSimplificationSolver"
+import { TraceKeepoutSolver } from "../../solvers/TraceKeepoutSolver/TraceKeepoutSolver"
import { AvailableSegmentPointSolver } from "../../solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver"
import {
PortPointPathingSolver,
@@ -102,6 +103,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
strawSolver?: StrawSolver
deadEndSolver?: DeadEndSolver
traceSimplificationSolver?: TraceSimplificationSolver
+ traceKeepoutSolver?: TraceKeepoutSolver
availableSegmentPointSolver?: AvailableSegmentPointSolver
portPointPathingSolver?: PortPointPathingSolver
multiSectionPortPointOptimizer?: MultiSectionPortPointOptimizer
@@ -244,14 +246,14 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
inputNodes,
capacityMeshNodes: cms.capacityNodes!,
colorMap: cms.colorMap,
- numShuffleSeeds: 2000,
+ numShuffleSeeds: 10000,
+ minAllowedBoardScore: -1,
hyperParameters: {
// 1 = 60% maximum pf (see computeSectionScore)
// 5 = 99.3% maximum pf
// 10 = 99.995% maximum pf (1 - e**(-10))
// NODE_PF_MAX_PENALTY: 10,
// RANDOM_WALK_DISTANCE: 50,
- MIN_ALLOWED_BOARD_SCORE: -1,
NODE_PF_FACTOR: 10000,
FORCE_OFF_BOARD_FREQUENCY: 0.3,
CENTER_OFFSET_DIST_PENALTY_FACTOR: 1,
@@ -296,19 +298,19 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
},
],
),
- // definePipelineStep(
- // "highDensityStitchSolver",
- // MultipleHighDensityRouteStitchSolver,
- // (cms) => [
- // {
- // connections: cms.srjWithPointPairs!.connections,
- // hdRoutes: cms.highDensityRouteSolver!.routes,
- // colorMap: cms.colorMap,
- // layerCount: cms.srj.layerCount,
- // defaultViaDiameter: cms.viaDiameter,
- // },
- // ],
- // ),
+ definePipelineStep(
+ "highDensityStitchSolver",
+ MultipleHighDensityRouteStitchSolver,
+ (cms) => [
+ {
+ connections: cms.srjWithPointPairs!.connections,
+ hdRoutes: cms.simpleHighDensityRouteSolver!.routes,
+ colorMap: cms.colorMap,
+ layerCount: cms.srj.layerCount,
+ defaultViaDiameter: cms.viaDiameter,
+ },
+ ],
+ ),
definePipelineStep(
"traceSimplificationSolver",
TraceSimplificationSolver,
@@ -328,6 +330,14 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
},
],
),
+ definePipelineStep("traceKeepoutSolver", TraceKeepoutSolver, (cms) => [
+ {
+ hdRoutes: cms.traceSimplificationSolver?.simplifiedHdRoutes ?? [],
+ obstacles: cms.srj.obstacles,
+ connMap: cms.connMap,
+ colorMap: cms.colorMap,
+ },
+ ]),
]
constructor(
@@ -430,6 +440,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
const simpleHighDensityViz = this.simpleHighDensityRouteSolver?.visualize()
const highDensityStitchViz = this.highDensityStitchSolver?.visualize()
const traceSimplificationViz = this.traceSimplificationSolver?.visualize()
+ const traceKeepoutViz = this.traceKeepoutSolver?.visualize()
const problemOutline = this.srj.outline
const problemLines: Line[] = []
@@ -516,6 +527,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
: null,
highDensityStitchViz,
traceSimplificationViz,
+ traceKeepoutViz,
this.solved
? combineVisualizations(
problemViz,
@@ -582,6 +594,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver {
_getOutputHdRoutes(): HighDensityRoute[] {
return (
+ this.traceKeepoutSolver?.redrawnHdRoutes ??
this.traceSimplificationSolver?.simplifiedHdRoutes ??
this.highDensityStitchSolver?.mergedHdRoutes ??
this.simpleHighDensityRouteSolver?.routes ??
diff --git a/lib/data-structures/HighDensityRouteSpatialIndex.ts b/lib/data-structures/HighDensityRouteSpatialIndex.ts
index bc99419d..e2bd3528 100644
--- a/lib/data-structures/HighDensityRouteSpatialIndex.ts
+++ b/lib/data-structures/HighDensityRouteSpatialIndex.ts
@@ -14,6 +14,7 @@ type Segment = [Point, Point]
export type HighDensityIntraNodeRoute = {
connectionName: string // Assuming this is unique per route
+ rootConnectionName?: string // Parent connection for merged routes
traceThickness: number
viaDiameter: number // Now used in conflict calculation
route: Array<{ x: number; y: number; z: number }>
diff --git a/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts b/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts
index 58429a99..0e24589c 100644
--- a/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts
+++ b/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts
@@ -176,7 +176,7 @@ export class AvailableSegmentPointSolver extends BaseSolver {
const centerY = (overlap.start.y + overlap.end.y) / 2
if (maxPortPoints > 5) {
- maxPortPoints = 5 + maxPortPoints / 4
+ maxPortPoints = 5 + Math.floor(maxPortPoints / 4)
}
// First pass: compute all XY positions and find which is closest to segment center
diff --git a/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts b/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts
index 8b6d6889..9c2fca81 100644
--- a/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts
+++ b/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts
@@ -100,8 +100,9 @@ export class HyperPortPointPathingSolver extends HyperParameterSupervisorSolver<
...this.params.hyperParameters,
...hyperParameters,
MIN_ALLOWED_BOARD_SCORE:
+ this.params.minAllowedBoardScore ??
hyperParameters.MIN_ALLOWED_BOARD_SCORE ??
- this.params.minAllowedBoardScore,
+ this.params.hyperParameters?.MIN_ALLOWED_BOARD_SCORE,
},
})
}
diff --git a/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts b/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts
index e8682bb1..91b50d15 100644
--- a/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts
+++ b/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts
@@ -56,7 +56,7 @@ export function visualizePointPathSolver(
const red = Math.min(255, Math.floor(pf * 512))
const greenAndBlue = Math.max(0, 255 - Math.floor(pf * 512))
- let color = `rgba(${red}, ${greenAndBlue}, ${greenAndBlue}, 0.3)`
+ let color = `rgba(${red}, ${greenAndBlue}, ${greenAndBlue}, ${pf < 0.001 ? "0.1" : "0.3"})`
if (node._containsObstacle) {
color = "rgba(255, 0, 0, 0.3)"
@@ -68,8 +68,8 @@ export function visualizePointPathSolver(
graphics.rects!.push({
center: node.center,
- width: node.width * 0.9,
- height: node.height * 0.9,
+ width: node.width - 0.2,
+ height: node.height - 0.2,
layer: `z${node.availableZ.join(",")}`,
fill: color,
label: `${node.capacityMeshNodeId}\npf: ${pf.toFixed(3)}, memPf: ${memPf.toFixed(3)}\nxSame: ${crossings.numSameLayerCrossings}, xLC: ${crossings.numEntryExitLayerChanges}, xTransition: ${crossings.numTransitionPairCrossings}\nobCmid: ${node._offBoardConnectedCapacityMeshNodeIds?.join(",")}\nobs: ${node._containsObstacle ? "yes" : "no"}`,
diff --git a/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts b/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts
index 0f8a63f9..0f5ab335 100644
--- a/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts
+++ b/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts
@@ -6,6 +6,8 @@ import { mapLayerNameToZ } from "lib/utils/mapLayerNameToZ"
import { SingleHighDensityRouteStitchSolver } from "./SingleHighDensityRouteStitchSolver"
import { GraphicsObject } from "graphics-debug"
import { safeTransparentize } from "../colors"
+import { ConnectivityMap } from "connectivity-map"
+import { distance } from "@tscircuit/math-utils"
export type UnsolvedRoute = {
connectionName: string
@@ -14,6 +16,9 @@ export type UnsolvedRoute = {
end: { x: number; y: number; z: number }
}
+const roundedPointHash = (p: { x: number; y: number; z: number }) =>
+ `${Math.round(p.x * 100)},${Math.round(p.y * 100)},${Math.round(p.z * 100)}`
+
export class MultipleHighDensityRouteStitchSolver extends BaseSolver {
unsolvedRoutes: UnsolvedRoute[]
activeSolver: SingleHighDensityRouteStitchSolver | null = null
@@ -22,7 +27,7 @@ export class MultipleHighDensityRouteStitchSolver extends BaseSolver {
defaultTraceThickness: number
defaultViaDiameter: number
- constructor(opts: {
+ constructor(params: {
connections: SimpleRouteConnection[]
hdRoutes: HighDensityIntraNodeRoute[]
colorMap?: Record
@@ -30,31 +35,115 @@ export class MultipleHighDensityRouteStitchSolver extends BaseSolver {
defaultViaDiameter?: number
}) {
super()
- this.colorMap = opts.colorMap ?? {}
+ this.colorMap = params.colorMap ?? {}
- const firstRoute = opts.hdRoutes[0]
+ const firstRoute = params.hdRoutes[0]
this.defaultTraceThickness = firstRoute?.traceThickness ?? 0.15
this.defaultViaDiameter =
- firstRoute?.viaDiameter ?? opts.defaultViaDiameter ?? 0.6
-
- this.unsolvedRoutes = opts.connections.map((c) => ({
- connectionName: c.name,
- hdRoutes: opts.hdRoutes.filter((r) => r.connectionName === c.name),
- start: {
- ...c.pointsToConnect[0],
- z: mapLayerNameToZ(
- getConnectionPointLayer(c.pointsToConnect[0]),
- opts.layerCount,
- ),
- },
- end: {
- ...c.pointsToConnect[1],
- z: mapLayerNameToZ(
- getConnectionPointLayer(c.pointsToConnect[1]),
- opts.layerCount,
- ),
- },
- }))
+ firstRoute?.viaDiameter ?? params.defaultViaDiameter ?? 0.6
+
+ const routeIslandConnectivityMap = new ConnectivityMap({})
+ const routeIslandConnections: Array = []
+ const routeIslands = []
+
+ const pointHashCounts = new Map()
+
+ for (let i = 0; i < params.hdRoutes.length; i++) {
+ const hdRoute = params.hdRoutes[i]
+ const start = hdRoute.route[0]
+ const end = hdRoute.route[hdRoute.route.length - 1]
+ routeIslandConnections.push([
+ `route_island_${i}`,
+ `${hdRoute.connectionName}:${roundedPointHash(start)}`,
+ `${hdRoute.connectionName}:${roundedPointHash(end)}`,
+ ])
+ }
+ routeIslandConnectivityMap.addConnections(routeIslandConnections)
+ for (const routeIslandConnection of routeIslandConnections) {
+ for (const pointHash of routeIslandConnection.slice(1)) {
+ pointHashCounts.set(
+ pointHash,
+ (pointHashCounts.get(pointHash) ?? 0) + 1,
+ )
+ }
+ }
+
+ this.unsolvedRoutes = []
+
+ const uniqueNets = Array.from(
+ new Set(Object.values(routeIslandConnectivityMap.idToNetMap)),
+ )
+
+ for (const netName of uniqueNets) {
+ const netMembers =
+ routeIslandConnectivityMap.getIdsConnectedToNet(netName)
+
+ const hdRoutes = params.hdRoutes.filter((r, i) =>
+ netMembers.includes(`route_island_${i}`),
+ )
+ if (hdRoutes.length === 0) continue
+
+ const connection = params.connections.find(
+ (c) => c.name === hdRoutes[0].connectionName,
+ )!
+
+ const possibleEndpoints1 = hdRoutes.flatMap((r) => [
+ r.route[0],
+ r.route[r.route.length - 1],
+ ])
+
+ const possibleEndpoints2 = []
+ for (const possibleEndpoint1 of possibleEndpoints1) {
+ const pointHash = `${hdRoutes[0].connectionName}:${roundedPointHash(possibleEndpoint1)}`
+ if (pointHashCounts.get(pointHash) === 1) {
+ possibleEndpoints2.push(possibleEndpoint1)
+ }
+ }
+ // Not sure why this happens
+ // If removing, make sure off-board-assignable2 doesn't break
+ if (possibleEndpoints2.length === 0) {
+ console.log("no possible endpoints, can't stitch")
+ continue
+ }
+
+ let start: { x: number; y: number; z: number }
+ let end: { x: number; y: number; z: number }
+
+ if (possibleEndpoints2.length !== 2) {
+ start = {
+ ...connection.pointsToConnect[0],
+ z: mapLayerNameToZ(
+ getConnectionPointLayer(connection.pointsToConnect[0]),
+ params.layerCount,
+ ),
+ }
+ end = {
+ ...connection.pointsToConnect[1],
+ z: mapLayerNameToZ(
+ getConnectionPointLayer(connection.pointsToConnect[1]),
+ params.layerCount,
+ ),
+ }
+ } else {
+ start = possibleEndpoints2[0]
+ end = possibleEndpoints2[1]
+
+ if (
+ distance(start, connection.pointsToConnect[1]) <
+ distance(end, connection.pointsToConnect[0])
+ ) {
+ ;[start, end] = [end, start]
+ }
+ }
+
+ this.unsolvedRoutes.push({
+ connectionName: hdRoutes[0].connectionName,
+ hdRoutes,
+ start,
+ end,
+ })
+ }
+
this.MAX_ITERATIONS = 100e3
}
diff --git a/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts b/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts
new file mode 100644
index 00000000..37a26c10
--- /dev/null
+++ b/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts
@@ -0,0 +1,675 @@
+import { BaseSolver } from "../BaseSolver"
+import { HighDensityRoute } from "lib/types/high-density-types"
+import { Obstacle } from "lib/types"
+import { ConnectivityMap } from "circuit-json-to-connectivity-map"
+import { ObstacleSpatialHashIndex } from "lib/data-structures/ObstacleTree"
+import { HighDensityRouteSpatialIndex } from "lib/data-structures/HighDensityRouteSpatialIndex"
+import { GraphicsObject } from "graphics-debug"
+import {
+ computeDrawPositionFromCollisions,
+ Segment,
+} from "./computeDrawPositionFromCollisions"
+import {
+ obstacleToSegments,
+ routeToOutlineSegments,
+} from "./obstacleToSegments"
+import {
+ distance,
+ pointToSegmentClosestPoint,
+ pointToSegmentDistance,
+} from "@tscircuit/math-utils"
+import { smoothHdRoutes } from "./smoothLines"
+
+const CURSOR_STEP_DISTANCE = 0.2
+
+interface Point2D {
+ x: number
+ y: number
+}
+
+interface Point3D extends Point2D {
+ z: number
+}
+
+export interface TraceKeepoutSolverInput {
+ hdRoutes: HighDensityRoute[]
+ obstacles: Obstacle[]
+ connMap: ConnectivityMap
+ colorMap: Record
+ keepoutRadiusSchedule?: number[]
+ smoothDistance?: number
+}
+
+/**
+ * TraceKeepoutSolver adjusts traces to maintain keepout distance from obstacles
+ * and non-connected traces. It works by walking along each trace with a cursor,
+ * detecting obstacles within a keepout radius, and pushing the draw position
+ * orthogonally to avoid them.
+ *
+ * The solver processes traces through multiple passes with decreasing keepout
+ * radii as defined by KEEPOUT_RADIUS_SCHEDULE.
+ */
+export class TraceKeepoutSolver extends BaseSolver {
+ originalHdRoutes: HighDensityRoute[]
+ hdRoutes: HighDensityRoute[]
+ redrawnHdRoutes: HighDensityRoute[] = []
+
+ smoothDistance: number
+
+ KEEPOUT_RADIUS_SCHEDULE: number[]
+ currentScheduleIndex = 0
+ currentKeepoutRadius: number
+
+ unprocessedRoutes: HighDensityRoute[] = []
+ smoothedCursorRoutes: HighDensityRoute[] = []
+ processedRoutes: HighDensityRoute[] = []
+
+ // Current trace being processed
+ currentTrace: HighDensityRoute | null = null
+ cursorPosition: Point3D | null = null
+ lastCursorPosition: Point3D | null = null
+ drawPosition: Point2D | null = null
+ currentTraceSegmentIndex = 0
+ currentTraceSegmentT = 0 // Parameter t in [0, 1] along the current segment
+ recordedDrawPositions: Point3D[] = []
+ lastCollidingSegments: Segment[] = []
+
+ obstacleSHI: ObstacleSpatialHashIndex
+ hdRouteSHI: HighDensityRouteSpatialIndex
+
+ constructor(private input: TraceKeepoutSolverInput) {
+ super()
+ this.MAX_ITERATIONS = 1e6
+
+ // Store original routes for visualization
+ this.originalHdRoutes = [...input.hdRoutes]
+
+ // Apply smoothing to routes
+ this.smoothDistance = input.smoothDistance ?? 0.5
+ this.hdRoutes = smoothHdRoutes(input.hdRoutes, this.smoothDistance)
+
+ this.KEEPOUT_RADIUS_SCHEDULE = input.keepoutRadiusSchedule ?? [
+ 0.5, 0.5, 0.5, 0.5,
+ ]
+ this.currentKeepoutRadius = this.KEEPOUT_RADIUS_SCHEDULE[0] ?? 0.15
+ this.unprocessedRoutes = [...this.hdRoutes]
+ this.smoothedCursorRoutes = [...this.unprocessedRoutes]
+
+ this.obstacleSHI = new ObstacleSpatialHashIndex("flatbush", input.obstacles)
+ this.hdRouteSHI = new HighDensityRouteSpatialIndex(this.hdRoutes)
+
+ // Make sure the start/endpoint of any route is properly connected in the
+ // connMap to the obstacle
+ for (const [
+ endpoint,
+ connectionName,
+ rootConnectionName,
+ ] of this.hdRoutes.flatMap(
+ (
+ r,
+ ): [
+ { x: number; y: number; z: number },
+ string,
+ string | undefined,
+ ][] => [
+ [r.route[0]!, r.connectionName, r.rootConnectionName],
+ [r.route[r.route.length - 1]!, r.connectionName, r.rootConnectionName],
+ ],
+ )) {
+ const obstacles = this.obstacleSHI
+ .searchArea(endpoint.x, endpoint.y, 0.01, 0.01)
+ .filter((o) => o.zLayers?.includes(endpoint.z))
+ if (obstacles.length === 0) continue
+ const obstacle = obstacles[0]!
+
+ this.input.connMap.addConnections([
+ [
+ connectionName,
+ rootConnectionName!,
+ ...(obstacle.offBoardConnectsTo ?? []),
+ obstacle.obstacleId!,
+ ...obstacle.connectedTo,
+ ].filter(Boolean),
+ ])
+ }
+ }
+
+ _step() {
+ // If no current trace, dequeue one
+ if (!this.currentTrace) {
+ const nextTrace = this.unprocessedRoutes.shift()
+
+ if (!nextTrace) {
+ // All traces processed for this schedule pass
+ // Check if there's another keepout radius in the schedule
+ this.currentScheduleIndex++
+ if (this.currentScheduleIndex < this.KEEPOUT_RADIUS_SCHEDULE.length) {
+ // Requeue all traces with the new keepout radius
+ this.currentKeepoutRadius =
+ this.KEEPOUT_RADIUS_SCHEDULE[this.currentScheduleIndex]!
+ this.unprocessedRoutes = smoothHdRoutes(
+ [...this.processedRoutes],
+ this.smoothDistance,
+ )
+ this.smoothedCursorRoutes = [...this.unprocessedRoutes]
+ this.processedRoutes = []
+ // Rebuild the spatial index with processed routes
+ this.hdRouteSHI = new HighDensityRouteSpatialIndex(
+ this.unprocessedRoutes,
+ )
+ return
+ }
+
+ // All schedule passes complete
+ this.redrawnHdRoutes = this.processedRoutes
+ this.solved = true
+ return
+ }
+
+ // Initialize the new trace processing
+ this.currentTrace = nextTrace
+ if (this.currentTrace.route.length < 2) {
+ // Trace is too short to process, just pass it through
+ this.processedRoutes.push(this.currentTrace)
+ this.currentTrace = null
+ return
+ }
+
+ const startPoint = this.currentTrace.route[0]!
+ this.cursorPosition = { ...startPoint }
+ this.lastCursorPosition = { ...startPoint }
+ this.drawPosition = { x: startPoint.x, y: startPoint.y }
+ this.currentTraceSegmentIndex = 0
+ this.currentTraceSegmentT = 0
+ this.recordedDrawPositions = [{ ...startPoint }]
+ return
+ }
+
+ // Save last cursor position before stepping
+ this.lastCursorPosition = { ...this.cursorPosition! }
+
+ // Step the cursor forward along the trace
+ const stepped = this.stepCursorForward()
+
+ if (!stepped) {
+ // Reached end of trace, finalize it
+ this.finalizeCurrentTrace()
+ return
+ }
+
+ // Get colliding segments for obstacles and traces
+ const collidingSegments = this.getCollidingSegments(this.cursorPosition!)
+ this.lastCollidingSegments = collidingSegments
+
+ // Compute draw position using the collision avoidance algorithm
+ const newDrawPosition = computeDrawPositionFromCollisions({
+ cursorPosition: this.cursorPosition!,
+ lastCursorPosition: this.lastCursorPosition!,
+ collidingSegments,
+ keepoutRadius: this.currentKeepoutRadius,
+ })
+
+ this.drawPosition = newDrawPosition ?? { ...this.cursorPosition! }
+
+ // if (
+ // this.positionHasCollision(
+ // {
+ // ...this.drawPosition!,
+ // z: this.cursorPosition!.z,
+ // },
+ // -0.001,
+ // ) ||
+ // distance(this.drawPosition!, this.cursorPosition!) >
+ // this.currentKeepoutRadius + 0.001
+ // ) {
+ // this.drawPosition = { ...this.cursorPosition! }
+ // }
+
+ // Record the draw position
+ this.recordedDrawPositions.push({
+ x: this.drawPosition!.x,
+ y: this.drawPosition!.y,
+ z: this.cursorPosition!.z,
+ })
+ }
+
+ /**
+ * Steps the cursor forward by CURSOR_STEP_DISTANCE along the trace
+ * Returns false if we've reached the end of the trace
+ */
+ private stepCursorForward(): boolean {
+ if (!this.currentTrace || !this.cursorPosition) return false
+
+ const route = this.currentTrace.route
+ let remainingDistance = CURSOR_STEP_DISTANCE
+
+ while (remainingDistance > 0) {
+ if (this.currentTraceSegmentIndex >= route.length - 1) {
+ // Reached end of trace
+ return false
+ }
+
+ const segStart = route[this.currentTraceSegmentIndex]!
+ const segEnd = route[this.currentTraceSegmentIndex + 1]!
+
+ const segDx = segEnd.x - segStart.x
+ const segDy = segEnd.y - segStart.y
+ const segLength = Math.sqrt(segDx * segDx + segDy * segDy)
+
+ if (segLength === 0) {
+ // Zero-length segment, skip it
+ this.currentTraceSegmentIndex++
+ this.currentTraceSegmentT = 0
+ continue
+ }
+
+ // How far we are into this segment
+ const currentDistInSeg = this.currentTraceSegmentT * segLength
+ const distToSegEnd = segLength - currentDistInSeg
+
+ if (remainingDistance <= distToSegEnd) {
+ // We can complete the step within this segment
+ const newDistInSeg = currentDistInSeg + remainingDistance
+ this.currentTraceSegmentT = newDistInSeg / segLength
+
+ // Update cursor position
+ this.cursorPosition = {
+ x: segStart.x + segDx * this.currentTraceSegmentT,
+ y: segStart.y + segDy * this.currentTraceSegmentT,
+ z: segStart.z, // Stay on same layer within segment
+ }
+
+ return true
+ } else {
+ // Step goes beyond this segment
+ remainingDistance -= distToSegEnd
+ this.currentTraceSegmentIndex++
+ this.currentTraceSegmentT = 0
+
+ if (this.currentTraceSegmentIndex >= route.length - 1) {
+ // Reached end of trace
+ const lastPoint = route[route.length - 1]!
+ this.cursorPosition = { ...lastPoint }
+ return false
+ }
+ }
+ }
+
+ return true
+ }
+
+ /**
+ * Gets all colliding segments (obstacle edges and trace outlines) within the keepout radius
+ */
+ private getCollidingSegments(position: {
+ x: number
+ y: number
+ z: number
+ }): Segment[] {
+ if (!this.currentTrace) return []
+
+ const rootConnectionName =
+ this.currentTrace.rootConnectionName ?? this.currentTrace.connectionName
+ const searchRadius = this.currentKeepoutRadius * 2
+ const segments: Segment[] = []
+
+ // Check for obstacles within the keepout radius
+ const nearbyObstacles = this.obstacleSHI.searchArea(
+ position.x,
+ position.y,
+ searchRadius,
+ searchRadius,
+ )
+
+ // Filter to non-connected obstacles on the same layer and convert to segments
+ for (const obstacle of nearbyObstacles) {
+ // Check if obstacle is on the same layer
+ if (obstacle.zLayers && !obstacle.zLayers.includes(position.z)) {
+ continue
+ }
+
+ // Check if obstacle is connected to this trace's net
+ if (obstacle.connectedTo.includes(rootConnectionName)) {
+ continue
+ }
+
+ // Check if obstacle's own ID is connected
+ if (
+ obstacle.obstacleId &&
+ this.input.connMap.areIdsConnected(
+ rootConnectionName,
+ obstacle.obstacleId,
+ )
+ ) {
+ continue
+ }
+
+ // Check connectivity via connMap
+ let isConnected = false
+ for (const connectedId of obstacle.connectedTo) {
+ if (
+ this.input.connMap.areIdsConnected(rootConnectionName, connectedId)
+ ) {
+ isConnected = true
+ break
+ }
+ }
+ if (isConnected) continue
+
+ // Convert obstacle to edge segments
+ segments.push(...obstacleToSegments(obstacle))
+ }
+
+ // Check for non-connected traces within the keepout radius
+ const nearbyRoutes = this.hdRouteSHI.getConflictingRoutesNearPoint(
+ { x: position.x, y: position.y },
+ searchRadius,
+ )
+
+ for (const { conflictingRoute } of nearbyRoutes) {
+ const routeRootName =
+ conflictingRoute.rootConnectionName ?? conflictingRoute.connectionName
+
+ // Don't avoid our own trace
+ if (routeRootName === rootConnectionName) {
+ continue
+ }
+
+ // Check connectivity
+ if (
+ this.input.connMap.areIdsConnected(rootConnectionName, routeRootName)
+ ) {
+ continue
+ }
+
+ // Convert route to outline segments (considering trace width)
+ const traceWidth = conflictingRoute.traceThickness ?? 0.15
+ segments.push(
+ ...routeToOutlineSegments(conflictingRoute.route, traceWidth),
+ )
+ }
+
+ return segments
+ }
+
+ positionHasCollision(
+ position: {
+ x: number
+ y: number
+ z: number
+ },
+ margin: number = 0,
+ ): boolean {
+ const collidingSegments = this.getCollidingSegments(position)
+
+ for (const segment of collidingSegments) {
+ if (
+ pointToSegmentDistance(position, segment.start, segment.end) <=
+ this.currentKeepoutRadius + margin
+ ) {
+ return true
+ }
+ }
+ return false
+ }
+
+ /**
+ * Finalizes the current trace with the recorded draw positions
+ */
+ private finalizeCurrentTrace() {
+ if (!this.currentTrace) return
+
+ // Add the final point if not already there
+ const lastRoutePoint =
+ this.currentTrace.route[this.currentTrace.route.length - 1]!
+ const lastRecorded =
+ this.recordedDrawPositions[this.recordedDrawPositions.length - 1]
+ if (
+ !lastRecorded ||
+ lastRecorded.x !== lastRoutePoint.x ||
+ lastRecorded.y !== lastRoutePoint.y
+ ) {
+ this.recordedDrawPositions.push({ ...lastRoutePoint })
+ }
+
+ // Simplify the recorded positions to remove redundant points
+ const simplifiedRoute = this.simplifyRoute(this.recordedDrawPositions)
+
+ // Create the redrawn trace
+ const redrawnTrace: HighDensityRoute = {
+ connectionName: this.currentTrace.connectionName,
+ rootConnectionName: this.currentTrace.rootConnectionName,
+ traceThickness: this.currentTrace.traceThickness,
+ viaDiameter: this.currentTrace.viaDiameter,
+ route: simplifiedRoute,
+ vias: [...this.currentTrace.vias], // Keep vias unchanged
+ }
+
+ this.processedRoutes.push(redrawnTrace)
+ this.currentTrace = null
+ this.cursorPosition = null
+ this.lastCursorPosition = null
+ this.drawPosition = null
+ this.recordedDrawPositions = []
+ }
+
+ /**
+ * Simplifies the route by removing collinear points
+ */
+ private simplifyRoute(points: Point3D[]): Point3D[] {
+ if (points.length <= 2) return points
+
+ const result: Point3D[] = [points[0]!]
+
+ for (let i = 1; i < points.length - 1; i++) {
+ const prev = result[result.length - 1]!
+ const curr = points[i]!
+ const next = points[i + 1]!
+
+ // Skip points where z changes - always keep layer transitions
+ if (curr.z !== prev.z || curr.z !== next.z) {
+ result.push(curr)
+ continue
+ }
+
+ // Check if the point is collinear with prev and next
+ const dx1 = curr.x - prev.x
+ const dy1 = curr.y - prev.y
+ const dx2 = next.x - curr.x
+ const dy2 = next.y - curr.y
+
+ // Cross product to check collinearity
+ const cross = dx1 * dy2 - dy1 * dx2
+ const epsilon = 1e-6
+
+ if (Math.abs(cross) > epsilon) {
+ // Not collinear, keep this point
+ result.push(curr)
+ }
+ }
+
+ result.push(points[points.length - 1]!)
+ return result
+ }
+
+ visualize(): GraphicsObject {
+ const visualization: GraphicsObject & {
+ lines: NonNullable
+ points: NonNullable
+ rects: NonNullable
+ circles: NonNullable
+ } = {
+ lines: [],
+ points: [],
+ rects: [],
+ circles: [],
+ coordinateSystem: "cartesian",
+ title: `Trace Keepout Solver (radius: ${this.currentKeepoutRadius.toFixed(2)}, smooth: ${this.smoothDistance.toFixed(2)}mm)`,
+ }
+
+ for (const route of this.originalHdRoutes) {
+ if (route.route.length === 0) continue
+
+ for (let i = 0; i < route.route.length - 1; i++) {
+ const current = route.route[i]!
+ const next = route.route[i + 1]!
+
+ if (current.z === next.z) {
+ visualization.lines.push({
+ points: [
+ { x: current.x, y: current.y },
+ { x: next.x, y: next.y },
+ ],
+ strokeColor: "rgba(0,0,0,0.25)",
+ strokeWidth: (route.traceThickness ?? 0.15) * 1.5,
+ })
+ }
+ }
+ }
+
+ // Visualize obstacles
+ for (const obstacle of this.input.obstacles) {
+ let fillColor = "rgba(128, 128, 128, 0.2)"
+ const isOnLayer0 = obstacle.zLayers?.includes(0)
+ const isOnLayer1 = obstacle.zLayers?.includes(1)
+
+ if (isOnLayer0 && isOnLayer1) {
+ fillColor = "rgba(128, 0, 128, 0.2)"
+ } else if (isOnLayer0) {
+ fillColor = "rgba(255, 0, 0, 0.2)"
+ } else if (isOnLayer1) {
+ fillColor = "rgba(0, 0, 255, 0.2)"
+ }
+
+ visualization.rects.push({
+ center: obstacle.center,
+ width: obstacle.width,
+ height: obstacle.height,
+ fill: fillColor,
+ label: `Obstacle (Z: ${obstacle.zLayers?.join(", ")})`,
+ })
+ }
+
+ // Draw processed routes
+ for (const route of this.processedRoutes) {
+ if (route.route.length === 0) continue
+
+ const color = this.input.colorMap[route.connectionName] || "#888888"
+
+ for (let i = 0; i < route.route.length - 1; i++) {
+ const current = route.route[i]!
+ const next = route.route[i + 1]!
+
+ if (current.z === next.z) {
+ visualization.lines.push({
+ points: [
+ { x: current.x, y: current.y },
+ { x: next.x, y: next.y },
+ ],
+ strokeColor: current.z === 0 ? "red" : "blue",
+ strokeWidth: route.traceThickness,
+ label: `${route.connectionName} (z=${current.z})`,
+ })
+ }
+ }
+
+ for (const via of route.vias) {
+ visualization.circles.push({
+ center: { x: via.x, y: via.y },
+ radius: route.viaDiameter / 2,
+ fill: "rgba(255, 0, 255, 0.5)",
+ label: `${route.connectionName} via`,
+ })
+ }
+ }
+
+ // Draw current trace being processed (if any)
+ if (this.currentTrace && this.recordedDrawPositions.length > 0) {
+ const color =
+ this.input.colorMap[this.currentTrace.connectionName] || "#00FF00"
+
+ for (let i = 0; i < this.recordedDrawPositions.length - 1; i++) {
+ const current = this.recordedDrawPositions[i]!
+ const next = this.recordedDrawPositions[i + 1]!
+
+ visualization.lines.push({
+ points: [
+ { x: current.x, y: current.y },
+ { x: next.x, y: next.y },
+ ],
+ strokeColor: "green",
+ strokeWidth: this.currentTrace.traceThickness,
+ })
+ }
+
+ // Draw cursor position
+ if (this.cursorPosition) {
+ visualization.circles.push({
+ center: { x: this.cursorPosition.x, y: this.cursorPosition.y },
+ radius: this.currentKeepoutRadius,
+ stroke: "orange",
+ label: "Cursor keepout",
+ })
+
+ visualization.points.push({
+ x: this.cursorPosition.x,
+ y: this.cursorPosition.y,
+ color: "orange",
+ label: "Cursor",
+ })
+ }
+
+ // Draw draw position
+ if (this.drawPosition) {
+ visualization.points.push({
+ x: this.drawPosition.x,
+ y: this.drawPosition.y,
+ color: "lime",
+ label: "Draw",
+ })
+ }
+
+ // Draw colliding segments
+ for (const segment of this.lastCollidingSegments) {
+ visualization.lines.push({
+ points: [
+ { x: segment.start.x, y: segment.start.y },
+ { x: segment.end.x, y: segment.end.y },
+ ],
+ strokeColor: "rgba(255, 0, 255, 0.8)",
+ strokeWidth: 0.02,
+ label: "Colliding segment",
+ })
+ }
+ }
+
+ if (!this.solved) {
+ // Draw smoothed routes (these are what the solver will process)
+ for (const route of this.smoothedCursorRoutes) {
+ if (route.route.length === 0) continue
+
+ for (let i = 0; i < route.route.length - 1; i++) {
+ const current = route.route[i]!
+ const next = route.route[i + 1]!
+
+ if (current.z === next.z) {
+ visualization.lines.push({
+ points: [
+ { x: current.x, y: current.y },
+ { x: next.x, y: next.y },
+ ],
+ strokeColor: "gray",
+ })
+ }
+ }
+ }
+ }
+
+ return visualization
+ }
+
+ /** Returns the redrawn routes. This is the primary output of the solver. */
+ getRedrawnHdRoutes(): HighDensityRoute[] {
+ return this.redrawnHdRoutes
+ }
+}
diff --git a/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts b/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts
new file mode 100644
index 00000000..e55fcf08
--- /dev/null
+++ b/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts
@@ -0,0 +1,294 @@
+interface Point2D {
+ x: number
+ y: number
+}
+
+export interface Segment {
+ start: Point2D
+ end: Point2D
+}
+
+export interface ComputeDrawPositionInput {
+ cursorPosition: Point2D
+ lastCursorPosition: Point2D
+ collidingSegments: Segment[]
+ keepoutRadius: number
+}
+
+function closestPointOnSegment(p: Point2D, a: Point2D, b: Point2D): Point2D {
+ const dx = b.x - a.x,
+ dy = b.y - a.y
+ const lenSq = dx * dx + dy * dy
+ if (lenSq === 0) return { x: a.x, y: a.y }
+ const t = Math.max(
+ 0,
+ Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq),
+ )
+ return { x: a.x + t * dx, y: a.y + t * dy }
+}
+
+/**
+ * Gets minimum clearance from a point to all segments
+ */
+function getMinClearance(pos: Point2D, segments: Segment[]): number {
+ let minClearance = Infinity
+ for (const seg of segments) {
+ const closest = closestPointOnSegment(pos, seg.start, seg.end)
+ const dist = Math.sqrt((pos.x - closest.x) ** 2 + (pos.y - closest.y) ** 2)
+ minClearance = Math.min(minClearance, dist)
+ }
+ return minClearance
+}
+
+/**
+ * Checks if two line segments intersect
+ */
+function segmentsIntersect(
+ a1: Point2D,
+ a2: Point2D,
+ b1: Point2D,
+ b2: Point2D,
+): boolean {
+ const d1 = direction(b1, b2, a1)
+ const d2 = direction(b1, b2, a2)
+ const d3 = direction(a1, a2, b1)
+ const d4 = direction(a1, a2, b2)
+
+ if (
+ ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&
+ ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))
+ ) {
+ return true
+ }
+
+ const eps = 0.0001
+ if (Math.abs(d1) < eps && onSegment(b1, b2, a1)) return true
+ if (Math.abs(d2) < eps && onSegment(b1, b2, a2)) return true
+ if (Math.abs(d3) < eps && onSegment(a1, a2, b1)) return true
+ if (Math.abs(d4) < eps && onSegment(a1, a2, b2)) return true
+
+ return false
+}
+
+function direction(a: Point2D, b: Point2D, c: Point2D): number {
+ return (c.x - a.x) * (b.y - a.y) - (b.x - a.x) * (c.y - a.y)
+}
+
+function onSegment(a: Point2D, b: Point2D, c: Point2D): boolean {
+ return (
+ c.x >= Math.min(a.x, b.x) - 0.0001 &&
+ c.x <= Math.max(a.x, b.x) + 0.0001 &&
+ c.y >= Math.min(a.y, b.y) - 0.0001 &&
+ c.y <= Math.max(a.y, b.y) + 0.0001
+ )
+}
+
+/**
+ * Checks if the path from cursor to position is clear (no segments in between)
+ */
+function isPathClear(
+ cursor: Point2D,
+ pos: Point2D,
+ segments: Segment[],
+): boolean {
+ for (const seg of segments) {
+ if (segmentsIntersect(cursor, pos, seg.start, seg.end)) {
+ return false
+ }
+ }
+ return true
+}
+
+/**
+ * Computes an optimal draw position that maintains keepoutRadius from all segments.
+ *
+ * The draw position is constrained to:
+ * 1. Lie on the barrier line (perpendicular to trace direction, passing through cursor)
+ * 2. Stay within keepoutRadius distance from the cursor position
+ *
+ * Within these constraints, it finds the position that maximizes the minimum
+ * clearance to all colliding segments. This provides the "safest" position
+ * even when a fully valid position (clearance >= keepoutRadius) isn't possible.
+ *
+ * @param input.cursorPosition - Current position along the trace
+ * @param input.lastCursorPosition - Previous position (used to determine trace direction)
+ * @param input.collidingSegments - Line segments representing obstacle edges and trace outlines
+ * @param input.keepoutRadius - Minimum distance to maintain from obstacles (also max distance from cursor)
+ *
+ * @returns The optimal draw position on the barrier line within keepoutRadius, or null if cursor is valid
+ */
+export function computeDrawPositionFromCollisions(
+ input: ComputeDrawPositionInput,
+): Point2D | null {
+ const {
+ cursorPosition,
+ lastCursorPosition,
+ collidingSegments,
+ keepoutRadius,
+ } = input
+ if (collidingSegments.length === 0) return null
+
+ const epsilon = 0.0001
+
+ // Calculate trace direction
+ const tdx = cursorPosition.x - lastCursorPosition.x
+ const tdy = cursorPosition.y - lastCursorPosition.y
+ const tLen = Math.sqrt(tdx * tdx + tdy * tdy)
+ const traceDir =
+ tLen > epsilon ? { x: tdx / tLen, y: tdy / tLen } : { x: 1, y: 0 }
+
+ // Barrier direction (perpendicular to trace)
+ const barrierDir = { x: -traceDir.y, y: traceDir.x }
+
+ // Check if cursor position itself is valid
+ const cursorClearance = getMinClearance(cursorPosition, collidingSegments)
+ if (cursorClearance >= keepoutRadius) {
+ return null // No adjustment needed
+ }
+
+ // Search outward from cursor along barrier line in both directions
+ // Stop as soon as we find a valid position (minimal displacement)
+ const steps = 20
+
+ // Search both directions simultaneously, increasing distance from cursor
+ for (let i = 1; i <= steps; i++) {
+ const d = (i / steps) * keepoutRadius
+
+ // Test positive direction
+ const posPlus = {
+ x: cursorPosition.x + barrierDir.x * d,
+ y: cursorPosition.y + barrierDir.y * d,
+ }
+ const clearancePlus = getMinClearance(posPlus, collidingSegments)
+
+ // Test negative direction
+ const posMinus = {
+ x: cursorPosition.x - barrierDir.x * d,
+ y: cursorPosition.y - barrierDir.y * d,
+ }
+ const clearanceMinus = getMinClearance(posMinus, collidingSegments)
+
+ // Return the first valid position found (minimal displacement)
+ // Position must have sufficient clearance AND path from cursor must be clear
+ const validPlus =
+ clearancePlus >= keepoutRadius &&
+ isPathClear(cursorPosition, posPlus, collidingSegments)
+ const validMinus =
+ clearanceMinus >= keepoutRadius &&
+ isPathClear(cursorPosition, posMinus, collidingSegments)
+
+ if (validPlus && validMinus) {
+ return clearancePlus >= clearanceMinus ? posPlus : posMinus
+ }
+ if (validPlus) return posPlus
+ if (validMinus) return posMinus
+ }
+
+ // No valid position found - return the best suboptimal position
+ // (position with maximum clearance within the search range that has clear path)
+ let bestPos: Point2D | null = null
+ let bestClearance = -Infinity
+
+ for (let i = -steps; i <= steps; i++) {
+ const d = (i / steps) * keepoutRadius
+ const testPos = {
+ x: cursorPosition.x + barrierDir.x * d,
+ y: cursorPosition.y + barrierDir.y * d,
+ }
+
+ // Only consider positions with clear path from cursor
+ if (!isPathClear(cursorPosition, testPos, collidingSegments)) {
+ continue
+ }
+
+ const clearance = getMinClearance(testPos, collidingSegments)
+ if (clearance > bestClearance) {
+ bestClearance = clearance
+ bestPos = testPos
+ }
+ }
+
+ // If no position has clear path, fall back to cursor position (return null)
+ if (bestPos === null) {
+ return null
+ }
+
+ const movedDist = Math.sqrt(
+ (bestPos.x - cursorPosition.x) ** 2 + (bestPos.y - cursorPosition.y) ** 2,
+ )
+ return movedDist > epsilon ? bestPos : null
+}
+/**
+ * Converts an obstacle (rectangular) to its 4 edge segments
+ */
+export function obstacleToSegments(obstacle: {
+ center: { x: number; y: number }
+ width: number
+ height: number
+}): Segment[] {
+ const halfW = obstacle.width / 2
+ const halfH = obstacle.height / 2
+ const cx = obstacle.center.x
+ const cy = obstacle.center.y
+
+ const topLeft = { x: cx - halfW, y: cy + halfH }
+ const topRight = { x: cx + halfW, y: cy + halfH }
+ const bottomLeft = { x: cx - halfW, y: cy - halfH }
+ const bottomRight = { x: cx + halfW, y: cy - halfH }
+
+ return [
+ { start: topLeft, end: topRight },
+ { start: topRight, end: bottomRight },
+ { start: bottomRight, end: bottomLeft },
+ { start: bottomLeft, end: topLeft },
+ ]
+}
+
+/**
+ * Converts a trace segment to its outline segments (left and right edges)
+ * considering the trace width
+ */
+export function traceSegmentToOutlineSegments(
+ segmentStart: Point2D,
+ segmentEnd: Point2D,
+ traceWidth: number = 0.1,
+): Segment[] {
+ const dx = segmentEnd.x - segmentStart.x
+ const dy = segmentEnd.y - segmentStart.y
+ const len = Math.sqrt(dx * dx + dy * dy)
+
+ if (len === 0) return []
+
+ const nx = dx / len
+ const ny = dy / len
+ const px = -ny
+ const py = nx
+ const halfW = traceWidth / 2
+
+ return [
+ {
+ start: { x: segmentStart.x + px * halfW, y: segmentStart.y + py * halfW },
+ end: { x: segmentEnd.x + px * halfW, y: segmentEnd.y + py * halfW },
+ },
+ {
+ start: { x: segmentStart.x - px * halfW, y: segmentStart.y - py * halfW },
+ end: { x: segmentEnd.x - px * halfW, y: segmentEnd.y - py * halfW },
+ },
+ ]
+}
+
+/**
+ * Converts an entire route to outline segments
+ */
+export function routeToOutlineSegments(
+ route: Array<{ x: number; y: number }>,
+ traceWidth: number = 0.1,
+): Segment[] {
+ const segments: Segment[] = []
+ for (let i = 0; i < route.length - 1; i++) {
+ segments.push(
+ ...traceSegmentToOutlineSegments(route[i]!, route[i + 1]!, traceWidth),
+ )
+ }
+ return segments
+}
diff --git a/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts b/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts
new file mode 100644
index 00000000..8547200d
--- /dev/null
+++ b/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts
@@ -0,0 +1,107 @@
+interface Point2D {
+ x: number
+ y: number
+}
+
+export interface Segment {
+ start: Point2D
+ end: Point2D
+}
+
+/**
+ * Converts an obstacle (rectangular) to its 4 edge segments
+ */
+export function obstacleToSegments(obstacle: {
+ center: { x: number; y: number }
+ width: number
+ height: number
+}): Segment[] {
+ const halfW = obstacle.width / 2
+ const halfH = obstacle.height / 2
+ const cx = obstacle.center.x
+ const cy = obstacle.center.y
+
+ const topLeft = { x: cx - halfW, y: cy + halfH }
+ const topRight = { x: cx + halfW, y: cy + halfH }
+ const bottomLeft = { x: cx - halfW, y: cy - halfH }
+ const bottomRight = { x: cx + halfW, y: cy - halfH }
+
+ return [
+ { start: topLeft, end: topRight }, // top edge
+ { start: topRight, end: bottomRight }, // right edge
+ { start: bottomRight, end: bottomLeft }, // bottom edge
+ { start: bottomLeft, end: topLeft }, // left edge
+ ]
+}
+
+/**
+ * Converts a trace segment to its outline segments (left and right edges)
+ * considering the trace width
+ */
+export function traceSegmentToOutlineSegments(
+ segmentStart: Point2D,
+ segmentEnd: Point2D,
+ traceWidth: number = 0.1,
+): Segment[] {
+ const dx = segmentEnd.x - segmentStart.x
+ const dy = segmentEnd.y - segmentStart.y
+ const len = Math.sqrt(dx * dx + dy * dy)
+
+ if (len === 0) {
+ return []
+ }
+
+ // Normalized direction
+ const nx = dx / len
+ const ny = dy / len
+
+ // Perpendicular direction
+ const px = -ny
+ const py = nx
+
+ // Half width offset
+ const halfW = traceWidth / 2
+
+ // Left edge
+ const leftStart = {
+ x: segmentStart.x + px * halfW,
+ y: segmentStart.y + py * halfW,
+ }
+ const leftEnd = {
+ x: segmentEnd.x + px * halfW,
+ y: segmentEnd.y + py * halfW,
+ }
+
+ // Right edge
+ const rightStart = {
+ x: segmentStart.x - px * halfW,
+ y: segmentStart.y - py * halfW,
+ }
+ const rightEnd = {
+ x: segmentEnd.x - px * halfW,
+ y: segmentEnd.y - py * halfW,
+ }
+
+ return [
+ { start: leftStart, end: leftEnd },
+ { start: rightStart, end: rightEnd },
+ ]
+}
+
+/**
+ * Converts an entire route to outline segments
+ */
+export function routeToOutlineSegments(
+ route: Array<{ x: number; y: number }>,
+ traceWidth: number = 0.1,
+): Segment[] {
+ const segments: Segment[] = []
+
+ for (let i = 0; i < route.length - 1; i++) {
+ const start = route[i]!
+ const end = route[i + 1]!
+ segments.push(...traceSegmentToOutlineSegments(start, end, traceWidth))
+ }
+
+ return segments
+}
diff --git a/lib/solvers/TraceKeepoutSolver/smoothLines.ts b/lib/solvers/TraceKeepoutSolver/smoothLines.ts
new file mode 100644
index 00000000..eaca332f
--- /dev/null
+++ b/lib/solvers/TraceKeepoutSolver/smoothLines.ts
@@ -0,0 +1,243 @@
+import { HighDensityRoute } from "lib/types/high-density-types"
+
+interface Point3D {
+ x: number
+ y: number
+ z: number
+}
+
+/**
+ * Smooths a route to avoid sudden slope changes within the given smoothDistance.
+ * Uses a weighted average approach where nearby points influence each point's position.
+ *
+ * @param route - Array of 3D points representing the route
+ * @param smoothDistance - Maximum distance over which slope changes are smoothed (default: 0.5mm)
+ * @param sampleInterval - Interval for resampling the route (default: 0.05mm)
+ * @returns Smoothed route with gradual slope transitions
+ */
+export function smoothRoute(
+ route: Point3D[],
+ smoothDistance: number = 0.5,
+ sampleInterval: number = 0.1,
+): Point3D[] {
+ if (route.length < 3) return [...route]
+
+ // Step 1: Resample the route at regular intervals
+ const resampled = resampleRoute(route, sampleInterval)
+ if (resampled.length < 3) return [...route]
+
+ // Step 2: Apply Gaussian smoothing while preserving endpoints and layer transitions
+ const smoothed = gaussianSmooth(resampled, smoothDistance)
+
+ // Step 3: Simplify the route to remove redundant points
+ return simplifyRoute(smoothed)
+}
+
+/**
+ * Resamples a route to have evenly spaced points
+ */
+function resampleRoute(route: Point3D[], interval: number): Point3D[] {
+ if (route.length < 2) return [...route]
+
+ const result: Point3D[] = [{ ...route[0]! }]
+ let currentDist = 0
+
+ for (let i = 0; i < route.length - 1; i++) {
+ const start = route[i]!
+ const end = route[i + 1]!
+
+ const dx = end.x - start.x
+ const dy = end.y - start.y
+ const segmentLength = Math.sqrt(dx * dx + dy * dy)
+
+ if (segmentLength === 0) continue
+
+ // If layer changes, add both points explicitly
+ if (start.z !== end.z) {
+ result.push({ ...end })
+ currentDist = 0
+ continue
+ }
+
+ const dirX = dx / segmentLength
+ const dirY = dy / segmentLength
+
+ let distInSegment = interval - currentDist
+ while (distInSegment < segmentLength) {
+ result.push({
+ x: start.x + dirX * distInSegment,
+ y: start.y + dirY * distInSegment,
+ z: start.z,
+ })
+ distInSegment += interval
+ }
+
+ currentDist = distInSegment - segmentLength
+ }
+
+ // Always add the final point
+ const lastPoint = route[route.length - 1]!
+ const lastResult = result[result.length - 1]!
+ if (lastResult.x !== lastPoint.x || lastResult.y !== lastPoint.y) {
+ result.push({ ...lastPoint })
+ }
+
+ return result
+}
+
+/**
+ * Applies Gaussian smoothing to the route
+ * Points are smoothed based on distance-weighted average of nearby points
+ */
+function gaussianSmooth(route: Point3D[], smoothDistance: number): Point3D[] {
+ if (route.length < 3) return [...route]
+
+ const result: Point3D[] = []
+ const sigma = smoothDistance / 3 // Standard deviation for Gaussian kernel
+
+ for (let i = 0; i < route.length; i++) {
+ const current = route[i]!
+
+ // Keep first and last points fixed (endpoints)
+ if (i === 0 || i === route.length - 1) {
+ result.push({ ...current })
+ continue
+ }
+
+ // Check for layer transitions - keep these points fixed
+ const prev = route[i - 1]!
+ const next = route[i + 1]!
+ if (current.z !== prev.z || current.z !== next.z) {
+ result.push({ ...current })
+ continue
+ }
+
+ // Calculate weighted average position
+ let sumX = 0
+ let sumY = 0
+ let sumWeight = 0
+
+ // Look at points within the smooth distance
+ let cumulativeDistBack = 0
+ for (let j = i; j >= 0 && cumulativeDistBack <= smoothDistance; j--) {
+ const pt = route[j]!
+
+ // Stop at layer transitions
+ if (pt.z !== current.z) break
+
+ const weight = gaussianWeight(cumulativeDistBack, sigma)
+ sumX += pt.x * weight
+ sumY += pt.y * weight
+ sumWeight += weight
+
+ if (j > 0) {
+ const prevPt = route[j - 1]!
+ cumulativeDistBack += distance(pt, prevPt)
+ }
+ }
+
+ let cumulativeDistForward = 0
+ for (
+ let j = i + 1;
+ j < route.length && cumulativeDistForward <= smoothDistance;
+ j++
+ ) {
+ const pt = route[j]!
+
+ // Stop at layer transitions
+ if (pt.z !== current.z) break
+
+ const prevPt = route[j - 1]!
+ cumulativeDistForward += distance(pt, prevPt)
+
+ const weight = gaussianWeight(cumulativeDistForward, sigma)
+ sumX += pt.x * weight
+ sumY += pt.y * weight
+ sumWeight += weight
+ }
+
+ if (sumWeight > 0) {
+ result.push({
+ x: sumX / sumWeight,
+ y: sumY / sumWeight,
+ z: current.z,
+ })
+ } else {
+ result.push({ ...current })
+ }
+ }
+
+ return result
+}
+
+/**
+ * Gaussian kernel weight function
+ */
+function gaussianWeight(distance: number, sigma: number): number {
+ return Math.exp(-(distance * distance) / (2 * sigma * sigma))
+}
+
+/**
+ * Calculate distance between two points
+ */
+function distance(a: Point3D, b: Point3D): number {
+ const dx = b.x - a.x
+ const dy = b.y - a.y
+ return Math.sqrt(dx * dx + dy * dy)
+}
+
+/**
+ * Simplifies the route by removing collinear points
+ */
+function simplifyRoute(points: Point3D[]): Point3D[] {
+ if (points.length <= 2) return points
+
+ const result: Point3D[] = [points[0]!]
+
+ for (let i = 1; i < points.length - 1; i++) {
+ const prev = result[result.length - 1]!
+ const curr = points[i]!
+ const next = points[i + 1]!
+
+ // Always keep points where z changes
+ if (curr.z !== prev.z || curr.z !== next.z) {
+ result.push(curr)
+ continue
+ }
+
+ // Check if the point is collinear with prev and next
+ const dx1 = curr.x - prev.x
+ const dy1 = curr.y - prev.y
+ const dx2 = next.x - curr.x
+ const dy2 = next.y - curr.y
+
+ // Cross product to check collinearity
+ const cross = dx1 * dy2 - dy1 * dx2
+ const epsilon = 1e-6
+
+ if (Math.abs(cross) > epsilon) {
+ // Not collinear, keep this point
+ result.push(curr)
+ }
+ }
+
+ result.push(points[points.length - 1]!)
+ return result
+}
+
+/**
+ * Smooths all routes in a HighDensityRoute array
+ *
+ * @param hdRoutes - Array of high density routes to smooth
+ * @param smoothDistance - Maximum distance over which slope changes are smoothed (default: 0.5mm)
+ * @returns New array of routes with smoothed paths
+ */
+export function smoothHdRoutes(
+ hdRoutes: HighDensityRoute[],
+ smoothDistance: number = 0.5,
+): HighDensityRoute[] {
+ return hdRoutes.map((route) => ({
+ ...route,
+ route: smoothRoute(route.route, smoothDistance),
+ }))
+}
diff --git a/lib/utils/getConnectivityMapFromSimpleRouteJson.ts b/lib/utils/getConnectivityMapFromSimpleRouteJson.ts
index f37333c9..ca94fd90 100644
--- a/lib/utils/getConnectivityMapFromSimpleRouteJson.ts
+++ b/lib/utils/getConnectivityMapFromSimpleRouteJson.ts
@@ -1,5 +1,9 @@
import { SimpleRouteJson } from "lib/types"
import { ConnectivityMap } from "circuit-json-to-connectivity-map"
+import { mapLayerNameToZ } from "./mapLayerNameToZ"
+
+const pointHash = (point: { x: number; y: number }) =>
+ `${Math.round(point.x * 100)},${Math.round(point.y * 100)}`
export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => {
const connMap = new ConnectivityMap({})
@@ -20,6 +24,19 @@ export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => {
}
for (const point of connection.pointsToConnect) {
+ connMap.addConnections([
+ [
+ connection.name,
+ `${pointHash(point)}:${
+ "layers" in point
+ ? point.layers
+ .map((l) => mapLayerNameToZ(l, srj.layerCount))
+ .sort()
+ .join("-")
+ : mapLayerNameToZ(point.layer, srj.layerCount)
+ }`,
+ ],
+ ])
if ("pcb_port_id" in point && point.pcb_port_id) {
connMap.addConnections([[connection.name, point.pcb_port_id as string]])
}
@@ -28,7 +45,17 @@ export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => {
for (const obstacle of srj.obstacles) {
const offBoardConnections = obstacle.offBoardConnectsTo ?? []
const connectionGroup = Array.from(
- new Set([...obstacle.connectedTo, ...offBoardConnections]),
+ new Set(
+ [
+ obstacle.obstacleId!,
+ ...obstacle.connectedTo,
+ ...offBoardConnections,
+ `${pointHash(obstacle.center)}:${obstacle.layers
+ .map((l) => mapLayerNameToZ(l, srj.layerCount))
+ .sort()
+ .join("-")}`,
+ ].filter(Boolean),
+ ),
)
if (connectionGroup.length > 0) {
diff --git a/lib/utils/getIntraNodeCrossings.ts b/lib/utils/getIntraNodeCrossings.ts
index f72d6ab1..5cafac6e 100644
--- a/lib/utils/getIntraNodeCrossings.ts
+++ b/lib/utils/getIntraNodeCrossings.ts
@@ -1,6 +1,9 @@
import { doSegmentsIntersect } from "@tscircuit/math-utils"
import { NodeWithPortPoints } from "lib/types/high-density-types"
+// Intersection calculation is only accurate to 0.00001 (0.01mm)
+const intSpace = (a: number) => Math.floor(a * 10000)
+
export const getIntraNodeCrossings = (node: NodeWithPortPoints) => {
// Count the number of crossings
let numSameLayerCrossings = 0
@@ -29,12 +32,12 @@ export const getIntraNodeCrossings = (node: NodeWithPortPoints) => {
const pointPair = {
connectionName: A.connectionName,
z: A.z,
- points: [{ x: A.x, y: A.y, z: A.z }],
+ points: [{ x: intSpace(A.x), y: intSpace(A.y), z: A.z }],
}
for (const B of node.portPoints) {
if (A.connectionName !== B.connectionName) continue
if (A.x === B.x && A.y === B.y) continue
- pointPair.points.push({ x: B.x, y: B.y, z: B.z })
+ pointPair.points.push({ x: intSpace(B.x), y: intSpace(B.y), z: B.z })
}
if (pointPair.points.some((p) => p.z !== pointPair.z)) {
numEntryExitLayerChanges++
diff --git a/tests/__snapshots__/core1.snap.svg b/tests/__snapshots__/core1.snap.svg
index 497e6e33..f8de8203 100644
--- a/tests/__snapshots__/core1.snap.svg
+++ b/tests/__snapshots__/core1.snap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/tests/__snapshots__/e2e3-multisection.snap.svg b/tests/__snapshots__/e2e3-multisection.snap.svg
index 84888543..20c276be 100644
--- a/tests/__snapshots__/e2e3-multisection.snap.svg
+++ b/tests/__snapshots__/e2e3-multisection.snap.svg
@@ -1,4 +1,4 @@
-
\ No newline at end of file
diff --git a/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg b/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg
index c64774b0..16e86d92 100644
--- a/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg
+++ b/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg
@@ -1,4 +1,4 @@
-